From 9a6c298ad833b3667782a80c7f2da67d41b6a13e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ali=20M=C3=BCrteza=20Ye=C5=9Fil?= Date: Sat, 11 Jul 2020 04:51:47 +0600 Subject: [PATCH] Initial commit --- Makefile | 75 + __pycache__/pelicanconf.cpython-38.pyc | Bin 0 -> 941 bytes __pycache__/publishconf.cpython-38.pyc | Bin 0 -> 518 bytes bin/__pycache__/rst2html.cpython-38.pyc | Bin 0 -> 545 bytes bin/__pycache__/rst2html4.cpython-38.pyc | Bin 0 -> 667 bytes bin/__pycache__/rst2html5.cpython-38.pyc | Bin 0 -> 663 bytes bin/__pycache__/rst2latex.cpython-38.pyc | Bin 0 -> 678 bytes bin/__pycache__/rst2man.cpython-38.pyc | Bin 0 -> 633 bytes bin/__pycache__/rst2odt.cpython-38.pyc | Bin 0 -> 706 bytes .../rst2odt_prepstyles.cpython-38.pyc | Bin 0 -> 1643 bytes bin/__pycache__/rst2pseudoxml.cpython-38.pyc | Bin 0 -> 551 bytes bin/__pycache__/rst2s5.cpython-38.pyc | Bin 0 -> 590 bytes bin/__pycache__/rst2xetex.cpython-38.pyc | Bin 0 -> 764 bytes bin/__pycache__/rst2xml.cpython-38.pyc | Bin 0 -> 553 bytes bin/__pycache__/rstpep2html.cpython-38.pyc | Bin 0 -> 613 bytes bin/activate | 84 + bin/activate.csh | 55 + bin/activate.fish | 100 + bin/activate.ps1 | 60 + bin/activate.xsh | 46 + bin/activate_this.py | 32 + bin/chardetect | 8 + bin/chardetect-3.8 | 8 + bin/chardetect3 | 8 + bin/distro | 8 + bin/distro-3.8 | 8 + bin/distro3 | 8 + bin/easy_install | 8 + bin/easy_install-3.8 | 8 + bin/easy_install3 | 8 + bin/markdown_py | 8 + bin/pelican | 8 + bin/pelican-import | 8 + bin/pelican-quickstart | 8 + bin/pelican-themes | 8 + bin/pip | 8 + bin/pip-3.8 | 8 + bin/pip3 | 8 + bin/pip3.8 | 8 + bin/pygmentize | 8 + bin/python | 1 + bin/python3 | 1 + bin/python3.8 | 1 + bin/rst2html.py | 23 + bin/rst2html4.py | 26 + bin/rst2html5.py | 35 + bin/rst2latex.py | 26 + bin/rst2man.py | 26 + bin/rst2odt.py | 30 + bin/rst2odt_prepstyles.py | 67 + bin/rst2pseudoxml.py | 23 + bin/rst2s5.py | 24 + bin/rst2xetex.py | 27 + bin/rst2xml.py | 23 + bin/rstpep2html.py | 25 + bin/unidecode | 8 + bin/wheel | 8 + bin/wheel-3.8 | 8 + bin/wheel3 | 8 + content/blog/privacy_for_the_whole_family.md | 55 + content/images/it_is_free_real_estate_1.jpg | Bin 0 -> 254627 bytes content/pages/about.md | 46 + content/pages/contact.md | 5 + docs/archives.html | 64 + docs/author/ali-murteza-yesil.html | 100 + docs/authors.html | 61 + docs/categories.html | 60 + docs/category/tech.html | 100 + docs/feeds/all.atom.xml | 31 + docs/feeds/tech.atom.xml | 31 + docs/images/it_is_free_real_estate_1.jpg | Bin 0 -> 254627 bytes docs/index.html | 100 + docs/pages/about.html | 91 + docs/pages/contact.html | 61 + docs/privacy-for-the-whole-family.html | 103 + docs/tag/nextcloud.html | 100 + docs/tag/privacy.html | 100 + docs/tag/self-hosting.html | 100 + docs/tags.html | 63 + docs/theme/css/main.css | 474 + docs/theme/css/pygment.css | 66 + docs/theme/css/pygment.css.save | 205 + docs/theme/css/reset.css | 52 + docs/theme/css/typogrify.css | 3 + docs/theme/css/wide.css | 48 + docs/theme/images/icons/_licence.txt | 15 + docs/theme/images/icons/facebook.png | Bin 0 -> 1204 bytes docs/theme/images/icons/github.png | Bin 0 -> 1348 bytes docs/theme/images/icons/google-plus.png | Bin 0 -> 1411 bytes docs/theme/images/icons/lastfm.png | Bin 0 -> 1395 bytes docs/theme/images/icons/linkedin.png | Bin 0 -> 1257 bytes docs/theme/images/icons/rss.png | Bin 0 -> 1441 bytes docs/theme/images/icons/search.png | Bin 0 -> 412 bytes docs/theme/images/icons/twitter.png | Bin 0 -> 1389 bytes docs/theme/images/icons/vimeo.png | Bin 0 -> 1322 bytes docs/theme/images/icons/youtube.png | Bin 0 -> 1504 bytes .../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 .../Jinja2-2.11.2.dist-info/INSTALLER | 1 + .../Jinja2-2.11.2.dist-info/LICENSE.rst | 28 + .../Jinja2-2.11.2.dist-info/METADATA | 106 + .../Jinja2-2.11.2.dist-info/RECORD | 61 + .../Jinja2-2.11.2.dist-info/WHEEL | 6 + .../Jinja2-2.11.2.dist-info/entry_points.txt | 3 + .../Jinja2-2.11.2.dist-info/top_level.txt | 1 + .../Markdown-3.2.2.dist-info/INSTALLER | 1 + .../Markdown-3.2.2.dist-info/LICENSE.md | 29 + .../Markdown-3.2.2.dist-info/METADATA | 57 + .../Markdown-3.2.2.dist-info/RECORD | 74 + .../Markdown-3.2.2.dist-info/WHEEL | 5 + .../Markdown-3.2.2.dist-info/entry_points.txt | 23 + .../Markdown-3.2.2.dist-info/top_level.txt | 1 + .../MarkupSafe-1.1.1.dist-info/INSTALLER | 1 + .../MarkupSafe-1.1.1.dist-info/LICENSE.txt | 28 + .../MarkupSafe-1.1.1.dist-info/METADATA | 105 + .../MarkupSafe-1.1.1.dist-info/RECORD | 16 + .../MarkupSafe-1.1.1.dist-info/WHEEL | 5 + .../MarkupSafe-1.1.1.dist-info/top_level.txt | 1 + .../Pygments-2.6.1.dist-info/AUTHORS | 231 + .../Pygments-2.6.1.dist-info/INSTALLER | 1 + .../Pygments-2.6.1.dist-info/LICENSE | 25 + .../Pygments-2.6.1.dist-info/METADATA | 48 + .../Pygments-2.6.1.dist-info/RECORD | 463 + .../Pygments-2.6.1.dist-info/WHEEL | 5 + .../Pygments-2.6.1.dist-info/entry_points.txt | 3 + .../Pygments-2.6.1.dist-info/top_level.txt | 1 + .../Unidecode-1.1.1.dist-info/DESCRIPTION.rst | 237 + .../Unidecode-1.1.1.dist-info/INSTALLER | 1 + .../Unidecode-1.1.1.dist-info/LICENSE.txt | 339 + .../Unidecode-1.1.1.dist-info/METADATA | 261 + .../Unidecode-1.1.1.dist-info/RECORD | 394 + .../Unidecode-1.1.1.dist-info/WHEEL | 6 + .../entry_points.txt | 3 + .../Unidecode-1.1.1.dist-info/metadata.json | 1 + .../Unidecode-1.1.1.dist-info/top_level.txt | 1 + .../__pycache__/_virtualenv.cpython-38.pyc | Bin 0 -> 3959 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20510 bytes .../__pycache__/contextlib2.cpython-38.pyc | Bin 0 -> 15500 bytes .../__pycache__/distro.cpython-38.pyc | Bin 0 -> 36551 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 240322 bytes .../__pycache__/retrying.cpython-38.pyc | Bin 0 -> 7992 bytes .../__pycache__/six.cpython-38.pyc | Bin 0 -> 26874 bytes lib/python3.8/site-packages/_virtualenv.pth | 1 + lib/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 ++ .../blinker-1.4.dist-info/AUTHORS | 8 + .../blinker-1.4.dist-info/INSTALLER | 1 + .../blinker-1.4.dist-info/LICENSE | 20 + .../blinker-1.4.dist-info/METADATA | 103 + .../blinker-1.4.dist-info/RECORD | 15 + .../site-packages/blinker-1.4.dist-info/WHEEL | 5 + .../blinker-1.4.dist-info/top_level.txt | 1 + .../site-packages/blinker/__init__.py | 22 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 414 bytes .../__pycache__/_saferef.cpython-38.pyc | Bin 0 -> 7235 bytes .../__pycache__/_utilities.cpython-38.pyc | Bin 0 -> 5550 bytes .../blinker/__pycache__/base.cpython-38.pyc | Bin 0 -> 14312 bytes .../site-packages/blinker/_saferef.py | 234 + .../site-packages/blinker/_utilities.py | 163 + lib/python3.8/site-packages/blinker/base.py | 455 + .../site-packages/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 523 bytes .../__pycache__/adapter.cpython-38.pyc | Bin 0 -> 3045 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 1756 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 682 bytes .../__pycache__/controller.cpython-38.pyc | Bin 0 -> 7749 bytes .../__pycache__/filewrapper.cpython-38.pyc | Bin 0 -> 2149 bytes .../__pycache__/serialize.cpython-38.pyc | Bin 0 -> 4174 bytes .../__pycache__/wrapper.cpython-38.pyc | Bin 0 -> 647 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 -> 267 bytes .../__pycache__/file_cache.cpython-38.pyc | Bin 0 -> 3241 bytes .../__pycache__/redis_cache.cpython-38.pyc | Bin 0 -> 1527 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 -> 230 bytes .../certifi/__pycache__/core.cpython-38.pyc | Bin 0 -> 454 bytes .../site-packages/certifi/cacert.pem | 4602 +++++++++ lib/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 -> 823 bytes .../__pycache__/big5freq.cpython-38.pyc | Bin 0 -> 27152 bytes .../__pycache__/big5prober.cpython-38.pyc | Bin 0 -> 1107 bytes .../chardistribution.cpython-38.pyc | Bin 0 -> 6193 bytes .../charsetgroupprober.cpython-38.pyc | Bin 0 -> 2224 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 0 -> 3456 bytes .../codingstatemachine.cpython-38.pyc | Bin 0 -> 2883 bytes .../chardet/__pycache__/compat.cpython-38.pyc | Bin 0 -> 328 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 0 -> 1114 bytes .../chardet/__pycache__/enums.cpython-38.pyc | Bin 0 -> 2621 bytes .../__pycache__/escprober.cpython-38.pyc | Bin 0 -> 2606 bytes .../chardet/__pycache__/escsm.cpython-38.pyc | Bin 0 -> 7447 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 0 -> 2424 bytes .../__pycache__/euckrfreq.cpython-38.pyc | Bin 0 -> 12036 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 0 -> 1115 bytes .../__pycache__/euctwfreq.cpython-38.pyc | Bin 0 -> 27156 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 0 -> 1115 bytes .../__pycache__/gb2312freq.cpython-38.pyc | Bin 0 -> 19080 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 0 -> 1123 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 0 -> 2996 bytes .../__pycache__/jisfreq.cpython-38.pyc | Bin 0 -> 22108 bytes .../chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 0 -> 37581 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 0 -> 23605 bytes .../langcyrillicmodel.cpython-38.pyc | Bin 0 -> 29069 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 0 -> 23563 bytes .../langhebrewmodel.cpython-38.pyc | Bin 0 -> 22190 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 0 -> 22169 bytes .../langturkishmodel.cpython-38.pyc | Bin 0 -> 22192 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 0 -> 3376 bytes .../mbcharsetprober.cpython-38.pyc | Bin 0 -> 2239 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 0 -> 1104 bytes .../chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 0 -> 16727 bytes .../sbcharsetprober.cpython-38.pyc | Bin 0 -> 2992 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 0 -> 1602 bytes .../__pycache__/sjisprober.cpython-38.pyc | Bin 0 -> 2460 bytes .../universaldetector.cpython-38.pyc | Bin 0 -> 5804 bytes .../__pycache__/utf8prober.cpython-38.pyc | Bin 0 -> 1965 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 412 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 + lib/python3.8/site-packages/chardet/compat.py | 34 + .../site-packages/chardet/cp949prober.py | 49 + lib/python3.8/site-packages/chardet/enums.py | 76 + .../site-packages/chardet/escprober.py | 101 + lib/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 + lib/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 + lib/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 -> 417 bytes .../colorama/__pycache__/ansi.cpython-38.pyc | Bin 0 -> 3202 bytes .../__pycache__/ansitowin32.cpython-38.pyc | Bin 0 -> 7711 bytes .../__pycache__/initialise.cpython-38.pyc | Bin 0 -> 1678 bytes .../colorama/__pycache__/win32.cpython-38.pyc | Bin 0 -> 3954 bytes .../__pycache__/winterm.cpython-38.pyc | Bin 0 -> 4638 bytes lib/python3.8/site-packages/colorama/ansi.py | 102 + .../site-packages/colorama/ansitowin32.py | 257 + .../site-packages/colorama/initialise.py | 80 + lib/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 lib/python3.8/site-packages/contextlib2.py | 518 ++ .../site-packages/dateutil/__init__.py | 8 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 349 bytes .../__pycache__/_common.cpython-38.pyc | Bin 0 -> 1395 bytes .../__pycache__/_version.cpython-38.pyc | Bin 0 -> 161 bytes .../__pycache__/easter.cpython-38.pyc | Bin 0 -> 2166 bytes .../__pycache__/relativedelta.cpython-38.pyc | Bin 0 -> 14873 bytes .../dateutil/__pycache__/rrule.cpython-38.pyc | Bin 0 -> 43478 bytes .../dateutil/__pycache__/tzwin.cpython-38.pyc | Bin 0 -> 164 bytes .../dateutil/__pycache__/utils.cpython-38.pyc | Bin 0 -> 2226 bytes .../site-packages/dateutil/_common.py | 43 + .../site-packages/dateutil/_version.py | 4 + .../site-packages/dateutil/easter.py | 89 + .../site-packages/dateutil/parser/__init__.py | 61 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2047 bytes .../parser/__pycache__/_parser.cpython-38.pyc | Bin 0 -> 40422 bytes .../__pycache__/isoparser.cpython-38.pyc | Bin 0 -> 11154 bytes .../site-packages/dateutil/parser/_parser.py | 1609 ++++ .../dateutil/parser/isoparser.py | 411 + .../site-packages/dateutil/relativedelta.py | 599 ++ lib/python3.8/site-packages/dateutil/rrule.py | 1735 ++++ .../site-packages/dateutil/tz/__init__.py | 12 + .../tz/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 680 bytes .../tz/__pycache__/_common.cpython-38.pyc | Bin 0 -> 10723 bytes .../tz/__pycache__/_factories.cpython-38.pyc | Bin 0 -> 2834 bytes .../dateutil/tz/__pycache__/tz.cpython-38.pyc | Bin 0 -> 44848 bytes .../tz/__pycache__/win.cpython-38.pyc | Bin 0 -> 11228 bytes .../site-packages/dateutil/tz/_common.py | 419 + .../site-packages/dateutil/tz/_factories.py | 80 + lib/python3.8/site-packages/dateutil/tz/tz.py | 1849 ++++ .../site-packages/dateutil/tz/win.py | 370 + lib/python3.8/site-packages/dateutil/tzwin.py | 2 + lib/python3.8/site-packages/dateutil/utils.py | 71 + .../dateutil/zoneinfo/__init__.py | 167 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 5662 bytes .../__pycache__/rebuild.cpython-38.pyc | Bin 0 -> 1871 bytes .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 0 -> 153315 bytes .../dateutil/zoneinfo/rebuild.py | 53 + .../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 -> 1032 bytes .../distlib/__pycache__/compat.cpython-38.pyc | Bin 0 -> 32181 bytes .../__pycache__/resources.cpython-38.pyc | Bin 0 -> 10982 bytes .../__pycache__/scripts.cpython-38.pyc | Bin 0 -> 10847 bytes .../distlib/__pycache__/util.cpython-38.pyc | Bin 0 -> 48135 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 ++++++ lib/python3.8/site-packages/distlib/compat.py | 1120 +++ .../site-packages/distlib/database.py | 1339 +++ lib/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 + lib/python3.8/site-packages/distlib/util.py | 1761 ++++ .../site-packages/distlib/version.py | 736 ++ lib/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 +++ .../docutils-0.16.dist-info/COPYING.txt | 137 + .../docutils-0.16.dist-info/INSTALLER | 1 + .../docutils-0.16.dist-info/METADATA | 64 + .../docutils-0.16.dist-info/RECORD | 332 + .../docutils-0.16.dist-info/WHEEL | 6 + .../docutils-0.16.dist-info/top_level.txt | 1 + .../site-packages/docutils/__init__.py | 233 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3952 bytes .../docutils/__pycache__/core.cpython-38.pyc | Bin 0 -> 21680 bytes .../__pycache__/examples.cpython-38.pyc | Bin 0 -> 3336 bytes .../__pycache__/frontend.cpython-38.pyc | Bin 0 -> 26902 bytes .../docutils/__pycache__/io.cpython-38.pyc | Bin 0 -> 13275 bytes .../docutils/__pycache__/nodes.cpython-38.pyc | Bin 0 -> 82071 bytes .../__pycache__/statemachine.cpython-38.pyc | Bin 0 -> 49143 bytes lib/python3.8/site-packages/docutils/core.py | 666 ++ .../site-packages/docutils/examples.py | 97 + .../site-packages/docutils/frontend.py | 863 ++ lib/python3.8/site-packages/docutils/io.py | 481 + .../docutils/languages/__init__.py | 47 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1118 bytes .../languages/__pycache__/af.cpython-38.pyc | Bin 0 -> 1057 bytes .../languages/__pycache__/ca.cpython-38.pyc | Bin 0 -> 1100 bytes .../languages/__pycache__/cs.cpython-38.pyc | Bin 0 -> 1079 bytes .../languages/__pycache__/da.cpython-38.pyc | Bin 0 -> 1079 bytes .../languages/__pycache__/de.cpython-38.pyc | Bin 0 -> 1061 bytes .../languages/__pycache__/en.cpython-38.pyc | Bin 0 -> 1012 bytes .../languages/__pycache__/eo.cpython-38.pyc | Bin 0 -> 1072 bytes .../languages/__pycache__/es.cpython-38.pyc | Bin 0 -> 1134 bytes .../languages/__pycache__/fa.cpython-38.pyc | Bin 0 -> 1163 bytes .../languages/__pycache__/fi.cpython-38.pyc | Bin 0 -> 1149 bytes .../languages/__pycache__/fr.cpython-38.pyc | Bin 0 -> 1082 bytes .../languages/__pycache__/gl.cpython-38.pyc | Bin 0 -> 1124 bytes .../languages/__pycache__/he.cpython-38.pyc | Bin 0 -> 1147 bytes .../languages/__pycache__/it.cpython-38.pyc | Bin 0 -> 1084 bytes .../languages/__pycache__/ja.cpython-38.pyc | Bin 0 -> 1087 bytes .../languages/__pycache__/ko.cpython-38.pyc | Bin 0 -> 1065 bytes .../languages/__pycache__/lt.cpython-38.pyc | Bin 0 -> 1140 bytes .../languages/__pycache__/lv.cpython-38.pyc | Bin 0 -> 1148 bytes .../languages/__pycache__/nl.cpython-38.pyc | Bin 0 -> 1058 bytes .../languages/__pycache__/pl.cpython-38.pyc | Bin 0 -> 1095 bytes .../__pycache__/pt_br.cpython-38.pyc | Bin 0 -> 1123 bytes .../languages/__pycache__/ru.cpython-38.pyc | Bin 0 -> 1462 bytes .../languages/__pycache__/sk.cpython-38.pyc | Bin 0 -> 1092 bytes .../languages/__pycache__/sv.cpython-38.pyc | Bin 0 -> 1062 bytes .../__pycache__/zh_cn.cpython-38.pyc | Bin 0 -> 1114 bytes .../__pycache__/zh_tw.cpython-38.pyc | Bin 0 -> 1452 bytes .../site-packages/docutils/languages/af.py | 58 + .../site-packages/docutils/languages/ca.py | 60 + .../site-packages/docutils/languages/cs.py | 60 + .../site-packages/docutils/languages/da.py | 62 + .../site-packages/docutils/languages/de.py | 58 + .../site-packages/docutils/languages/en.py | 60 + .../site-packages/docutils/languages/eo.py | 61 + .../site-packages/docutils/languages/es.py | 59 + .../site-packages/docutils/languages/fa.py | 61 + .../site-packages/docutils/languages/fi.py | 60 + .../site-packages/docutils/languages/fr.py | 58 + .../site-packages/docutils/languages/gl.py | 63 + .../site-packages/docutils/languages/he.py | 60 + .../site-packages/docutils/languages/it.py | 58 + .../site-packages/docutils/languages/ja.py | 61 + .../site-packages/docutils/languages/ko.py | 61 + .../site-packages/docutils/languages/lt.py | 61 + .../site-packages/docutils/languages/lv.py | 60 + .../site-packages/docutils/languages/nl.py | 60 + .../site-packages/docutils/languages/pl.py | 62 + .../site-packages/docutils/languages/pt_br.py | 60 + .../site-packages/docutils/languages/ru.py | 59 + .../site-packages/docutils/languages/sk.py | 58 + .../site-packages/docutils/languages/sv.py | 60 + .../site-packages/docutils/languages/zh_cn.py | 67 + .../site-packages/docutils/languages/zh_tw.py | 66 + lib/python3.8/site-packages/docutils/nodes.py | 2317 +++++ .../docutils/parsers/__init__.py | 51 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1732 bytes .../parsers/__pycache__/null.cpython-38.pyc | Bin 0 -> 631 bytes .../site-packages/docutils/parsers/null.py | 20 + .../docutils/parsers/rst/__init__.py | 416 + .../rst/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 14966 bytes .../rst/__pycache__/roles.cpython-38.pyc | Bin 0 -> 11360 bytes .../rst/__pycache__/states.cpython-38.pyc | Bin 0 -> 92280 bytes .../__pycache__/tableparser.cpython-38.pyc | Bin 0 -> 17572 bytes .../parsers/rst/directives/__init__.py | 419 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 12820 bytes .../__pycache__/admonitions.cpython-38.pyc | Bin 0 -> 3056 bytes .../__pycache__/body.cpython-38.pyc | Bin 0 -> 7941 bytes .../__pycache__/html.cpython-38.pyc | Bin 0 -> 2911 bytes .../__pycache__/images.cpython-38.pyc | Bin 0 -> 4976 bytes .../__pycache__/misc.cpython-38.pyc | Bin 0 -> 14453 bytes .../__pycache__/parts.cpython-38.pyc | Bin 0 -> 3904 bytes .../__pycache__/references.cpython-38.pyc | Bin 0 -> 994 bytes .../__pycache__/tables.cpython-38.pyc | Bin 0 -> 15194 bytes .../parsers/rst/directives/admonitions.py | 99 + .../docutils/parsers/rst/directives/body.py | 288 + .../docutils/parsers/rst/directives/html.py | 88 + .../docutils/parsers/rst/directives/images.py | 171 + .../docutils/parsers/rst/directives/misc.py | 556 ++ .../docutils/parsers/rst/directives/parts.py | 126 + .../parsers/rst/directives/references.py | 29 + .../docutils/parsers/rst/directives/tables.py | 513 ++ .../docutils/parsers/rst/include/README.txt | 17 + .../docutils/parsers/rst/include/isoamsa.txt | 162 + .../docutils/parsers/rst/include/isoamsb.txt | 126 + .../docutils/parsers/rst/include/isoamsc.txt | 29 + .../docutils/parsers/rst/include/isoamsn.txt | 96 + .../docutils/parsers/rst/include/isoamso.txt | 62 + .../docutils/parsers/rst/include/isoamsr.txt | 191 + .../docutils/parsers/rst/include/isobox.txt | 46 + .../docutils/parsers/rst/include/isocyr1.txt | 73 + .../docutils/parsers/rst/include/isocyr2.txt | 32 + .../docutils/parsers/rst/include/isodia.txt | 20 + .../docutils/parsers/rst/include/isogrk1.txt | 55 + .../docutils/parsers/rst/include/isogrk2.txt | 26 + .../docutils/parsers/rst/include/isogrk3.txt | 52 + .../parsers/rst/include/isogrk4-wide.txt | 49 + .../docutils/parsers/rst/include/isogrk4.txt | 8 + .../docutils/parsers/rst/include/isolat1.txt | 68 + .../docutils/parsers/rst/include/isolat2.txt | 128 + .../parsers/rst/include/isomfrk-wide.txt | 58 + .../docutils/parsers/rst/include/isomfrk.txt | 11 + .../parsers/rst/include/isomopf-wide.txt | 32 + .../docutils/parsers/rst/include/isomopf.txt | 13 + .../parsers/rst/include/isomscr-wide.txt | 58 + .../docutils/parsers/rst/include/isomscr.txt | 17 + .../docutils/parsers/rst/include/isonum.txt | 82 + .../docutils/parsers/rst/include/isopub.txt | 90 + .../docutils/parsers/rst/include/isotech.txt | 168 + .../docutils/parsers/rst/include/mmlalias.txt | 554 ++ .../parsers/rst/include/mmlextra-wide.txt | 113 + .../docutils/parsers/rst/include/mmlextra.txt | 87 + .../docutils/parsers/rst/include/s5defs.txt | 68 + .../parsers/rst/include/xhtml1-lat1.txt | 102 + .../parsers/rst/include/xhtml1-special.txt | 37 + .../parsers/rst/include/xhtml1-symbol.txt | 130 + .../parsers/rst/languages/__init__.py | 36 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 799 bytes .../languages/__pycache__/af.cpython-38.pyc | Bin 0 -> 2350 bytes .../languages/__pycache__/ca.cpython-38.pyc | Bin 0 -> 2705 bytes .../languages/__pycache__/cs.cpython-38.pyc | Bin 0 -> 3373 bytes .../languages/__pycache__/da.cpython-38.pyc | Bin 0 -> 2373 bytes .../languages/__pycache__/de.cpython-38.pyc | Bin 0 -> 2084 bytes .../languages/__pycache__/en.cpython-38.pyc | Bin 0 -> 1717 bytes .../languages/__pycache__/eo.cpython-38.pyc | Bin 0 -> 2270 bytes .../languages/__pycache__/es.cpython-38.pyc | Bin 0 -> 2487 bytes .../languages/__pycache__/fa.cpython-38.pyc | Bin 0 -> 2366 bytes .../languages/__pycache__/fi.cpython-38.pyc | Bin 0 -> 2387 bytes .../languages/__pycache__/fr.cpython-38.pyc | Bin 0 -> 2271 bytes .../languages/__pycache__/gl.cpython-38.pyc | Bin 0 -> 2236 bytes .../languages/__pycache__/he.cpython-38.pyc | Bin 0 -> 1860 bytes .../languages/__pycache__/it.cpython-38.pyc | Bin 0 -> 2125 bytes .../languages/__pycache__/ja.cpython-38.pyc | Bin 0 -> 2482 bytes .../languages/__pycache__/ko.cpython-38.pyc | Bin 0 -> 2267 bytes .../languages/__pycache__/lt.cpython-38.pyc | Bin 0 -> 2301 bytes .../languages/__pycache__/lv.cpython-38.pyc | Bin 0 -> 2263 bytes .../languages/__pycache__/nl.cpython-38.pyc | Bin 0 -> 2300 bytes .../languages/__pycache__/pl.cpython-38.pyc | Bin 0 -> 2077 bytes .../__pycache__/pt_br.cpython-38.pyc | Bin 0 -> 2485 bytes .../languages/__pycache__/ru.cpython-38.pyc | Bin 0 -> 2814 bytes .../languages/__pycache__/sk.cpython-38.pyc | Bin 0 -> 2818 bytes .../languages/__pycache__/sv.cpython-38.pyc | Bin 0 -> 1957 bytes .../__pycache__/zh_cn.cpython-38.pyc | Bin 0 -> 2664 bytes .../__pycache__/zh_tw.cpython-38.pyc | Bin 0 -> 3643 bytes .../docutils/parsers/rst/languages/af.py | 106 + .../docutils/parsers/rst/languages/ca.py | 125 + .../docutils/parsers/rst/languages/cs.py | 108 + .../docutils/parsers/rst/languages/da.py | 113 + .../docutils/parsers/rst/languages/de.py | 105 + .../docutils/parsers/rst/languages/en.py | 110 + .../docutils/parsers/rst/languages/eo.py | 118 + .../docutils/parsers/rst/languages/es.py | 125 + .../docutils/parsers/rst/languages/fa.py | 102 + .../docutils/parsers/rst/languages/fi.py | 98 + .../docutils/parsers/rst/languages/fr.py | 103 + .../docutils/parsers/rst/languages/gl.py | 111 + .../docutils/parsers/rst/languages/he.py | 108 + .../docutils/parsers/rst/languages/it.py | 97 + .../docutils/parsers/rst/languages/ja.py | 119 + .../docutils/parsers/rst/languages/ko.py | 111 + .../docutils/parsers/rst/languages/lt.py | 109 + .../docutils/parsers/rst/languages/lv.py | 108 + .../docutils/parsers/rst/languages/nl.py | 112 + .../docutils/parsers/rst/languages/pl.py | 102 + .../docutils/parsers/rst/languages/pt_br.py | 108 + .../docutils/parsers/rst/languages/ru.py | 89 + .../docutils/parsers/rst/languages/sk.py | 95 + .../docutils/parsers/rst/languages/sv.py | 95 + .../docutils/parsers/rst/languages/zh_cn.py | 104 + .../docutils/parsers/rst/languages/zh_tw.py | 109 + .../docutils/parsers/rst/roles.py | 399 + .../docutils/parsers/rst/states.py | 3116 +++++++ .../docutils/parsers/rst/tableparser.py | 542 ++ .../docutils/readers/__init__.py | 112 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3303 bytes .../__pycache__/doctree.cpython-38.pyc | Bin 0 -> 1497 bytes .../readers/__pycache__/pep.cpython-38.pyc | Bin 0 -> 1612 bytes .../__pycache__/standalone.cpython-38.pyc | Bin 0 -> 1941 bytes .../site-packages/docutils/readers/doctree.py | 46 + .../site-packages/docutils/readers/pep.py | 48 + .../docutils/readers/standalone.py | 66 + .../site-packages/docutils/statemachine.py | 1539 ++++ .../docutils/transforms/__init__.py | 172 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 5358 bytes .../__pycache__/components.cpython-38.pyc | Bin 0 -> 2145 bytes .../__pycache__/frontmatter.cpython-38.pyc | Bin 0 -> 16529 bytes .../__pycache__/misc.cpython-38.pyc | Bin 0 -> 3785 bytes .../__pycache__/parts.cpython-38.pyc | Bin 0 -> 6015 bytes .../__pycache__/peps.cpython-38.pyc | Bin 0 -> 8982 bytes .../__pycache__/references.cpython-38.pyc | Bin 0 -> 24333 bytes .../__pycache__/universal.cpython-38.pyc | Bin 0 -> 8493 bytes .../__pycache__/writer_aux.cpython-38.pyc | Bin 0 -> 2400 bytes .../docutils/transforms/components.py | 52 + .../docutils/transforms/frontmatter.py | 548 ++ .../site-packages/docutils/transforms/misc.py | 144 + .../docutils/transforms/parts.py | 180 + .../site-packages/docutils/transforms/peps.py | 305 + .../docutils/transforms/references.py | 911 ++ .../docutils/transforms/universal.py | 320 + .../docutils/transforms/writer_aux.py | 88 + .../site-packages/docutils/utils/__init__.py | 797 ++ .../utils/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 25111 bytes .../__pycache__/code_analyzer.cpython-38.pyc | Bin 0 -> 4373 bytes .../error_reporting.cpython-38.pyc | Bin 0 -> 6367 bytes .../punctuation_chars.cpython-38.pyc | Bin 0 -> 2316 bytes .../utils/__pycache__/roman.cpython-38.pyc | Bin 0 -> 2809 bytes .../__pycache__/smartquotes.cpython-38.pyc | Bin 0 -> 29494 bytes .../__pycache__/urischemes.cpython-38.pyc | Bin 0 -> 5205 bytes .../docutils/utils/code_analyzer.py | 142 + .../docutils/utils/error_reporting.py | 229 + .../docutils/utils/math/__init__.py | 48 + .../math/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1453 bytes .../__pycache__/latex2mathml.cpython-38.pyc | Bin 0 -> 15236 bytes .../math/__pycache__/math2html.cpython-38.pyc | Bin 0 -> 195613 bytes .../tex2mathml_extern.cpython-38.pyc | Bin 0 -> 3344 bytes .../__pycache__/tex2unichar.cpython-38.pyc | Bin 0 -> 14152 bytes .../__pycache__/unichar2tex.cpython-38.pyc | Bin 0 -> 16724 bytes .../docutils/utils/math/latex2mathml.py | 568 ++ .../docutils/utils/math/math2html.py | 5383 +++++++++++ .../docutils/utils/math/tex2mathml_extern.py | 148 + .../docutils/utils/math/tex2unichar.py | 662 ++ .../docutils/utils/math/unichar2tex.py | 788 ++ .../docutils/utils/punctuation_chars.py | 122 + .../site-packages/docutils/utils/roman.py | 82 + .../docutils/utils/smartquotes.py | 1014 ++ .../docutils/utils/urischemes.py | 136 + .../docutils/writers/__init__.py | 143 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 4062 bytes .../__pycache__/_html_base.cpython-38.pyc | Bin 0 -> 57667 bytes .../__pycache__/docutils_xml.cpython-38.pyc | Bin 0 -> 5717 bytes .../__pycache__/manpage.cpython-38.pyc | Bin 0 -> 41926 bytes .../writers/__pycache__/null.cpython-38.pyc | Bin 0 -> 620 bytes .../__pycache__/pseudoxml.cpython-38.pyc | Bin 0 -> 938 bytes .../docutils/writers/_html_base.py | 1670 ++++ .../docutils/writers/docutils_xml.py | 199 + .../docutils/writers/html4css1/__init__.py | 824 ++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 28855 bytes .../docutils/writers/html4css1/html4css1.css | 349 + .../docutils/writers/html4css1/template.txt | 8 + .../writers/html5_polyglot/__init__.py | 219 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 7539 bytes .../docutils/writers/html5_polyglot/math.css | 276 + .../writers/html5_polyglot/minimal.css | 284 + .../docutils/writers/html5_polyglot/plain.css | 298 + .../writers/html5_polyglot/template.txt | 8 + .../docutils/writers/latex2e/__init__.py | 3216 +++++++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 92079 bytes .../docutils/writers/latex2e/default.tex | 14 + .../docutils/writers/latex2e/titlepage.tex | 20 + .../docutils/writers/latex2e/xelatex.tex | 21 + .../site-packages/docutils/writers/manpage.py | 1178 +++ .../site-packages/docutils/writers/null.py | 21 + .../docutils/writers/odf_odt/__init__.py | 3534 +++++++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 94266 bytes .../pygmentsformatter.cpython-38.pyc | Bin 0 -> 2822 bytes .../writers/odf_odt/pygmentsformatter.py | 109 + .../docutils/writers/odf_odt/styles.odt | Bin 0 -> 16500 bytes .../docutils/writers/pep_html/__init__.py | 105 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3313 bytes .../docutils/writers/pep_html/pep.css | 344 + .../docutils/writers/pep_html/template.txt | 29 + .../docutils/writers/pseudoxml.py | 31 + .../docutils/writers/s5_html/__init__.py | 353 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 10518 bytes .../writers/s5_html/themes/README.txt | 6 + .../writers/s5_html/themes/big-black/__base__ | 2 + .../s5_html/themes/big-black/framing.css | 25 + .../s5_html/themes/big-black/pretty.css | 109 + .../s5_html/themes/big-white/framing.css | 24 + .../s5_html/themes/big-white/pretty.css | 107 + .../writers/s5_html/themes/default/blank.gif | Bin 0 -> 49 bytes .../s5_html/themes/default/framing.css | 25 + .../s5_html/themes/default/iepngfix.htc | 42 + .../writers/s5_html/themes/default/opera.css | 8 + .../s5_html/themes/default/outline.css | 16 + .../writers/s5_html/themes/default/pretty.css | 120 + .../writers/s5_html/themes/default/print.css | 24 + .../s5_html/themes/default/s5-core.css | 11 + .../writers/s5_html/themes/default/slides.css | 10 + .../writers/s5_html/themes/default/slides.js | 558 ++ .../s5_html/themes/medium-black/__base__ | 2 + .../s5_html/themes/medium-black/pretty.css | 115 + .../s5_html/themes/medium-white/framing.css | 24 + .../s5_html/themes/medium-white/pretty.css | 113 + .../s5_html/themes/small-black/__base__ | 2 + .../s5_html/themes/small-black/pretty.css | 116 + .../s5_html/themes/small-white/framing.css | 24 + .../s5_html/themes/small-white/pretty.css | 114 + .../docutils/writers/xetex/__init__.py | 150 + .../xetex/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 4128 bytes lib/python3.8/site-packages/easy_install.py | 5 + .../feedgenerator-1.9.1.dist-info/INSTALLER | 1 + .../feedgenerator-1.9.1.dist-info/LICENSE | 28 + .../feedgenerator-1.9.1.dist-info/METADATA | 49 + .../feedgenerator-1.9.1.dist-info/RECORD | 26 + .../feedgenerator-1.9.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/feedgenerator/__init__.py | 24 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 943 bytes .../feedgenerator/django/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 156 bytes .../feedgenerator/django/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 162 bytes .../__pycache__/datetime_safe.cpython-38.pyc | Bin 0 -> 2655 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 0 -> 7584 bytes .../__pycache__/feedgenerator.cpython-38.pyc | Bin 0 -> 13130 bytes .../__pycache__/functional.cpython-38.pyc | Bin 0 -> 13393 bytes .../utils/__pycache__/six.cpython-38.pyc | Bin 0 -> 10004 bytes .../utils/__pycache__/timezone.cpython-38.pyc | Bin 0 -> 7113 bytes .../utils/__pycache__/xmlutils.cpython-38.pyc | Bin 0 -> 1075 bytes .../django/utils/datetime_safe.py | 89 + .../feedgenerator/django/utils/encoding.py | 256 + .../django/utils/feedgenerator.py | 404 + .../feedgenerator/django/utils/functional.py | 370 + .../feedgenerator/django/utils/six.py | 370 + .../feedgenerator/django/utils/timezone.py | 292 + .../feedgenerator/django/utils/xmlutils.py | 23 + .../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 -> 1273 bytes .../__pycache__/_ihatexml.cpython-38.pyc | Bin 0 -> 13762 bytes .../__pycache__/_inputstream.cpython-38.pyc | Bin 0 -> 21854 bytes .../__pycache__/_tokenizer.cpython-38.pyc | Bin 0 -> 39620 bytes .../__pycache__/_utils.cpython-38.pyc | Bin 0 -> 3308 bytes .../__pycache__/constants.cpython-38.pyc | Bin 0 -> 66327 bytes .../__pycache__/html5parser.cpython-38.pyc | Bin 0 -> 95137 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 0 -> 10786 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 -> 399 bytes .../_trie/__pycache__/_base.cpython-38.pyc | Bin 0 -> 1504 bytes .../_trie/__pycache__/datrie.cpython-38.pyc | Bin 0 -> 1999 bytes .../_trie/__pycache__/py.cpython-38.pyc | Bin 0 -> 2223 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 -> 3298 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 11312 bytes .../__pycache__/etree.cpython-38.pyc | Bin 0 -> 11806 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 -> 3979 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 lib/python3.8/site-packages/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 231 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 0 -> 9019 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 0 -> 21355 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 0 -> 1783 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 0 -> 185 bytes lib/python3.8/site-packages/idna/codec.py | 118 + lib/python3.8/site-packages/idna/compat.py | 12 + lib/python3.8/site-packages/idna/core.py | 396 + lib/python3.8/site-packages/idna/idnadata.py | 1979 ++++ lib/python3.8/site-packages/idna/intranges.py | 53 + .../site-packages/idna/package_data.py | 2 + lib/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 ++++ .../site-packages/jinja2/__init__.py | 44 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1779 bytes .../jinja2/__pycache__/_compat.cpython-38.pyc | Bin 0 -> 3874 bytes .../__pycache__/_identifier.cpython-38.pyc | Bin 0 -> 1862 bytes .../__pycache__/asyncfilters.cpython-38.pyc | Bin 0 -> 4825 bytes .../__pycache__/asyncsupport.cpython-38.pyc | Bin 0 -> 8191 bytes .../jinja2/__pycache__/bccache.cpython-38.pyc | Bin 0 -> 12209 bytes .../__pycache__/compiler.cpython-38.pyc | Bin 0 -> 48319 bytes .../__pycache__/constants.cpython-38.pyc | Bin 0 -> 1506 bytes .../jinja2/__pycache__/debug.cpython-38.pyc | Bin 0 -> 5146 bytes .../__pycache__/defaults.cpython-38.pyc | Bin 0 -> 1082 bytes .../__pycache__/environment.cpython-38.pyc | Bin 0 -> 43979 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 5610 bytes .../jinja2/__pycache__/ext.cpython-38.pyc | Bin 0 -> 21474 bytes .../jinja2/__pycache__/filters.cpython-38.pyc | Bin 0 -> 39780 bytes .../__pycache__/idtracking.cpython-38.pyc | Bin 0 -> 9840 bytes .../jinja2/__pycache__/lexer.cpython-38.pyc | Bin 0 -> 19354 bytes .../jinja2/__pycache__/loaders.cpython-38.pyc | Bin 0 -> 16967 bytes .../jinja2/__pycache__/meta.cpython-38.pyc | Bin 0 -> 3458 bytes .../__pycache__/nativetypes.cpython-38.pyc | Bin 0 -> 3892 bytes .../jinja2/__pycache__/nodes.cpython-38.pyc | Bin 0 -> 35385 bytes .../__pycache__/optimizer.cpython-38.pyc | Bin 0 -> 1624 bytes .../jinja2/__pycache__/parser.cpython-38.pyc | Bin 0 -> 24941 bytes .../jinja2/__pycache__/runtime.cpython-38.pyc | Bin 0 -> 27617 bytes .../jinja2/__pycache__/sandbox.cpython-38.pyc | Bin 0 -> 14101 bytes .../jinja2/__pycache__/tests.cpython-38.pyc | Bin 0 -> 5339 bytes .../jinja2/__pycache__/utils.cpython-38.pyc | Bin 0 -> 22816 bytes .../jinja2/__pycache__/visitor.cpython-38.pyc | Bin 0 -> 3267 bytes lib/python3.8/site-packages/jinja2/_compat.py | 132 + .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/asyncfilters.py | 158 + .../site-packages/jinja2/asyncsupport.py | 264 + lib/python3.8/site-packages/jinja2/bccache.py | 350 + .../site-packages/jinja2/compiler.py | 1843 ++++ .../site-packages/jinja2/constants.py | 21 + lib/python3.8/site-packages/jinja2/debug.py | 268 + .../site-packages/jinja2/defaults.py | 44 + .../site-packages/jinja2/environment.py | 1362 +++ .../site-packages/jinja2/exceptions.py | 177 + lib/python3.8/site-packages/jinja2/ext.py | 704 ++ lib/python3.8/site-packages/jinja2/filters.py | 1382 +++ .../site-packages/jinja2/idtracking.py | 290 + lib/python3.8/site-packages/jinja2/lexer.py | 848 ++ lib/python3.8/site-packages/jinja2/loaders.py | 504 + lib/python3.8/site-packages/jinja2/meta.py | 101 + .../site-packages/jinja2/nativetypes.py | 94 + lib/python3.8/site-packages/jinja2/nodes.py | 1088 +++ .../site-packages/jinja2/optimizer.py | 41 + lib/python3.8/site-packages/jinja2/parser.py | 939 ++ lib/python3.8/site-packages/jinja2/runtime.py | 1011 ++ lib/python3.8/site-packages/jinja2/sandbox.py | 510 + lib/python3.8/site-packages/jinja2/tests.py | 215 + lib/python3.8/site-packages/jinja2/utils.py | 732 ++ lib/python3.8/site-packages/jinja2/visitor.py | 81 + .../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 + .../site-packages/markdown/__init__.py | 61 + .../site-packages/markdown/__main__.py | 151 + .../site-packages/markdown/__meta__.py | 49 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1848 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 0 -> 4288 bytes .../__pycache__/__meta__.cpython-38.pyc | Bin 0 -> 1482 bytes .../__pycache__/blockparser.cpython-38.pyc | Bin 0 -> 4966 bytes .../blockprocessors.cpython-38.pyc | Bin 0 -> 16755 bytes .../markdown/__pycache__/core.cpython-38.pyc | Bin 0 -> 12170 bytes .../__pycache__/inlinepatterns.cpython-38.pyc | Bin 0 -> 25292 bytes .../__pycache__/pep562.cpython-38.pyc | Bin 0 -> 8164 bytes .../__pycache__/postprocessors.cpython-38.pyc | Bin 0 -> 4626 bytes .../__pycache__/preprocessors.cpython-38.pyc | Bin 0 -> 9806 bytes .../__pycache__/serializers.cpython-38.pyc | Bin 0 -> 3215 bytes .../__pycache__/test_tools.cpython-38.pyc | Bin 0 -> 6709 bytes .../__pycache__/treeprocessors.cpython-38.pyc | Bin 0 -> 11874 bytes .../markdown/__pycache__/util.cpython-38.pyc | Bin 0 -> 13901 bytes .../site-packages/markdown/blockparser.py | 125 + .../site-packages/markdown/blockprocessors.py | 592 ++ lib/python3.8/site-packages/markdown/core.py | 406 + .../markdown/extensions/__init__.py | 107 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 4039 bytes .../__pycache__/abbr.cpython-38.pyc | Bin 0 -> 3544 bytes .../__pycache__/admonition.cpython-38.pyc | Bin 0 -> 3003 bytes .../__pycache__/attr_list.cpython-38.pyc | Bin 0 -> 4695 bytes .../__pycache__/codehilite.cpython-38.pyc | Bin 0 -> 8083 bytes .../__pycache__/def_list.cpython-38.pyc | Bin 0 -> 3542 bytes .../__pycache__/extra.cpython-38.pyc | Bin 0 -> 2298 bytes .../__pycache__/fenced_code.cpython-38.pyc | Bin 0 -> 3526 bytes .../__pycache__/footnotes.cpython-38.pyc | Bin 0 -> 12157 bytes .../__pycache__/legacy_attrs.cpython-38.pyc | Bin 0 -> 3181 bytes .../__pycache__/legacy_em.cpython-38.pyc | Bin 0 -> 1884 bytes .../__pycache__/md_in_html.cpython-38.pyc | Bin 0 -> 3389 bytes .../__pycache__/meta.cpython-38.pyc | Bin 0 -> 2476 bytes .../__pycache__/nl2br.cpython-38.pyc | Bin 0 -> 1211 bytes .../__pycache__/sane_lists.cpython-38.pyc | Bin 0 -> 2194 bytes .../__pycache__/smarty.cpython-38.pyc | Bin 0 -> 8983 bytes .../__pycache__/tables.cpython-38.pyc | Bin 0 -> 5568 bytes .../extensions/__pycache__/toc.cpython-38.pyc | Bin 0 -> 10105 bytes .../__pycache__/wikilinks.cpython-38.pyc | Bin 0 -> 3212 bytes .../site-packages/markdown/extensions/abbr.py | 94 + .../markdown/extensions/admonition.py | 94 + .../markdown/extensions/attr_list.py | 167 + .../markdown/extensions/codehilite.py | 270 + .../markdown/extensions/def_list.py | 109 + .../markdown/extensions/extra.py | 58 + .../markdown/extensions/fenced_code.py | 109 + .../markdown/extensions/footnotes.py | 418 + .../markdown/extensions/legacy_attrs.py | 67 + .../markdown/extensions/legacy_em.py | 49 + .../markdown/extensions/md_in_html.py | 100 + .../site-packages/markdown/extensions/meta.py | 79 + .../markdown/extensions/nl2br.py | 33 + .../markdown/extensions/sane_lists.py | 54 + .../markdown/extensions/smarty.py | 263 + .../markdown/extensions/tables.py | 223 + .../site-packages/markdown/extensions/toc.py | 368 + .../markdown/extensions/wikilinks.py | 87 + .../site-packages/markdown/inlinepatterns.py | 881 ++ .../site-packages/markdown/pep562.py | 245 + .../site-packages/markdown/postprocessors.py | 117 + .../site-packages/markdown/preprocessors.py | 370 + .../site-packages/markdown/serializers.py | 189 + .../site-packages/markdown/test_tools.py | 180 + .../site-packages/markdown/treeprocessors.py | 435 + lib/python3.8/site-packages/markdown/util.py | 463 + .../site-packages/markupsafe/__init__.py | 327 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 10930 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 739 bytes .../__pycache__/_constants.cpython-38.pyc | Bin 0 -> 4235 bytes .../__pycache__/_native.cpython-38.pyc | Bin 0 -> 2113 bytes .../site-packages/markupsafe/_compat.py | 33 + .../site-packages/markupsafe/_constants.py | 264 + .../site-packages/markupsafe/_native.py | 69 + .../site-packages/markupsafe/_speedups.c | 423 + .../_speedups.cpython-38-x86_64-linux-gnu.so | Bin 0 -> 48016 bytes .../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 -> 1928 bytes .../__pycache__/_version.cpython-38.pyc | Bin 0 -> 192 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 1826 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 -> 707 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 545 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1122 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2871 bytes .../__pycache__/_typing.cpython-38.pyc | Bin 0 -> 1450 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 9290 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 4053 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 20300 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 16874 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1539 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 13314 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 ++ lib/python3.8/site-packages/packaging/tags.py | 739 ++ .../site-packages/packaging/utils.py | 62 + .../site-packages/packaging/version.py | 535 ++ .../pelican-4.2.0.dist-info/INSTALLER | 1 + .../pelican-4.2.0.dist-info/LICENSE | 661 ++ .../pelican-4.2.0.dist-info/METADATA | 538 ++ .../pelican-4.2.0.dist-info/RECORD | 119 + .../pelican-4.2.0.dist-info/WHEEL | 6 + .../pelican-4.2.0.dist-info/entry_points.txt | 6 + .../pelican-4.2.0.dist-info/top_level.txt | 1 + .../site-packages/pelican/__init__.py | 578 ++ .../site-packages/pelican/__main__.py | 10 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 15195 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 0 -> 341 bytes .../pelican/__pycache__/cache.cpython-38.pyc | Bin 0 -> 5020 bytes .../__pycache__/contents.cpython-38.pyc | Bin 0 -> 16102 bytes .../__pycache__/generators.cpython-38.pyc | Bin 0 -> 28005 bytes .../pelican/__pycache__/log.cpython-38.pyc | Bin 0 -> 8519 bytes .../__pycache__/paginator.cpython-38.pyc | Bin 0 -> 4895 bytes .../__pycache__/readers.cpython-38.pyc | Bin 0 -> 23730 bytes .../__pycache__/rstdirectives.cpython-38.pyc | Bin 0 -> 2609 bytes .../pelican/__pycache__/server.cpython-38.pyc | Bin 0 -> 4567 bytes .../__pycache__/settings.cpython-38.pyc | Bin 0 -> 15853 bytes .../__pycache__/signals.cpython-38.pyc | Bin 0 -> 1327 bytes .../__pycache__/urlwrappers.cpython-38.pyc | Bin 0 -> 4344 bytes .../pelican/__pycache__/utils.cpython-38.pyc | Bin 0 -> 27956 bytes .../__pycache__/writers.cpython-38.pyc | Bin 0 -> 8118 bytes lib/python3.8/site-packages/pelican/cache.py | 141 + .../site-packages/pelican/contents.py | 615 ++ .../site-packages/pelican/generators.py | 937 ++ lib/python3.8/site-packages/pelican/log.py | 269 + .../site-packages/pelican/paginator.py | 163 + .../site-packages/pelican/readers.py | 759 ++ .../site-packages/pelican/rstdirectives.py | 95 + lib/python3.8/site-packages/pelican/server.py | 143 + .../site-packages/pelican/settings.py | 668 ++ .../site-packages/pelican/signals.py | 52 + .../pelican/themes/blueidea/LICENSE | 20 + .../pelican/themes/blueidea/README.md | 54 + .../pelican/themes/blueidea/screenshot-1.png | Bin 0 -> 90734 bytes .../pelican/themes/blueidea/screenshot-2.png | Bin 0 -> 86223 bytes .../pelican/themes/blueidea/screenshot-3.png | Bin 0 -> 63019 bytes .../pelican/themes/blueidea/screenshot-4.png | Bin 0 -> 51253 bytes .../pelican/themes/blueidea/screenshot-5.png | Bin 0 -> 84742 bytes .../themes/blueidea/static/css/main.css | 474 + .../themes/blueidea/static/css/pygment.css | 66 + .../blueidea/static/css/pygment.css.save | 205 + .../themes/blueidea/static/css/reset.css | 52 + .../themes/blueidea/static/css/typogrify.css | 3 + .../themes/blueidea/static/css/wide.css | 48 + .../blueidea/static/images/icons/_licence.txt | 15 + .../blueidea/static/images/icons/facebook.png | Bin 0 -> 1204 bytes .../blueidea/static/images/icons/github.png | Bin 0 -> 1348 bytes .../static/images/icons/google-plus.png | Bin 0 -> 1411 bytes .../blueidea/static/images/icons/lastfm.png | Bin 0 -> 1395 bytes .../blueidea/static/images/icons/linkedin.png | Bin 0 -> 1257 bytes .../blueidea/static/images/icons/rss.png | Bin 0 -> 1441 bytes .../blueidea/static/images/icons/search.png | Bin 0 -> 412 bytes .../blueidea/static/images/icons/twitter.png | Bin 0 -> 1389 bytes .../blueidea/static/images/icons/vimeo.png | Bin 0 -> 1322 bytes .../blueidea/static/images/icons/youtube.png | Bin 0 -> 1504 bytes .../themes/blueidea/templates/analytics.html | 27 + .../themes/blueidea/templates/archives.html | 13 + .../themes/blueidea/templates/article.html | 35 + .../blueidea/templates/article_infos.html | 12 + .../themes/blueidea/templates/author.html | 2 + .../themes/blueidea/templates/authors.html | 15 + .../themes/blueidea/templates/base.html | 101 + .../themes/blueidea/templates/category.html | 2 + .../themes/blueidea/templates/comments.html | 1 + .../blueidea/templates/disqus_script.html | 11 + .../themes/blueidea/templates/github.html | 9 + .../themes/blueidea/templates/index.html | 60 + .../themes/blueidea/templates/page.html | 12 + .../themes/blueidea/templates/piwik.html | 19 + .../themes/blueidea/templates/tag.html | 2 + .../themes/blueidea/templates/taglist.html | 2 + .../themes/blueidea/templates/tags.html | 15 + .../blueidea/templates/translations.html | 8 + .../themes/blueidea/templates/twitter.html | 3 + .../themes/notmyidea/static/css/fonts.css | 12 + .../themes/notmyidea/static/css/main.css | 467 + .../themes/notmyidea/static/css/pygment.css | 205 + .../themes/notmyidea/static/css/reset.css | 52 + .../themes/notmyidea/static/css/typogrify.css | 3 + .../themes/notmyidea/static/css/wide.css | 48 + .../static/fonts/Yanone_Kaffeesatz_400.eot | Bin 0 -> 20932 bytes .../static/fonts/Yanone_Kaffeesatz_400.svg | 407 + .../static/fonts/Yanone_Kaffeesatz_400.ttf | Bin 0 -> 39168 bytes .../static/fonts/Yanone_Kaffeesatz_400.woff | Bin 0 -> 22256 bytes .../static/fonts/Yanone_Kaffeesatz_400.woff2 | Bin 0 -> 18320 bytes .../themes/notmyidea/static/fonts/font.css | 12 + .../notmyidea/static/images/icons/aboutme.png | Bin 0 -> 411 bytes .../static/images/icons/bitbucket.png | Bin 0 -> 3178 bytes .../static/images/icons/delicious.png | Bin 0 -> 827 bytes .../static/images/icons/facebook.png | Bin 0 -> 150 bytes .../notmyidea/static/images/icons/github.png | Bin 0 -> 606 bytes .../static/images/icons/gitorious.png | Bin 0 -> 223 bytes .../notmyidea/static/images/icons/gittip.png | Bin 0 -> 402 bytes .../static/images/icons/google-groups.png | Bin 0 -> 420 bytes .../static/images/icons/google-plus.png | Bin 0 -> 511 bytes .../static/images/icons/hackernews.png | Bin 0 -> 2771 bytes .../notmyidea/static/images/icons/lastfm.png | Bin 0 -> 840 bytes .../static/images/icons/linkedin.png | Bin 0 -> 625 bytes .../notmyidea/static/images/icons/reddit.png | Bin 0 -> 458 bytes .../notmyidea/static/images/icons/rss.png | Bin 0 -> 751 bytes .../static/images/icons/slideshare.png | Bin 0 -> 435 bytes .../static/images/icons/speakerdeck.png | Bin 0 -> 580 bytes .../static/images/icons/stackoverflow.png | Bin 0 -> 414 bytes .../notmyidea/static/images/icons/twitter.png | Bin 0 -> 416 bytes .../notmyidea/static/images/icons/vimeo.png | Bin 0 -> 349 bytes .../notmyidea/static/images/icons/youtube.png | Bin 0 -> 316 bytes .../themes/notmyidea/templates/analytics.html | 45 + .../themes/notmyidea/templates/archives.html | 13 + .../themes/notmyidea/templates/article.html | 46 + .../notmyidea/templates/article_infos.html | 23 + .../themes/notmyidea/templates/author.html | 2 + .../themes/notmyidea/templates/authors.html | 16 + .../themes/notmyidea/templates/base.html | 79 + .../themes/notmyidea/templates/category.html | 2 + .../themes/notmyidea/templates/comments.html | 1 + .../notmyidea/templates/disqus_script.html | 11 + .../themes/notmyidea/templates/github.html | 9 + .../themes/notmyidea/templates/index.html | 59 + .../themes/notmyidea/templates/page.html | 19 + .../notmyidea/templates/period_archives.html | 13 + .../themes/notmyidea/templates/tag.html | 2 + .../themes/notmyidea/templates/taglist.html | 1 + .../themes/notmyidea/templates/tags.html | 16 + .../notmyidea/templates/translations.html | 16 + .../themes/notmyidea/templates/twitter.html | 3 + .../themes/simple/templates/archives.html | 14 + .../themes/simple/templates/article.html | 67 + .../themes/simple/templates/author.html | 8 + .../themes/simple/templates/authors.html | 12 + .../pelican/themes/simple/templates/base.html | 62 + .../themes/simple/templates/categories.html | 12 + .../themes/simple/templates/category.html | 8 + .../themes/simple/templates/gosquared.html | 14 + .../themes/simple/templates/index.html | 28 + .../pelican/themes/simple/templates/page.html | 27 + .../themes/simple/templates/pagination.html | 11 + .../simple/templates/period_archives.html | 14 + .../pelican/themes/simple/templates/tag.html | 7 + .../pelican/themes/simple/templates/tags.html | 12 + .../themes/simple/templates/translations.html | 16 + .../site-packages/pelican/tools/__init__.py | 0 .../tools/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 149 bytes .../__pycache__/pelican_import.cpython-38.pyc | Bin 0 -> 24438 bytes .../pelican_quickstart.cpython-38.pyc | Bin 0 -> 8917 bytes .../__pycache__/pelican_themes.cpython-38.pyc | Bin 0 -> 6415 bytes .../pelican/tools/pelican_import.py | 1026 +++ .../pelican/tools/pelican_quickstart.py | 379 + .../pelican/tools/pelican_themes.py | 261 + .../pelican/tools/templates/Makefile.jinja2 | 163 + .../tools/templates/pelicanconf.py.jinja2 | 35 + .../tools/templates/publishconf.py.jinja2 | 25 + .../pelican/tools/templates/tasks.py.jinja2 | 148 + .../site-packages/pelican/urlwrappers.py | 133 + lib/python3.8/site-packages/pelican/utils.py | 921 ++ .../site-packages/pelican/writers.py | 278 + .../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 -> 256 bytes .../pep517/__pycache__/compat.cpython-38.pyc | Bin 0 -> 1023 bytes .../__pycache__/wrappers.cpython-38.pyc | Bin 0 -> 10522 bytes .../site-packages/pep517/_in_process.py | 280 + lib/python3.8/site-packages/pep517/build.py | 124 + lib/python3.8/site-packages/pep517/check.py | 203 + .../site-packages/pep517/colorlog.py | 115 + lib/python3.8/site-packages/pep517/compat.py | 34 + .../site-packages/pep517/dirtools.py | 44 + .../site-packages/pep517/envbuild.py | 167 + lib/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 lib/python3.8/site-packages/pip/__init__.py | 18 + lib/python3.8/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 651 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 700 bytes .../__pycache__/build_env.cpython-38.pyc | Bin 0 -> 7505 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 8722 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 0 -> 10667 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 12504 bytes .../__pycache__/legacy_resolve.cpython-38.pyc | Bin 0 -> 9920 bytes .../__pycache__/locations.cpython-38.pyc | Bin 0 -> 4514 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 3606 bytes .../__pycache__/pyproject.cpython-38.pyc | Bin 0 -> 3756 bytes .../self_outdated_check.cpython-38.pyc | Bin 0 -> 5515 bytes .../__pycache__/wheel_builder.cpython-38.pyc | Bin 0 -> 6721 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 -> 258 bytes .../__pycache__/autocompletion.cpython-38.pyc | Bin 0 -> 4975 bytes .../__pycache__/base_command.cpython-38.pyc | Bin 0 -> 5869 bytes .../cli/__pycache__/cmdoptions.cpython-38.pyc | Bin 0 -> 20350 bytes .../command_context.cpython-38.pyc | Bin 0 -> 1333 bytes .../cli/__pycache__/main.cpython-38.pyc | Bin 0 -> 1428 bytes .../__pycache__/main_parser.cpython-38.pyc | Bin 0 -> 2181 bytes .../cli/__pycache__/parser.cpython-38.pyc | Bin 0 -> 8999 bytes .../__pycache__/req_command.cpython-38.pyc | Bin 0 -> 8311 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 387 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 -> 2874 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 16683 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 -> 834 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 1950 bytes .../__pycache__/installed.cpython-38.pyc | Bin 0 -> 1230 bytes .../__pycache__/sdist.cpython-38.pyc | Bin 0 -> 3493 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1582 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 -> 212 bytes .../__pycache__/collector.cpython-38.pyc | Bin 0 -> 14178 bytes .../__pycache__/package_finder.cpython-38.pyc | Bin 0 -> 25771 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 -> 246 bytes .../__pycache__/candidate.cpython-38.pyc | Bin 0 -> 1443 bytes .../__pycache__/format_control.cpython-38.pyc | Bin 0 -> 2438 bytes .../models/__pycache__/index.cpython-38.pyc | Bin 0 -> 1168 bytes .../models/__pycache__/link.cpython-38.pyc | Bin 0 -> 6681 bytes .../models/__pycache__/scheme.cpython-38.pyc | Bin 0 -> 884 bytes .../__pycache__/search_scope.cpython-38.pyc | Bin 0 -> 3275 bytes .../selection_prefs.cpython-38.pyc | Bin 0 -> 1618 bytes .../__pycache__/target_python.cpython-38.pyc | Bin 0 -> 3241 bytes .../models/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 3204 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 -> 234 bytes .../network/__pycache__/auth.cpython-38.pyc | Bin 0 -> 7000 bytes .../network/__pycache__/cache.cpython-38.pyc | Bin 0 -> 2713 bytes .../__pycache__/download.cpython-38.pyc | Bin 0 -> 4392 bytes .../__pycache__/session.cpython-38.pyc | Bin 0 -> 8873 bytes .../network/__pycache__/utils.cpython-38.pyc | Bin 0 -> 728 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 -> 182 bytes .../__pycache__/check.cpython-38.pyc | Bin 0 -> 3678 bytes .../__pycache__/prepare.cpython-38.pyc | Bin 0 -> 11184 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 188 bytes .../build/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 1230 bytes .../metadata_legacy.cpython-38.pyc | Bin 0 -> 3290 bytes .../build/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1328 bytes .../__pycache__/wheel_legacy.cpython-38.pyc | Bin 0 -> 2589 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 -> 246 bytes .../editable_legacy.cpython-38.pyc | Bin 0 -> 1324 bytes .../install/__pycache__/legacy.cpython-38.pyc | Bin 0 -> 3070 bytes .../install/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 14604 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 -> 2216 bytes .../__pycache__/constructors.cpython-38.pyc | Bin 0 -> 10385 bytes .../req/__pycache__/req_file.cpython-38.pyc | Bin 0 -> 12724 bytes .../__pycache__/req_install.cpython-38.pyc | Bin 0 -> 21360 bytes .../req/__pycache__/req_set.cpython-38.pyc | Bin 0 -> 6043 bytes .../__pycache__/req_tracker.cpython-38.pyc | Bin 0 -> 4063 bytes .../__pycache__/req_uninstall.cpython-38.pyc | Bin 0 -> 17449 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 -> 177 bytes .../utils/__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 1361 bytes .../utils/__pycache__/compat.cpython-38.pyc | Bin 0 -> 6142 bytes .../__pycache__/deprecation.cpython-38.pyc | Bin 0 -> 2848 bytes .../__pycache__/distutils_args.cpython-38.pyc | Bin 0 -> 1161 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 0 -> 1269 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 0 -> 4057 bytes .../__pycache__/filetypes.cpython-38.pyc | Bin 0 -> 578 bytes .../utils/__pycache__/glibc.cpython-38.pyc | Bin 0 -> 1730 bytes .../utils/__pycache__/hashes.cpython-38.pyc | Bin 0 -> 4166 bytes .../inject_securetransport.cpython-38.pyc | Bin 0 -> 954 bytes .../utils/__pycache__/logging.cpython-38.pyc | Bin 0 -> 9181 bytes .../__pycache__/marker_files.cpython-38.pyc | Bin 0 -> 950 bytes .../utils/__pycache__/misc.cpython-38.pyc | Bin 0 -> 23800 bytes .../utils/__pycache__/models.cpython-38.pyc | Bin 0 -> 1946 bytes .../__pycache__/packaging.cpython-38.pyc | Bin 0 -> 2630 bytes .../__pycache__/pkg_resources.cpython-38.pyc | Bin 0 -> 1844 bytes .../setuptools_build.cpython-38.pyc | Bin 0 -> 2949 bytes .../__pycache__/subprocess.cpython-38.pyc | Bin 0 -> 5620 bytes .../utils/__pycache__/temp_dir.cpython-38.pyc | Bin 0 -> 6733 bytes .../utils/__pycache__/typing.cpython-38.pyc | Bin 0 -> 1459 bytes .../utils/__pycache__/ui.cpython-38.pyc | Bin 0 -> 11824 bytes .../__pycache__/unpacking.cpython-38.pyc | Bin 0 -> 6097 bytes .../utils/__pycache__/urls.cpython-38.pyc | Bin 0 -> 1487 bytes .../__pycache__/virtualenv.cpython-38.pyc | Bin 0 -> 3302 bytes .../utils/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 6347 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 -> 470 bytes .../vcs/__pycache__/bazaar.cpython-38.pyc | Bin 0 -> 3769 bytes .../vcs/__pycache__/git.cpython-38.pyc | Bin 0 -> 9520 bytes .../vcs/__pycache__/mercurial.cpython-38.pyc | Bin 0 -> 4910 bytes .../vcs/__pycache__/subversion.cpython-38.pyc | Bin 0 -> 8509 bytes .../__pycache__/versioncontrol.cpython-38.pyc | Bin 0 -> 19238 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 -> 2985 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 -> 100378 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 0 -> 622 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 179 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20532 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 201656 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24452 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 729 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 567 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1003 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2785 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 8941 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 3900 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19809 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 10656 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 -> 2428 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 -> 5591 bytes .../progress/__pycache__/bar.cpython-38.pyc | Bin 0 -> 2615 bytes .../__pycache__/spinner.cpython-38.pyc | Bin 0 -> 1374 bytes lib/python3.8/site-packages/progress/bar.py | 91 + .../site-packages/progress/counter.py | 41 + .../site-packages/progress/spinner.py | 43 + .../site-packages/pygments/__init__.py | 85 + .../site-packages/pygments/__main__.py | 18 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2972 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 0 -> 540 bytes .../__pycache__/cmdline.cpython-38.pyc | Bin 0 -> 12561 bytes .../__pycache__/console.cpython-38.pyc | Bin 0 -> 1866 bytes .../__pycache__/filter.cpython-38.pyc | Bin 0 -> 2649 bytes .../__pycache__/formatter.cpython-38.pyc | Bin 0 -> 2936 bytes .../pygments/__pycache__/lexer.cpython-38.pyc | Bin 0 -> 24331 bytes .../__pycache__/modeline.cpython-38.pyc | Bin 0 -> 1138 bytes .../__pycache__/plugin.cpython-38.pyc | Bin 0 -> 2036 bytes .../__pycache__/regexopt.cpython-38.pyc | Bin 0 -> 2902 bytes .../__pycache__/scanner.cpython-38.pyc | Bin 0 -> 3505 bytes .../__pycache__/sphinxext.cpython-38.pyc | Bin 0 -> 4474 bytes .../pygments/__pycache__/style.cpython-38.pyc | Bin 0 -> 4208 bytes .../pygments/__pycache__/token.cpython-38.pyc | Bin 0 -> 4465 bytes .../__pycache__/unistring.cpython-38.pyc | Bin 0 -> 32016 bytes .../pygments/__pycache__/util.cpython-38.pyc | Bin 0 -> 9820 bytes .../site-packages/pygments/cmdline.py | 575 ++ .../site-packages/pygments/console.py | 71 + .../site-packages/pygments/filter.py | 74 + .../pygments/filters/__init__.py | 351 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 11383 bytes .../site-packages/pygments/formatter.py | 95 + .../pygments/formatters/__init__.py | 154 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 4527 bytes .../__pycache__/_mapping.cpython-38.pyc | Bin 0 -> 4988 bytes .../__pycache__/bbcode.cpython-38.pyc | Bin 0 -> 2989 bytes .../__pycache__/html.cpython-38.pyc | Bin 0 -> 26539 bytes .../formatters/__pycache__/img.cpython-38.pyc | Bin 0 -> 16630 bytes .../formatters/__pycache__/irc.cpython-38.pyc | Bin 0 -> 4381 bytes .../__pycache__/latex.cpython-38.pyc | Bin 0 -> 12443 bytes .../__pycache__/other.cpython-38.pyc | Bin 0 -> 4880 bytes .../formatters/__pycache__/rtf.cpython-38.pyc | Bin 0 -> 4053 bytes .../formatters/__pycache__/svg.cpython-38.pyc | Bin 0 -> 6250 bytes .../__pycache__/terminal.cpython-38.pyc | Bin 0 -> 3874 bytes .../__pycache__/terminal256.cpython-38.pyc | Bin 0 -> 8649 bytes .../pygments/formatters/_mapping.py | 83 + .../pygments/formatters/bbcode.py | 109 + .../site-packages/pygments/formatters/html.py | 880 ++ .../site-packages/pygments/formatters/img.py | 614 ++ .../site-packages/pygments/formatters/irc.py | 182 + .../pygments/formatters/latex.py | 481 + .../pygments/formatters/other.py | 164 + .../site-packages/pygments/formatters/rtf.py | 147 + .../site-packages/pygments/formatters/svg.py | 187 + .../pygments/formatters/terminal.py | 130 + .../pygments/formatters/terminal256.py | 319 + lib/python3.8/site-packages/pygments/lexer.py | 877 ++ .../site-packages/pygments/lexers/__init__.py | 343 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 8972 bytes .../__pycache__/_asy_builtins.cpython-38.pyc | Bin 0 -> 26611 bytes .../__pycache__/_cl_builtins.cpython-38.pyc | Bin 0 -> 16159 bytes .../_cocoa_builtins.cpython-38.pyc | Bin 0 -> 42489 bytes .../_csound_builtins.cpython-38.pyc | Bin 0 -> 15363 bytes .../_lasso_builtins.cpython-38.pyc | Bin 0 -> 76798 bytes .../__pycache__/_lua_builtins.cpython-38.pyc | Bin 0 -> 6557 bytes .../__pycache__/_mapping.cpython-38.pyc | Bin 0 -> 44529 bytes .../__pycache__/_mql_builtins.cpython-38.pyc | Bin 0 -> 17954 bytes .../_openedge_builtins.cpython-38.pyc | Bin 0 -> 33306 bytes .../__pycache__/_php_builtins.cpython-38.pyc | Bin 0 -> 88976 bytes .../_postgres_builtins.cpython-38.pyc | Bin 0 -> 7567 bytes .../_scilab_builtins.cpython-38.pyc | Bin 0 -> 34102 bytes .../_sourcemod_builtins.cpython-38.pyc | Bin 0 -> 20682 bytes .../__pycache__/_stan_builtins.cpython-38.pyc | Bin 0 -> 7430 bytes .../_stata_builtins.cpython-38.pyc | Bin 0 -> 19535 bytes .../__pycache__/_tsql_builtins.cpython-38.pyc | Bin 0 -> 8742 bytes .../__pycache__/_usd_builtins.cpython-38.pyc | Bin 0 -> 1452 bytes .../_vbscript_builtins.cpython-38.pyc | Bin 0 -> 3789 bytes .../__pycache__/_vim_builtins.cpython-38.pyc | Bin 0 -> 30647 bytes .../__pycache__/actionscript.cpython-38.pyc | Bin 0 -> 8362 bytes .../lexers/__pycache__/agile.cpython-38.pyc | Bin 0 -> 1237 bytes .../lexers/__pycache__/algebra.cpython-38.pyc | Bin 0 -> 6431 bytes .../lexers/__pycache__/ambient.cpython-38.pyc | Bin 0 -> 2219 bytes .../lexers/__pycache__/ampl.cpython-38.pyc | Bin 0 -> 3205 bytes .../lexers/__pycache__/apl.cpython-38.pyc | Bin 0 -> 1778 bytes .../__pycache__/archetype.cpython-38.pyc | Bin 0 -> 6345 bytes .../lexers/__pycache__/asm.cpython-38.pyc | Bin 0 -> 25209 bytes .../__pycache__/automation.cpython-38.pyc | Bin 0 -> 16025 bytes .../lexers/__pycache__/basic.cpython-38.pyc | Bin 0 -> 17591 bytes .../lexers/__pycache__/bibtex.cpython-38.pyc | Bin 0 -> 3546 bytes .../lexers/__pycache__/boa.cpython-38.pyc | Bin 0 -> 2962 bytes .../__pycache__/business.cpython-38.pyc | Bin 0 -> 18350 bytes .../lexers/__pycache__/c_cpp.cpython-38.pyc | Bin 0 -> 7608 bytes .../lexers/__pycache__/c_like.cpython-38.pyc | Bin 0 -> 20983 bytes .../__pycache__/capnproto.cpython-38.pyc | Bin 0 -> 1721 bytes .../lexers/__pycache__/chapel.cpython-38.pyc | Bin 0 -> 2781 bytes .../lexers/__pycache__/clean.cpython-38.pyc | Bin 0 -> 3818 bytes .../__pycache__/compiled.cpython-38.pyc | Bin 0 -> 1853 bytes .../lexers/__pycache__/configs.cpython-38.pyc | Bin 0 -> 21975 bytes .../lexers/__pycache__/console.cpython-38.pyc | Bin 0 -> 3460 bytes .../lexers/__pycache__/crystal.cpython-38.pyc | Bin 0 -> 9696 bytes .../lexers/__pycache__/csound.cpython-38.pyc | Bin 0 -> 8647 bytes .../lexers/__pycache__/css.cpython-38.pyc | Bin 0 -> 20757 bytes .../lexers/__pycache__/d.cpython-38.pyc | Bin 0 -> 5846 bytes .../lexers/__pycache__/dalvik.cpython-38.pyc | Bin 0 -> 3320 bytes .../lexers/__pycache__/data.cpython-38.pyc | Bin 0 -> 10529 bytes .../lexers/__pycache__/diff.cpython-38.pyc | Bin 0 -> 3673 bytes .../lexers/__pycache__/dotnet.cpython-38.pyc | Bin 0 -> 18965 bytes .../lexers/__pycache__/dsls.cpython-38.pyc | Bin 0 -> 23754 bytes .../lexers/__pycache__/dylan.cpython-38.pyc | Bin 0 -> 8114 bytes .../lexers/__pycache__/ecl.cpython-38.pyc | Bin 0 -> 4361 bytes .../lexers/__pycache__/eiffel.cpython-38.pyc | Bin 0 -> 2213 bytes .../lexers/__pycache__/elm.cpython-38.pyc | Bin 0 -> 2117 bytes .../lexers/__pycache__/email.cpython-38.pyc | Bin 0 -> 4346 bytes .../lexers/__pycache__/erlang.cpython-38.pyc | Bin 0 -> 12679 bytes .../__pycache__/esoteric.cpython-38.pyc | Bin 0 -> 7052 bytes .../lexers/__pycache__/ezhil.cpython-38.pyc | Bin 0 -> 2835 bytes .../lexers/__pycache__/factor.cpython-38.pyc | Bin 0 -> 12300 bytes .../lexers/__pycache__/fantom.cpython-38.pyc | Bin 0 -> 4842 bytes .../lexers/__pycache__/felix.cpython-38.pyc | Bin 0 -> 5511 bytes .../__pycache__/floscript.cpython-38.pyc | Bin 0 -> 2286 bytes .../lexers/__pycache__/forth.cpython-38.pyc | Bin 0 -> 4623 bytes .../lexers/__pycache__/fortran.cpython-38.pyc | Bin 0 -> 7011 bytes .../lexers/__pycache__/foxpro.cpython-38.pyc | Bin 0 -> 20057 bytes .../lexers/__pycache__/freefem.cpython-38.pyc | Bin 0 -> 16899 bytes .../__pycache__/functional.cpython-38.pyc | Bin 0 -> 973 bytes .../lexers/__pycache__/go.cpython-38.pyc | Bin 0 -> 2621 bytes .../grammar_notation.cpython-38.pyc | Bin 0 -> 5876 bytes .../lexers/__pycache__/graph.cpython-38.pyc | Bin 0 -> 2370 bytes .../__pycache__/graphics.cpython-38.pyc | Bin 0 -> 24153 bytes .../lexers/__pycache__/haskell.cpython-38.pyc | Bin 0 -> 18769 bytes .../lexers/__pycache__/haxe.cpython-38.pyc | Bin 0 -> 12035 bytes .../lexers/__pycache__/hdl.cpython-38.pyc | Bin 0 -> 11015 bytes .../lexers/__pycache__/hexdump.cpython-38.pyc | Bin 0 -> 2627 bytes .../lexers/__pycache__/html.cpython-38.pyc | Bin 0 -> 11751 bytes .../lexers/__pycache__/idl.cpython-38.pyc | Bin 0 -> 11401 bytes .../lexers/__pycache__/igor.cpython-38.pyc | Bin 0 -> 24627 bytes .../lexers/__pycache__/inferno.cpython-38.pyc | Bin 0 -> 2542 bytes .../__pycache__/installers.cpython-38.pyc | Bin 0 -> 9517 bytes .../__pycache__/int_fiction.cpython-38.pyc | Bin 0 -> 26533 bytes .../lexers/__pycache__/iolang.cpython-38.pyc | Bin 0 -> 1681 bytes .../lexers/__pycache__/j.cpython-38.pyc | Bin 0 -> 2931 bytes .../__pycache__/javascript.cpython-38.pyc | Bin 0 -> 34027 bytes .../lexers/__pycache__/julia.cpython-38.pyc | Bin 0 -> 10468 bytes .../lexers/__pycache__/jvm.cpython-38.pyc | Bin 0 -> 41042 bytes .../lexers/__pycache__/lisp.cpython-38.pyc | Bin 0 -> 105512 bytes .../lexers/__pycache__/make.cpython-38.pyc | Bin 0 -> 4504 bytes .../lexers/__pycache__/markup.cpython-38.pyc | Bin 0 -> 14335 bytes .../lexers/__pycache__/math.cpython-38.pyc | Bin 0 -> 976 bytes .../lexers/__pycache__/matlab.cpython-38.pyc | Bin 0 -> 18432 bytes .../lexers/__pycache__/mime.cpython-38.pyc | Bin 0 -> 6355 bytes .../lexers/__pycache__/ml.cpython-38.pyc | Bin 0 -> 12950 bytes .../__pycache__/modeling.cpython-38.pyc | Bin 0 -> 8440 bytes .../lexers/__pycache__/modula2.cpython-38.pyc | Bin 0 -> 19461 bytes .../lexers/__pycache__/monte.cpython-38.pyc | Bin 0 -> 4144 bytes .../lexers/__pycache__/mosel.cpython-38.pyc | Bin 0 -> 6172 bytes .../lexers/__pycache__/ncl.cpython-38.pyc | Bin 0 -> 45347 bytes .../lexers/__pycache__/nimrod.cpython-38.pyc | Bin 0 -> 3942 bytes .../lexers/__pycache__/nit.cpython-38.pyc | Bin 0 -> 2299 bytes .../lexers/__pycache__/nix.cpython-38.pyc | Bin 0 -> 3321 bytes .../lexers/__pycache__/oberon.cpython-38.pyc | Bin 0 -> 2485 bytes .../__pycache__/objective.cpython-38.pyc | Bin 0 -> 14445 bytes .../lexers/__pycache__/ooc.cpython-38.pyc | Bin 0 -> 2366 bytes .../lexers/__pycache__/other.cpython-38.pyc | Bin 0 -> 2341 bytes .../__pycache__/parasail.cpython-38.pyc | Bin 0 -> 2287 bytes .../lexers/__pycache__/parsers.cpython-38.pyc | Bin 0 -> 18102 bytes .../lexers/__pycache__/pascal.cpython-38.pyc | Bin 0 -> 21424 bytes .../lexers/__pycache__/pawn.cpython-38.pyc | Bin 0 -> 5560 bytes .../lexers/__pycache__/perl.cpython-38.pyc | Bin 0 -> 27033 bytes .../lexers/__pycache__/php.cpython-38.pyc | Bin 0 -> 8024 bytes .../lexers/__pycache__/pony.cpython-38.pyc | Bin 0 -> 2500 bytes .../lexers/__pycache__/praat.cpython-38.pyc | Bin 0 -> 7939 bytes .../lexers/__pycache__/prolog.cpython-38.pyc | Bin 0 -> 7215 bytes .../lexers/__pycache__/python.cpython-38.pyc | Bin 0 -> 30194 bytes .../lexers/__pycache__/qvt.cpython-38.pyc | Bin 0 -> 4135 bytes .../lexers/__pycache__/r.cpython-38.pyc | Bin 0 -> 4290 bytes .../lexers/__pycache__/rdf.cpython-38.pyc | Bin 0 -> 7772 bytes .../lexers/__pycache__/rebol.cpython-38.pyc | Bin 0 -> 11478 bytes .../__pycache__/resource.cpython-38.pyc | Bin 0 -> 2339 bytes .../lexers/__pycache__/ride.cpython-38.pyc | Bin 0 -> 3725 bytes .../lexers/__pycache__/rnc.cpython-38.pyc | Bin 0 -> 1513 bytes .../__pycache__/roboconf.cpython-38.pyc | Bin 0 -> 1906 bytes .../__pycache__/robotframework.cpython-38.pyc | Bin 0 -> 19217 bytes .../lexers/__pycache__/ruby.cpython-38.pyc | Bin 0 -> 13119 bytes .../lexers/__pycache__/rust.cpython-38.pyc | Bin 0 -> 4634 bytes .../lexers/__pycache__/sas.cpython-38.pyc | Bin 0 -> 5957 bytes .../lexers/__pycache__/scdoc.cpython-38.pyc | Bin 0 -> 1636 bytes .../__pycache__/scripting.cpython-38.pyc | Bin 0 -> 49495 bytes .../lexers/__pycache__/sgf.cpython-38.pyc | Bin 0 -> 1782 bytes .../lexers/__pycache__/shell.cpython-38.pyc | Bin 0 -> 22250 bytes .../lexers/__pycache__/sieve.cpython-38.pyc | Bin 0 -> 2178 bytes .../lexers/__pycache__/slash.cpython-38.pyc | Bin 0 -> 4559 bytes .../__pycache__/smalltalk.cpython-38.pyc | Bin 0 -> 4478 bytes .../lexers/__pycache__/smv.cpython-38.pyc | Bin 0 -> 2149 bytes .../lexers/__pycache__/snobol.cpython-38.pyc | Bin 0 -> 1995 bytes .../__pycache__/solidity.cpython-38.pyc | Bin 0 -> 2616 bytes .../lexers/__pycache__/special.cpython-38.pyc | Bin 0 -> 3227 bytes .../lexers/__pycache__/sql.cpython-38.pyc | Bin 0 -> 22820 bytes .../lexers/__pycache__/stata.cpython-38.pyc | Bin 0 -> 2963 bytes .../__pycache__/supercollider.cpython-38.pyc | Bin 0 -> 2807 bytes .../lexers/__pycache__/tcl.cpython-38.pyc | Bin 0 -> 3627 bytes .../__pycache__/templates.cpython-38.pyc | Bin 0 -> 59370 bytes .../__pycache__/teraterm.cpython-38.pyc | Bin 0 -> 4529 bytes .../lexers/__pycache__/testing.cpython-38.pyc | Bin 0 -> 7911 bytes .../lexers/__pycache__/text.cpython-38.pyc | Bin 0 -> 1416 bytes .../__pycache__/textedit.cpython-38.pyc | Bin 0 -> 5025 bytes .../__pycache__/textfmts.cpython-38.pyc | Bin 0 -> 10414 bytes .../lexers/__pycache__/theorem.cpython-38.pyc | Bin 0 -> 12552 bytes .../__pycache__/trafficscript.cpython-38.pyc | Bin 0 -> 1571 bytes .../__pycache__/typoscript.cpython-38.pyc | Bin 0 -> 5347 bytes .../lexers/__pycache__/unicon.cpython-38.pyc | Bin 0 -> 9637 bytes .../lexers/__pycache__/urbi.cpython-38.pyc | Bin 0 -> 3932 bytes .../lexers/__pycache__/usd.cpython-38.pyc | Bin 0 -> 2830 bytes .../lexers/__pycache__/varnish.cpython-38.pyc | Bin 0 -> 5026 bytes .../__pycache__/verification.cpython-38.pyc | Bin 0 -> 2954 bytes .../lexers/__pycache__/web.cpython-38.pyc | Bin 0 -> 1226 bytes .../lexers/__pycache__/webidl.cpython-38.pyc | Bin 0 -> 4951 bytes .../lexers/__pycache__/webmisc.cpython-38.pyc | Bin 0 -> 24383 bytes .../lexers/__pycache__/whiley.cpython-38.pyc | Bin 0 -> 2468 bytes .../lexers/__pycache__/x10.cpython-38.pyc | Bin 0 -> 1848 bytes .../lexers/__pycache__/xorg.cpython-38.pyc | Bin 0 -> 1052 bytes .../lexers/__pycache__/zig.cpython-38.pyc | Bin 0 -> 3167 bytes .../pygments/lexers/_asy_builtins.py | 1645 ++++ .../pygments/lexers/_cl_builtins.py | 232 + .../pygments/lexers/_cocoa_builtins.py | 71 + .../pygments/lexers/_csound_builtins.py | 1694 ++++ .../pygments/lexers/_lasso_builtins.py | 5327 +++++++++++ .../pygments/lexers/_lua_builtins.py | 293 + .../site-packages/pygments/lexers/_mapping.py | 538 ++ .../pygments/lexers/_mql_builtins.py | 1172 +++ .../pygments/lexers/_openedge_builtins.py | 2547 +++++ .../pygments/lexers/_php_builtins.py | 4754 ++++++++++ .../pygments/lexers/_postgres_builtins.py | 621 ++ .../pygments/lexers/_scilab_builtins.py | 3094 +++++++ .../pygments/lexers/_sourcemod_builtins.py | 1161 +++ .../pygments/lexers/_stan_builtins.py | 558 ++ .../pygments/lexers/_stata_builtins.py | 421 + .../pygments/lexers/_tsql_builtins.py | 1004 ++ .../pygments/lexers/_usd_builtins.py | 107 + .../pygments/lexers/_vbscript_builtins.py | 280 + .../pygments/lexers/_vim_builtins.py | 1939 ++++ .../pygments/lexers/actionscript.py | 240 + .../site-packages/pygments/lexers/agile.py | 24 + .../site-packages/pygments/lexers/algebra.py | 221 + .../site-packages/pygments/lexers/ambient.py | 76 + .../site-packages/pygments/lexers/ampl.py | 87 + .../site-packages/pygments/lexers/apl.py | 101 + .../pygments/lexers/archetype.py | 318 + .../site-packages/pygments/lexers/asm.py | 993 ++ .../pygments/lexers/automation.py | 374 + .../site-packages/pygments/lexers/basic.py | 659 ++ .../site-packages/pygments/lexers/bibtex.py | 160 + .../site-packages/pygments/lexers/boa.py | 102 + .../site-packages/pygments/lexers/business.py | 612 ++ .../site-packages/pygments/lexers/c_cpp.py | 253 + .../site-packages/pygments/lexers/c_like.py | 571 ++ .../pygments/lexers/capnproto.py | 78 + .../site-packages/pygments/lexers/chapel.py | 112 + .../site-packages/pygments/lexers/clean.py | 178 + .../site-packages/pygments/lexers/compiled.py | 34 + .../site-packages/pygments/lexers/configs.py | 939 ++ .../site-packages/pygments/lexers/console.py | 114 + .../site-packages/pygments/lexers/crystal.py | 393 + .../site-packages/pygments/lexers/csound.py | 465 + .../site-packages/pygments/lexers/css.py | 691 ++ .../site-packages/pygments/lexers/d.py | 256 + .../site-packages/pygments/lexers/dalvik.py | 125 + .../site-packages/pygments/lexers/data.py | 561 ++ .../site-packages/pygments/lexers/diff.py | 165 + .../site-packages/pygments/lexers/dotnet.py | 688 ++ .../site-packages/pygments/lexers/dsls.py | 960 ++ .../site-packages/pygments/lexers/dylan.py | 289 + .../site-packages/pygments/lexers/ecl.py | 125 + .../site-packages/pygments/lexers/eiffel.py | 65 + .../site-packages/pygments/lexers/elm.py | 121 + .../site-packages/pygments/lexers/email.py | 154 + .../site-packages/pygments/lexers/erlang.py | 533 ++ .../site-packages/pygments/lexers/esoteric.py | 277 + .../site-packages/pygments/lexers/ezhil.py | 69 + .../site-packages/pygments/lexers/factor.py | 344 + .../site-packages/pygments/lexers/fantom.py | 250 + .../site-packages/pygments/lexers/felix.py | 273 + .../pygments/lexers/floscript.py | 83 + .../site-packages/pygments/lexers/forth.py | 179 + .../site-packages/pygments/lexers/fortran.py | 206 + .../site-packages/pygments/lexers/foxpro.py | 428 + .../site-packages/pygments/lexers/freefem.py | 898 ++ .../pygments/lexers/functional.py | 21 + .../site-packages/pygments/lexers/go.py | 101 + .../pygments/lexers/grammar_notation.py | 270 + .../site-packages/pygments/lexers/graph.py | 85 + .../site-packages/pygments/lexers/graphics.py | 781 ++ .../site-packages/pygments/lexers/haskell.py | 871 ++ .../site-packages/pygments/lexers/haxe.py | 936 ++ .../site-packages/pygments/lexers/hdl.py | 376 + .../site-packages/pygments/lexers/hexdump.py | 103 + .../site-packages/pygments/lexers/html.py | 602 ++ .../site-packages/pygments/lexers/idl.py | 270 + .../site-packages/pygments/lexers/igor.py | 425 + .../site-packages/pygments/lexers/inferno.py | 96 + .../pygments/lexers/installers.py | 322 + .../pygments/lexers/int_fiction.py | 1343 +++ .../site-packages/pygments/lexers/iolang.py | 63 + .../site-packages/pygments/lexers/j.py | 146 + .../pygments/lexers/javascript.py | 1533 +++ .../site-packages/pygments/lexers/julia.py | 335 + .../site-packages/pygments/lexers/jvm.py | 1666 ++++ .../site-packages/pygments/lexers/lisp.py | 2694 ++++++ .../site-packages/pygments/lexers/make.py | 202 + .../site-packages/pygments/lexers/markup.py | 598 ++ .../site-packages/pygments/lexers/math.py | 21 + .../site-packages/pygments/lexers/matlab.py | 692 ++ .../site-packages/pygments/lexers/mime.py | 226 + .../site-packages/pygments/lexers/ml.py | 859 ++ .../site-packages/pygments/lexers/modeling.py | 366 + .../site-packages/pygments/lexers/modula2.py | 1561 ++++ .../site-packages/pygments/lexers/monte.py | 204 + .../site-packages/pygments/lexers/mosel.py | 448 + .../site-packages/pygments/lexers/ncl.py | 894 ++ .../site-packages/pygments/lexers/nimrod.py | 159 + .../site-packages/pygments/lexers/nit.py | 64 + .../site-packages/pygments/lexers/nix.py | 136 + .../site-packages/pygments/lexers/oberon.py | 105 + .../pygments/lexers/objective.py | 504 + .../site-packages/pygments/lexers/ooc.py | 85 + .../site-packages/pygments/lexers/other.py | 41 + .../site-packages/pygments/lexers/parasail.py | 79 + .../site-packages/pygments/lexers/parsers.py | 835 ++ .../site-packages/pygments/lexers/pascal.py | 644 ++ .../site-packages/pygments/lexers/pawn.py | 199 + .../site-packages/pygments/lexers/perl.py | 718 ++ .../site-packages/pygments/lexers/php.py | 270 + .../site-packages/pygments/lexers/pony.py | 94 + .../site-packages/pygments/lexers/praat.py | 302 + .../site-packages/pygments/lexers/prolog.py | 306 + .../site-packages/pygments/lexers/python.py | 1153 +++ .../site-packages/pygments/lexers/qvt.py | 152 + .../site-packages/pygments/lexers/r.py | 193 + .../site-packages/pygments/lexers/rdf.py | 423 + .../site-packages/pygments/lexers/rebol.py | 431 + .../site-packages/pygments/lexers/resource.py | 85 + .../site-packages/pygments/lexers/ride.py | 139 + .../site-packages/pygments/lexers/rnc.py | 67 + .../site-packages/pygments/lexers/roboconf.py | 82 + .../pygments/lexers/robotframework.py | 559 ++ .../site-packages/pygments/lexers/ruby.py | 519 ++ .../site-packages/pygments/lexers/rust.py | 211 + .../site-packages/pygments/lexers/sas.py | 228 + .../site-packages/pygments/lexers/scdoc.py | 70 + .../pygments/lexers/scripting.py | 1275 +++ .../site-packages/pygments/lexers/sgf.py | 61 + .../site-packages/pygments/lexers/shell.py | 849 ++ .../site-packages/pygments/lexers/sieve.py | 69 + .../site-packages/pygments/lexers/slash.py | 185 + .../pygments/lexers/smalltalk.py | 195 + .../site-packages/pygments/lexers/smv.py | 79 + .../site-packages/pygments/lexers/snobol.py | 83 + .../site-packages/pygments/lexers/solidity.py | 93 + .../site-packages/pygments/lexers/special.py | 105 + .../site-packages/pygments/lexers/sql.py | 744 ++ .../site-packages/pygments/lexers/stata.py | 171 + .../pygments/lexers/supercollider.py | 90 + .../site-packages/pygments/lexers/tcl.py | 145 + .../pygments/lexers/templates.py | 2283 +++++ .../site-packages/pygments/lexers/teraterm.py | 158 + .../site-packages/pygments/lexers/testing.py | 207 + .../site-packages/pygments/lexers/text.py | 26 + .../site-packages/pygments/lexers/textedit.py | 169 + .../site-packages/pygments/lexers/textfmts.py | 431 + .../site-packages/pygments/lexers/theorem.py | 456 + .../pygments/lexers/trafficscript.py | 54 + .../pygments/lexers/typoscript.py | 219 + .../site-packages/pygments/lexers/unicon.py | 390 + .../site-packages/pygments/lexers/urbi.py | 133 + .../site-packages/pygments/lexers/usd.py | 90 + .../site-packages/pygments/lexers/varnish.py | 190 + .../pygments/lexers/verification.py | 114 + .../site-packages/pygments/lexers/web.py | 24 + .../site-packages/pygments/lexers/webidl.py | 297 + .../site-packages/pygments/lexers/webmisc.py | 992 ++ .../site-packages/pygments/lexers/whiley.py | 116 + .../site-packages/pygments/lexers/x10.py | 69 + .../site-packages/pygments/lexers/xorg.py | 37 + .../site-packages/pygments/lexers/zig.py | 129 + .../site-packages/pygments/modeline.py | 44 + .../site-packages/pygments/plugin.py | 70 + .../site-packages/pygments/regexopt.py | 92 + .../site-packages/pygments/scanner.py | 105 + .../site-packages/pygments/sphinxext.py | 156 + lib/python3.8/site-packages/pygments/style.py | 180 + .../site-packages/pygments/styles/__init__.py | 87 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2600 bytes .../styles/__pycache__/abap.cpython-38.pyc | Bin 0 -> 915 bytes .../styles/__pycache__/algol.cpython-38.pyc | Bin 0 -> 2199 bytes .../__pycache__/algol_nu.cpython-38.pyc | Bin 0 -> 2211 bytes .../styles/__pycache__/arduino.cpython-38.pyc | Bin 0 -> 2160 bytes .../styles/__pycache__/autumn.cpython-38.pyc | Bin 0 -> 1746 bytes .../styles/__pycache__/borland.cpython-38.pyc | Bin 0 -> 1498 bytes .../styles/__pycache__/bw.cpython-38.pyc | Bin 0 -> 1193 bytes .../__pycache__/colorful.cpython-38.pyc | Bin 0 -> 2165 bytes .../styles/__pycache__/default.cpython-38.pyc | Bin 0 -> 1939 bytes .../styles/__pycache__/emacs.cpython-38.pyc | Bin 0 -> 1968 bytes .../__pycache__/friendly.cpython-38.pyc | Bin 0 -> 2027 bytes .../styles/__pycache__/fruity.cpython-38.pyc | Bin 0 -> 1371 bytes .../styles/__pycache__/igor.cpython-38.pyc | Bin 0 -> 943 bytes .../styles/__pycache__/inkpot.cpython-38.pyc | Bin 0 -> 1803 bytes .../__pycache__/lovelace.cpython-38.pyc | Bin 0 -> 2460 bytes .../styles/__pycache__/manni.cpython-38.pyc | Bin 0 -> 2173 bytes .../styles/__pycache__/monokai.cpython-38.pyc | Bin 0 -> 2330 bytes .../styles/__pycache__/murphy.cpython-38.pyc | Bin 0 -> 2132 bytes .../styles/__pycache__/native.cpython-38.pyc | Bin 0 -> 1804 bytes .../__pycache__/paraiso_dark.cpython-38.pyc | Bin 0 -> 2647 bytes .../__pycache__/paraiso_light.cpython-38.pyc | Bin 0 -> 2652 bytes .../styles/__pycache__/pastie.cpython-38.pyc | Bin 0 -> 2053 bytes .../styles/__pycache__/perldoc.cpython-38.pyc | Bin 0 -> 1867 bytes .../__pycache__/rainbow_dash.cpython-38.pyc | Bin 0 -> 2305 bytes .../styles/__pycache__/rrt.cpython-38.pyc | Bin 0 -> 1054 bytes .../styles/__pycache__/sas.cpython-38.pyc | Bin 0 -> 1508 bytes .../__pycache__/solarized.cpython-38.pyc | Bin 0 -> 2889 bytes .../__pycache__/stata_dark.cpython-38.pyc | Bin 0 -> 1366 bytes .../__pycache__/stata_light.cpython-38.pyc | Bin 0 -> 1392 bytes .../styles/__pycache__/tango.cpython-38.pyc | Bin 0 -> 3695 bytes .../styles/__pycache__/trac.cpython-38.pyc | Bin 0 -> 1689 bytes .../styles/__pycache__/vim.cpython-38.pyc | Bin 0 -> 1631 bytes .../styles/__pycache__/vs.cpython-38.pyc | Bin 0 -> 1094 bytes .../styles/__pycache__/xcode.cpython-38.pyc | Bin 0 -> 1260 bytes .../site-packages/pygments/styles/abap.py | 29 + .../site-packages/pygments/styles/algol.py | 63 + .../site-packages/pygments/styles/algol_nu.py | 63 + .../site-packages/pygments/styles/arduino.py | 98 + .../site-packages/pygments/styles/autumn.py | 65 + .../site-packages/pygments/styles/borland.py | 51 + .../site-packages/pygments/styles/bw.py | 49 + .../site-packages/pygments/styles/colorful.py | 81 + .../site-packages/pygments/styles/default.py | 73 + .../site-packages/pygments/styles/emacs.py | 72 + .../site-packages/pygments/styles/friendly.py | 72 + .../site-packages/pygments/styles/fruity.py | 42 + .../site-packages/pygments/styles/igor.py | 29 + .../site-packages/pygments/styles/inkpot.py | 67 + .../site-packages/pygments/styles/lovelace.py | 97 + .../site-packages/pygments/styles/manni.py | 75 + .../site-packages/pygments/styles/monokai.py | 107 + .../site-packages/pygments/styles/murphy.py | 80 + .../site-packages/pygments/styles/native.py | 65 + .../pygments/styles/paraiso_dark.py | 125 + .../pygments/styles/paraiso_light.py | 125 + .../site-packages/pygments/styles/pastie.py | 75 + .../site-packages/pygments/styles/perldoc.py | 69 + .../pygments/styles/rainbow_dash.py | 89 + .../site-packages/pygments/styles/rrt.py | 33 + .../site-packages/pygments/styles/sas.py | 44 + .../pygments/styles/solarized.py | 130 + .../pygments/styles/stata_dark.py | 41 + .../pygments/styles/stata_light.py | 39 + .../site-packages/pygments/styles/tango.py | 141 + .../site-packages/pygments/styles/trac.py | 63 + .../site-packages/pygments/styles/vim.py | 63 + .../site-packages/pygments/styles/vs.py | 38 + .../site-packages/pygments/styles/xcode.py | 51 + lib/python3.8/site-packages/pygments/token.py | 213 + .../site-packages/pygments/unistring.py | 217 + lib/python3.8/site-packages/pygments/util.py | 351 + .../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 ++++++++++++++ .../python_dateutil-2.8.1.dist-info/INSTALLER | 1 + .../python_dateutil-2.8.1.dist-info/LICENSE | 54 + .../python_dateutil-2.8.1.dist-info/METADATA | 200 + .../python_dateutil-2.8.1.dist-info/RECORD | 44 + .../python_dateutil-2.8.1.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../python_dateutil-2.8.1.dist-info/zip-safe | 1 + .../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 -> 350 bytes .../pytoml/__pycache__/core.cpython-38.pyc | Bin 0 -> 927 bytes .../pytoml/__pycache__/parser.cpython-38.pyc | Bin 0 -> 10092 bytes .../pytoml/__pycache__/test.cpython-38.pyc | Bin 0 -> 1229 bytes .../pytoml/__pycache__/utils.cpython-38.pyc | Bin 0 -> 2139 bytes .../pytoml/__pycache__/writer.cpython-38.pyc | Bin 0 -> 3715 bytes lib/python3.8/site-packages/pytoml/core.py | 13 + lib/python3.8/site-packages/pytoml/parser.py | 342 + lib/python3.8/site-packages/pytoml/test.py | 30 + lib/python3.8/site-packages/pytoml/utils.py | 67 + lib/python3.8/site-packages/pytoml/writer.py | 114 + .../pytz-2020.1.dist-info/DESCRIPTION.rst | 598 ++ .../pytz-2020.1.dist-info/INSTALLER | 1 + .../pytz-2020.1.dist-info/LICENSE.txt | 19 + .../pytz-2020.1.dist-info/METADATA | 632 ++ .../pytz-2020.1.dist-info/RECORD | 621 ++ .../site-packages/pytz-2020.1.dist-info/WHEEL | 6 + .../pytz-2020.1.dist-info/metadata.json | 1 + .../pytz-2020.1.dist-info/top_level.txt | 1 + .../pytz-2020.1.dist-info/zip-safe | 1 + lib/python3.8/site-packages/pytz/__init__.py | 1552 ++++ .../pytz/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 29465 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 2130 bytes .../pytz/__pycache__/lazy.cpython-38.pyc | Bin 0 -> 5019 bytes .../pytz/__pycache__/reference.cpython-38.pyc | Bin 0 -> 3887 bytes .../pytz/__pycache__/tzfile.cpython-38.pyc | Bin 0 -> 3109 bytes .../pytz/__pycache__/tzinfo.cpython-38.pyc | Bin 0 -> 14882 bytes .../site-packages/pytz/exceptions.py | 59 + lib/python3.8/site-packages/pytz/lazy.py | 172 + lib/python3.8/site-packages/pytz/reference.py | 140 + lib/python3.8/site-packages/pytz/tzfile.py | 134 + lib/python3.8/site-packages/pytz/tzinfo.py | 577 ++ .../pytz/zoneinfo/Africa/Abidjan | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 0 -> 816 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 251 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 0 -> 735 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 0 -> 251 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 0 -> 251 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 0 -> 194 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 0 -> 1955 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 0 -> 2429 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 0 -> 2036 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 251 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 0 -> 251 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 0 -> 2295 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 0 -> 246 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 0 -> 653 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 0 -> 251 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 0 -> 679 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 0 -> 246 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 0 -> 246 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 0 -> 251 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 0 -> 208 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 0 -> 251 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 0 -> 199 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 0 -> 254 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 0 -> 625 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 0 -> 689 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 0 -> 955 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 0 -> 2356 bytes .../pytz/zoneinfo/America/Anchorage | Bin 0 -> 2371 bytes .../pytz/zoneinfo/America/Anguilla | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Antigua | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Araguaina | Bin 0 -> 884 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1076 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1048 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1090 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1076 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 0 -> 1048 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1090 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1102 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1104 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1076 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 0 -> 186 bytes .../pytz/zoneinfo/America/Asuncion | Bin 0 -> 2044 bytes .../pytz/zoneinfo/America/Atikokan | Bin 0 -> 336 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 0 -> 1024 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1546 bytes .../pytz/zoneinfo/America/Barbados | Bin 0 -> 314 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 0 -> 576 bytes .../pytz/zoneinfo/America/Belize | Bin 0 -> 948 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 0 -> 298 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 0 -> 632 bytes .../pytz/zoneinfo/America/Bogota | Bin 0 -> 246 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 0 -> 2394 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2084 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 0 -> 1444 bytes .../pytz/zoneinfo/America/Cancun | Bin 0 -> 782 bytes .../pytz/zoneinfo/America/Caracas | Bin 0 -> 264 bytes .../pytz/zoneinfo/America/Catamarca | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Cayenne | Bin 0 -> 198 bytes .../pytz/zoneinfo/America/Cayman | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Chicago | Bin 0 -> 3576 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 0 -> 1484 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 0 -> 336 bytes .../pytz/zoneinfo/America/Cordoba | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 0 -> 316 bytes .../pytz/zoneinfo/America/Creston | Bin 0 -> 208 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 0 -> 1416 bytes .../pytz/zoneinfo/America/Curacao | Bin 0 -> 186 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 0 -> 698 bytes .../pytz/zoneinfo/America/Dawson | Bin 0 -> 1600 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 0 -> 1050 bytes .../pytz/zoneinfo/America/Denver | Bin 0 -> 2444 bytes .../pytz/zoneinfo/America/Detroit | Bin 0 -> 2230 bytes .../pytz/zoneinfo/America/Dominica | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Edmonton | Bin 0 -> 2332 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 0 -> 656 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 0 -> 224 bytes .../pytz/zoneinfo/America/Ensenada | Bin 0 -> 2342 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 0 -> 2240 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 0 -> 1666 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 0 -> 716 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 0 -> 2192 bytes .../pytz/zoneinfo/America/Godthab | Bin 0 -> 1878 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin 0 -> 3210 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 0 -> 1848 bytes .../pytz/zoneinfo/America/Grenada | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Guatemala | Bin 0 -> 280 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Guyana | Bin 0 -> 236 bytes .../pytz/zoneinfo/America/Halifax | Bin 0 -> 3424 bytes .../pytz/zoneinfo/America/Havana | Bin 0 -> 2416 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 0 -> 416 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1666 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 0 -> 2428 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1722 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1904 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1684 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1414 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1694 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1778 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 0 -> 1666 bytes .../pytz/zoneinfo/America/Inuvik | Bin 0 -> 1894 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 0 -> 2032 bytes .../pytz/zoneinfo/America/Jamaica | Bin 0 -> 482 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 0 -> 1048 bytes .../pytz/zoneinfo/America/Juneau | Bin 0 -> 2353 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2772 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2352 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 0 -> 2428 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 0 -> 186 bytes .../pytz/zoneinfo/America/La_Paz | Bin 0 -> 232 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 0 -> 406 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 0 -> 2836 bytes .../pytz/zoneinfo/America/Louisville | Bin 0 -> 2772 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 0 -> 186 bytes .../pytz/zoneinfo/America/Maceio | Bin 0 -> 744 bytes .../pytz/zoneinfo/America/Managua | Bin 0 -> 430 bytes .../pytz/zoneinfo/America/Manaus | Bin 0 -> 604 bytes .../pytz/zoneinfo/America/Marigot | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Martinique | Bin 0 -> 232 bytes .../pytz/zoneinfo/America/Matamoros | Bin 0 -> 1390 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 0 -> 1526 bytes .../pytz/zoneinfo/America/Mendoza | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Menominee | Bin 0 -> 2274 bytes .../pytz/zoneinfo/America/Merida | Bin 0 -> 1422 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 0 -> 1423 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 0 -> 1584 bytes .../pytz/zoneinfo/America/Miquelon | Bin 0 -> 1666 bytes .../pytz/zoneinfo/America/Moncton | Bin 0 -> 3154 bytes .../pytz/zoneinfo/America/Monterrey | Bin 0 -> 1390 bytes .../pytz/zoneinfo/America/Montevideo | Bin 0 -> 1510 bytes .../pytz/zoneinfo/America/Montreal | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Montserrat | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Nassau | Bin 0 -> 2258 bytes .../pytz/zoneinfo/America/New_York | Bin 0 -> 3536 bytes .../pytz/zoneinfo/America/Nipigon | Bin 0 -> 2122 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin 0 -> 2367 bytes .../pytz/zoneinfo/America/Noronha | Bin 0 -> 716 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2380 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 0 -> 2380 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2380 bytes .../site-packages/pytz/zoneinfo/America/Nuuk | Bin 0 -> 1878 bytes .../pytz/zoneinfo/America/Ojinaga | Bin 0 -> 1484 bytes .../pytz/zoneinfo/America/Panama | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 0 -> 2094 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 0 -> 262 bytes .../pytz/zoneinfo/America/Phoenix | Bin 0 -> 328 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 0 -> 1434 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 0 -> 628 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 0 -> 576 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 0 -> 1902 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 0 -> 2122 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 0 -> 1892 bytes .../pytz/zoneinfo/America/Recife | Bin 0 -> 716 bytes .../pytz/zoneinfo/America/Regina | Bin 0 -> 980 bytes .../pytz/zoneinfo/America/Resolute | Bin 0 -> 1892 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 0 -> 628 bytes .../pytz/zoneinfo/America/Rosario | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 0 -> 2342 bytes .../pytz/zoneinfo/America/Santarem | Bin 0 -> 602 bytes .../pytz/zoneinfo/America/Santiago | Bin 0 -> 2529 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 0 -> 458 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 0 -> 1444 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin 0 -> 1916 bytes .../pytz/zoneinfo/America/Shiprock | Bin 0 -> 2444 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 0 -> 2329 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/St_Johns | Bin 0 -> 3655 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 0 -> 560 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 0 -> 252 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 0 -> 1502 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin 0 -> 2202 bytes .../pytz/zoneinfo/America/Tijuana | Bin 0 -> 2342 bytes .../pytz/zoneinfo/America/Toronto | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Tortola | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Vancouver | Bin 0 -> 2892 bytes .../pytz/zoneinfo/America/Virgin | Bin 0 -> 148 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 0 -> 1600 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 0 -> 2868 bytes .../pytz/zoneinfo/America/Yakutat | Bin 0 -> 2305 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 0 -> 1966 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 0 -> 297 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin 0 -> 297 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 194 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 0 -> 1520 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 0 -> 199 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 0 -> 1418 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 0 -> 164 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 0 -> 165 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 0 -> 1162 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin 0 -> 165 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2228 bytes .../site-packages/pytz/zoneinfo/Asia/Aden | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 0 -> 997 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 0 -> 1853 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 0 -> 1188 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 0 -> 983 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 0 -> 1011 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 0 -> 619 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 0 -> 619 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 0 -> 991 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 0 -> 983 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 0 -> 199 bytes .../site-packages/pytz/zoneinfo/Asia/Baku | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 0 -> 199 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 0 -> 1221 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 0 -> 2154 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 0 -> 983 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 0 -> 203 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 0 -> 285 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 0 -> 1221 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 0 -> 949 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 0 -> 561 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 0 -> 372 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 0 -> 337 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 0 -> 2294 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 0 -> 337 bytes .../site-packages/pytz/zoneinfo/Asia/Dili | Bin 0 -> 227 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 0 -> 591 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 0 -> 2028 bytes .../site-packages/pytz/zoneinfo/Asia/Gaza | Bin 0 -> 2316 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 0 -> 2344 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 351 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1203 bytes .../site-packages/pytz/zoneinfo/Asia/Hovd | Bin 0 -> 891 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 0 -> 1243 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 0 -> 1947 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 0 -> 355 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 0 -> 221 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 0 -> 2288 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 0 -> 208 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 0 -> 1166 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 0 -> 379 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 0 -> 165 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 0 -> 212 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 0 -> 212 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 0 -> 1271 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 0 -> 285 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1207 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 383 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 0 -> 483 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 0 -> 1222 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 0 -> 328 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 0 -> 2002 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1165 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1221 bytes .../site-packages/pytz/zoneinfo/Asia/Omsk | Bin 0 -> 1207 bytes .../site-packages/pytz/zoneinfo/Asia/Oral | Bin 0 -> 1005 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 199 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 0 -> 353 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 0 -> 237 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 0 -> 199 bytes .../site-packages/pytz/zoneinfo/Asia/Qostanay | Bin 0 -> 1011 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1025 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 0 -> 268 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 0 -> 351 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 0 -> 1202 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 0 -> 577 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 0 -> 617 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 0 -> 561 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 0 -> 383 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1208 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 0 -> 761 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 0 -> 591 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 0 -> 1035 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 0 -> 2582 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 2288 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 0 -> 203 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 0 -> 203 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 0 -> 1221 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 254 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 891 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 891 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1252 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 0 -> 199 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 0 -> 1208 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 0 -> 1207 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 0 -> 268 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1243 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 0 -> 1151 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 0 -> 3484 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 0 -> 1978 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 0 -> 1897 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 270 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2228 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 0 -> 3475 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 1162 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 164 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 0 -> 148 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 0 -> 1214 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 0 -> 2204 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 0 -> 2222 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 0 -> 433 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2243 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 0 -> 2204 bytes .../pytz/zoneinfo/Australia/Currie | Bin 0 -> 2204 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 0 -> 304 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 0 -> 484 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 0 -> 2316 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 0 -> 1860 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 0 -> 489 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1860 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 0 -> 2204 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 0 -> 2204 bytes .../pytz/zoneinfo/Australia/North | Bin 0 -> 304 bytes .../pytz/zoneinfo/Australia/Perth | Bin 0 -> 460 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 0 -> 433 bytes .../pytz/zoneinfo/Australia/South | Bin 0 -> 2222 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 0 -> 2204 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 0 -> 2316 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 0 -> 2204 bytes .../pytz/zoneinfo/Australia/West | Bin 0 -> 460 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 0 -> 2243 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 0 -> 628 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 0 -> 716 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 0 -> 1444 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 0 -> 604 bytes lib/python3.8/site-packages/pytz/zoneinfo/CET | Bin 0 -> 2094 bytes .../site-packages/pytz/zoneinfo/CST6CDT | Bin 0 -> 2310 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 0 -> 3424 bytes .../pytz/zoneinfo/Canada/Central | Bin 0 -> 2868 bytes .../pytz/zoneinfo/Canada/Eastern | Bin 0 -> 3494 bytes .../pytz/zoneinfo/Canada/Mountain | Bin 0 -> 2332 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 0 -> 3655 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 0 -> 2892 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 0 -> 980 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 0 -> 1600 bytes .../pytz/zoneinfo/Chile/Continental | Bin 0 -> 2529 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 0 -> 2233 bytes .../site-packages/pytz/zoneinfo/Cuba | Bin 0 -> 2416 bytes lib/python3.8/site-packages/pytz/zoneinfo/EET | Bin 0 -> 1908 bytes lib/python3.8/site-packages/pytz/zoneinfo/EST | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/EST5EDT | Bin 0 -> 2310 bytes .../site-packages/pytz/zoneinfo/Egypt | Bin 0 -> 1955 bytes .../site-packages/pytz/zoneinfo/Eire | Bin 0 -> 3492 bytes .../site-packages/pytz/zoneinfo/Etc/GMT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/UCT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/UTC | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Zulu | Bin 0 -> 114 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 0 -> 2910 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 0 -> 1742 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 0 -> 1165 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 0 -> 2262 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 0 -> 3648 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 0 -> 2301 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 0 -> 2933 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 0 -> 2184 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 0 -> 2368 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 0 -> 2390 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 0 -> 2137 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 0 -> 3492 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 0 -> 3052 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 0 -> 3648 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 0 -> 1900 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3648 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 0 -> 1947 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 0 -> 3648 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1493 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 0 -> 2088 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 0 -> 1153 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 0 -> 3469 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 0 -> 3648 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 0 -> 2946 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 0 -> 2614 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 0 -> 2620 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 0 -> 1900 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 0 -> 1321 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 0 -> 2944 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 0 -> 1535 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 0 -> 2002 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 0 -> 2228 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 0 -> 2962 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 0 -> 2301 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 0 -> 2198 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 0 -> 2641 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 0 -> 1215 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 0 -> 2641 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 0 -> 1920 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 0 -> 1183 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 0 -> 1453 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 0 -> 2077 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 0 -> 2148 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 0 -> 2084 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 0 -> 2390 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 1267 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2050 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 0 -> 2641 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 0 -> 2200 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 0 -> 2162 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 0 -> 1165 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 0 -> 2654 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 0 -> 1920 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2106 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 0 -> 1909 bytes .../site-packages/pytz/zoneinfo/Factory | Bin 0 -> 116 bytes lib/python3.8/site-packages/pytz/zoneinfo/GB | Bin 0 -> 3648 bytes .../site-packages/pytz/zoneinfo/GB-Eire | Bin 0 -> 3648 bytes lib/python3.8/site-packages/pytz/zoneinfo/GMT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT+0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT-0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Greenwich | Bin 0 -> 114 bytes lib/python3.8/site-packages/pytz/zoneinfo/HST | Bin 0 -> 115 bytes .../site-packages/pytz/zoneinfo/Hongkong | Bin 0 -> 1203 bytes .../site-packages/pytz/zoneinfo/Iceland | Bin 0 -> 1162 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 0 -> 251 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 0 -> 199 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 0 -> 174 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 0 -> 251 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 0 -> 165 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 0 -> 199 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 0 -> 241 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 0 -> 251 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 0 -> 165 bytes .../site-packages/pytz/zoneinfo/Iran | Bin 0 -> 2582 bytes .../site-packages/pytz/zoneinfo/Israel | Bin 0 -> 2288 bytes .../site-packages/pytz/zoneinfo/Jamaica | Bin 0 -> 482 bytes .../site-packages/pytz/zoneinfo/Japan | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Kwajalein | Bin 0 -> 316 bytes .../site-packages/pytz/zoneinfo/Libya | Bin 0 -> 625 bytes lib/python3.8/site-packages/pytz/zoneinfo/MET | Bin 0 -> 2094 bytes lib/python3.8/site-packages/pytz/zoneinfo/MST | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/MST7MDT | Bin 0 -> 2310 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2342 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 0 -> 1526 bytes .../pytz/zoneinfo/Mexico/General | Bin 0 -> 1584 bytes lib/python3.8/site-packages/pytz/zoneinfo/NZ | Bin 0 -> 2437 bytes .../site-packages/pytz/zoneinfo/NZ-CHAT | Bin 0 -> 2068 bytes .../site-packages/pytz/zoneinfo/Navajo | Bin 0 -> 2444 bytes lib/python3.8/site-packages/pytz/zoneinfo/PRC | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/PST8PDT | Bin 0 -> 2310 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 0 -> 1097 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 0 -> 268 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 0 -> 2068 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 0 -> 269 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 0 -> 2233 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 0 -> 466 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 0 -> 234 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 0 -> 200 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 0 -> 1077 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 0 -> 166 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 0 -> 238 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 0 -> 164 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 166 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 0 -> 494 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 0 -> 238 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 0 -> 351 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 0 -> 316 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 0 -> 310 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 0 -> 173 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 0 -> 252 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 0 -> 241 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 0 -> 880 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 0 -> 304 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 0 -> 180 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 0 -> 202 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 0 -> 303 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 0 -> 303 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 186 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 0 -> 577 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 0 -> 494 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 0 -> 175 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 0 -> 165 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 0 -> 166 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 0 -> 372 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 0 -> 269 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 0 -> 166 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 0 -> 166 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 0 -> 269 bytes .../site-packages/pytz/zoneinfo/Poland | Bin 0 -> 2654 bytes .../site-packages/pytz/zoneinfo/Portugal | Bin 0 -> 3469 bytes lib/python3.8/site-packages/pytz/zoneinfo/ROC | Bin 0 -> 761 bytes lib/python3.8/site-packages/pytz/zoneinfo/ROK | Bin 0 -> 617 bytes .../site-packages/pytz/zoneinfo/Singapore | Bin 0 -> 383 bytes .../site-packages/pytz/zoneinfo/Turkey | Bin 0 -> 1947 bytes lib/python3.8/site-packages/pytz/zoneinfo/UCT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/US/Alaska | Bin 0 -> 2371 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 0 -> 328 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 0 -> 3576 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 0 -> 1666 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 0 -> 3536 bytes .../site-packages/pytz/zoneinfo/US/Hawaii | Bin 0 -> 329 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 0 -> 2428 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 0 -> 2230 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 0 -> 2444 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 0 -> 2836 bytes .../site-packages/pytz/zoneinfo/US/Samoa | Bin 0 -> 175 bytes lib/python3.8/site-packages/pytz/zoneinfo/UTC | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Universal | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/W-SU | Bin 0 -> 1535 bytes lib/python3.8/site-packages/pytz/zoneinfo/WET | Bin 0 -> 1905 bytes .../site-packages/pytz/zoneinfo/Zulu | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 274 + .../site-packages/pytz/zoneinfo/leapseconds | 78 + .../site-packages/pytz/zoneinfo/posixrules | Bin 0 -> 3536 bytes .../site-packages/pytz/zoneinfo/tzdata.zi | 4410 +++++++++ .../site-packages/pytz/zoneinfo/zone.tab | 452 + .../site-packages/pytz/zoneinfo/zone1970.tab | 384 + .../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 -> 3354 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 0 -> 524 bytes .../_internal_utils.cpython-38.pyc | Bin 0 -> 1294 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 0 -> 16885 bytes .../requests/__pycache__/api.cpython-38.pyc | Bin 0 -> 6481 bytes .../requests/__pycache__/auth.cpython-38.pyc | Bin 0 -> 8303 bytes .../requests/__pycache__/certs.cpython-38.pyc | Bin 0 -> 595 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 1629 bytes .../__pycache__/cookies.cpython-38.pyc | Bin 0 -> 18808 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 5206 bytes .../requests/__pycache__/hooks.cpython-38.pyc | Bin 0 -> 966 bytes .../__pycache__/models.cpython-38.pyc | Bin 0 -> 23830 bytes .../__pycache__/packages.cpython-38.pyc | Bin 0 -> 383 bytes .../__pycache__/sessions.cpython-38.pyc | Bin 0 -> 19516 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 4162 bytes .../__pycache__/structures.cpython-38.pyc | Bin 0 -> 4404 bytes .../requests/__pycache__/utils.cpython-38.pyc | Bin 0 -> 22173 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 42 + .../site-packages/requests/adapters.py | 533 ++ lib/python3.8/site-packages/requests/api.py | 158 + lib/python3.8/site-packages/requests/auth.py | 305 + lib/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 + lib/python3.8/site-packages/requests/help.py | 119 + lib/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 + lib/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 -> 7790 bytes .../_deprecation_warning.cpython-38.pyc | Bin 0 -> 538 bytes .../__pycache__/_imp.cpython-38.pyc | Bin 0 -> 1912 bytes .../__pycache__/archive_util.cpython-38.pyc | Bin 0 -> 5150 bytes .../__pycache__/config.cpython-38.pyc | Bin 0 -> 17918 bytes .../__pycache__/depends.cpython-38.pyc | Bin 0 -> 5238 bytes .../__pycache__/dist.cpython-38.pyc | Bin 0 -> 42348 bytes .../__pycache__/extension.cpython-38.pyc | Bin 0 -> 1983 bytes .../__pycache__/glob.cpython-38.pyc | Bin 0 -> 3755 bytes .../__pycache__/lib2to3_ex.cpython-38.pyc | Bin 0 -> 2433 bytes .../__pycache__/monkey.cpython-38.pyc | Bin 0 -> 4666 bytes .../__pycache__/msvc.cpython-38.pyc | Bin 0 -> 39653 bytes .../__pycache__/namespaces.cpython-38.pyc | Bin 0 -> 3638 bytes .../__pycache__/package_index.cpython-38.pyc | Bin 0 -> 32992 bytes .../__pycache__/py27compat.cpython-38.pyc | Bin 0 -> 1771 bytes .../__pycache__/py33compat.cpython-38.pyc | Bin 0 -> 1430 bytes .../__pycache__/py34compat.cpython-38.pyc | Bin 0 -> 472 bytes .../__pycache__/sandbox.cpython-38.pyc | Bin 0 -> 15558 bytes .../__pycache__/ssl_support.cpython-38.pyc | Bin 0 -> 6877 bytes .../__pycache__/unicode_utils.cpython-38.pyc | Bin 0 -> 1173 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 314 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 7405 bytes .../windows_support.cpython-38.pyc | Bin 0 -> 1011 bytes .../setuptools/_deprecation_warning.py | 7 + .../site-packages/setuptools/_imp.py | 73 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 176 bytes .../__pycache__/ordered_set.cpython-38.pyc | Bin 0 -> 16434 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24449 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 -> 726 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 564 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1000 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2782 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19756 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 10833 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1457 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 12087 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 -> 734 bytes .../__pycache__/bdist_egg.cpython-38.pyc | Bin 0 -> 14204 bytes .../__pycache__/build_ext.cpython-38.pyc | Bin 0 -> 9917 bytes .../__pycache__/build_py.cpython-38.pyc | Bin 0 -> 8663 bytes .../__pycache__/easy_install.cpython-38.pyc | Bin 0 -> 66716 bytes .../__pycache__/egg_info.cpython-38.pyc | Bin 0 -> 21795 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 4038 bytes .../install_egg_info.cpython-38.pyc | Bin 0 -> 2922 bytes .../__pycache__/install_lib.cpython-38.pyc | Bin 0 -> 5105 bytes .../install_scripts.cpython-38.pyc | Bin 0 -> 2295 bytes .../__pycache__/py36compat.cpython-38.pyc | Bin 0 -> 4632 bytes .../command/__pycache__/sdist.cpython-38.pyc | Bin 0 -> 7881 bytes .../command/__pycache__/setopt.cpython-38.pyc | Bin 0 -> 4559 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 -> 2442 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 + .../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 lib/python3.8/site-packages/six.py | 980 ++ .../site-packages/unidecode/__init__.py | 103 + .../site-packages/unidecode/__main__.py | 3 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2754 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 0 -> 196 bytes .../unidecode/__pycache__/util.cpython-38.pyc | Bin 0 -> 1663 bytes .../unidecode/__pycache__/x000.cpython-38.pyc | Bin 0 -> 1357 bytes .../unidecode/__pycache__/x001.cpython-38.pyc | Bin 0 -> 1299 bytes .../unidecode/__pycache__/x002.cpython-38.pyc | Bin 0 -> 1280 bytes .../unidecode/__pycache__/x003.cpython-38.pyc | Bin 0 -> 1301 bytes .../unidecode/__pycache__/x004.cpython-38.pyc | Bin 0 -> 1281 bytes .../unidecode/__pycache__/x005.cpython-38.pyc | Bin 0 -> 1277 bytes .../unidecode/__pycache__/x006.cpython-38.pyc | Bin 0 -> 1272 bytes .../unidecode/__pycache__/x007.cpython-38.pyc | Bin 0 -> 1314 bytes .../unidecode/__pycache__/x009.cpython-38.pyc | Bin 0 -> 1310 bytes .../unidecode/__pycache__/x00a.cpython-38.pyc | Bin 0 -> 1322 bytes .../unidecode/__pycache__/x00b.cpython-38.pyc | Bin 0 -> 1326 bytes .../unidecode/__pycache__/x00c.cpython-38.pyc | Bin 0 -> 1324 bytes .../unidecode/__pycache__/x00d.cpython-38.pyc | Bin 0 -> 1320 bytes .../unidecode/__pycache__/x00e.cpython-38.pyc | Bin 0 -> 1334 bytes .../unidecode/__pycache__/x00f.cpython-38.pyc | Bin 0 -> 1323 bytes .../unidecode/__pycache__/x010.cpython-38.pyc | Bin 0 -> 1250 bytes .../unidecode/__pycache__/x011.cpython-38.pyc | Bin 0 -> 1332 bytes .../unidecode/__pycache__/x012.cpython-38.pyc | Bin 0 -> 1381 bytes .../unidecode/__pycache__/x013.cpython-38.pyc | Bin 0 -> 1331 bytes .../unidecode/__pycache__/x014.cpython-38.pyc | Bin 0 -> 1377 bytes .../unidecode/__pycache__/x015.cpython-38.pyc | Bin 0 -> 1409 bytes .../unidecode/__pycache__/x016.cpython-38.pyc | Bin 0 -> 1340 bytes .../unidecode/__pycache__/x017.cpython-38.pyc | Bin 0 -> 1318 bytes .../unidecode/__pycache__/x018.cpython-38.pyc | Bin 0 -> 1318 bytes .../unidecode/__pycache__/x01d.cpython-38.pyc | Bin 0 -> 1336 bytes .../unidecode/__pycache__/x01e.cpython-38.pyc | Bin 0 -> 1328 bytes .../unidecode/__pycache__/x01f.cpython-38.pyc | Bin 0 -> 1389 bytes .../unidecode/__pycache__/x020.cpython-38.pyc | Bin 0 -> 1287 bytes .../unidecode/__pycache__/x021.cpython-38.pyc | Bin 0 -> 1382 bytes .../unidecode/__pycache__/x022.cpython-38.pyc | Bin 0 -> 1409 bytes .../unidecode/__pycache__/x023.cpython-38.pyc | Bin 0 -> 1420 bytes .../unidecode/__pycache__/x024.cpython-38.pyc | Bin 0 -> 1297 bytes .../unidecode/__pycache__/x025.cpython-38.pyc | Bin 0 -> 1399 bytes .../unidecode/__pycache__/x026.cpython-38.pyc | Bin 0 -> 1420 bytes .../unidecode/__pycache__/x027.cpython-38.pyc | Bin 0 -> 1411 bytes .../unidecode/__pycache__/x028.cpython-38.pyc | Bin 0 -> 2137 bytes .../unidecode/__pycache__/x029.cpython-38.pyc | Bin 0 -> 1419 bytes .../unidecode/__pycache__/x02a.cpython-38.pyc | Bin 0 -> 1421 bytes .../unidecode/__pycache__/x02c.cpython-38.pyc | Bin 0 -> 1394 bytes .../unidecode/__pycache__/x02e.cpython-38.pyc | Bin 0 -> 1426 bytes .../unidecode/__pycache__/x02f.cpython-38.pyc | Bin 0 -> 1426 bytes .../unidecode/__pycache__/x030.cpython-38.pyc | Bin 0 -> 1295 bytes .../unidecode/__pycache__/x031.cpython-38.pyc | Bin 0 -> 1277 bytes .../unidecode/__pycache__/x032.cpython-38.pyc | Bin 0 -> 1468 bytes .../unidecode/__pycache__/x033.cpython-38.pyc | Bin 0 -> 1582 bytes .../unidecode/__pycache__/x04d.cpython-38.pyc | Bin 0 -> 1426 bytes .../unidecode/__pycache__/x04e.cpython-38.pyc | Bin 0 -> 1602 bytes .../unidecode/__pycache__/x04f.cpython-38.pyc | Bin 0 -> 1603 bytes .../unidecode/__pycache__/x050.cpython-38.pyc | Bin 0 -> 1646 bytes .../unidecode/__pycache__/x051.cpython-38.pyc | Bin 0 -> 1628 bytes .../unidecode/__pycache__/x052.cpython-38.pyc | Bin 0 -> 1580 bytes .../unidecode/__pycache__/x053.cpython-38.pyc | Bin 0 -> 1595 bytes .../unidecode/__pycache__/x054.cpython-38.pyc | Bin 0 -> 1591 bytes .../unidecode/__pycache__/x055.cpython-38.pyc | Bin 0 -> 1589 bytes .../unidecode/__pycache__/x056.cpython-38.pyc | Bin 0 -> 1593 bytes .../unidecode/__pycache__/x057.cpython-38.pyc | Bin 0 -> 1622 bytes .../unidecode/__pycache__/x058.cpython-38.pyc | Bin 0 -> 1625 bytes .../unidecode/__pycache__/x059.cpython-38.pyc | Bin 0 -> 1618 bytes .../unidecode/__pycache__/x05a.cpython-38.pyc | Bin 0 -> 1620 bytes .../unidecode/__pycache__/x05b.cpython-38.pyc | Bin 0 -> 1620 bytes .../unidecode/__pycache__/x05c.cpython-38.pyc | Bin 0 -> 1589 bytes .../unidecode/__pycache__/x05d.cpython-38.pyc | Bin 0 -> 1616 bytes .../unidecode/__pycache__/x05e.cpython-38.pyc | Bin 0 -> 1615 bytes .../unidecode/__pycache__/x05f.cpython-38.pyc | Bin 0 -> 1617 bytes .../unidecode/__pycache__/x060.cpython-38.pyc | Bin 0 -> 1612 bytes .../unidecode/__pycache__/x061.cpython-38.pyc | Bin 0 -> 1607 bytes .../unidecode/__pycache__/x062.cpython-38.pyc | Bin 0 -> 1611 bytes .../unidecode/__pycache__/x063.cpython-38.pyc | Bin 0 -> 1630 bytes .../unidecode/__pycache__/x064.cpython-38.pyc | Bin 0 -> 1631 bytes .../unidecode/__pycache__/x065.cpython-38.pyc | Bin 0 -> 1592 bytes .../unidecode/__pycache__/x066.cpython-38.pyc | Bin 0 -> 1616 bytes .../unidecode/__pycache__/x067.cpython-38.pyc | Bin 0 -> 1628 bytes .../unidecode/__pycache__/x068.cpython-38.pyc | Bin 0 -> 1648 bytes .../unidecode/__pycache__/x069.cpython-38.pyc | Bin 0 -> 1649 bytes .../unidecode/__pycache__/x06a.cpython-38.pyc | Bin 0 -> 1647 bytes .../unidecode/__pycache__/x06b.cpython-38.pyc | Bin 0 -> 1597 bytes .../unidecode/__pycache__/x06c.cpython-38.pyc | Bin 0 -> 1632 bytes .../unidecode/__pycache__/x06d.cpython-38.pyc | Bin 0 -> 1631 bytes .../unidecode/__pycache__/x06e.cpython-38.pyc | Bin 0 -> 1614 bytes .../unidecode/__pycache__/x06f.cpython-38.pyc | Bin 0 -> 1620 bytes .../unidecode/__pycache__/x070.cpython-38.pyc | Bin 0 -> 1626 bytes .../unidecode/__pycache__/x071.cpython-38.pyc | Bin 0 -> 1615 bytes .../unidecode/__pycache__/x072.cpython-38.pyc | Bin 0 -> 1631 bytes .../unidecode/__pycache__/x073.cpython-38.pyc | Bin 0 -> 1633 bytes .../unidecode/__pycache__/x074.cpython-38.pyc | Bin 0 -> 1662 bytes .../unidecode/__pycache__/x075.cpython-38.pyc | Bin 0 -> 1621 bytes .../unidecode/__pycache__/x076.cpython-38.pyc | Bin 0 -> 1604 bytes .../unidecode/__pycache__/x077.cpython-38.pyc | Bin 0 -> 1615 bytes .../unidecode/__pycache__/x078.cpython-38.pyc | Bin 0 -> 1606 bytes .../unidecode/__pycache__/x079.cpython-38.pyc | Bin 0 -> 1591 bytes .../unidecode/__pycache__/x07a.cpython-38.pyc | Bin 0 -> 1616 bytes .../unidecode/__pycache__/x07b.cpython-38.pyc | Bin 0 -> 1628 bytes .../unidecode/__pycache__/x07c.cpython-38.pyc | Bin 0 -> 1620 bytes .../unidecode/__pycache__/x07d.cpython-38.pyc | Bin 0 -> 1635 bytes .../unidecode/__pycache__/x07e.cpython-38.pyc | Bin 0 -> 1635 bytes .../unidecode/__pycache__/x07f.cpython-38.pyc | Bin 0 -> 1608 bytes .../unidecode/__pycache__/x080.cpython-38.pyc | Bin 0 -> 1611 bytes .../unidecode/__pycache__/x081.cpython-38.pyc | Bin 0 -> 1637 bytes .../unidecode/__pycache__/x082.cpython-38.pyc | Bin 0 -> 1633 bytes .../unidecode/__pycache__/x083.cpython-38.pyc | Bin 0 -> 1625 bytes .../unidecode/__pycache__/x084.cpython-38.pyc | Bin 0 -> 1616 bytes .../unidecode/__pycache__/x085.cpython-38.pyc | Bin 0 -> 1606 bytes .../unidecode/__pycache__/x086.cpython-38.pyc | Bin 0 -> 1603 bytes .../unidecode/__pycache__/x087.cpython-38.pyc | Bin 0 -> 1627 bytes .../unidecode/__pycache__/x088.cpython-38.pyc | Bin 0 -> 1617 bytes .../unidecode/__pycache__/x089.cpython-38.pyc | Bin 0 -> 1595 bytes .../unidecode/__pycache__/x08a.cpython-38.pyc | Bin 0 -> 1618 bytes .../unidecode/__pycache__/x08b.cpython-38.pyc | Bin 0 -> 1602 bytes .../unidecode/__pycache__/x08c.cpython-38.pyc | Bin 0 -> 1607 bytes .../unidecode/__pycache__/x08d.cpython-38.pyc | Bin 0 -> 1598 bytes .../unidecode/__pycache__/x08e.cpython-38.pyc | Bin 0 -> 1627 bytes .../unidecode/__pycache__/x08f.cpython-38.pyc | Bin 0 -> 1593 bytes .../unidecode/__pycache__/x090.cpython-38.pyc | Bin 0 -> 1621 bytes .../unidecode/__pycache__/x091.cpython-38.pyc | Bin 0 -> 1626 bytes .../unidecode/__pycache__/x092.cpython-38.pyc | Bin 0 -> 1628 bytes .../unidecode/__pycache__/x093.cpython-38.pyc | Bin 0 -> 1626 bytes .../unidecode/__pycache__/x094.cpython-38.pyc | Bin 0 -> 1625 bytes .../unidecode/__pycache__/x095.cpython-38.pyc | Bin 0 -> 1615 bytes .../unidecode/__pycache__/x096.cpython-38.pyc | Bin 0 -> 1587 bytes .../unidecode/__pycache__/x097.cpython-38.pyc | Bin 0 -> 1591 bytes .../unidecode/__pycache__/x098.cpython-38.pyc | Bin 0 -> 1575 bytes .../unidecode/__pycache__/x099.cpython-38.pyc | Bin 0 -> 1587 bytes .../unidecode/__pycache__/x09a.cpython-38.pyc | Bin 0 -> 1575 bytes .../unidecode/__pycache__/x09b.cpython-38.pyc | Bin 0 -> 1644 bytes .../unidecode/__pycache__/x09c.cpython-38.pyc | Bin 0 -> 1602 bytes .../unidecode/__pycache__/x09d.cpython-38.pyc | Bin 0 -> 1636 bytes .../unidecode/__pycache__/x09e.cpython-38.pyc | Bin 0 -> 1585 bytes .../unidecode/__pycache__/x09f.cpython-38.pyc | Bin 0 -> 1522 bytes .../unidecode/__pycache__/x0a0.cpython-38.pyc | Bin 0 -> 1498 bytes .../unidecode/__pycache__/x0a1.cpython-38.pyc | Bin 0 -> 1539 bytes .../unidecode/__pycache__/x0a2.cpython-38.pyc | Bin 0 -> 1573 bytes .../unidecode/__pycache__/x0a3.cpython-38.pyc | Bin 0 -> 1591 bytes .../unidecode/__pycache__/x0a4.cpython-38.pyc | Bin 0 -> 1516 bytes .../unidecode/__pycache__/x0ac.cpython-38.pyc | Bin 0 -> 1779 bytes .../unidecode/__pycache__/x0ad.cpython-38.pyc | Bin 0 -> 1836 bytes .../unidecode/__pycache__/x0ae.cpython-38.pyc | Bin 0 -> 1945 bytes .../unidecode/__pycache__/x0af.cpython-38.pyc | Bin 0 -> 2082 bytes .../unidecode/__pycache__/x0b0.cpython-38.pyc | Bin 0 -> 1923 bytes .../unidecode/__pycache__/x0b1.cpython-38.pyc | Bin 0 -> 1816 bytes .../unidecode/__pycache__/x0b2.cpython-38.pyc | Bin 0 -> 1750 bytes .../unidecode/__pycache__/x0b3.cpython-38.pyc | Bin 0 -> 1811 bytes .../unidecode/__pycache__/x0b4.cpython-38.pyc | Bin 0 -> 1832 bytes .../unidecode/__pycache__/x0b5.cpython-38.pyc | Bin 0 -> 1989 bytes .../unidecode/__pycache__/x0b6.cpython-38.pyc | Bin 0 -> 2066 bytes .../unidecode/__pycache__/x0b7.cpython-38.pyc | Bin 0 -> 1903 bytes .../unidecode/__pycache__/x0b8.cpython-38.pyc | Bin 0 -> 1784 bytes .../unidecode/__pycache__/x0b9.cpython-38.pyc | Bin 0 -> 1774 bytes .../unidecode/__pycache__/x0ba.cpython-38.pyc | Bin 0 -> 1835 bytes .../unidecode/__pycache__/x0bb.cpython-38.pyc | Bin 0 -> 1800 bytes .../unidecode/__pycache__/x0bc.cpython-38.pyc | Bin 0 -> 1777 bytes .../unidecode/__pycache__/x0bd.cpython-38.pyc | Bin 0 -> 1822 bytes .../unidecode/__pycache__/x0be.cpython-38.pyc | Bin 0 -> 1919 bytes .../unidecode/__pycache__/x0bf.cpython-38.pyc | Bin 0 -> 2080 bytes .../unidecode/__pycache__/x0c0.cpython-38.pyc | Bin 0 -> 1926 bytes .../unidecode/__pycache__/x0c1.cpython-38.pyc | Bin 0 -> 1835 bytes .../unidecode/__pycache__/x0c2.cpython-38.pyc | Bin 0 -> 1780 bytes .../unidecode/__pycache__/x0c3.cpython-38.pyc | Bin 0 -> 2045 bytes .../unidecode/__pycache__/x0c4.cpython-38.pyc | Bin 0 -> 2094 bytes .../unidecode/__pycache__/x0c5.cpython-38.pyc | Bin 0 -> 1651 bytes .../unidecode/__pycache__/x0c6.cpython-38.pyc | Bin 0 -> 1560 bytes .../unidecode/__pycache__/x0c7.cpython-38.pyc | Bin 0 -> 1634 bytes .../unidecode/__pycache__/x0c8.cpython-38.pyc | Bin 0 -> 1803 bytes .../unidecode/__pycache__/x0c9.cpython-38.pyc | Bin 0 -> 1792 bytes .../unidecode/__pycache__/x0ca.cpython-38.pyc | Bin 0 -> 2077 bytes .../unidecode/__pycache__/x0cb.cpython-38.pyc | Bin 0 -> 2082 bytes .../unidecode/__pycache__/x0cc.cpython-38.pyc | Bin 0 -> 1819 bytes .../unidecode/__pycache__/x0cd.cpython-38.pyc | Bin 0 -> 1808 bytes .../unidecode/__pycache__/x0ce.cpython-38.pyc | Bin 0 -> 1778 bytes .../unidecode/__pycache__/x0cf.cpython-38.pyc | Bin 0 -> 1783 bytes .../unidecode/__pycache__/x0d0.cpython-38.pyc | Bin 0 -> 1776 bytes .../unidecode/__pycache__/x0d1.cpython-38.pyc | Bin 0 -> 1837 bytes .../unidecode/__pycache__/x0d2.cpython-38.pyc | Bin 0 -> 1794 bytes .../unidecode/__pycache__/x0d3.cpython-38.pyc | Bin 0 -> 1775 bytes .../unidecode/__pycache__/x0d4.cpython-38.pyc | Bin 0 -> 1828 bytes .../unidecode/__pycache__/x0d5.cpython-38.pyc | Bin 0 -> 1750 bytes .../unidecode/__pycache__/x0d6.cpython-38.pyc | Bin 0 -> 1835 bytes .../unidecode/__pycache__/x0d7.cpython-38.pyc | Bin 0 -> 1638 bytes .../unidecode/__pycache__/x0f9.cpython-38.pyc | Bin 0 -> 1518 bytes .../unidecode/__pycache__/x0fa.cpython-38.pyc | Bin 0 -> 1467 bytes .../unidecode/__pycache__/x0fb.cpython-38.pyc | Bin 0 -> 1381 bytes .../unidecode/__pycache__/x0fc.cpython-38.pyc | Bin 0 -> 1430 bytes .../unidecode/__pycache__/x0fd.cpython-38.pyc | Bin 0 -> 1422 bytes .../unidecode/__pycache__/x0fe.cpython-38.pyc | Bin 0 -> 1372 bytes .../unidecode/__pycache__/x0ff.cpython-38.pyc | Bin 0 -> 1174 bytes .../unidecode/__pycache__/x1d4.cpython-38.pyc | Bin 0 -> 1326 bytes .../unidecode/__pycache__/x1d5.cpython-38.pyc | Bin 0 -> 1326 bytes .../unidecode/__pycache__/x1d6.cpython-38.pyc | Bin 0 -> 1382 bytes .../unidecode/__pycache__/x1d7.cpython-38.pyc | Bin 0 -> 1410 bytes .../unidecode/__pycache__/x1f1.cpython-38.pyc | Bin 0 -> 1419 bytes lib/python3.8/site-packages/unidecode/util.py | 58 + lib/python3.8/site-packages/unidecode/x000.py | 165 + lib/python3.8/site-packages/unidecode/x001.py | 258 + lib/python3.8/site-packages/unidecode/x002.py | 257 + lib/python3.8/site-packages/unidecode/x003.py | 257 + lib/python3.8/site-packages/unidecode/x004.py | 257 + lib/python3.8/site-packages/unidecode/x005.py | 257 + lib/python3.8/site-packages/unidecode/x006.py | 257 + lib/python3.8/site-packages/unidecode/x007.py | 257 + lib/python3.8/site-packages/unidecode/x009.py | 257 + lib/python3.8/site-packages/unidecode/x00a.py | 257 + lib/python3.8/site-packages/unidecode/x00b.py | 257 + lib/python3.8/site-packages/unidecode/x00c.py | 257 + lib/python3.8/site-packages/unidecode/x00d.py | 257 + lib/python3.8/site-packages/unidecode/x00e.py | 257 + lib/python3.8/site-packages/unidecode/x00f.py | 257 + lib/python3.8/site-packages/unidecode/x010.py | 257 + lib/python3.8/site-packages/unidecode/x011.py | 257 + lib/python3.8/site-packages/unidecode/x012.py | 258 + lib/python3.8/site-packages/unidecode/x013.py | 257 + lib/python3.8/site-packages/unidecode/x014.py | 258 + lib/python3.8/site-packages/unidecode/x015.py | 258 + lib/python3.8/site-packages/unidecode/x016.py | 257 + lib/python3.8/site-packages/unidecode/x017.py | 257 + lib/python3.8/site-packages/unidecode/x018.py | 257 + lib/python3.8/site-packages/unidecode/x01d.py | 257 + lib/python3.8/site-packages/unidecode/x01e.py | 257 + lib/python3.8/site-packages/unidecode/x01f.py | 257 + lib/python3.8/site-packages/unidecode/x020.py | 257 + lib/python3.8/site-packages/unidecode/x021.py | 257 + lib/python3.8/site-packages/unidecode/x022.py | 257 + lib/python3.8/site-packages/unidecode/x023.py | 257 + lib/python3.8/site-packages/unidecode/x024.py | 258 + lib/python3.8/site-packages/unidecode/x025.py | 257 + lib/python3.8/site-packages/unidecode/x026.py | 257 + lib/python3.8/site-packages/unidecode/x027.py | 257 + lib/python3.8/site-packages/unidecode/x028.py | 258 + lib/python3.8/site-packages/unidecode/x029.py | 257 + lib/python3.8/site-packages/unidecode/x02a.py | 257 + lib/python3.8/site-packages/unidecode/x02c.py | 257 + lib/python3.8/site-packages/unidecode/x02e.py | 257 + lib/python3.8/site-packages/unidecode/x02f.py | 257 + lib/python3.8/site-packages/unidecode/x030.py | 257 + lib/python3.8/site-packages/unidecode/x031.py | 257 + lib/python3.8/site-packages/unidecode/x032.py | 257 + lib/python3.8/site-packages/unidecode/x033.py | 258 + lib/python3.8/site-packages/unidecode/x04d.py | 257 + lib/python3.8/site-packages/unidecode/x04e.py | 258 + lib/python3.8/site-packages/unidecode/x04f.py | 258 + lib/python3.8/site-packages/unidecode/x050.py | 258 + lib/python3.8/site-packages/unidecode/x051.py | 258 + lib/python3.8/site-packages/unidecode/x052.py | 258 + lib/python3.8/site-packages/unidecode/x053.py | 258 + lib/python3.8/site-packages/unidecode/x054.py | 258 + lib/python3.8/site-packages/unidecode/x055.py | 258 + lib/python3.8/site-packages/unidecode/x056.py | 258 + lib/python3.8/site-packages/unidecode/x057.py | 258 + lib/python3.8/site-packages/unidecode/x058.py | 258 + lib/python3.8/site-packages/unidecode/x059.py | 258 + lib/python3.8/site-packages/unidecode/x05a.py | 258 + lib/python3.8/site-packages/unidecode/x05b.py | 258 + lib/python3.8/site-packages/unidecode/x05c.py | 258 + lib/python3.8/site-packages/unidecode/x05d.py | 258 + lib/python3.8/site-packages/unidecode/x05e.py | 258 + lib/python3.8/site-packages/unidecode/x05f.py | 258 + lib/python3.8/site-packages/unidecode/x060.py | 258 + lib/python3.8/site-packages/unidecode/x061.py | 258 + lib/python3.8/site-packages/unidecode/x062.py | 258 + lib/python3.8/site-packages/unidecode/x063.py | 258 + lib/python3.8/site-packages/unidecode/x064.py | 258 + lib/python3.8/site-packages/unidecode/x065.py | 258 + lib/python3.8/site-packages/unidecode/x066.py | 258 + lib/python3.8/site-packages/unidecode/x067.py | 258 + lib/python3.8/site-packages/unidecode/x068.py | 258 + lib/python3.8/site-packages/unidecode/x069.py | 258 + lib/python3.8/site-packages/unidecode/x06a.py | 258 + lib/python3.8/site-packages/unidecode/x06b.py | 258 + lib/python3.8/site-packages/unidecode/x06c.py | 258 + lib/python3.8/site-packages/unidecode/x06d.py | 258 + lib/python3.8/site-packages/unidecode/x06e.py | 258 + lib/python3.8/site-packages/unidecode/x06f.py | 258 + lib/python3.8/site-packages/unidecode/x070.py | 258 + lib/python3.8/site-packages/unidecode/x071.py | 258 + lib/python3.8/site-packages/unidecode/x072.py | 258 + lib/python3.8/site-packages/unidecode/x073.py | 258 + lib/python3.8/site-packages/unidecode/x074.py | 258 + lib/python3.8/site-packages/unidecode/x075.py | 258 + lib/python3.8/site-packages/unidecode/x076.py | 258 + lib/python3.8/site-packages/unidecode/x077.py | 258 + lib/python3.8/site-packages/unidecode/x078.py | 258 + lib/python3.8/site-packages/unidecode/x079.py | 258 + lib/python3.8/site-packages/unidecode/x07a.py | 258 + lib/python3.8/site-packages/unidecode/x07b.py | 258 + lib/python3.8/site-packages/unidecode/x07c.py | 258 + lib/python3.8/site-packages/unidecode/x07d.py | 258 + lib/python3.8/site-packages/unidecode/x07e.py | 258 + lib/python3.8/site-packages/unidecode/x07f.py | 258 + lib/python3.8/site-packages/unidecode/x080.py | 258 + lib/python3.8/site-packages/unidecode/x081.py | 258 + lib/python3.8/site-packages/unidecode/x082.py | 258 + lib/python3.8/site-packages/unidecode/x083.py | 258 + lib/python3.8/site-packages/unidecode/x084.py | 258 + lib/python3.8/site-packages/unidecode/x085.py | 258 + lib/python3.8/site-packages/unidecode/x086.py | 258 + lib/python3.8/site-packages/unidecode/x087.py | 258 + lib/python3.8/site-packages/unidecode/x088.py | 258 + lib/python3.8/site-packages/unidecode/x089.py | 258 + lib/python3.8/site-packages/unidecode/x08a.py | 258 + lib/python3.8/site-packages/unidecode/x08b.py | 258 + lib/python3.8/site-packages/unidecode/x08c.py | 258 + lib/python3.8/site-packages/unidecode/x08d.py | 258 + lib/python3.8/site-packages/unidecode/x08e.py | 258 + lib/python3.8/site-packages/unidecode/x08f.py | 258 + lib/python3.8/site-packages/unidecode/x090.py | 258 + lib/python3.8/site-packages/unidecode/x091.py | 258 + lib/python3.8/site-packages/unidecode/x092.py | 258 + lib/python3.8/site-packages/unidecode/x093.py | 258 + lib/python3.8/site-packages/unidecode/x094.py | 258 + lib/python3.8/site-packages/unidecode/x095.py | 258 + lib/python3.8/site-packages/unidecode/x096.py | 258 + lib/python3.8/site-packages/unidecode/x097.py | 258 + lib/python3.8/site-packages/unidecode/x098.py | 258 + lib/python3.8/site-packages/unidecode/x099.py | 258 + lib/python3.8/site-packages/unidecode/x09a.py | 258 + lib/python3.8/site-packages/unidecode/x09b.py | 258 + lib/python3.8/site-packages/unidecode/x09c.py | 258 + lib/python3.8/site-packages/unidecode/x09d.py | 258 + lib/python3.8/site-packages/unidecode/x09e.py | 258 + lib/python3.8/site-packages/unidecode/x09f.py | 257 + lib/python3.8/site-packages/unidecode/x0a0.py | 258 + lib/python3.8/site-packages/unidecode/x0a1.py | 258 + lib/python3.8/site-packages/unidecode/x0a2.py | 258 + lib/python3.8/site-packages/unidecode/x0a3.py | 258 + lib/python3.8/site-packages/unidecode/x0a4.py | 257 + lib/python3.8/site-packages/unidecode/x0ac.py | 258 + lib/python3.8/site-packages/unidecode/x0ad.py | 258 + lib/python3.8/site-packages/unidecode/x0ae.py | 258 + lib/python3.8/site-packages/unidecode/x0af.py | 258 + lib/python3.8/site-packages/unidecode/x0b0.py | 258 + lib/python3.8/site-packages/unidecode/x0b1.py | 258 + lib/python3.8/site-packages/unidecode/x0b2.py | 258 + lib/python3.8/site-packages/unidecode/x0b3.py | 258 + lib/python3.8/site-packages/unidecode/x0b4.py | 258 + lib/python3.8/site-packages/unidecode/x0b5.py | 258 + lib/python3.8/site-packages/unidecode/x0b6.py | 258 + lib/python3.8/site-packages/unidecode/x0b7.py | 258 + lib/python3.8/site-packages/unidecode/x0b8.py | 258 + lib/python3.8/site-packages/unidecode/x0b9.py | 258 + lib/python3.8/site-packages/unidecode/x0ba.py | 258 + lib/python3.8/site-packages/unidecode/x0bb.py | 258 + lib/python3.8/site-packages/unidecode/x0bc.py | 258 + lib/python3.8/site-packages/unidecode/x0bd.py | 258 + lib/python3.8/site-packages/unidecode/x0be.py | 258 + lib/python3.8/site-packages/unidecode/x0bf.py | 258 + lib/python3.8/site-packages/unidecode/x0c0.py | 258 + lib/python3.8/site-packages/unidecode/x0c1.py | 258 + lib/python3.8/site-packages/unidecode/x0c2.py | 258 + lib/python3.8/site-packages/unidecode/x0c3.py | 258 + lib/python3.8/site-packages/unidecode/x0c4.py | 258 + lib/python3.8/site-packages/unidecode/x0c5.py | 258 + lib/python3.8/site-packages/unidecode/x0c6.py | 258 + lib/python3.8/site-packages/unidecode/x0c7.py | 258 + lib/python3.8/site-packages/unidecode/x0c8.py | 258 + lib/python3.8/site-packages/unidecode/x0c9.py | 258 + lib/python3.8/site-packages/unidecode/x0ca.py | 258 + lib/python3.8/site-packages/unidecode/x0cb.py | 258 + lib/python3.8/site-packages/unidecode/x0cc.py | 258 + lib/python3.8/site-packages/unidecode/x0cd.py | 258 + lib/python3.8/site-packages/unidecode/x0ce.py | 258 + lib/python3.8/site-packages/unidecode/x0cf.py | 258 + lib/python3.8/site-packages/unidecode/x0d0.py | 258 + lib/python3.8/site-packages/unidecode/x0d1.py | 258 + lib/python3.8/site-packages/unidecode/x0d2.py | 258 + lib/python3.8/site-packages/unidecode/x0d3.py | 258 + lib/python3.8/site-packages/unidecode/x0d4.py | 258 + lib/python3.8/site-packages/unidecode/x0d5.py | 258 + lib/python3.8/site-packages/unidecode/x0d6.py | 258 + lib/python3.8/site-packages/unidecode/x0d7.py | 257 + lib/python3.8/site-packages/unidecode/x0f9.py | 258 + lib/python3.8/site-packages/unidecode/x0fa.py | 257 + lib/python3.8/site-packages/unidecode/x0fb.py | 258 + lib/python3.8/site-packages/unidecode/x0fc.py | 258 + lib/python3.8/site-packages/unidecode/x0fd.py | 257 + lib/python3.8/site-packages/unidecode/x0fe.py | 258 + lib/python3.8/site-packages/unidecode/x0ff.py | 258 + lib/python3.8/site-packages/unidecode/x1d4.py | 258 + lib/python3.8/site-packages/unidecode/x1d5.py | 258 + lib/python3.8/site-packages/unidecode/x1d6.py | 258 + lib/python3.8/site-packages/unidecode/x1d7.py | 258 + lib/python3.8/site-packages/unidecode/x1f1.py | 258 + .../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 -> 2095 bytes .../__pycache__/_collections.cpython-38.pyc | Bin 0 -> 10640 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 10075 bytes .../__pycache__/connectionpool.cpython-38.pyc | Bin 0 -> 24171 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 10024 bytes .../urllib3/__pycache__/fields.cpython-38.pyc | Bin 0 -> 8083 bytes .../__pycache__/filepost.cpython-38.pyc | Bin 0 -> 2709 bytes .../__pycache__/poolmanager.cpython-38.pyc | Bin 0 -> 12884 bytes .../__pycache__/request.cpython-38.pyc | Bin 0 -> 5623 bytes .../__pycache__/response.cpython-38.pyc | Bin 0 -> 20325 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 -> 173 bytes .../_appengine_environ.cpython-38.pyc | Bin 0 -> 1397 bytes .../__pycache__/ntlmpool.cpython-38.pyc | Bin 0 -> 3245 bytes .../__pycache__/pyopenssl.cpython-38.pyc | Bin 0 -> 14898 bytes .../contrib/__pycache__/socks.cpython-38.pyc | Bin 0 -> 5557 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 + lib/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 -> 388 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 -> 528 bytes .../_implementation.cpython-38.pyc | Bin 0 -> 3285 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 -> 993 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 3166 bytes .../util/__pycache__/queue.cpython-38.pyc | Bin 0 -> 1003 bytes .../util/__pycache__/request.cpython-38.pyc | Bin 0 -> 3323 bytes .../util/__pycache__/response.cpython-38.pyc | Bin 0 -> 1950 bytes .../util/__pycache__/retry.cpython-38.pyc | Bin 0 -> 12934 bytes .../util/__pycache__/ssl_.cpython-38.pyc | Bin 0 -> 9802 bytes .../util/__pycache__/timeout.cpython-38.pyc | Bin 0 -> 8853 bytes .../util/__pycache__/url.cpython-38.pyc | Bin 0 -> 10656 bytes .../util/__pycache__/wait.cpython-38.pyc | Bin 0 -> 3087 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 -> 9713 bytes .../__pycache__/labels.cpython-38.pyc | Bin 0 -> 3811 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 lib/python3.8/site-packages/wheel/__init__.py | 1 + lib/python3.8/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 185 bytes .../__pycache__/bdist_wheel.cpython-38.pyc | Bin 0 -> 10891 bytes .../__pycache__/macosx_libfile.cpython-38.pyc | Bin 0 -> 7112 bytes .../wheel/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 3721 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 7609 bytes .../wheel/__pycache__/pkginfo.cpython-38.pyc | Bin 0 -> 1546 bytes .../wheel/__pycache__/util.cpython-38.pyc | Bin 0 -> 1299 bytes .../__pycache__/wheelfile.cpython-38.pyc | Bin 0 -> 5517 bytes lib/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 -> 3069 bytes .../site-packages/wheel/cli/convert.py | 269 + lib/python3.8/site-packages/wheel/cli/pack.py | 79 + .../site-packages/wheel/cli/unpack.py | 25 + .../site-packages/wheel/macosx_libfile.py | 341 + lib/python3.8/site-packages/wheel/metadata.py | 138 + .../site-packages/wheel/pep425tags.py | 261 + lib/python3.8/site-packages/wheel/pkginfo.py | 43 + lib/python3.8/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + output | 1 + pelicanconf.py | 75 + publishconf.py | 28 + pyvenv.cfg | 8 + tasks.py | 110 + theme/blueidea/LICENSE | 20 + theme/blueidea/README.md | 54 + theme/blueidea/screenshot-1.png | Bin 0 -> 90734 bytes theme/blueidea/screenshot-2.png | Bin 0 -> 86223 bytes theme/blueidea/screenshot-3.png | Bin 0 -> 63019 bytes theme/blueidea/screenshot-4.png | Bin 0 -> 51253 bytes theme/blueidea/screenshot-5.png | Bin 0 -> 84742 bytes theme/blueidea/static/css/main.css | 474 + theme/blueidea/static/css/pygment.css | 66 + theme/blueidea/static/css/pygment.css.save | 205 + theme/blueidea/static/css/reset.css | 52 + theme/blueidea/static/css/typogrify.css | 3 + theme/blueidea/static/css/wide.css | 48 + .../blueidea/static/images/icons/_licence.txt | 15 + .../blueidea/static/images/icons/facebook.png | Bin 0 -> 1204 bytes theme/blueidea/static/images/icons/github.png | Bin 0 -> 1348 bytes .../static/images/icons/google-plus.png | Bin 0 -> 1411 bytes theme/blueidea/static/images/icons/lastfm.png | Bin 0 -> 1395 bytes .../blueidea/static/images/icons/linkedin.png | Bin 0 -> 1257 bytes theme/blueidea/static/images/icons/rss.png | Bin 0 -> 1441 bytes theme/blueidea/static/images/icons/search.png | Bin 0 -> 412 bytes .../blueidea/static/images/icons/twitter.png | Bin 0 -> 1389 bytes theme/blueidea/static/images/icons/vimeo.png | Bin 0 -> 1322 bytes .../blueidea/static/images/icons/youtube.png | Bin 0 -> 1504 bytes theme/blueidea/templates/analytics.html | 27 + theme/blueidea/templates/archives.html | 13 + theme/blueidea/templates/article.html | 35 + theme/blueidea/templates/article_infos.html | 12 + theme/blueidea/templates/author.html | 2 + theme/blueidea/templates/authors.html | 15 + theme/blueidea/templates/base.html | 101 + theme/blueidea/templates/category.html | 2 + theme/blueidea/templates/comments.html | 1 + theme/blueidea/templates/disqus_script.html | 11 + theme/blueidea/templates/github.html | 9 + theme/blueidea/templates/index.html | 60 + theme/blueidea/templates/page.html | 12 + theme/blueidea/templates/piwik.html | 19 + theme/blueidea/templates/tag.html | 2 + theme/blueidea/templates/taglist.html | 2 + theme/blueidea/templates/tags.html | 15 + theme/blueidea/templates/translations.html | 8 + theme/blueidea/templates/twitter.html | 3 + 3341 files changed, 419518 insertions(+) create mode 100644 Makefile create mode 100644 __pycache__/pelicanconf.cpython-38.pyc create mode 100644 __pycache__/publishconf.cpython-38.pyc create mode 100644 bin/__pycache__/rst2html.cpython-38.pyc create mode 100644 bin/__pycache__/rst2html4.cpython-38.pyc create mode 100644 bin/__pycache__/rst2html5.cpython-38.pyc create mode 100644 bin/__pycache__/rst2latex.cpython-38.pyc create mode 100644 bin/__pycache__/rst2man.cpython-38.pyc create mode 100644 bin/__pycache__/rst2odt.cpython-38.pyc create mode 100644 bin/__pycache__/rst2odt_prepstyles.cpython-38.pyc create mode 100644 bin/__pycache__/rst2pseudoxml.cpython-38.pyc create mode 100644 bin/__pycache__/rst2s5.cpython-38.pyc create mode 100644 bin/__pycache__/rst2xetex.cpython-38.pyc create mode 100644 bin/__pycache__/rst2xml.cpython-38.pyc create mode 100644 bin/__pycache__/rstpep2html.cpython-38.pyc create mode 100644 bin/activate create mode 100644 bin/activate.csh create mode 100644 bin/activate.fish create mode 100644 bin/activate.ps1 create mode 100644 bin/activate.xsh create mode 100644 bin/activate_this.py create mode 100755 bin/chardetect create mode 100755 bin/chardetect-3.8 create mode 100755 bin/chardetect3 create mode 100755 bin/distro create mode 100755 bin/distro-3.8 create mode 100755 bin/distro3 create mode 100755 bin/easy_install create mode 100755 bin/easy_install-3.8 create mode 100755 bin/easy_install3 create mode 100755 bin/markdown_py create mode 100755 bin/pelican create mode 100755 bin/pelican-import create mode 100755 bin/pelican-quickstart create mode 100755 bin/pelican-themes create mode 100755 bin/pip create mode 100755 bin/pip-3.8 create mode 100755 bin/pip3 create mode 100755 bin/pip3.8 create mode 100755 bin/pygmentize create mode 120000 bin/python create mode 120000 bin/python3 create mode 120000 bin/python3.8 create mode 100755 bin/rst2html.py create mode 100755 bin/rst2html4.py create mode 100755 bin/rst2html5.py create mode 100755 bin/rst2latex.py create mode 100755 bin/rst2man.py create mode 100755 bin/rst2odt.py create mode 100755 bin/rst2odt_prepstyles.py create mode 100755 bin/rst2pseudoxml.py create mode 100755 bin/rst2s5.py create mode 100755 bin/rst2xetex.py create mode 100755 bin/rst2xml.py create mode 100755 bin/rstpep2html.py create mode 100755 bin/unidecode create mode 100755 bin/wheel create mode 100755 bin/wheel-3.8 create mode 100755 bin/wheel3 create mode 100644 content/blog/privacy_for_the_whole_family.md create mode 100644 content/images/it_is_free_real_estate_1.jpg create mode 100644 content/pages/about.md create mode 100644 content/pages/contact.md create mode 100644 docs/archives.html create mode 100644 docs/author/ali-murteza-yesil.html create mode 100644 docs/authors.html create mode 100644 docs/categories.html create mode 100644 docs/category/tech.html create mode 100644 docs/feeds/all.atom.xml create mode 100644 docs/feeds/tech.atom.xml create mode 100644 docs/images/it_is_free_real_estate_1.jpg create mode 100644 docs/index.html create mode 100644 docs/pages/about.html create mode 100644 docs/pages/contact.html create mode 100644 docs/privacy-for-the-whole-family.html create mode 100644 docs/tag/nextcloud.html create mode 100644 docs/tag/privacy.html create mode 100644 docs/tag/self-hosting.html create mode 100644 docs/tags.html create mode 100644 docs/theme/css/main.css create mode 100644 docs/theme/css/pygment.css create mode 100644 docs/theme/css/pygment.css.save create mode 100644 docs/theme/css/reset.css create mode 100644 docs/theme/css/typogrify.css create mode 100644 docs/theme/css/wide.css create mode 100644 docs/theme/images/icons/_licence.txt create mode 100644 docs/theme/images/icons/facebook.png create mode 100644 docs/theme/images/icons/github.png create mode 100644 docs/theme/images/icons/google-plus.png create mode 100644 docs/theme/images/icons/lastfm.png create mode 100644 docs/theme/images/icons/linkedin.png create mode 100644 docs/theme/images/icons/rss.png create mode 100644 docs/theme/images/icons/search.png create mode 100644 docs/theme/images/icons/twitter.png create mode 100644 docs/theme/images/icons/vimeo.png create mode 100644 docs/theme/images/icons/youtube.png create mode 100644 lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv create mode 100644 lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/LICENSE.rst create mode 100644 lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/Markdown-3.2.2.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/Markdown-3.2.2.dist-info/LICENSE.md create mode 100644 lib/python3.8/site-packages/Markdown-3.2.2.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/Markdown-3.2.2.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/Markdown-3.2.2.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/Markdown-3.2.2.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/Markdown-3.2.2.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/Pygments-2.6.1.dist-info/AUTHORS create mode 100644 lib/python3.8/site-packages/Pygments-2.6.1.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/Pygments-2.6.1.dist-info/LICENSE create mode 100644 lib/python3.8/site-packages/Pygments-2.6.1.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/Pygments-2.6.1.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/Pygments-2.6.1.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/Pygments-2.6.1.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/Pygments-2.6.1.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/DESCRIPTION.rst create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/metadata.json create mode 100644 lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/__pycache__/appdirs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/__pycache__/contextlib2.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/__pycache__/distro.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/__pycache__/pyparsing.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/__pycache__/retrying.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/_virtualenv.pth create mode 100644 lib/python3.8/site-packages/_virtualenv.py create mode 100644 lib/python3.8/site-packages/appdirs-1.4.3.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/appdirs-1.4.3.virtualenv create mode 100644 lib/python3.8/site-packages/appdirs.py create mode 100644 lib/python3.8/site-packages/blinker-1.4.dist-info/AUTHORS create mode 100644 lib/python3.8/site-packages/blinker-1.4.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/blinker-1.4.dist-info/LICENSE create mode 100644 lib/python3.8/site-packages/blinker-1.4.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/blinker-1.4.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/blinker-1.4.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/blinker-1.4.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/blinker/__init__.py create mode 100644 lib/python3.8/site-packages/blinker/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/blinker/__pycache__/_saferef.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/blinker/__pycache__/_utilities.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/blinker/__pycache__/base.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/blinker/_saferef.py create mode 100644 lib/python3.8/site-packages/blinker/_utilities.py create mode 100644 lib/python3.8/site-packages/blinker/base.py create mode 100644 lib/python3.8/site-packages/cachecontrol/__init__.py create mode 100644 lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/__pycache__/adapter.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/__pycache__/compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/__pycache__/filewrapper.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/__pycache__/wrapper.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/_cmd.py create mode 100644 lib/python3.8/site-packages/cachecontrol/adapter.py create mode 100644 lib/python3.8/site-packages/cachecontrol/cache.py create mode 100644 lib/python3.8/site-packages/cachecontrol/caches/__init__.py create mode 100644 lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/cachecontrol/caches/file_cache.py create mode 100644 lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py create mode 100644 lib/python3.8/site-packages/cachecontrol/compat.py create mode 100644 lib/python3.8/site-packages/cachecontrol/controller.py create mode 100644 lib/python3.8/site-packages/cachecontrol/filewrapper.py create mode 100644 lib/python3.8/site-packages/cachecontrol/heuristics.py create mode 100644 lib/python3.8/site-packages/cachecontrol/serialize.py create mode 100644 lib/python3.8/site-packages/cachecontrol/wrapper.py create mode 100644 lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/certifi-2019.11.28.virtualenv create mode 100644 lib/python3.8/site-packages/certifi/__init__.py create mode 100644 lib/python3.8/site-packages/certifi/__main__.py create mode 100644 lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/certifi/__pycache__/core.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/certifi/cacert.pem create mode 100644 lib/python3.8/site-packages/certifi/core.py create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/chardet-3.0.4.virtualenv create mode 100644 lib/python3.8/site-packages/chardet/__init__.py create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/big5freq.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/cp949prober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/escsm.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/euctwprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/gb2312prober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/jpcntx.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/langgreekmodel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/sbcharsetprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/chardet/big5freq.py create mode 100644 lib/python3.8/site-packages/chardet/big5prober.py create mode 100644 lib/python3.8/site-packages/chardet/chardistribution.py create mode 100644 lib/python3.8/site-packages/chardet/charsetgroupprober.py create mode 100644 lib/python3.8/site-packages/chardet/charsetprober.py create mode 100644 lib/python3.8/site-packages/chardet/cli/__init__.py create mode 100644 lib/python3.8/site-packages/chardet/cli/chardetect.py create mode 100644 lib/python3.8/site-packages/chardet/codingstatemachine.py create mode 100644 lib/python3.8/site-packages/chardet/compat.py create mode 100644 lib/python3.8/site-packages/chardet/cp949prober.py create mode 100644 lib/python3.8/site-packages/chardet/enums.py create mode 100644 lib/python3.8/site-packages/chardet/escprober.py create mode 100644 lib/python3.8/site-packages/chardet/escsm.py create mode 100644 lib/python3.8/site-packages/chardet/eucjpprober.py create mode 100644 lib/python3.8/site-packages/chardet/euckrfreq.py create mode 100644 lib/python3.8/site-packages/chardet/euckrprober.py create mode 100644 lib/python3.8/site-packages/chardet/euctwfreq.py create mode 100644 lib/python3.8/site-packages/chardet/euctwprober.py create mode 100644 lib/python3.8/site-packages/chardet/gb2312freq.py create mode 100644 lib/python3.8/site-packages/chardet/gb2312prober.py create mode 100644 lib/python3.8/site-packages/chardet/hebrewprober.py create mode 100644 lib/python3.8/site-packages/chardet/jisfreq.py create mode 100644 lib/python3.8/site-packages/chardet/jpcntx.py create mode 100644 lib/python3.8/site-packages/chardet/langbulgarianmodel.py create mode 100644 lib/python3.8/site-packages/chardet/langcyrillicmodel.py create mode 100644 lib/python3.8/site-packages/chardet/langgreekmodel.py create mode 100644 lib/python3.8/site-packages/chardet/langhebrewmodel.py create mode 100644 lib/python3.8/site-packages/chardet/langhungarianmodel.py create mode 100644 lib/python3.8/site-packages/chardet/langthaimodel.py create mode 100644 lib/python3.8/site-packages/chardet/langturkishmodel.py create mode 100644 lib/python3.8/site-packages/chardet/latin1prober.py create mode 100644 lib/python3.8/site-packages/chardet/mbcharsetprober.py create mode 100644 lib/python3.8/site-packages/chardet/mbcsgroupprober.py create mode 100644 lib/python3.8/site-packages/chardet/mbcssm.py create mode 100644 lib/python3.8/site-packages/chardet/sbcharsetprober.py create mode 100644 lib/python3.8/site-packages/chardet/sbcsgroupprober.py create mode 100644 lib/python3.8/site-packages/chardet/sjisprober.py create mode 100644 lib/python3.8/site-packages/chardet/universaldetector.py create mode 100644 lib/python3.8/site-packages/chardet/utf8prober.py create mode 100644 lib/python3.8/site-packages/chardet/version.py create mode 100644 lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/colorama-0.4.3.virtualenv create mode 100644 lib/python3.8/site-packages/colorama/__init__.py create mode 100644 lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/colorama/__pycache__/ansi.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/colorama/__pycache__/ansitowin32.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/colorama/__pycache__/initialise.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/colorama/__pycache__/winterm.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/colorama/ansi.py create mode 100644 lib/python3.8/site-packages/colorama/ansitowin32.py create mode 100644 lib/python3.8/site-packages/colorama/initialise.py create mode 100644 lib/python3.8/site-packages/colorama/win32.py create mode 100644 lib/python3.8/site-packages/colorama/winterm.py create mode 100644 lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv create mode 100644 lib/python3.8/site-packages/contextlib2.py create mode 100644 lib/python3.8/site-packages/dateutil/__init__.py create mode 100644 lib/python3.8/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/__pycache__/_common.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/__pycache__/_version.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/__pycache__/easter.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/__pycache__/relativedelta.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/__pycache__/rrule.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/__pycache__/tzwin.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/__pycache__/utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/_common.py create mode 100644 lib/python3.8/site-packages/dateutil/_version.py create mode 100644 lib/python3.8/site-packages/dateutil/easter.py create mode 100644 lib/python3.8/site-packages/dateutil/parser/__init__.py create mode 100644 lib/python3.8/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/parser/__pycache__/isoparser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/parser/_parser.py create mode 100644 lib/python3.8/site-packages/dateutil/parser/isoparser.py create mode 100644 lib/python3.8/site-packages/dateutil/relativedelta.py create mode 100644 lib/python3.8/site-packages/dateutil/rrule.py create mode 100644 lib/python3.8/site-packages/dateutil/tz/__init__.py create mode 100644 lib/python3.8/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/tz/__pycache__/_factories.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/tz/__pycache__/win.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/tz/_common.py create mode 100644 lib/python3.8/site-packages/dateutil/tz/_factories.py create mode 100644 lib/python3.8/site-packages/dateutil/tz/tz.py create mode 100644 lib/python3.8/site-packages/dateutil/tz/win.py create mode 100644 lib/python3.8/site-packages/dateutil/tzwin.py create mode 100644 lib/python3.8/site-packages/dateutil/utils.py create mode 100644 lib/python3.8/site-packages/dateutil/zoneinfo/__init__.py create mode 100644 lib/python3.8/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz create mode 100644 lib/python3.8/site-packages/dateutil/zoneinfo/rebuild.py create mode 100644 lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/distlib-0.3.0.virtualenv create mode 100644 lib/python3.8/site-packages/distlib/__init__.py create mode 100644 lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/distlib/__pycache__/compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/distlib/__pycache__/resources.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/distlib/__pycache__/scripts.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/distlib/__pycache__/util.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/distlib/_backport/__init__.py create mode 100644 lib/python3.8/site-packages/distlib/_backport/misc.py create mode 100644 lib/python3.8/site-packages/distlib/_backport/shutil.py create mode 100644 lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg create mode 100644 lib/python3.8/site-packages/distlib/_backport/sysconfig.py create mode 100644 lib/python3.8/site-packages/distlib/_backport/tarfile.py create mode 100644 lib/python3.8/site-packages/distlib/compat.py create mode 100644 lib/python3.8/site-packages/distlib/database.py create mode 100644 lib/python3.8/site-packages/distlib/index.py create mode 100644 lib/python3.8/site-packages/distlib/locators.py create mode 100644 lib/python3.8/site-packages/distlib/manifest.py create mode 100644 lib/python3.8/site-packages/distlib/markers.py create mode 100644 lib/python3.8/site-packages/distlib/metadata.py create mode 100644 lib/python3.8/site-packages/distlib/resources.py create mode 100644 lib/python3.8/site-packages/distlib/scripts.py create mode 100644 lib/python3.8/site-packages/distlib/util.py create mode 100644 lib/python3.8/site-packages/distlib/version.py create mode 100644 lib/python3.8/site-packages/distlib/wheel.py create mode 100644 lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/distro-1.4.0.virtualenv create mode 100644 lib/python3.8/site-packages/distro.py create mode 100644 lib/python3.8/site-packages/docutils-0.16.dist-info/COPYING.txt create mode 100644 lib/python3.8/site-packages/docutils-0.16.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/docutils-0.16.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/docutils-0.16.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/docutils-0.16.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/docutils-0.16.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/docutils/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/__pycache__/core.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/__pycache__/examples.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/__pycache__/frontend.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/__pycache__/io.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/__pycache__/nodes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/__pycache__/statemachine.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/core.py create mode 100644 lib/python3.8/site-packages/docutils/examples.py create mode 100644 lib/python3.8/site-packages/docutils/frontend.py create mode 100644 lib/python3.8/site-packages/docutils/io.py create mode 100644 lib/python3.8/site-packages/docutils/languages/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/af.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/ca.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/cs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/da.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/de.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/en.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/eo.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/es.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/fa.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/fi.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/fr.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/gl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/he.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/it.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/ja.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/ko.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/lt.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/lv.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/nl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/pl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/pt_br.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/ru.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/sk.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/sv.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/zh_cn.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/__pycache__/zh_tw.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/languages/af.py create mode 100644 lib/python3.8/site-packages/docutils/languages/ca.py create mode 100644 lib/python3.8/site-packages/docutils/languages/cs.py create mode 100644 lib/python3.8/site-packages/docutils/languages/da.py create mode 100644 lib/python3.8/site-packages/docutils/languages/de.py create mode 100644 lib/python3.8/site-packages/docutils/languages/en.py create mode 100644 lib/python3.8/site-packages/docutils/languages/eo.py create mode 100644 lib/python3.8/site-packages/docutils/languages/es.py create mode 100644 lib/python3.8/site-packages/docutils/languages/fa.py create mode 100644 lib/python3.8/site-packages/docutils/languages/fi.py create mode 100644 lib/python3.8/site-packages/docutils/languages/fr.py create mode 100644 lib/python3.8/site-packages/docutils/languages/gl.py create mode 100644 lib/python3.8/site-packages/docutils/languages/he.py create mode 100644 lib/python3.8/site-packages/docutils/languages/it.py create mode 100644 lib/python3.8/site-packages/docutils/languages/ja.py create mode 100644 lib/python3.8/site-packages/docutils/languages/ko.py create mode 100644 lib/python3.8/site-packages/docutils/languages/lt.py create mode 100644 lib/python3.8/site-packages/docutils/languages/lv.py create mode 100644 lib/python3.8/site-packages/docutils/languages/nl.py create mode 100644 lib/python3.8/site-packages/docutils/languages/pl.py create mode 100644 lib/python3.8/site-packages/docutils/languages/pt_br.py create mode 100644 lib/python3.8/site-packages/docutils/languages/ru.py create mode 100644 lib/python3.8/site-packages/docutils/languages/sk.py create mode 100644 lib/python3.8/site-packages/docutils/languages/sv.py create mode 100644 lib/python3.8/site-packages/docutils/languages/zh_cn.py create mode 100644 lib/python3.8/site-packages/docutils/languages/zh_tw.py create mode 100644 lib/python3.8/site-packages/docutils/nodes.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/__pycache__/null.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/null.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/__pycache__/roles.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/__pycache__/states.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/__pycache__/tableparser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/admonitions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/body.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/html.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/images.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/misc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/parts.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/references.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/tables.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/admonitions.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/body.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/html.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/images.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/misc.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/parts.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/references.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/directives/tables.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/README.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsa.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsb.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsc.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsn.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isoamso.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsr.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isobox.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr1.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr2.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isodia.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk1.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk2.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk3.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isolat1.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isolat2.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf-wide.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr-wide.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isonum.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isopub.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/isotech.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/mmlalias.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/s5defs.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-special.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/af.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ca.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/cs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/da.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/de.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/en.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/eo.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/es.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fa.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fi.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fr.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/gl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/he.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/it.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ja.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ko.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/lt.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/lv.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/nl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/pl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/pt_br.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ru.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/sk.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/sv.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/zh_cn.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/zh_tw.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/af.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/ca.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/cs.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/da.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/de.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/en.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/eo.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/es.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/fa.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/fi.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/fr.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/gl.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/he.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/it.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/ja.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/ko.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/lt.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/lv.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/nl.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/pl.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/pt_br.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/ru.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/sk.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/sv.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_cn.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_tw.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/roles.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/states.py create mode 100644 lib/python3.8/site-packages/docutils/parsers/rst/tableparser.py create mode 100644 lib/python3.8/site-packages/docutils/readers/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/readers/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/readers/__pycache__/doctree.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/readers/__pycache__/pep.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/readers/__pycache__/standalone.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/readers/doctree.py create mode 100644 lib/python3.8/site-packages/docutils/readers/pep.py create mode 100644 lib/python3.8/site-packages/docutils/readers/standalone.py create mode 100644 lib/python3.8/site-packages/docutils/statemachine.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/components.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/frontmatter.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/misc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/parts.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/peps.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/references.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/universal.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/__pycache__/writer_aux.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/transforms/components.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/frontmatter.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/misc.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/parts.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/peps.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/references.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/universal.py create mode 100644 lib/python3.8/site-packages/docutils/transforms/writer_aux.py create mode 100644 lib/python3.8/site-packages/docutils/utils/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/__pycache__/code_analyzer.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/__pycache__/error_reporting.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/__pycache__/punctuation_chars.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/__pycache__/roman.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/__pycache__/smartquotes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/__pycache__/urischemes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/code_analyzer.py create mode 100644 lib/python3.8/site-packages/docutils/utils/error_reporting.py create mode 100644 lib/python3.8/site-packages/docutils/utils/math/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/utils/math/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/math/__pycache__/latex2mathml.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/math/__pycache__/math2html.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/math/__pycache__/tex2mathml_extern.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/math/__pycache__/tex2unichar.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/math/__pycache__/unichar2tex.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/utils/math/latex2mathml.py create mode 100644 lib/python3.8/site-packages/docutils/utils/math/math2html.py create mode 100644 lib/python3.8/site-packages/docutils/utils/math/tex2mathml_extern.py create mode 100644 lib/python3.8/site-packages/docutils/utils/math/tex2unichar.py create mode 100644 lib/python3.8/site-packages/docutils/utils/math/unichar2tex.py create mode 100644 lib/python3.8/site-packages/docutils/utils/punctuation_chars.py create mode 100644 lib/python3.8/site-packages/docutils/utils/roman.py create mode 100644 lib/python3.8/site-packages/docutils/utils/smartquotes.py create mode 100644 lib/python3.8/site-packages/docutils/utils/urischemes.py create mode 100644 lib/python3.8/site-packages/docutils/writers/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/writers/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/__pycache__/_html_base.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/__pycache__/docutils_xml.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/__pycache__/manpage.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/__pycache__/null.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/__pycache__/pseudoxml.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/_html_base.py create mode 100644 lib/python3.8/site-packages/docutils/writers/docutils_xml.py create mode 100644 lib/python3.8/site-packages/docutils/writers/html4css1/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/writers/html4css1/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/html4css1/html4css1.css create mode 100644 lib/python3.8/site-packages/docutils/writers/html4css1/template.txt create mode 100644 lib/python3.8/site-packages/docutils/writers/html5_polyglot/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/writers/html5_polyglot/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/html5_polyglot/math.css create mode 100644 lib/python3.8/site-packages/docutils/writers/html5_polyglot/minimal.css create mode 100644 lib/python3.8/site-packages/docutils/writers/html5_polyglot/plain.css create mode 100644 lib/python3.8/site-packages/docutils/writers/html5_polyglot/template.txt create mode 100644 lib/python3.8/site-packages/docutils/writers/latex2e/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/writers/latex2e/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/latex2e/default.tex create mode 100644 lib/python3.8/site-packages/docutils/writers/latex2e/titlepage.tex create mode 100644 lib/python3.8/site-packages/docutils/writers/latex2e/xelatex.tex create mode 100644 lib/python3.8/site-packages/docutils/writers/manpage.py create mode 100644 lib/python3.8/site-packages/docutils/writers/null.py create mode 100644 lib/python3.8/site-packages/docutils/writers/odf_odt/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/writers/odf_odt/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/odf_odt/__pycache__/pygmentsformatter.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/odf_odt/pygmentsformatter.py create mode 100644 lib/python3.8/site-packages/docutils/writers/odf_odt/styles.odt create mode 100644 lib/python3.8/site-packages/docutils/writers/pep_html/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/writers/pep_html/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/pep_html/pep.css create mode 100644 lib/python3.8/site-packages/docutils/writers/pep_html/template.txt create mode 100644 lib/python3.8/site-packages/docutils/writers/pseudoxml.py create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/README.txt create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-black/__base__ create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-black/framing.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-black/pretty.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-white/framing.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-white/pretty.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/blank.gif create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/framing.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/iepngfix.htc create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/opera.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/outline.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/pretty.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/print.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/s5-core.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/slides.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/slides.js create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/medium-black/__base__ create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/medium-black/pretty.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/medium-white/framing.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/medium-white/pretty.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/small-black/__base__ create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/small-black/pretty.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/small-white/framing.css create mode 100644 lib/python3.8/site-packages/docutils/writers/s5_html/themes/small-white/pretty.css create mode 100644 lib/python3.8/site-packages/docutils/writers/xetex/__init__.py create mode 100644 lib/python3.8/site-packages/docutils/writers/xetex/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/easy_install.py create mode 100644 lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/LICENSE create mode 100644 lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/feedgenerator/__init__.py create mode 100644 lib/python3.8/site-packages/feedgenerator/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/__init__.py create mode 100644 lib/python3.8/site-packages/feedgenerator/django/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__init__.py create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/datetime_safe.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/encoding.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/feedgenerator.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/functional.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/six.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/timezone.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/xmlutils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/datetime_safe.py create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/encoding.py create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/feedgenerator.py create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/functional.py create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/six.py create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/timezone.py create mode 100644 lib/python3.8/site-packages/feedgenerator/django/utils/xmlutils.py create mode 100644 lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/html5lib-1.0.1.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/html5lib-1.0.1.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/html5lib-1.0.1.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/html5lib-1.0.1.virtualenv create mode 100644 lib/python3.8/site-packages/html5lib/__init__.py create mode 100644 lib/python3.8/site-packages/html5lib/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/__pycache__/_ihatexml.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/__pycache__/_inputstream.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/__pycache__/_tokenizer.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/__pycache__/_utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/__pycache__/constants.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/__pycache__/html5parser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/__pycache__/serializer.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/_ihatexml.py create mode 100644 lib/python3.8/site-packages/html5lib/_inputstream.py create mode 100644 lib/python3.8/site-packages/html5lib/_tokenizer.py create mode 100644 lib/python3.8/site-packages/html5lib/_trie/__init__.py create mode 100644 lib/python3.8/site-packages/html5lib/_trie/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/_trie/__pycache__/_base.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/_trie/__pycache__/datrie.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/_trie/__pycache__/py.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/_trie/_base.py create mode 100644 lib/python3.8/site-packages/html5lib/_trie/datrie.py create mode 100644 lib/python3.8/site-packages/html5lib/_trie/py.py create mode 100644 lib/python3.8/site-packages/html5lib/_utils.py create mode 100644 lib/python3.8/site-packages/html5lib/constants.py create mode 100644 lib/python3.8/site-packages/html5lib/filters/__init__.py create mode 100644 lib/python3.8/site-packages/html5lib/filters/alphabeticalattributes.py create mode 100644 lib/python3.8/site-packages/html5lib/filters/base.py create mode 100644 lib/python3.8/site-packages/html5lib/filters/inject_meta_charset.py create mode 100644 lib/python3.8/site-packages/html5lib/filters/lint.py create mode 100644 lib/python3.8/site-packages/html5lib/filters/optionaltags.py create mode 100644 lib/python3.8/site-packages/html5lib/filters/sanitizer.py create mode 100644 lib/python3.8/site-packages/html5lib/filters/whitespace.py create mode 100644 lib/python3.8/site-packages/html5lib/html5parser.py create mode 100644 lib/python3.8/site-packages/html5lib/serializer.py create mode 100644 lib/python3.8/site-packages/html5lib/treeadapters/__init__.py create mode 100644 lib/python3.8/site-packages/html5lib/treeadapters/genshi.py create mode 100644 lib/python3.8/site-packages/html5lib/treeadapters/sax.py create mode 100644 lib/python3.8/site-packages/html5lib/treebuilders/__init__.py create mode 100644 lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/base.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/treebuilders/base.py create mode 100644 lib/python3.8/site-packages/html5lib/treebuilders/dom.py create mode 100644 lib/python3.8/site-packages/html5lib/treebuilders/etree.py create mode 100644 lib/python3.8/site-packages/html5lib/treebuilders/etree_lxml.py create mode 100644 lib/python3.8/site-packages/html5lib/treewalkers/__init__.py create mode 100644 lib/python3.8/site-packages/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/html5lib/treewalkers/base.py create mode 100644 lib/python3.8/site-packages/html5lib/treewalkers/dom.py create mode 100644 lib/python3.8/site-packages/html5lib/treewalkers/etree.py create mode 100644 lib/python3.8/site-packages/html5lib/treewalkers/etree_lxml.py create mode 100644 lib/python3.8/site-packages/html5lib/treewalkers/genshi.py create mode 100644 lib/python3.8/site-packages/idna-2.8.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/idna-2.8.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/idna-2.8.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/idna-2.8.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/idna-2.8.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/idna-2.8.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/idna-2.8.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/idna-2.8.virtualenv create mode 100644 lib/python3.8/site-packages/idna/__init__.py create mode 100644 lib/python3.8/site-packages/idna/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/idna/__pycache__/core.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/idna/__pycache__/idnadata.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/idna/__pycache__/intranges.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/idna/__pycache__/package_data.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/idna/codec.py create mode 100644 lib/python3.8/site-packages/idna/compat.py create mode 100644 lib/python3.8/site-packages/idna/core.py create mode 100644 lib/python3.8/site-packages/idna/idnadata.py create mode 100644 lib/python3.8/site-packages/idna/intranges.py create mode 100644 lib/python3.8/site-packages/idna/package_data.py create mode 100644 lib/python3.8/site-packages/idna/uts46data.py create mode 100644 lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/ipaddr-2.2.0.virtualenv create mode 100644 lib/python3.8/site-packages/ipaddr.py create mode 100644 lib/python3.8/site-packages/jinja2/__init__.py create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/_compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/_identifier.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/asyncfilters.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/asyncsupport.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/bccache.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/compiler.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/constants.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/debug.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/defaults.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/environment.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/exceptions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/ext.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/filters.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/idtracking.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/lexer.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/loaders.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/meta.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/nativetypes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/nodes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/optimizer.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/parser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/runtime.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/sandbox.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/tests.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/__pycache__/visitor.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/jinja2/_compat.py create mode 100644 lib/python3.8/site-packages/jinja2/_identifier.py create mode 100644 lib/python3.8/site-packages/jinja2/asyncfilters.py create mode 100644 lib/python3.8/site-packages/jinja2/asyncsupport.py create mode 100644 lib/python3.8/site-packages/jinja2/bccache.py create mode 100644 lib/python3.8/site-packages/jinja2/compiler.py create mode 100644 lib/python3.8/site-packages/jinja2/constants.py create mode 100644 lib/python3.8/site-packages/jinja2/debug.py create mode 100644 lib/python3.8/site-packages/jinja2/defaults.py create mode 100644 lib/python3.8/site-packages/jinja2/environment.py create mode 100644 lib/python3.8/site-packages/jinja2/exceptions.py create mode 100644 lib/python3.8/site-packages/jinja2/ext.py create mode 100644 lib/python3.8/site-packages/jinja2/filters.py create mode 100644 lib/python3.8/site-packages/jinja2/idtracking.py create mode 100644 lib/python3.8/site-packages/jinja2/lexer.py create mode 100644 lib/python3.8/site-packages/jinja2/loaders.py create mode 100644 lib/python3.8/site-packages/jinja2/meta.py create mode 100644 lib/python3.8/site-packages/jinja2/nativetypes.py create mode 100644 lib/python3.8/site-packages/jinja2/nodes.py create mode 100644 lib/python3.8/site-packages/jinja2/optimizer.py create mode 100644 lib/python3.8/site-packages/jinja2/parser.py create mode 100644 lib/python3.8/site-packages/jinja2/runtime.py create mode 100644 lib/python3.8/site-packages/jinja2/sandbox.py create mode 100644 lib/python3.8/site-packages/jinja2/tests.py create mode 100644 lib/python3.8/site-packages/jinja2/utils.py create mode 100644 lib/python3.8/site-packages/jinja2/visitor.py create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.dist-info/pbr.json create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/lockfile-0.12.2.virtualenv create mode 100644 lib/python3.8/site-packages/lockfile/__init__.py create mode 100644 lib/python3.8/site-packages/lockfile/linklockfile.py create mode 100644 lib/python3.8/site-packages/lockfile/mkdirlockfile.py create mode 100644 lib/python3.8/site-packages/lockfile/pidlockfile.py create mode 100644 lib/python3.8/site-packages/lockfile/sqlitelockfile.py create mode 100644 lib/python3.8/site-packages/lockfile/symlinklockfile.py create mode 100644 lib/python3.8/site-packages/markdown/__init__.py create mode 100644 lib/python3.8/site-packages/markdown/__main__.py create mode 100644 lib/python3.8/site-packages/markdown/__meta__.py create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/__main__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/__meta__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/blockparser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/blockprocessors.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/core.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/inlinepatterns.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/pep562.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/postprocessors.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/preprocessors.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/serializers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/test_tools.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/treeprocessors.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/__pycache__/util.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/blockparser.py create mode 100644 lib/python3.8/site-packages/markdown/blockprocessors.py create mode 100644 lib/python3.8/site-packages/markdown/core.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/__init__.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/abbr.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/admonition.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/attr_list.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/codehilite.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/def_list.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/extra.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/fenced_code.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/footnotes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/legacy_attrs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/legacy_em.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/md_in_html.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/meta.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/nl2br.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/sane_lists.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/smarty.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/tables.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/toc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/__pycache__/wikilinks.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markdown/extensions/abbr.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/admonition.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/attr_list.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/codehilite.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/def_list.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/extra.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/fenced_code.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/footnotes.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/legacy_attrs.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/legacy_em.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/md_in_html.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/meta.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/nl2br.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/sane_lists.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/smarty.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/tables.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/toc.py create mode 100644 lib/python3.8/site-packages/markdown/extensions/wikilinks.py create mode 100644 lib/python3.8/site-packages/markdown/inlinepatterns.py create mode 100644 lib/python3.8/site-packages/markdown/pep562.py create mode 100644 lib/python3.8/site-packages/markdown/postprocessors.py create mode 100644 lib/python3.8/site-packages/markdown/preprocessors.py create mode 100644 lib/python3.8/site-packages/markdown/serializers.py create mode 100644 lib/python3.8/site-packages/markdown/test_tools.py create mode 100644 lib/python3.8/site-packages/markdown/treeprocessors.py create mode 100644 lib/python3.8/site-packages/markdown/util.py create mode 100644 lib/python3.8/site-packages/markupsafe/__init__.py create mode 100644 lib/python3.8/site-packages/markupsafe/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markupsafe/__pycache__/_compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markupsafe/__pycache__/_constants.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markupsafe/__pycache__/_native.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/markupsafe/_compat.py create mode 100644 lib/python3.8/site-packages/markupsafe/_constants.py create mode 100644 lib/python3.8/site-packages/markupsafe/_native.py create mode 100644 lib/python3.8/site-packages/markupsafe/_speedups.c create mode 100755 lib/python3.8/site-packages/markupsafe/_speedups.cpython-38-x86_64-linux-gnu.so create mode 100644 lib/python3.8/site-packages/msgpack-0.6.2.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/msgpack-0.6.2.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/msgpack-0.6.2.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/msgpack-0.6.2.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/msgpack-0.6.2.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/msgpack-0.6.2.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/msgpack-0.6.2.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/msgpack-0.6.2.virtualenv create mode 100644 lib/python3.8/site-packages/msgpack/__init__.py create mode 100644 lib/python3.8/site-packages/msgpack/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/msgpack/__pycache__/_version.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/msgpack/__pycache__/exceptions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/msgpack/_cmsgpack.cpython-38-x86_64-linux-gnu.so create mode 100644 lib/python3.8/site-packages/msgpack/_version.py create mode 100644 lib/python3.8/site-packages/msgpack/exceptions.py create mode 100644 lib/python3.8/site-packages/msgpack/fallback.py create mode 100644 lib/python3.8/site-packages/packaging-20.3.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/packaging-20.3.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/packaging-20.3.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/packaging-20.3.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/packaging-20.3.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/packaging-20.3.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/packaging-20.3.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/packaging-20.3.virtualenv create mode 100644 lib/python3.8/site-packages/packaging/__about__.py create mode 100644 lib/python3.8/site-packages/packaging/__init__.py create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/_typing.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/__pycache__/version.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/packaging/_compat.py create mode 100644 lib/python3.8/site-packages/packaging/_structures.py create mode 100644 lib/python3.8/site-packages/packaging/_typing.py create mode 100644 lib/python3.8/site-packages/packaging/markers.py create mode 100644 lib/python3.8/site-packages/packaging/py.typed create mode 100644 lib/python3.8/site-packages/packaging/requirements.py create mode 100644 lib/python3.8/site-packages/packaging/specifiers.py create mode 100644 lib/python3.8/site-packages/packaging/tags.py create mode 100644 lib/python3.8/site-packages/packaging/utils.py create mode 100644 lib/python3.8/site-packages/packaging/version.py create mode 100644 lib/python3.8/site-packages/pelican-4.2.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/pelican-4.2.0.dist-info/LICENSE create mode 100644 lib/python3.8/site-packages/pelican-4.2.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/pelican-4.2.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/pelican-4.2.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/pelican-4.2.0.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/pelican-4.2.0.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/pelican/__init__.py create mode 100644 lib/python3.8/site-packages/pelican/__main__.py create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/__main__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/cache.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/contents.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/generators.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/log.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/paginator.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/readers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/rstdirectives.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/server.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/settings.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/signals.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/urlwrappers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/__pycache__/writers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/cache.py create mode 100644 lib/python3.8/site-packages/pelican/contents.py create mode 100644 lib/python3.8/site-packages/pelican/generators.py create mode 100644 lib/python3.8/site-packages/pelican/log.py create mode 100644 lib/python3.8/site-packages/pelican/paginator.py create mode 100644 lib/python3.8/site-packages/pelican/readers.py create mode 100644 lib/python3.8/site-packages/pelican/rstdirectives.py create mode 100644 lib/python3.8/site-packages/pelican/server.py create mode 100644 lib/python3.8/site-packages/pelican/settings.py create mode 100644 lib/python3.8/site-packages/pelican/signals.py create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/LICENSE create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/README.md create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/screenshot-1.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/screenshot-2.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/screenshot-3.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/screenshot-4.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/screenshot-5.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/css/main.css create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/css/pygment.css create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/css/pygment.css.save create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/css/reset.css create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/css/typogrify.css create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/css/wide.css create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/_licence.txt create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/facebook.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/github.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/google-plus.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/lastfm.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/linkedin.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/rss.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/search.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/twitter.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/vimeo.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/static/images/icons/youtube.png create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/analytics.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/archives.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/article.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/article_infos.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/author.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/authors.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/base.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/category.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/comments.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/disqus_script.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/github.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/index.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/page.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/piwik.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/tag.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/taglist.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/tags.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/translations.html create mode 100644 lib/python3.8/site-packages/pelican/themes/blueidea/templates/twitter.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/fonts.css create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/main.css create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/pygment.css create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/reset.css create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/typogrify.css create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/wide.css create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.eot create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.svg create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.ttf create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.woff create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.woff2 create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/font.css create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/aboutme.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/bitbucket.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/delicious.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/facebook.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/github.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/gitorious.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/gittip.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/google-groups.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/google-plus.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/hackernews.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/lastfm.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/linkedin.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/reddit.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/rss.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/slideshare.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/speakerdeck.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/stackoverflow.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/twitter.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/vimeo.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/youtube.png create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/analytics.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/archives.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/article.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/article_infos.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/author.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/authors.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/base.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/category.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/comments.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/disqus_script.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/github.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/index.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/page.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/period_archives.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/tag.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/taglist.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/tags.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/translations.html create mode 100644 lib/python3.8/site-packages/pelican/themes/notmyidea/templates/twitter.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/archives.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/article.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/author.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/authors.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/base.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/categories.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/category.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/gosquared.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/index.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/page.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/pagination.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/period_archives.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/tag.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/tags.html create mode 100644 lib/python3.8/site-packages/pelican/themes/simple/templates/translations.html create mode 100644 lib/python3.8/site-packages/pelican/tools/__init__.py create mode 100644 lib/python3.8/site-packages/pelican/tools/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/tools/__pycache__/pelican_import.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/tools/__pycache__/pelican_quickstart.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/tools/__pycache__/pelican_themes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pelican/tools/pelican_import.py create mode 100644 lib/python3.8/site-packages/pelican/tools/pelican_quickstart.py create mode 100644 lib/python3.8/site-packages/pelican/tools/pelican_themes.py create mode 100644 lib/python3.8/site-packages/pelican/tools/templates/Makefile.jinja2 create mode 100644 lib/python3.8/site-packages/pelican/tools/templates/pelicanconf.py.jinja2 create mode 100755 lib/python3.8/site-packages/pelican/tools/templates/publishconf.py.jinja2 create mode 100644 lib/python3.8/site-packages/pelican/tools/templates/tasks.py.jinja2 create mode 100644 lib/python3.8/site-packages/pelican/urlwrappers.py create mode 100644 lib/python3.8/site-packages/pelican/utils.py create mode 100644 lib/python3.8/site-packages/pelican/writers.py create mode 100644 lib/python3.8/site-packages/pep517-0.8.2.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/pep517-0.8.2.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/pep517-0.8.2.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/pep517-0.8.2.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/pep517-0.8.2.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/pep517-0.8.2.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/pep517-0.8.2.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/pep517-0.8.2.virtualenv create mode 100644 lib/python3.8/site-packages/pep517/__init__.py create mode 100644 lib/python3.8/site-packages/pep517/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pep517/__pycache__/compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pep517/__pycache__/wrappers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pep517/_in_process.py create mode 100644 lib/python3.8/site-packages/pep517/build.py create mode 100644 lib/python3.8/site-packages/pep517/check.py create mode 100644 lib/python3.8/site-packages/pep517/colorlog.py create mode 100644 lib/python3.8/site-packages/pep517/compat.py create mode 100644 lib/python3.8/site-packages/pep517/dirtools.py create mode 100644 lib/python3.8/site-packages/pep517/envbuild.py create mode 100644 lib/python3.8/site-packages/pep517/meta.py create mode 100644 lib/python3.8/site-packages/pep517/wrappers.py create mode 100644 lib/python3.8/site-packages/pip-20.0.2.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/pip-20.0.2.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/pip-20.0.2.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/pip-20.0.2.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/pip-20.0.2.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/pip-20.0.2.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/pip-20.0.2.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/pip-20.0.2.virtualenv create mode 100644 lib/python3.8/site-packages/pip/__init__.py create mode 100644 lib/python3.8/site-packages/pip/__main__.py create mode 100644 lib/python3.8/site-packages/pip/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/build_env.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/cache.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/configuration.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/exceptions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/locations.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/pep425tags.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/pyproject.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/build_env.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cache.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/parser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/base_command.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/command_context.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/main.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/main_parser.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/parser.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/req_command.py create mode 100644 lib/python3.8/site-packages/pip/_internal/cli/status_codes.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/__pycache__/install.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/check.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/completion.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/configuration.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/debug.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/download.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/freeze.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/hash.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/help.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/install.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/list.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/search.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/show.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/uninstall.py create mode 100644 lib/python3.8/site-packages/pip/_internal/commands/wheel.py create mode 100644 lib/python3.8/site-packages/pip/_internal/configuration.py create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/base.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/base.py create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/installed.py create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/sdist.py create mode 100644 lib/python3.8/site-packages/pip/_internal/distributions/wheel.py create mode 100644 lib/python3.8/site-packages/pip/_internal/exceptions.py create mode 100644 lib/python3.8/site-packages/pip/_internal/index/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/index/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/index/__pycache__/collector.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/index/collector.py create mode 100644 lib/python3.8/site-packages/pip/_internal/index/package_finder.py create mode 100644 lib/python3.8/site-packages/pip/_internal/legacy_resolve.py create mode 100644 lib/python3.8/site-packages/pip/_internal/locations.py create mode 100644 lib/python3.8/site-packages/pip/_internal/main.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/candidate.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/format_control.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/index.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/link.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/scheme.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/target_python.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/__pycache__/wheel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/models/candidate.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/format_control.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/index.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/link.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/scheme.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/search_scope.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/target_python.py create mode 100644 lib/python3.8/site-packages/pip/_internal/models/wheel.py create mode 100644 lib/python3.8/site-packages/pip/_internal/network/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/network/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/network/__pycache__/auth.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/network/__pycache__/cache.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/network/__pycache__/download.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/network/__pycache__/session.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/network/__pycache__/utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/network/auth.py create mode 100644 lib/python3.8/site-packages/pip/_internal/network/cache.py create mode 100644 lib/python3.8/site-packages/pip/_internal/network/download.py create mode 100644 lib/python3.8/site-packages/pip/_internal/network/session.py create mode 100644 lib/python3.8/site-packages/pip/_internal/network/utils.py create mode 100644 lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/__pycache__/check.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/check.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/freeze.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 lib/python3.8/site-packages/pip/_internal/operations/prepare.py create mode 100644 lib/python3.8/site-packages/pip/_internal/pep425tags.py create mode 100644 lib/python3.8/site-packages/pip/_internal/pyproject.py create mode 100644 lib/python3.8/site-packages/pip/_internal/req/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/req/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/req/__pycache__/constructors.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_file.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_install.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_set.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/req/constructors.py create mode 100644 lib/python3.8/site-packages/pip/_internal/req/req_file.py create mode 100644 lib/python3.8/site-packages/pip/_internal/req/req_install.py create mode 100644 lib/python3.8/site-packages/pip/_internal/req/req_set.py create mode 100644 lib/python3.8/site-packages/pip/_internal/req/req_tracker.py create mode 100644 lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 lib/python3.8/site-packages/pip/_internal/self_outdated_check.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/logging.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/misc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/models.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/typing.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/ui.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/urls.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/appdirs.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/compat.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/deprecation.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/encoding.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/filesystem.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/filetypes.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/glibc.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/hashes.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/logging.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/marker_files.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/misc.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/models.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/packaging.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/subprocess.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/typing.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/ui.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/unpacking.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/urls.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 lib/python3.8/site-packages/pip/_internal/utils/wheel.py create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/git.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/git.py create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/subversion.py create mode 100644 lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 lib/python3.8/site-packages/pip/_internal/wheel_builder.py create mode 100644 lib/python3.8/site-packages/pip/_vendor/__init__.py create mode 100644 lib/python3.8/site-packages/pip/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/pkg_resources-0.0.0.virtualenv create mode 100644 lib/python3.8/site-packages/pkg_resources/__init__.py create mode 100644 lib/python3.8/site-packages/pkg_resources/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/__pycache__/py31compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 lib/python3.8/site-packages/pkg_resources/_vendor/six.py create mode 100644 lib/python3.8/site-packages/pkg_resources/extern/__init__.py create mode 100644 lib/python3.8/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pkg_resources/py31compat.py create mode 100644 lib/python3.8/site-packages/progress-1.5.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/progress-1.5.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/progress-1.5.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/progress-1.5.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/progress-1.5.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/progress-1.5.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/progress-1.5.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/progress-1.5.virtualenv create mode 100644 lib/python3.8/site-packages/progress/__init__.py create mode 100644 lib/python3.8/site-packages/progress/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/progress/__pycache__/bar.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/progress/__pycache__/spinner.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/progress/bar.py create mode 100644 lib/python3.8/site-packages/progress/counter.py create mode 100644 lib/python3.8/site-packages/progress/spinner.py create mode 100644 lib/python3.8/site-packages/pygments/__init__.py create mode 100644 lib/python3.8/site-packages/pygments/__main__.py create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/__main__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/cmdline.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/console.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/filter.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/formatter.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/lexer.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/modeline.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/plugin.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/regexopt.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/scanner.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/sphinxext.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/style.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/token.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/unistring.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/__pycache__/util.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/cmdline.py create mode 100644 lib/python3.8/site-packages/pygments/console.py create mode 100644 lib/python3.8/site-packages/pygments/filter.py create mode 100644 lib/python3.8/site-packages/pygments/filters/__init__.py create mode 100644 lib/python3.8/site-packages/pygments/filters/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatter.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/__init__.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/_mapping.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/bbcode.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/html.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/img.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/irc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/latex.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/other.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/rtf.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/svg.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/terminal.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/__pycache__/terminal256.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/formatters/_mapping.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/bbcode.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/html.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/img.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/irc.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/latex.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/other.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/rtf.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/svg.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/terminal.py create mode 100644 lib/python3.8/site-packages/pygments/formatters/terminal256.py create mode 100644 lib/python3.8/site-packages/pygments/lexer.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/__init__.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_mapping.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_usd_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/actionscript.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/agile.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/algebra.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ambient.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ampl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/apl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/archetype.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/asm.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/automation.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/basic.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/bibtex.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/boa.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/business.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/c_like.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/capnproto.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/chapel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/clean.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/compiled.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/configs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/console.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/crystal.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/csound.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/css.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/dalvik.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/data.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/diff.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/dotnet.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/dsls.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/dylan.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ecl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/eiffel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/elm.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/email.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/erlang.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/esoteric.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ezhil.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/factor.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/fantom.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/felix.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/floscript.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/forth.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/fortran.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/foxpro.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/freefem.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/functional.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/go.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/graph.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/graphics.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/haskell.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/haxe.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/hdl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/hexdump.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/html.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/idl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/igor.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/inferno.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/installers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/iolang.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/j.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/javascript.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/julia.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/jvm.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/lisp.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/make.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/markup.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/math.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/matlab.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/mime.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ml.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/modeling.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/modula2.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/monte.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/mosel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ncl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/nimrod.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/nit.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/nix.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/oberon.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/objective.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ooc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/other.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/parasail.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/parsers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/pascal.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/pawn.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/perl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/php.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/pony.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/praat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/prolog.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/python.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/qvt.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/r.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/rdf.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/rebol.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/resource.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ride.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/rnc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/roboconf.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/robotframework.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/ruby.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/rust.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/sas.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/scdoc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/scripting.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/sgf.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/shell.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/sieve.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/slash.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/smv.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/snobol.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/solidity.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/special.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/sql.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/stata.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/supercollider.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/tcl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/templates.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/teraterm.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/testing.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/text.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/textedit.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/textfmts.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/theorem.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/typoscript.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/unicon.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/urbi.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/usd.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/varnish.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/verification.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/web.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/webidl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/webmisc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/whiley.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/x10.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/xorg.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/__pycache__/zig.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/lexers/_asy_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_cl_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_cocoa_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_csound_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_lasso_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_lua_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_mapping.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_mql_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_openedge_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_php_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_postgres_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_scilab_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_sourcemod_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_stan_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_stata_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_tsql_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_usd_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_vbscript_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/_vim_builtins.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/actionscript.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/agile.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/algebra.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ambient.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ampl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/apl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/archetype.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/asm.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/automation.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/basic.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/bibtex.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/boa.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/business.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/c_cpp.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/c_like.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/capnproto.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/chapel.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/clean.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/compiled.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/configs.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/console.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/crystal.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/csound.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/css.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/d.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/dalvik.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/data.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/diff.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/dotnet.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/dsls.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/dylan.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ecl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/eiffel.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/elm.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/email.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/erlang.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/esoteric.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ezhil.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/factor.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/fantom.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/felix.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/floscript.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/forth.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/fortran.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/foxpro.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/freefem.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/functional.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/go.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/grammar_notation.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/graph.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/graphics.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/haskell.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/haxe.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/hdl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/hexdump.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/html.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/idl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/igor.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/inferno.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/installers.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/int_fiction.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/iolang.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/j.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/javascript.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/julia.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/jvm.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/lisp.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/make.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/markup.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/math.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/matlab.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/mime.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ml.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/modeling.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/modula2.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/monte.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/mosel.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ncl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/nimrod.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/nit.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/nix.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/oberon.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/objective.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ooc.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/other.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/parasail.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/parsers.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/pascal.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/pawn.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/perl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/php.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/pony.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/praat.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/prolog.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/python.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/qvt.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/r.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/rdf.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/rebol.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/resource.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ride.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/rnc.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/roboconf.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/robotframework.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/ruby.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/rust.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/sas.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/scdoc.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/scripting.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/sgf.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/shell.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/sieve.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/slash.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/smalltalk.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/smv.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/snobol.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/solidity.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/special.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/sql.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/stata.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/supercollider.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/tcl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/templates.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/teraterm.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/testing.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/text.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/textedit.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/textfmts.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/theorem.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/trafficscript.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/typoscript.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/unicon.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/urbi.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/usd.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/varnish.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/verification.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/web.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/webidl.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/webmisc.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/whiley.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/x10.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/xorg.py create mode 100644 lib/python3.8/site-packages/pygments/lexers/zig.py create mode 100644 lib/python3.8/site-packages/pygments/modeline.py create mode 100644 lib/python3.8/site-packages/pygments/plugin.py create mode 100644 lib/python3.8/site-packages/pygments/regexopt.py create mode 100644 lib/python3.8/site-packages/pygments/scanner.py create mode 100644 lib/python3.8/site-packages/pygments/sphinxext.py create mode 100644 lib/python3.8/site-packages/pygments/style.py create mode 100644 lib/python3.8/site-packages/pygments/styles/__init__.py create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/abap.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/algol.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/algol_nu.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/arduino.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/autumn.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/borland.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/bw.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/colorful.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/default.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/emacs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/friendly.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/fruity.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/igor.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/inkpot.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/lovelace.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/manni.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/monokai.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/murphy.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/native.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/pastie.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/perldoc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/rrt.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/sas.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/solarized.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/stata_dark.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/stata_light.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/tango.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/trac.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/vim.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/vs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/__pycache__/xcode.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pygments/styles/abap.py create mode 100644 lib/python3.8/site-packages/pygments/styles/algol.py create mode 100644 lib/python3.8/site-packages/pygments/styles/algol_nu.py create mode 100644 lib/python3.8/site-packages/pygments/styles/arduino.py create mode 100644 lib/python3.8/site-packages/pygments/styles/autumn.py create mode 100644 lib/python3.8/site-packages/pygments/styles/borland.py create mode 100644 lib/python3.8/site-packages/pygments/styles/bw.py create mode 100644 lib/python3.8/site-packages/pygments/styles/colorful.py create mode 100644 lib/python3.8/site-packages/pygments/styles/default.py create mode 100644 lib/python3.8/site-packages/pygments/styles/emacs.py create mode 100644 lib/python3.8/site-packages/pygments/styles/friendly.py create mode 100644 lib/python3.8/site-packages/pygments/styles/fruity.py create mode 100644 lib/python3.8/site-packages/pygments/styles/igor.py create mode 100644 lib/python3.8/site-packages/pygments/styles/inkpot.py create mode 100644 lib/python3.8/site-packages/pygments/styles/lovelace.py create mode 100644 lib/python3.8/site-packages/pygments/styles/manni.py create mode 100644 lib/python3.8/site-packages/pygments/styles/monokai.py create mode 100644 lib/python3.8/site-packages/pygments/styles/murphy.py create mode 100644 lib/python3.8/site-packages/pygments/styles/native.py create mode 100644 lib/python3.8/site-packages/pygments/styles/paraiso_dark.py create mode 100644 lib/python3.8/site-packages/pygments/styles/paraiso_light.py create mode 100644 lib/python3.8/site-packages/pygments/styles/pastie.py create mode 100644 lib/python3.8/site-packages/pygments/styles/perldoc.py create mode 100644 lib/python3.8/site-packages/pygments/styles/rainbow_dash.py create mode 100644 lib/python3.8/site-packages/pygments/styles/rrt.py create mode 100644 lib/python3.8/site-packages/pygments/styles/sas.py create mode 100644 lib/python3.8/site-packages/pygments/styles/solarized.py create mode 100644 lib/python3.8/site-packages/pygments/styles/stata_dark.py create mode 100644 lib/python3.8/site-packages/pygments/styles/stata_light.py create mode 100644 lib/python3.8/site-packages/pygments/styles/tango.py create mode 100644 lib/python3.8/site-packages/pygments/styles/trac.py create mode 100644 lib/python3.8/site-packages/pygments/styles/vim.py create mode 100644 lib/python3.8/site-packages/pygments/styles/vs.py create mode 100644 lib/python3.8/site-packages/pygments/styles/xcode.py create mode 100644 lib/python3.8/site-packages/pygments/token.py create mode 100644 lib/python3.8/site-packages/pygments/unistring.py create mode 100644 lib/python3.8/site-packages/pygments/util.py create mode 100644 lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/pyparsing-2.4.6.virtualenv create mode 100644 lib/python3.8/site-packages/pyparsing.py create mode 100644 lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/LICENSE create mode 100644 lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/zip-safe create mode 100644 lib/python3.8/site-packages/pytoml-0.1.21.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/pytoml-0.1.21.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/pytoml-0.1.21.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/pytoml-0.1.21.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/pytoml-0.1.21.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/pytoml-0.1.21.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/pytoml-0.1.21.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/pytoml-0.1.21.virtualenv create mode 100644 lib/python3.8/site-packages/pytoml/__init__.py create mode 100644 lib/python3.8/site-packages/pytoml/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytoml/__pycache__/core.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytoml/__pycache__/parser.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytoml/__pycache__/test.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytoml/__pycache__/utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytoml/__pycache__/writer.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytoml/core.py create mode 100644 lib/python3.8/site-packages/pytoml/parser.py create mode 100644 lib/python3.8/site-packages/pytoml/test.py create mode 100644 lib/python3.8/site-packages/pytoml/utils.py create mode 100644 lib/python3.8/site-packages/pytoml/writer.py create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/DESCRIPTION.rst create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/metadata.json create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/pytz-2020.1.dist-info/zip-safe create mode 100644 lib/python3.8/site-packages/pytz/__init__.py create mode 100644 lib/python3.8/site-packages/pytz/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytz/__pycache__/exceptions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytz/__pycache__/lazy.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytz/__pycache__/reference.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytz/__pycache__/tzfile.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytz/__pycache__/tzinfo.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/pytz/exceptions.py create mode 100644 lib/python3.8/site-packages/pytz/lazy.py create mode 100644 lib/python3.8/site-packages/pytz/reference.py create mode 100644 lib/python3.8/site-packages/pytz/tzfile.py create mode 100644 lib/python3.8/site-packages/pytz/tzinfo.py create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Abidjan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Accra create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Addis_Ababa create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Algiers create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Asmara create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Asmera create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Bamako create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Bangui create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Banjul create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Bissau create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Blantyre create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Brazzaville create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Bujumbura create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Cairo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Casablanca create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Ceuta create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Conakry create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Dakar create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Djibouti create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Douala create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/El_Aaiun create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Freetown create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Gaborone create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Harare create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Johannesburg create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Juba create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Kampala create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Khartoum create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Kigali create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Kinshasa create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Lagos create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Libreville create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Lome create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Luanda create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Lubumbashi create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Lusaka create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Malabo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Maputo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Maseru create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Mbabane create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Mogadishu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Monrovia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Nairobi create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Ndjamena create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Niamey create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Nouakchott create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Ouagadougou create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Porto-Novo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Sao_Tome create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Timbuktu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Tripoli create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Tunis create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Africa/Windhoek create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Adak create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Anchorage create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Anguilla create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Antigua create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Araguaina create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Catamarca create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Cordoba create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Jujuy create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Mendoza create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Salta create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/San_Juan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/San_Luis create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Tucuman create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Aruba create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Asuncion create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Atikokan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Atka create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Bahia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Bahia_Banderas create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Barbados create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Belem create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Belize create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Blanc-Sablon create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Boa_Vista create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Bogota create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Boise create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Buenos_Aires create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Cambridge_Bay create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Campo_Grande create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Cancun create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Caracas create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Catamarca create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Cayenne create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Cayman create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Chicago create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Chihuahua create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Coral_Harbour create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Cordoba create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Costa_Rica create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Creston create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Cuiaba create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Curacao create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Danmarkshavn create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Dawson create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Dawson_Creek create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Denver create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Detroit create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Dominica create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Edmonton create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Eirunepe create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/El_Salvador create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Ensenada create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Fort_Nelson create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Fort_Wayne create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Fortaleza create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Glace_Bay create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Godthab create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Goose_Bay create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Grand_Turk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Grenada create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Guadeloupe create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Guatemala create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Guayaquil create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Guyana create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Halifax create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Havana create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Hermosillo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Knox create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Marengo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Petersburg create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Tell_City create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Vevay create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Vincennes create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Winamac create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Indianapolis create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Inuvik create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Iqaluit create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Jamaica create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Jujuy create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Juneau create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Kentucky/Louisville create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Kentucky/Monticello create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Knox_IN create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Kralendijk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/La_Paz create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Lima create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Los_Angeles create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Louisville create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Lower_Princes create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Maceio create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Managua create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Manaus create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Marigot create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Martinique create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Matamoros create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Mazatlan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Mendoza create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Menominee create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Merida create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Metlakatla create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Mexico_City create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Miquelon create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Moncton create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Monterrey create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Montevideo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Montreal create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Montserrat create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Nassau create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/New_York create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Nipigon create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Nome create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Noronha create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/North_Dakota/Center create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Nuuk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Ojinaga create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Panama create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Pangnirtung create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Paramaribo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Phoenix create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Port-au-Prince create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Port_of_Spain create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Porto_Acre create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Porto_Velho create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Puerto_Rico create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Punta_Arenas create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Rainy_River create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Rankin_Inlet create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Recife create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Regina create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Resolute create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Rio_Branco create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Rosario create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Santa_Isabel create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Santarem create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Santiago create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Santo_Domingo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Sao_Paulo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Scoresbysund create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Shiprock create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Sitka create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/St_Barthelemy create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/St_Johns create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/St_Kitts create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/St_Lucia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/St_Thomas create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/St_Vincent create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Swift_Current create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Tegucigalpa create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Thule create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Thunder_Bay create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Tijuana create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Toronto create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Tortola create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Vancouver create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Virgin create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Whitehorse create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Winnipeg create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Yakutat create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/America/Yellowknife create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Casey create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Davis create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Macquarie create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Mawson create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/McMurdo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Palmer create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Rothera create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/South_Pole create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Syowa create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Troll create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Vostok create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Arctic/Longyearbyen create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Aden create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Almaty create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Amman create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Anadyr create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Aqtau create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Aqtobe create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ashgabat create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ashkhabad create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Atyrau create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Baghdad create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Bahrain create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Baku create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Bangkok create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Barnaul create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Beirut create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Bishkek create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Brunei create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Calcutta create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Chita create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Choibalsan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Chongqing create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Chungking create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Colombo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dacca create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Damascus create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dhaka create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dili create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dubai create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dushanbe create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Famagusta create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Gaza create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Harbin create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Hebron create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Hong_Kong create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Hovd create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Irkutsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Istanbul create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Jakarta create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Jayapura create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Jerusalem create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kabul create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kamchatka create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Karachi create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kashgar create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kathmandu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Katmandu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Khandyga create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kolkata create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kuching create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kuwait create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Macao create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Macau create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Magadan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Makassar create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Manila create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Muscat create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Nicosia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Novokuznetsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Novosibirsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Omsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Oral create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Phnom_Penh create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Pontianak create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Pyongyang create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Qatar create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Qostanay create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Qyzylorda create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Rangoon create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Riyadh create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Saigon create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Sakhalin create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Samarkand create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Seoul create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Shanghai create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Singapore create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Srednekolymsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Taipei create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tashkent create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tbilisi create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tehran create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tel_Aviv create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Thimbu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Thimphu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tokyo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tomsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ulan_Bator create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Urumqi create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ust-Nera create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Vientiane create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Vladivostok create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Yakutsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Yangon create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Yekaterinburg create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Asia/Yerevan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Azores create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Bermuda create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Canary create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Faeroe create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Faroe create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Madeira create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Reykjavik create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/South_Georgia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/St_Helena create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Stanley create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/ACT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Adelaide create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Brisbane create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Broken_Hill create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Canberra create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Currie create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Darwin create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Eucla create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Hobart create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/LHI create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Lindeman create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Lord_Howe create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Melbourne create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/NSW create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/North create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Perth create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Queensland create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/South create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Sydney create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Tasmania create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Victoria create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/West create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Australia/Yancowinna create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Brazil/Acre create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Brazil/DeNoronha create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Brazil/East create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Brazil/West create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/CET create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/CST6CDT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Canada/Atlantic create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Canada/Central create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Canada/Eastern create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Canada/Mountain create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Canada/Newfoundland create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Canada/Pacific create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Canada/Saskatchewan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Canada/Yukon create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Chile/Continental create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Chile/EasterIsland create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Cuba create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/EET create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/EST create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/EST5EDT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Egypt create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Eire create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+0 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+1 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+10 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+11 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+12 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+2 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+3 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+4 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+5 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+6 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+7 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+8 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+9 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-0 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-1 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-10 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-11 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-12 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-13 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-14 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-2 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-3 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-4 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-5 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-6 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-7 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-8 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-9 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT0 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/Greenwich create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/UCT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/UTC create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/Universal create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Etc/Zulu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Amsterdam create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Andorra create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Astrakhan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Athens create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Belfast create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Belgrade create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Berlin create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Bratislava create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Brussels create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Bucharest create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Budapest create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Busingen create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Chisinau create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Copenhagen create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Dublin create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Gibraltar create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Guernsey create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Helsinki create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Isle_of_Man create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Istanbul create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Jersey create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Kaliningrad create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Kiev create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Kirov create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Lisbon create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Ljubljana create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/London create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Luxembourg create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Madrid create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Malta create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Mariehamn create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Minsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Monaco create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Moscow create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Nicosia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Oslo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Paris create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Podgorica create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Prague create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Riga create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Rome create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Samara create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/San_Marino create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Sarajevo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Saratov create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Simferopol create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Skopje create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Sofia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Stockholm create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Tallinn create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Tirane create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Tiraspol create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Ulyanovsk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Uzhgorod create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Vaduz create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Vatican create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Vienna create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Vilnius create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Volgograd create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Warsaw create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Zagreb create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Zaporozhye create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Europe/Zurich create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Factory create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/GB create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/GB-Eire create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/GMT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/GMT+0 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/GMT-0 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/GMT0 create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Greenwich create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/HST create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Hongkong create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Iceland create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Antananarivo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Chagos create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Christmas create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Cocos create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Comoro create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Kerguelen create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Mahe create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Maldives create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Mauritius create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Mayotte create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Indian/Reunion create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Iran create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Israel create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Jamaica create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Japan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Kwajalein create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Libya create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/MET create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/MST create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/MST7MDT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Mexico/BajaNorte create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Mexico/BajaSur create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Mexico/General create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/NZ create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/NZ-CHAT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Navajo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/PRC create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/PST8PDT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Apia create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Auckland create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Bougainville create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Chatham create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Chuuk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Easter create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Efate create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Enderbury create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Fakaofo create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Fiji create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Funafuti create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Galapagos create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Gambier create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Guadalcanal create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Guam create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Honolulu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Johnston create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Kiritimati create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Kosrae create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Kwajalein create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Majuro create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Marquesas create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Midway create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Nauru create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Niue create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Norfolk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Noumea create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Pago_Pago create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Palau create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Pitcairn create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Pohnpei create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Ponape create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Port_Moresby create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Rarotonga create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Saipan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Samoa create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Tahiti create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Tarawa create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Tongatapu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Truk create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Wake create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Wallis create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Yap create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Poland create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Portugal create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/ROC create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/ROK create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Singapore create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Turkey create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/UCT create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Alaska create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Aleutian create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Arizona create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Central create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/East-Indiana create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Eastern create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Hawaii create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Indiana-Starke create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Michigan create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Mountain create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Pacific create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/US/Samoa create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/UTC create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Universal create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/W-SU create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/WET create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/Zulu create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/iso3166.tab create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/leapseconds create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/posixrules create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/tzdata.zi create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/zone.tab create mode 100644 lib/python3.8/site-packages/pytz/zoneinfo/zone1970.tab create mode 100644 lib/python3.8/site-packages/requests-2.22.0.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/requests-2.22.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/requests-2.22.0.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/requests-2.22.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/requests-2.22.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/requests-2.22.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/requests-2.22.0.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/requests-2.22.0.virtualenv create mode 100644 lib/python3.8/site-packages/requests/__init__.py create mode 100644 lib/python3.8/site-packages/requests/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/__version__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/_internal_utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/adapters.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/api.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/auth.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/certs.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/cookies.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/exceptions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/hooks.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/models.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/packages.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/sessions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/status_codes.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/structures.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__pycache__/utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/requests/__version__.py create mode 100644 lib/python3.8/site-packages/requests/_internal_utils.py create mode 100644 lib/python3.8/site-packages/requests/adapters.py create mode 100644 lib/python3.8/site-packages/requests/api.py create mode 100644 lib/python3.8/site-packages/requests/auth.py create mode 100644 lib/python3.8/site-packages/requests/certs.py create mode 100644 lib/python3.8/site-packages/requests/compat.py create mode 100644 lib/python3.8/site-packages/requests/cookies.py create mode 100644 lib/python3.8/site-packages/requests/exceptions.py create mode 100644 lib/python3.8/site-packages/requests/help.py create mode 100644 lib/python3.8/site-packages/requests/hooks.py create mode 100644 lib/python3.8/site-packages/requests/models.py create mode 100644 lib/python3.8/site-packages/requests/packages.py create mode 100644 lib/python3.8/site-packages/requests/sessions.py create mode 100644 lib/python3.8/site-packages/requests/status_codes.py create mode 100644 lib/python3.8/site-packages/requests/structures.py create mode 100644 lib/python3.8/site-packages/requests/utils.py create mode 100644 lib/python3.8/site-packages/retrying-1.3.3.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/retrying-1.3.3.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/retrying-1.3.3.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/retrying-1.3.3.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/retrying-1.3.3.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/retrying-1.3.3.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/retrying-1.3.3.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/retrying-1.3.3.virtualenv create mode 100644 lib/python3.8/site-packages/retrying.py create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/dependency_links.txt create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.dist-info/zip-safe create mode 100644 lib/python3.8/site-packages/setuptools-44.0.0.virtualenv create mode 100644 lib/python3.8/site-packages/setuptools/__init__.py create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/_imp.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/archive_util.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/config.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/depends.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/dist.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/extension.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/glob.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/monkey.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/msvc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/namespaces.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/package_index.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/py27compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/py33compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/py34compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/sandbox.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/ssl_support.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/unicode_utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/version.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/wheel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/__pycache__/windows_support.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_deprecation_warning.py create mode 100644 lib/python3.8/site-packages/setuptools/_imp.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/__init__.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 lib/python3.8/site-packages/setuptools/_vendor/six.py create mode 100644 lib/python3.8/site-packages/setuptools/archive_util.py create mode 100644 lib/python3.8/site-packages/setuptools/build_meta.py create mode 100644 lib/python3.8/site-packages/setuptools/cli-32.exe create mode 100644 lib/python3.8/site-packages/setuptools/cli-64.exe create mode 100644 lib/python3.8/site-packages/setuptools/cli.exe create mode 100644 lib/python3.8/site-packages/setuptools/command/__init__.py create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/build_ext.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/build_py.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/easy_install.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/egg_info.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/install.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/install_lib.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/install_scripts.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/py36compat.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/sdist.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/__pycache__/setopt.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/command/alias.py create mode 100644 lib/python3.8/site-packages/setuptools/command/bdist_egg.py create mode 100644 lib/python3.8/site-packages/setuptools/command/bdist_rpm.py create mode 100644 lib/python3.8/site-packages/setuptools/command/bdist_wininst.py create mode 100644 lib/python3.8/site-packages/setuptools/command/build_clib.py create mode 100644 lib/python3.8/site-packages/setuptools/command/build_ext.py create mode 100644 lib/python3.8/site-packages/setuptools/command/build_py.py create mode 100644 lib/python3.8/site-packages/setuptools/command/develop.py create mode 100644 lib/python3.8/site-packages/setuptools/command/dist_info.py create mode 100644 lib/python3.8/site-packages/setuptools/command/easy_install.py create mode 100644 lib/python3.8/site-packages/setuptools/command/egg_info.py create mode 100644 lib/python3.8/site-packages/setuptools/command/install.py create mode 100644 lib/python3.8/site-packages/setuptools/command/install_egg_info.py create mode 100644 lib/python3.8/site-packages/setuptools/command/install_lib.py create mode 100644 lib/python3.8/site-packages/setuptools/command/install_scripts.py create mode 100644 lib/python3.8/site-packages/setuptools/command/launcher manifest.xml create mode 100644 lib/python3.8/site-packages/setuptools/command/py36compat.py create mode 100644 lib/python3.8/site-packages/setuptools/command/register.py create mode 100644 lib/python3.8/site-packages/setuptools/command/rotate.py create mode 100644 lib/python3.8/site-packages/setuptools/command/saveopts.py create mode 100644 lib/python3.8/site-packages/setuptools/command/sdist.py create mode 100644 lib/python3.8/site-packages/setuptools/command/setopt.py create mode 100644 lib/python3.8/site-packages/setuptools/command/test.py create mode 100644 lib/python3.8/site-packages/setuptools/command/upload.py create mode 100644 lib/python3.8/site-packages/setuptools/command/upload_docs.py create mode 100644 lib/python3.8/site-packages/setuptools/config.py create mode 100644 lib/python3.8/site-packages/setuptools/dep_util.py create mode 100644 lib/python3.8/site-packages/setuptools/depends.py create mode 100644 lib/python3.8/site-packages/setuptools/dist.py create mode 100644 lib/python3.8/site-packages/setuptools/errors.py create mode 100644 lib/python3.8/site-packages/setuptools/extension.py create mode 100644 lib/python3.8/site-packages/setuptools/extern/__init__.py create mode 100644 lib/python3.8/site-packages/setuptools/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/setuptools/glob.py create mode 100644 lib/python3.8/site-packages/setuptools/gui-32.exe create mode 100644 lib/python3.8/site-packages/setuptools/gui-64.exe create mode 100644 lib/python3.8/site-packages/setuptools/gui.exe create mode 100644 lib/python3.8/site-packages/setuptools/installer.py create mode 100644 lib/python3.8/site-packages/setuptools/launch.py create mode 100644 lib/python3.8/site-packages/setuptools/lib2to3_ex.py create mode 100644 lib/python3.8/site-packages/setuptools/monkey.py create mode 100644 lib/python3.8/site-packages/setuptools/msvc.py create mode 100644 lib/python3.8/site-packages/setuptools/namespaces.py create mode 100644 lib/python3.8/site-packages/setuptools/package_index.py create mode 100644 lib/python3.8/site-packages/setuptools/py27compat.py create mode 100644 lib/python3.8/site-packages/setuptools/py31compat.py create mode 100644 lib/python3.8/site-packages/setuptools/py33compat.py create mode 100644 lib/python3.8/site-packages/setuptools/py34compat.py create mode 100644 lib/python3.8/site-packages/setuptools/sandbox.py create mode 100644 lib/python3.8/site-packages/setuptools/script (dev).tmpl create mode 100644 lib/python3.8/site-packages/setuptools/script.tmpl create mode 100644 lib/python3.8/site-packages/setuptools/site-patch.py create mode 100644 lib/python3.8/site-packages/setuptools/ssl_support.py create mode 100644 lib/python3.8/site-packages/setuptools/unicode_utils.py create mode 100644 lib/python3.8/site-packages/setuptools/version.py create mode 100644 lib/python3.8/site-packages/setuptools/wheel.py create mode 100644 lib/python3.8/site-packages/setuptools/windows_support.py create mode 100644 lib/python3.8/site-packages/six-1.14.0.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/six-1.14.0.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/six-1.14.0.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/six-1.14.0.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/six-1.14.0.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/six-1.14.0.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/six-1.14.0.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/six-1.14.0.virtualenv create mode 100644 lib/python3.8/site-packages/six.py create mode 100644 lib/python3.8/site-packages/unidecode/__init__.py create mode 100644 lib/python3.8/site-packages/unidecode/__main__.py create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/__main__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/util.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x000.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x001.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x002.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x003.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x004.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x005.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x006.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x007.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x009.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x00a.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x00b.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x00c.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x00d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x00e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x00f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x010.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x011.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x012.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x013.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x014.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x015.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x016.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x017.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x018.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x01d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x01e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x01f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x020.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x021.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x022.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x023.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x024.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x025.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x026.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x027.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x028.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x029.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x02a.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x02c.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x02e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x02f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x030.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x031.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x032.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x033.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x04d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x04e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x04f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x050.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x051.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x052.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x053.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x054.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x055.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x056.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x057.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x058.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x059.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x05a.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x05b.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x05c.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x05d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x05e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x05f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x060.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x061.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x062.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x063.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x064.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x065.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x066.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x067.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x068.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x069.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x06a.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x06b.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x06c.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x06d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x06e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x06f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x070.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x071.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x072.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x073.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x074.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x075.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x076.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x077.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x078.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x079.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x07a.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x07b.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x07c.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x07d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x07e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x07f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x080.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x081.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x082.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x083.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x084.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x085.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x086.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x087.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x088.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x089.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x08a.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x08b.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x08c.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x08d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x08e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x08f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x090.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x091.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x092.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x093.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x094.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x095.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x096.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x097.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x098.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x099.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x09a.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x09b.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x09c.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x09d.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x09e.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x09f.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0a0.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0a1.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0a2.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0a3.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0a4.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0ac.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0ad.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0ae.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0af.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b0.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b1.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b2.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b3.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b4.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b5.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b6.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b7.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b8.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0b9.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0ba.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0bb.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0bc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0bd.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0be.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0bf.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c0.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c1.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c2.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c3.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c4.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c5.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c6.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c7.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c8.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0c9.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0ca.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0cb.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0cc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0cd.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0ce.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0cf.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0d0.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0d1.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0d2.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0d3.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0d4.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0d5.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0d6.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0d7.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0f9.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0fa.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0fb.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0fc.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0fd.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0fe.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x0ff.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x1d4.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x1d5.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x1d6.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x1d7.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/__pycache__/x1f1.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/unidecode/util.py create mode 100644 lib/python3.8/site-packages/unidecode/x000.py create mode 100644 lib/python3.8/site-packages/unidecode/x001.py create mode 100644 lib/python3.8/site-packages/unidecode/x002.py create mode 100644 lib/python3.8/site-packages/unidecode/x003.py create mode 100644 lib/python3.8/site-packages/unidecode/x004.py create mode 100644 lib/python3.8/site-packages/unidecode/x005.py create mode 100644 lib/python3.8/site-packages/unidecode/x006.py create mode 100644 lib/python3.8/site-packages/unidecode/x007.py create mode 100644 lib/python3.8/site-packages/unidecode/x009.py create mode 100644 lib/python3.8/site-packages/unidecode/x00a.py create mode 100644 lib/python3.8/site-packages/unidecode/x00b.py create mode 100644 lib/python3.8/site-packages/unidecode/x00c.py create mode 100644 lib/python3.8/site-packages/unidecode/x00d.py create mode 100644 lib/python3.8/site-packages/unidecode/x00e.py create mode 100644 lib/python3.8/site-packages/unidecode/x00f.py create mode 100644 lib/python3.8/site-packages/unidecode/x010.py create mode 100644 lib/python3.8/site-packages/unidecode/x011.py create mode 100644 lib/python3.8/site-packages/unidecode/x012.py create mode 100644 lib/python3.8/site-packages/unidecode/x013.py create mode 100644 lib/python3.8/site-packages/unidecode/x014.py create mode 100644 lib/python3.8/site-packages/unidecode/x015.py create mode 100644 lib/python3.8/site-packages/unidecode/x016.py create mode 100644 lib/python3.8/site-packages/unidecode/x017.py create mode 100644 lib/python3.8/site-packages/unidecode/x018.py create mode 100644 lib/python3.8/site-packages/unidecode/x01d.py create mode 100644 lib/python3.8/site-packages/unidecode/x01e.py create mode 100644 lib/python3.8/site-packages/unidecode/x01f.py create mode 100644 lib/python3.8/site-packages/unidecode/x020.py create mode 100644 lib/python3.8/site-packages/unidecode/x021.py create mode 100644 lib/python3.8/site-packages/unidecode/x022.py create mode 100644 lib/python3.8/site-packages/unidecode/x023.py create mode 100644 lib/python3.8/site-packages/unidecode/x024.py create mode 100644 lib/python3.8/site-packages/unidecode/x025.py create mode 100644 lib/python3.8/site-packages/unidecode/x026.py create mode 100644 lib/python3.8/site-packages/unidecode/x027.py create mode 100644 lib/python3.8/site-packages/unidecode/x028.py create mode 100644 lib/python3.8/site-packages/unidecode/x029.py create mode 100644 lib/python3.8/site-packages/unidecode/x02a.py create mode 100644 lib/python3.8/site-packages/unidecode/x02c.py create mode 100644 lib/python3.8/site-packages/unidecode/x02e.py create mode 100644 lib/python3.8/site-packages/unidecode/x02f.py create mode 100644 lib/python3.8/site-packages/unidecode/x030.py create mode 100644 lib/python3.8/site-packages/unidecode/x031.py create mode 100644 lib/python3.8/site-packages/unidecode/x032.py create mode 100644 lib/python3.8/site-packages/unidecode/x033.py create mode 100644 lib/python3.8/site-packages/unidecode/x04d.py create mode 100644 lib/python3.8/site-packages/unidecode/x04e.py create mode 100644 lib/python3.8/site-packages/unidecode/x04f.py create mode 100644 lib/python3.8/site-packages/unidecode/x050.py create mode 100644 lib/python3.8/site-packages/unidecode/x051.py create mode 100644 lib/python3.8/site-packages/unidecode/x052.py create mode 100644 lib/python3.8/site-packages/unidecode/x053.py create mode 100644 lib/python3.8/site-packages/unidecode/x054.py create mode 100644 lib/python3.8/site-packages/unidecode/x055.py create mode 100644 lib/python3.8/site-packages/unidecode/x056.py create mode 100644 lib/python3.8/site-packages/unidecode/x057.py create mode 100644 lib/python3.8/site-packages/unidecode/x058.py create mode 100644 lib/python3.8/site-packages/unidecode/x059.py create mode 100644 lib/python3.8/site-packages/unidecode/x05a.py create mode 100644 lib/python3.8/site-packages/unidecode/x05b.py create mode 100644 lib/python3.8/site-packages/unidecode/x05c.py create mode 100644 lib/python3.8/site-packages/unidecode/x05d.py create mode 100644 lib/python3.8/site-packages/unidecode/x05e.py create mode 100644 lib/python3.8/site-packages/unidecode/x05f.py create mode 100644 lib/python3.8/site-packages/unidecode/x060.py create mode 100644 lib/python3.8/site-packages/unidecode/x061.py create mode 100644 lib/python3.8/site-packages/unidecode/x062.py create mode 100644 lib/python3.8/site-packages/unidecode/x063.py create mode 100644 lib/python3.8/site-packages/unidecode/x064.py create mode 100644 lib/python3.8/site-packages/unidecode/x065.py create mode 100644 lib/python3.8/site-packages/unidecode/x066.py create mode 100644 lib/python3.8/site-packages/unidecode/x067.py create mode 100644 lib/python3.8/site-packages/unidecode/x068.py create mode 100644 lib/python3.8/site-packages/unidecode/x069.py create mode 100644 lib/python3.8/site-packages/unidecode/x06a.py create mode 100644 lib/python3.8/site-packages/unidecode/x06b.py create mode 100644 lib/python3.8/site-packages/unidecode/x06c.py create mode 100644 lib/python3.8/site-packages/unidecode/x06d.py create mode 100644 lib/python3.8/site-packages/unidecode/x06e.py create mode 100644 lib/python3.8/site-packages/unidecode/x06f.py create mode 100644 lib/python3.8/site-packages/unidecode/x070.py create mode 100644 lib/python3.8/site-packages/unidecode/x071.py create mode 100644 lib/python3.8/site-packages/unidecode/x072.py create mode 100644 lib/python3.8/site-packages/unidecode/x073.py create mode 100644 lib/python3.8/site-packages/unidecode/x074.py create mode 100644 lib/python3.8/site-packages/unidecode/x075.py create mode 100644 lib/python3.8/site-packages/unidecode/x076.py create mode 100644 lib/python3.8/site-packages/unidecode/x077.py create mode 100644 lib/python3.8/site-packages/unidecode/x078.py create mode 100644 lib/python3.8/site-packages/unidecode/x079.py create mode 100644 lib/python3.8/site-packages/unidecode/x07a.py create mode 100644 lib/python3.8/site-packages/unidecode/x07b.py create mode 100644 lib/python3.8/site-packages/unidecode/x07c.py create mode 100644 lib/python3.8/site-packages/unidecode/x07d.py create mode 100644 lib/python3.8/site-packages/unidecode/x07e.py create mode 100644 lib/python3.8/site-packages/unidecode/x07f.py create mode 100644 lib/python3.8/site-packages/unidecode/x080.py create mode 100644 lib/python3.8/site-packages/unidecode/x081.py create mode 100644 lib/python3.8/site-packages/unidecode/x082.py create mode 100644 lib/python3.8/site-packages/unidecode/x083.py create mode 100644 lib/python3.8/site-packages/unidecode/x084.py create mode 100644 lib/python3.8/site-packages/unidecode/x085.py create mode 100644 lib/python3.8/site-packages/unidecode/x086.py create mode 100644 lib/python3.8/site-packages/unidecode/x087.py create mode 100644 lib/python3.8/site-packages/unidecode/x088.py create mode 100644 lib/python3.8/site-packages/unidecode/x089.py create mode 100644 lib/python3.8/site-packages/unidecode/x08a.py create mode 100644 lib/python3.8/site-packages/unidecode/x08b.py create mode 100644 lib/python3.8/site-packages/unidecode/x08c.py create mode 100644 lib/python3.8/site-packages/unidecode/x08d.py create mode 100644 lib/python3.8/site-packages/unidecode/x08e.py create mode 100644 lib/python3.8/site-packages/unidecode/x08f.py create mode 100644 lib/python3.8/site-packages/unidecode/x090.py create mode 100644 lib/python3.8/site-packages/unidecode/x091.py create mode 100644 lib/python3.8/site-packages/unidecode/x092.py create mode 100644 lib/python3.8/site-packages/unidecode/x093.py create mode 100644 lib/python3.8/site-packages/unidecode/x094.py create mode 100644 lib/python3.8/site-packages/unidecode/x095.py create mode 100644 lib/python3.8/site-packages/unidecode/x096.py create mode 100644 lib/python3.8/site-packages/unidecode/x097.py create mode 100644 lib/python3.8/site-packages/unidecode/x098.py create mode 100644 lib/python3.8/site-packages/unidecode/x099.py create mode 100644 lib/python3.8/site-packages/unidecode/x09a.py create mode 100644 lib/python3.8/site-packages/unidecode/x09b.py create mode 100644 lib/python3.8/site-packages/unidecode/x09c.py create mode 100644 lib/python3.8/site-packages/unidecode/x09d.py create mode 100644 lib/python3.8/site-packages/unidecode/x09e.py create mode 100644 lib/python3.8/site-packages/unidecode/x09f.py create mode 100644 lib/python3.8/site-packages/unidecode/x0a0.py create mode 100644 lib/python3.8/site-packages/unidecode/x0a1.py create mode 100644 lib/python3.8/site-packages/unidecode/x0a2.py create mode 100644 lib/python3.8/site-packages/unidecode/x0a3.py create mode 100644 lib/python3.8/site-packages/unidecode/x0a4.py create mode 100644 lib/python3.8/site-packages/unidecode/x0ac.py create mode 100644 lib/python3.8/site-packages/unidecode/x0ad.py create mode 100644 lib/python3.8/site-packages/unidecode/x0ae.py create mode 100644 lib/python3.8/site-packages/unidecode/x0af.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b0.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b1.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b2.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b3.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b4.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b5.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b6.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b7.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b8.py create mode 100644 lib/python3.8/site-packages/unidecode/x0b9.py create mode 100644 lib/python3.8/site-packages/unidecode/x0ba.py create mode 100644 lib/python3.8/site-packages/unidecode/x0bb.py create mode 100644 lib/python3.8/site-packages/unidecode/x0bc.py create mode 100644 lib/python3.8/site-packages/unidecode/x0bd.py create mode 100644 lib/python3.8/site-packages/unidecode/x0be.py create mode 100644 lib/python3.8/site-packages/unidecode/x0bf.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c0.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c1.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c2.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c3.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c4.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c5.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c6.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c7.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c8.py create mode 100644 lib/python3.8/site-packages/unidecode/x0c9.py create mode 100644 lib/python3.8/site-packages/unidecode/x0ca.py create mode 100644 lib/python3.8/site-packages/unidecode/x0cb.py create mode 100644 lib/python3.8/site-packages/unidecode/x0cc.py create mode 100644 lib/python3.8/site-packages/unidecode/x0cd.py create mode 100644 lib/python3.8/site-packages/unidecode/x0ce.py create mode 100644 lib/python3.8/site-packages/unidecode/x0cf.py create mode 100644 lib/python3.8/site-packages/unidecode/x0d0.py create mode 100644 lib/python3.8/site-packages/unidecode/x0d1.py create mode 100644 lib/python3.8/site-packages/unidecode/x0d2.py create mode 100644 lib/python3.8/site-packages/unidecode/x0d3.py create mode 100644 lib/python3.8/site-packages/unidecode/x0d4.py create mode 100644 lib/python3.8/site-packages/unidecode/x0d5.py create mode 100644 lib/python3.8/site-packages/unidecode/x0d6.py create mode 100644 lib/python3.8/site-packages/unidecode/x0d7.py create mode 100644 lib/python3.8/site-packages/unidecode/x0f9.py create mode 100644 lib/python3.8/site-packages/unidecode/x0fa.py create mode 100644 lib/python3.8/site-packages/unidecode/x0fb.py create mode 100644 lib/python3.8/site-packages/unidecode/x0fc.py create mode 100644 lib/python3.8/site-packages/unidecode/x0fd.py create mode 100644 lib/python3.8/site-packages/unidecode/x0fe.py create mode 100644 lib/python3.8/site-packages/unidecode/x0ff.py create mode 100644 lib/python3.8/site-packages/unidecode/x1d4.py create mode 100644 lib/python3.8/site-packages/unidecode/x1d5.py create mode 100644 lib/python3.8/site-packages/unidecode/x1d6.py create mode 100644 lib/python3.8/site-packages/unidecode/x1d7.py create mode 100644 lib/python3.8/site-packages/unidecode/x1f1.py create mode 100644 lib/python3.8/site-packages/urllib3-1.25.8.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/urllib3-1.25.8.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/urllib3-1.25.8.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/urllib3-1.25.8.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/urllib3-1.25.8.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/urllib3-1.25.8.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/urllib3-1.25.8.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/urllib3-1.25.8.virtualenv create mode 100644 lib/python3.8/site-packages/urllib3/__init__.py create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/_collections.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/connection.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/connectionpool.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/exceptions.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/fields.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/filepost.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/poolmanager.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/request.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/__pycache__/response.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/_collections.py create mode 100644 lib/python3.8/site-packages/urllib3/connection.py create mode 100644 lib/python3.8/site-packages/urllib3/connectionpool.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/__init__.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/contrib/__pycache__/socks.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/appengine.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/securetransport.py create mode 100644 lib/python3.8/site-packages/urllib3/contrib/socks.py create mode 100644 lib/python3.8/site-packages/urllib3/exceptions.py create mode 100644 lib/python3.8/site-packages/urllib3/fields.py create mode 100644 lib/python3.8/site-packages/urllib3/filepost.py create mode 100644 lib/python3.8/site-packages/urllib3/packages/__init__.py create mode 100644 lib/python3.8/site-packages/urllib3/packages/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/packages/backports/__init__.py create mode 100644 lib/python3.8/site-packages/urllib3/packages/backports/makefile.py create mode 100644 lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 lib/python3.8/site-packages/urllib3/poolmanager.py create mode 100644 lib/python3.8/site-packages/urllib3/request.py create mode 100644 lib/python3.8/site-packages/urllib3/response.py create mode 100644 lib/python3.8/site-packages/urllib3/util/__init__.py create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/connection.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/queue.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/request.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/response.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/retry.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/ssl_.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/timeout.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/url.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/__pycache__/wait.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/urllib3/util/connection.py create mode 100644 lib/python3.8/site-packages/urllib3/util/queue.py create mode 100644 lib/python3.8/site-packages/urllib3/util/request.py create mode 100644 lib/python3.8/site-packages/urllib3/util/response.py create mode 100644 lib/python3.8/site-packages/urllib3/util/retry.py create mode 100644 lib/python3.8/site-packages/urllib3/util/ssl_.py create mode 100644 lib/python3.8/site-packages/urllib3/util/timeout.py create mode 100644 lib/python3.8/site-packages/urllib3/util/url.py create mode 100644 lib/python3.8/site-packages/urllib3/util/wait.py create mode 100644 lib/python3.8/site-packages/webencodings-0.5.1.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/webencodings-0.5.1.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/webencodings-0.5.1.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/webencodings-0.5.1.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/webencodings-0.5.1.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/webencodings-0.5.1.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/webencodings-0.5.1.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/webencodings-0.5.1.virtualenv create mode 100644 lib/python3.8/site-packages/webencodings/__init__.py create mode 100644 lib/python3.8/site-packages/webencodings/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/webencodings/__pycache__/labels.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/webencodings/labels.py create mode 100644 lib/python3.8/site-packages/webencodings/mklabels.py create mode 100644 lib/python3.8/site-packages/webencodings/tests.py create mode 100644 lib/python3.8/site-packages/webencodings/x_user_defined.py create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.dist-info/AUTHORS.txt create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.dist-info/INSTALLER create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.dist-info/LICENSE.txt create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.dist-info/METADATA create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.dist-info/RECORD create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.dist-info/WHEEL create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.dist-info/entry_points.txt create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.dist-info/top_level.txt create mode 100644 lib/python3.8/site-packages/wheel-0.34.2.virtualenv create mode 100644 lib/python3.8/site-packages/wheel/__init__.py create mode 100644 lib/python3.8/site-packages/wheel/__main__.py create mode 100644 lib/python3.8/site-packages/wheel/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/__pycache__/bdist_wheel.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/__pycache__/macosx_libfile.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/__pycache__/metadata.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/__pycache__/pep425tags.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/__pycache__/pkginfo.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/__pycache__/util.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/__pycache__/wheelfile.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/_version.py create mode 100644 lib/python3.8/site-packages/wheel/bdist_wheel.py create mode 100644 lib/python3.8/site-packages/wheel/cli/__init__.py create mode 100644 lib/python3.8/site-packages/wheel/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/python3.8/site-packages/wheel/cli/convert.py create mode 100644 lib/python3.8/site-packages/wheel/cli/pack.py create mode 100644 lib/python3.8/site-packages/wheel/cli/unpack.py create mode 100644 lib/python3.8/site-packages/wheel/macosx_libfile.py create mode 100644 lib/python3.8/site-packages/wheel/metadata.py create mode 100644 lib/python3.8/site-packages/wheel/pep425tags.py create mode 100644 lib/python3.8/site-packages/wheel/pkginfo.py create mode 100644 lib/python3.8/site-packages/wheel/util.py create mode 100644 lib/python3.8/site-packages/wheel/wheelfile.py create mode 120000 output create mode 100644 pelicanconf.py create mode 100644 publishconf.py create mode 100644 pyvenv.cfg create mode 100644 tasks.py create mode 100644 theme/blueidea/LICENSE create mode 100644 theme/blueidea/README.md create mode 100644 theme/blueidea/screenshot-1.png create mode 100644 theme/blueidea/screenshot-2.png create mode 100644 theme/blueidea/screenshot-3.png create mode 100644 theme/blueidea/screenshot-4.png create mode 100644 theme/blueidea/screenshot-5.png create mode 100644 theme/blueidea/static/css/main.css create mode 100644 theme/blueidea/static/css/pygment.css create mode 100644 theme/blueidea/static/css/pygment.css.save create mode 100644 theme/blueidea/static/css/reset.css create mode 100644 theme/blueidea/static/css/typogrify.css create mode 100644 theme/blueidea/static/css/wide.css create mode 100644 theme/blueidea/static/images/icons/_licence.txt create mode 100644 theme/blueidea/static/images/icons/facebook.png create mode 100644 theme/blueidea/static/images/icons/github.png create mode 100644 theme/blueidea/static/images/icons/google-plus.png create mode 100644 theme/blueidea/static/images/icons/lastfm.png create mode 100644 theme/blueidea/static/images/icons/linkedin.png create mode 100644 theme/blueidea/static/images/icons/rss.png create mode 100644 theme/blueidea/static/images/icons/search.png create mode 100644 theme/blueidea/static/images/icons/twitter.png create mode 100644 theme/blueidea/static/images/icons/vimeo.png create mode 100644 theme/blueidea/static/images/icons/youtube.png create mode 100644 theme/blueidea/templates/analytics.html create mode 100644 theme/blueidea/templates/archives.html create mode 100644 theme/blueidea/templates/article.html create mode 100644 theme/blueidea/templates/article_infos.html create mode 100644 theme/blueidea/templates/author.html create mode 100644 theme/blueidea/templates/authors.html create mode 100644 theme/blueidea/templates/base.html create mode 100644 theme/blueidea/templates/category.html create mode 100644 theme/blueidea/templates/comments.html create mode 100644 theme/blueidea/templates/disqus_script.html create mode 100644 theme/blueidea/templates/github.html create mode 100644 theme/blueidea/templates/index.html create mode 100644 theme/blueidea/templates/page.html create mode 100644 theme/blueidea/templates/piwik.html create mode 100644 theme/blueidea/templates/tag.html create mode 100644 theme/blueidea/templates/taglist.html create mode 100644 theme/blueidea/templates/tags.html create mode 100644 theme/blueidea/templates/translations.html create mode 100644 theme/blueidea/templates/twitter.html diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9c98540 --- /dev/null +++ b/Makefile @@ -0,0 +1,75 @@ +PY?=python3 +PELICAN?=pelican +PELICANOPTS= + +BASEDIR=$(CURDIR) +INPUTDIR=$(BASEDIR)/content +OUTPUTDIR=$(BASEDIR)/output +CONFFILE=$(BASEDIR)/pelicanconf.py +PUBLISHCONF=$(BASEDIR)/publishconf.py + + +DEBUG ?= 0 +ifeq ($(DEBUG), 1) + PELICANOPTS += -D +endif + +RELATIVE ?= 0 +ifeq ($(RELATIVE), 1) + PELICANOPTS += --relative-urls +endif + +help: + @echo 'Makefile for a pelican Web site ' + @echo ' ' + @echo 'Usage: ' + @echo ' make html (re)generate the web site ' + @echo ' make clean remove the generated files ' + @echo ' make regenerate regenerate files upon modification ' + @echo ' make publish generate using production settings ' + @echo ' make serve [PORT=8000] serve site at http://localhost:8000' + @echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 ' + @echo ' make devserver [PORT=8000] serve and regenerate together ' + @echo ' make ssh_upload upload the web site via SSH ' + @echo ' make rsync_upload upload the web site via rsync+ssh ' + @echo ' ' + @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' + @echo 'Set the RELATIVE variable to 1 to enable relative urls ' + @echo ' ' + +html: + $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) + +clean: + [ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR) + +regenerate: + $(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) + +serve: +ifdef PORT + $(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) +else + $(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) +endif + +serve-global: +ifdef SERVER + $(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b $(SERVER) +else + $(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b 0.0.0.0 +endif + + +devserver: +ifdef PORT + $(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) +else + $(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) +endif + +publish: + $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS) + + +.PHONY: html help clean regenerate serve serve-global devserver publish \ No newline at end of file diff --git a/__pycache__/pelicanconf.cpython-38.pyc b/__pycache__/pelicanconf.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f251a9fb044ca3f7aee4b9f381d6026f6c39b98 GIT binary patch literal 941 zcmZuvOK;jh5Vnm0hd?3Erjc49_2fhGy{f8gU;!(BP_LGH2<2u!_CUj3|L+HNHCf&m=+Q4t|nvVD2pRj9B=8Rz|s=xEtxLs3f6|Ph-n-ZAGc@j;&cu5;^f}ASg!kh zD%*W7Kl_lYH=@BpH|Ft@85`dC9wb>l3yrdQBbzfp-Gn&{D4Y5EJKiAVF3<9W5t5Y8 z!)svbk6n*z$n>EDY{=`SH}x#8PJln=ns3?=yAI^d0UUy<!EfE8)tV~TWK|W>M*aeq!wSRz literal 0 HcmV?d00001 diff --git a/__pycache__/publishconf.cpython-38.pyc b/__pycache__/publishconf.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7993f4edbc7526ee0987b933e5f94100cac6313 GIT binary patch literal 518 zcmaKpK~LK-6vyo(Z9^dlAtpXUI5c;J5QUnpQlL}oBH@c=YL^5#O%&VGnu$-sg&p^m zeBBB04R)H-YST_U>HY2h?^#dJ_B@LEz(xEX(iabaU#}eZp*=9G zd{J^iWv)fdq`Gwwo;1gq)|EO#RMuB( zWrK?8%ywB-i50iqg{gU7lif zA)egW!>b`ipC{9My5%i99-$OrL??6nb&lz1JVjU79kCt!1>K;ZpgwTZY~=Sx7plyI l%vIKoGpN=!JS$3Wq&RQ?Q5`wi>x3|b`!Mta7#LPf>^;Y0;h%gnq{2c4VPA3g4~+aMYmv6OK8N zxWRzG62PAmo_r%1eL(syM)7?_nw+E1mC962nu*Gq3?n{)>@jL`nD7j8o_`55oSdPu z*dI-gsS;W!Ch3LgwWFXpbv<=kps)LGbV6GCZrn&=w_u*p!SsCWg#JWN*KbzU^jFvo zz4fRh{@!rY)^>_Zp}{}oaKT3DS`M}|VsN6@`{fce80Nszr{`rPp*-j)(9Xsc6t#|N z&SbBF8aQ)i?A&O8ui?s3+mEILTT$xMty8ij&Fs<$2d33bfuG%yDhr>tZ6I%3pUJ*s z68s$t?q8a%PTJ$us+mXmXtU~i111T6Od28H|2s0Xm`C`%teqO_K@5vg53Jh(UtDeh zs{T*4cwW6YtT=P5zHx4AW8FdAxEii~@lu5=N_dqATKgzKni5>#2ROqS Lxt|bB{-nuYT^^h) literal 0 HcmV?d00001 diff --git a/bin/__pycache__/rst2html4.cpython-38.pyc b/bin/__pycache__/rst2html4.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ba9f0c71a44c89241c4b263eedc6512c2987102 GIT binary patch literal 667 zcmY*X&2AGh5Vkj)-LNGB0TL1?AG;FSq*c`uLR28Nhk%e8MA*y9Sx=fJ{#n_xYLj>1 z9pH#~0ggP!UODj!T)>-Bso3%-kNo-jX2yOu945q%Z{eW$5fJjT3vQ3d2QU0`GY^8~ zWcx%=5lEU-pq~SvAA6$rC7|Rz(RV57<_DsKIq|GehN_?URg_1Rh(1J*NghLAL=cPk zlfNT^bCM3W-;)!jDqSfq+0q(~476Zq7_NZ5GG&96bnI=jkd<43eadQUL{nD!g6+@K zv)SuumLxOJH4WAcveM|KvC4H4^X`}(WD|y#Ygb`qG?xkY23#uRup{j_N7>}yKN8!A zs}gEtUW}E}xXut%jT?si!lhaA%lCx5X-OKi_v-8Pic$$#X=on`Sn@_aRyGI_vIG_XifJQV5?)L&3{0V!10WM9&?*IS* literal 0 HcmV?d00001 diff --git a/bin/__pycache__/rst2html5.cpython-38.pyc b/bin/__pycache__/rst2html5.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89c5dc0785b3cfb07f13746f3fe5d87073e02007 GIT binary patch literal 663 zcmZWn-D(p-6rR~^cDGxDK}ErOY#oHT3ZkC|E8_cL#<_)XW zIXRiVnvz4p14x4MuE_IQAnC@N#uF->CQPe^w$gQiXIuP!u}8e6%GJKsii-RJTrx18 z1l+b}kn?K;gaZ@Q(hfB$@}FTB=yi)mQG3%|HB&LkMXjK{&0#?s;VTY~+1hlJ&GAc6 z5a{6k>$96v66dMnRA>dn!l}0n^Nj^QgG*1GZY>w!idJ9FC%L_rlg5Y^A7#cK2GL z(N3FIRcN}Z+C*qZ1++U3{NFH{KCh0Z)3*P@T5Zcgx2$fX1=AL6FAQbFA3!z z087LhWy^{cdsaBjXoQ3+V z3MwK+3kvjW1oZPj48BE_d?e(rLj9_RP?ts0rRfAG__O96|>385Bv)WnFRMK3q6+eUXZ1O8Wk+&^L zX?w5kb!DZ6k_Ps_UxNY15qz&^A~<)b1cyPH2bzEmV)M~-P`Qe7PjZy)93l2;LSus3_(x^B-pt#a- z4efD&shq4km~_;R$}+f?Wt%8laRu#>2fUpotC!_+wJN4}K$Ugi!nYtU4&gg-N8P*& zf8OM%>%5lrtT8pOE`AFL2L*xzBP>-sSPOFs0c%(9&S2_AAqz_0nh7sh~#SMY6 z$iAV5NKVNt-+e7KZ_Dngcy?<=aki0;X(NIH)>-pK3UG`wCv}IJ#%SaVreq6DwjS)7 zH^BUcdlnor{RW~U>-Z;N7gi#JdBaTbUGQvejb`uQ)Z5VbU_qS0rDx6r+dx_T!nMiU zp3IW|UKdtMx=r0^5qtIb1*~~czQ%DHD?2YuJEMJuy<)4~!`IM))#{G=4z^TmF1x3JD1<7)VAeg1U+S0}NPn<5PJoF;TiQ<^46^f1YjKLJ0v A8~^|S literal 0 HcmV?d00001 diff --git a/bin/__pycache__/rst2odt.cpython-38.pyc b/bin/__pycache__/rst2odt.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d5615a6ccdcb34d9bc335f170663f8fe4aabdde GIT binary patch literal 706 zcmYk3zmL-}6vu5Rb<(tj3I={mUMtZAZeT))6Q_frqKE?>gds}fSDI^LN4BG*U77hG zU_|^!S(#WFSq{4e?)>Dh{I#F;@q2zV8b!#C?|zv5A_)C(=IWr=s%bp#YfFoXdQK6~jkPEODy+&+&E*-}Yi7zoacWM&2INEWRrE6rZEi>lNs zQ1@7)ByWpSd|>ki#C*9d3t-$P)*y_Iqo1}C^rAx((%otH*RrDKRVg4dGFy})SDWr8 zhh^SYCgY$BRW_!S!rq{#sx+WF`U-LmYWw~f2vE5Jy`#DJI81VhPUc6)mv~n~&9un{ z&nqc_DL65zEljI`zlM*7Y1yg*bj;Yq>!{jcI(ojx4z9lDdKYAwEiB7APj7TbD_P_f zbbSrx?~=}*W{0y`I&$^9M#Y6xpgh|FbY`c6V8ft8NR z)-YIr)8@n7T=tvYED`$%{4c>G=wvny$Bt#pYmLC;vFp`|*Q^G0#n&?E9({ srOkmQ#?7V+AJz8rDtPQjnpyGv5EC5Y8<=8B#(3-zOfG!iIveET4>2mu!2kdN literal 0 HcmV?d00001 diff --git a/bin/__pycache__/rst2odt_prepstyles.cpython-38.pyc b/bin/__pycache__/rst2odt_prepstyles.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e340573a802958efa2375df56649e534b7aee3e1 GIT binary patch literal 1643 zcma)6&2Jnv6t_K|kDcspX$ci8pc)XBSk%q7Jw#~v5K*&{ib7PB_P|ImnykIaWalfk zw@H>+ArUzCKj5${aY0=9Ykc6sss928%JXbmB2HNH^RwUcd(ZFv{GPO0K7#QZ^`hS$ zg#I*}tHXlL=P;!L!cd49W+cTK2?;j5m0B4MY0cBr4sAH2sS`S|+Nqm)p?4{3gpFF} zhdy(d%e-ACQ_?0bJFISb<8v=FRUiekj2 zEJW{+=Ul{!vp}lzl*^5RsbE})0M=8HC@zAjM_sJjrATrWji>p@+=UaHE5Z35aBen{ zif84lKNb0)h-D%Nd7N=MP@_Rn@|+c;X~uIk04KQ|)FBV%PCDu+28 z#M~ueu0qGnr8RfKUu%iL*5=%+yyG^*P~l%HcX6%qAcEH_Yl)YDrjs95XC^+Qcjff@ z63_tW^{Q?xUI#y32f=#`3K5{Bu{ZNCVE_r9-Rk#O88&tArSW+&RR%gG7b@Wr3g*|< zDPsWBjDB}p&IQ0936n#OPoJB$yRO|?QjU|9Yd1{F9m7z;V&xN(qpb(SeeJ{wWCt4JiiMJ=i8>P0+#`k5&X^fg=w|rvQM5hW+1+|P+}2)_ zkBc;sN_)nu2~m4BmcfnoRI&1=?NM4tt{r(aRY|I8Ry^h1hIj+4ht@2~LuZu>h_)z{ zCLDB3G++WSYRrao1}V`LzDf2g5&_)&>#M%X%6^%Yy=e}KnQ+!SJ>op=O=brN=l3UB z-+&k#%HG|Ldz%|9R&igBL{ci*7gF7a-x8IAmzRYo&voO~_8ssbKLCP=kA0X9CNIo- z12>6-*D-xTttR&II=M+a>|ya9=#I>VmxBOf5?EvUTVMcT7;e*iS6+ zg|ZX{DPZ~;AVgWrs&%PB@Rf74fIhXvfGy}XU;`^a>jms@cMR=D5o9ikpkRt|AvEP@iK-t6KiKHYx^{IL zR^(l940Vl@{3GCG8wkQ}+=TfiBni@U$7py_WOSmadrg?+YCnShq^5#LkudqvG==|A z<5j#5dtuuB3I^s)H6TUD2(BAq{M2#1GH<{FwgMygm(<~TpJWA_ru;M0Xyn^KsM{n> U2+o5*fm#HUza7VW%kw?_4{7zkcK`qY literal 0 HcmV?d00001 diff --git a/bin/__pycache__/rst2pseudoxml.cpython-38.pyc b/bin/__pycache__/rst2pseudoxml.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35165d51cb5de227eb5a1322ca186de8022c1ac1 GIT binary patch literal 551 zcmYjO&5qMB5VoDaQm8weJFO)S&HMjyVyy z!GOOKz~>Q07@Py^It(9 zdOf0?jMw#^+_Hg-Ucz{b!>aSbwHz!ny>`8l+tZgI!E_GnL7hp#K&|T}?}U;-4V*aR znezttd$@4aDsNcGxwle=hGe%B;*C}oY+h2DfBZlmQckVN5(h65u;B(=YAdcU`$bSGw1Qm%3vc;Kk=PfG9TGQ|M@+v#+If_;zk#u0>mjKQ&`A$StDTLs~$Mu$5bb0Tq# z0e>NYKSn(IN-%nd^i_<;^&V+*j>4^2#ww{3mDVXnJc0B!sxwG<3K`Enha66psK^g| zaz>TVLNQ4%tkIr==F}VNH$b16w)a9h`leq?;Wl9J(asv)w?coQFITS?)Jeg?(cXoV z$(Xa8QxB?>%ma0M7yNSaGxU#M52zr+weAwtw2DiiVYtcRg7wlj0n=L1d13Tn^#U~5 zfN&%4?s;)kYh!klhsG3W@5Y`Lb)IR?q|rbvEWPbp-&^1-_~fZGy=}pjl-9(}3sRr# ztngqP%@hnLM^%e_$eJdgn`TI*X_X5Rl&!H~qwq8vkCFuW zhV1yKf92Qn%B!yGL^tbo$J#CM*=_?MXWPSiy+7Tm>OX3BzkKkp#R?=iL1pvO>aEMz%8Z|KE&!F&>Wyt{>sB_}C-lr@#EWBD_4u&t@0|$;s}% zpdwH-r$E03KtJ_F?^{60d!kP$@%sbO!6m`0P=!@L?^7cBc?5kCK_muWFjoX~5)XIT z=!{iT%Ze+uG_`gNv|z4gZUyXRUA9gt%igvNCG85#L)MsDw58NnENgjs2^l|!OIFqb zlF={ZBX2qq)9y}lC@IQHD5-%zrG&f!4Td|g>`*08zXI*7x2~9VTnnyh4a~sYnYMJT z0dWpn$86o25(}5LL9?oniaS|rwvleNXT8wULrnOF8(^O4GdGfZ@xPE*ip+cKguMeU zZhWT)@fmv{V98tMn6wBZq>dR9v5k?Q8HX|zV4c)^>;Ka0*2M{9a{xA7IoCW(Q{SK; zU~+Ik_$x>>IRC?@tp$@}AFxeUu2QpobAIm2Rw*385)9}PlDxkKOp1g2c#mQV%`51R z5vDY<@pFg=-JmE?wJ5qs)g@QZ9a(TU$0&PIoMl-)z6C040|p-(F(HQU#2opv55Hfh zu4>XoHj`F2yj+8rY*qkjvfeEg*Qe|1wynvd_7?BN_!KK{)&aA{Fdz literal 0 HcmV?d00001 diff --git a/bin/__pycache__/rst2xml.cpython-38.pyc b/bin/__pycache__/rst2xml.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7b27b8371bd40c97174bedaa1150ab1e50537d1 GIT binary patch literal 553 zcmYjO%Wl*#6t$g95@r~I011hew^JlI6vg!>S%|vHShLM;+b{91{Ohg8`$Unv&K@QQP z*uI$VQ7w(sOwki(O`u=|4VH#A(5II7K`KuV`jwJ?4embeoE1Hn=KcTE<5$aS`aRBw zUJqzNh8x`_z2#acX<)c5;Dq%mv;sVLvJ29h?aSw2z_9@SpHgX9kf%VS;5dw?J}@Jg zvIeMw!{B-zdI#bN&I9$fcN~00>5!ajwII#x%*g<*HB7@WyK>i}81l9imbdMYDa)CH z;hKl=C(V}o?cQ?P%p>Es--=rYE{TR*I>Pu7Uyz%P`3OIr)j@Z4C%dvY9pf7i<=GlQ zm7DEqb+NP2^-qqDZvH4g)^Ly Ln+d_>XPW#1v&^5< literal 0 HcmV?d00001 diff --git a/bin/__pycache__/rstpep2html.cpython-38.pyc b/bin/__pycache__/rstpep2html.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f16d9e3d798f60d33d445d5ac72b4b64d4696ee9 GIT binary patch literal 613 zcmYjO%Z}496t$g4Gc6Se79dt$P9&PbEM@~jjGzLcf+EcTLpG5c-;z*2g6(K%|A8GJ z087LlWy^|RU;_>_h`E-Je6Q?teC~ZUosN-@?_pAYCJ6l)lFJeMLW$lnS@D5D~haS>z0BZzOJVgwP7`3Ocl`4spn zIY#N;?!)+q%0@Mk3A#2~ISPtXr>U!fKG9X@8ewVPtwdvMFn4HcH1DcLy`#@gUMz<< zlIDwiyq|AftrcCUnyCsTc&gm!R$C@g%01Iivf22jw}W2xC?);X_MEq@Bo~c>{sxCN z>x3&g*vd4mYqZ+ke+mi=b71NIY5HH)z_Bx3LRD>Mu5#IErJ%> zBJohxPKq=rCI%P>Qz|B*n4Fo$T_pYFl4zRrqq6kBF3Ua^x?%$QJqzyQ7%v}}N6Td~ z9efQP$|`NZ1m2km2Z%g;LuQ!pU-&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/murteza/Virtual/Blog' +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/bin/activate.csh b/bin/activate.csh new file mode 100644 index 0000000..6b9856f --- /dev/null +++ b/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/murteza/Virtual/Blog' + +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/bin/activate.fish b/bin/activate.fish new file mode 100644 index 0000000..d3d5c00 --- /dev/null +++ b/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/murteza/Virtual/Blog' + +# 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/bin/activate.ps1 b/bin/activate.ps1 new file mode 100644 index 0000000..95504d3 --- /dev/null +++ b/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/bin/activate.xsh b/bin/activate.xsh new file mode 100644 index 0000000..55a21b0 --- /dev/null +++ b/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/murteza/Virtual/Blog" + +$_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/bin/activate_this.py b/bin/activate_this.py new file mode 100644 index 0000000..4479986 --- /dev/null +++ b/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/bin/chardetect b/bin/chardetect new file mode 100755 index 0000000..cff9ee6 --- /dev/null +++ b/bin/chardetect @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/chardetect-3.8 b/bin/chardetect-3.8 new file mode 100755 index 0000000..cff9ee6 --- /dev/null +++ b/bin/chardetect-3.8 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/chardetect3 b/bin/chardetect3 new file mode 100755 index 0000000..cff9ee6 --- /dev/null +++ b/bin/chardetect3 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/distro b/bin/distro new file mode 100755 index 0000000..21390a9 --- /dev/null +++ b/bin/distro @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/distro-3.8 b/bin/distro-3.8 new file mode 100755 index 0000000..21390a9 --- /dev/null +++ b/bin/distro-3.8 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/distro3 b/bin/distro3 new file mode 100755 index 0000000..21390a9 --- /dev/null +++ b/bin/distro3 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/easy_install b/bin/easy_install new file mode 100755 index 0000000..36533a1 --- /dev/null +++ b/bin/easy_install @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/easy_install-3.8 b/bin/easy_install-3.8 new file mode 100755 index 0000000..36533a1 --- /dev/null +++ b/bin/easy_install-3.8 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/easy_install3 b/bin/easy_install3 new file mode 100755 index 0000000..36533a1 --- /dev/null +++ b/bin/easy_install3 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/markdown_py b/bin/markdown_py new file mode 100755 index 0000000..4b19c07 --- /dev/null +++ b/bin/markdown_py @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from markdown.__main__ import run +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(run()) diff --git a/bin/pelican b/bin/pelican new file mode 100755 index 0000000..fe87d60 --- /dev/null +++ b/bin/pelican @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pelican.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/pelican-import b/bin/pelican-import new file mode 100755 index 0000000..e8b83b8 --- /dev/null +++ b/bin/pelican-import @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pelican.tools.pelican_import import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/pelican-quickstart b/bin/pelican-quickstart new file mode 100755 index 0000000..aab8e1c --- /dev/null +++ b/bin/pelican-quickstart @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pelican.tools.pelican_quickstart import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/pelican-themes b/bin/pelican-themes new file mode 100755 index 0000000..d04aad3 --- /dev/null +++ b/bin/pelican-themes @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pelican.tools.pelican_themes import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/pip b/bin/pip new file mode 100755 index 0000000..515203d --- /dev/null +++ b/bin/pip @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/pip-3.8 b/bin/pip-3.8 new file mode 100755 index 0000000..515203d --- /dev/null +++ b/bin/pip-3.8 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/pip3 b/bin/pip3 new file mode 100755 index 0000000..515203d --- /dev/null +++ b/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/pip3.8 b/bin/pip3.8 new file mode 100755 index 0000000..515203d --- /dev/null +++ b/bin/pip3.8 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/pygmentize b/bin/pygmentize new file mode 100755 index 0000000..0dc1ad7 --- /dev/null +++ b/bin/pygmentize @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pygments.cmdline import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/python b/bin/python new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/bin/python @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/bin/python3 b/bin/python3 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/bin/python3.8 b/bin/python3.8 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/bin/python3.8 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/bin/rst2html.py b/bin/rst2html.py new file mode 100755 index 0000000..14263f2 --- /dev/null +++ b/bin/rst2html.py @@ -0,0 +1,23 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2html.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing HTML. +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description + + +description = ('Generates (X)HTML documents from standalone reStructuredText ' + 'sources. ' + default_description) + +publish_cmdline(writer_name='html', description=description) diff --git a/bin/rst2html4.py b/bin/rst2html4.py new file mode 100755 index 0000000..abc9c35 --- /dev/null +++ b/bin/rst2html4.py @@ -0,0 +1,26 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2html4.py 7994 2016-12-10 17:41:45Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing (X)HTML. + +The output conforms to XHTML 1.0 transitional +and almost to HTML 4.01 transitional (except for closing empty tags). +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description + + +description = ('Generates (X)HTML documents from standalone reStructuredText ' + 'sources. ' + default_description) + +publish_cmdline(writer_name='html4', description=description) diff --git a/bin/rst2html5.py b/bin/rst2html5.py new file mode 100755 index 0000000..e67aaf2 --- /dev/null +++ b/bin/rst2html5.py @@ -0,0 +1,35 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf8 -*- +# :Copyright: © 2015 Günter Milde. +# :License: Released under the terms of the `2-Clause BSD license`_, in short: +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. +# This file is offered as-is, without any warranty. +# +# .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause +# +# Revision: $Revision: 8410 $ +# Date: $Date: 2019-11-04 22:14:43 +0100 (Mo, 04. Nov 2019) $ + +""" +A minimal front end to the Docutils Publisher, producing HTML 5 documents. + +The output also conforms to XHTML 1.0 transitional +(except for the doctype declaration). +""" + +try: + import locale # module missing in Jython + locale.setlocale(locale.LC_ALL, '') +except locale.Error: + pass + +from docutils.core import publish_cmdline, default_description + +description = (u'Generates HTML 5 documents from standalone ' + u'reStructuredText sources ' + + default_description) + +publish_cmdline(writer_name='html5', description=description) diff --git a/bin/rst2latex.py b/bin/rst2latex.py new file mode 100755 index 0000000..f42b523 --- /dev/null +++ b/bin/rst2latex.py @@ -0,0 +1,26 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2latex.py 5905 2009-04-16 12:04:49Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing LaTeX. +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline + +description = ('Generates LaTeX documents from standalone reStructuredText ' + 'sources. ' + 'Reads from (default is stdin) and writes to ' + ' (default is stdout). See ' + ' for ' + 'the full reference.') + +publish_cmdline(writer_name='latex', description=description) diff --git a/bin/rst2man.py b/bin/rst2man.py new file mode 100755 index 0000000..d074e2a --- /dev/null +++ b/bin/rst2man.py @@ -0,0 +1,26 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# Author: +# Contact: grubert@users.sf.net +# Copyright: This module has been placed in the public domain. + +""" +man.py +====== + +This module provides a simple command line interface that uses the +man page writer to output from ReStructuredText source. +""" + +import locale +try: + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description +from docutils.writers import manpage + +description = ("Generates plain unix manual documents. " + default_description) + +publish_cmdline(writer=manpage.Writer(), description=description) diff --git a/bin/rst2odt.py b/bin/rst2odt.py new file mode 100755 index 0000000..af70164 --- /dev/null +++ b/bin/rst2odt.py @@ -0,0 +1,30 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2odt.py 5839 2009-01-07 19:09:28Z dkuhlman $ +# Author: Dave Kuhlman +# Copyright: This module has been placed in the public domain. + +""" +A front end to the Docutils Publisher, producing OpenOffice documents. +""" + +import sys +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline_to_binary, default_description +from docutils.writers.odf_odt import Writer, Reader + + +description = ('Generates OpenDocument/OpenOffice/ODF documents from ' + 'standalone reStructuredText sources. ' + default_description) + + +writer = Writer() +reader = Reader() +output = publish_cmdline_to_binary(reader=reader, writer=writer, + description=description) + diff --git a/bin/rst2odt_prepstyles.py b/bin/rst2odt_prepstyles.py new file mode 100755 index 0000000..bad432e --- /dev/null +++ b/bin/rst2odt_prepstyles.py @@ -0,0 +1,67 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2odt_prepstyles.py 8346 2019-08-26 12:11:32Z milde $ +# Author: Dave Kuhlman +# Copyright: This module has been placed in the public domain. + +""" +Fix a word-processor-generated styles.odt for odtwriter use: Drop page size +specifications from styles.xml in STYLE_FILE.odt. +""" + +# Author: Michael Schutte + +from __future__ import print_function + +from lxml import etree +import sys +import zipfile +from tempfile import mkstemp +import shutil +import os + +NAMESPACES = { + "style": "urn:oasis:names:tc:opendocument:xmlns:style:1.0", + "fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +} + + +def prepstyle(filename): + + zin = zipfile.ZipFile(filename) + styles = zin.read("styles.xml") + + root = etree.fromstring(styles) + for el in root.xpath("//style:page-layout-properties", + namespaces=NAMESPACES): + for attr in el.attrib: + if attr.startswith("{%s}" % NAMESPACES["fo"]): + del el.attrib[attr] + + tempname = mkstemp() + zout = zipfile.ZipFile(os.fdopen(tempname[0], "w"), "w", + zipfile.ZIP_DEFLATED) + + for item in zin.infolist(): + if item.filename == "styles.xml": + zout.writestr(item, etree.tostring(root)) + else: + zout.writestr(item, zin.read(item.filename)) + + zout.close() + zin.close() + shutil.move(tempname[1], filename) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + print(__doc__, file=sys.stderr) + print("Usage: %s STYLE_FILE.odt\n" % sys.argv[0], file=sys.stderr) + sys.exit(1) + filename = args[0] + prepstyle(filename) + + +if __name__ == '__main__': + main() diff --git a/bin/rst2pseudoxml.py b/bin/rst2pseudoxml.py new file mode 100755 index 0000000..4597a22 --- /dev/null +++ b/bin/rst2pseudoxml.py @@ -0,0 +1,23 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2pseudoxml.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing pseudo-XML. +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description + + +description = ('Generates pseudo-XML from standalone reStructuredText ' + 'sources (for testing purposes). ' + default_description) + +publish_cmdline(description=description) diff --git a/bin/rst2s5.py b/bin/rst2s5.py new file mode 100755 index 0000000..ac4b71a --- /dev/null +++ b/bin/rst2s5.py @@ -0,0 +1,24 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2s5.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: Chris Liechti +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing HTML slides using +the S5 template system. +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description + + +description = ('Generates S5 (X)HTML slideshow documents from standalone ' + 'reStructuredText sources. ' + default_description) + +publish_cmdline(writer_name='s5', description=description) diff --git a/bin/rst2xetex.py b/bin/rst2xetex.py new file mode 100755 index 0000000..883beb9 --- /dev/null +++ b/bin/rst2xetex.py @@ -0,0 +1,27 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2xetex.py 7847 2015-03-17 17:30:47Z milde $ +# Author: Guenter Milde +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing Lua/XeLaTeX code. +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline + +description = ('Generates LaTeX documents from standalone reStructuredText ' + 'sources for compilation with the Unicode-aware TeX variants ' + 'XeLaTeX or LuaLaTeX. ' + 'Reads from (default is stdin) and writes to ' + ' (default is stdout). See ' + ' for ' + 'the full reference.') + +publish_cmdline(writer_name='xetex', description=description) diff --git a/bin/rst2xml.py b/bin/rst2xml.py new file mode 100755 index 0000000..9482064 --- /dev/null +++ b/bin/rst2xml.py @@ -0,0 +1,23 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rst2xml.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing Docutils XML. +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description + + +description = ('Generates Docutils-native XML from standalone ' + 'reStructuredText sources. ' + default_description) + +publish_cmdline(writer_name='xml', description=description) diff --git a/bin/rstpep2html.py b/bin/rstpep2html.py new file mode 100755 index 0000000..a332313 --- /dev/null +++ b/bin/rstpep2html.py @@ -0,0 +1,25 @@ +#!/home/murteza/Virtual/Blog/bin/python + +# $Id: rstpep2html.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A minimal front end to the Docutils Publisher, producing HTML from PEP +(Python Enhancement Proposal) documents. +""" + +try: + import locale + locale.setlocale(locale.LC_ALL, '') +except: + pass + +from docutils.core import publish_cmdline, default_description + + +description = ('Generates (X)HTML from reStructuredText-format PEP files. ' + + default_description) + +publish_cmdline(reader_name='pep', writer_name='pep_html', + description=description) diff --git a/bin/unidecode b/bin/unidecode new file mode 100755 index 0000000..09d4008 --- /dev/null +++ b/bin/unidecode @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from unidecode.util import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/wheel b/bin/wheel new file mode 100755 index 0000000..d6ebc76 --- /dev/null +++ b/bin/wheel @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/wheel-3.8 b/bin/wheel-3.8 new file mode 100755 index 0000000..d6ebc76 --- /dev/null +++ b/bin/wheel-3.8 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/bin/wheel3 b/bin/wheel3 new file mode 100755 index 0000000..d6ebc76 --- /dev/null +++ b/bin/wheel3 @@ -0,0 +1,8 @@ +#!/home/murteza/Virtual/Blog/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/content/blog/privacy_for_the_whole_family.md b/content/blog/privacy_for_the_whole_family.md new file mode 100644 index 0000000..7035f89 --- /dev/null +++ b/content/blog/privacy_for_the_whole_family.md @@ -0,0 +1,55 @@ +title: Privacy For The Whole Family +date: 2020-07-10 11:18 +tags: privacy, nextcloud, self-hosting +category: Tech +summary: My story of learning about wounds in my privacy and my first steps to recover it, helping my family in the process. +status: published + +According to my mother, we had internet in our house while I was a baby. Internet back in the day used to make iconic dial sound, was slow and would lose connection whenever someone called the landline. I grew up seeing webpages full of GIFs (I won't argue about its pronounciation, it was decided long ago) and banner ads injected by adwares. Flash and Shockwave were the fundamental building blocks of interactive webpages with animations. + +All those colorful flash games sites were offering tones of free games in exchange of distributing adverts and malware in their websites. As a child attracted by colors, I believed that those games were actually free. Some of those "free" game sites are still around and powered by Google AdSense. Others moved to Facebook and started earning from Facebook Ads and in-game currencies often called "gems". Around that time my classmates started to talk about Facebook and I had to go there too. + +I grew up since then. I came abroad to study computer science. I have my own laptop and smartphone. I was using my devices and all those free services to talk to my family from thousands of kilometres away. I was using those sweet and free services for backing up my data, photos, documents, contacts and more. These services are free for us because all those wonderful advertisers are paying them off their goodwill ... + +#### *__So I thought__* + +I was naive to upload my and my family's photos to Google Photos. I was naive to tag my friends in photos on Facebook. I was naive to use Amazon instead of taking a walk in tech market and support the independent sellers. I was feeding tech giants for convenience and damaging local economy without knowing. I didn't know any better and I confussed giving up my privacy with convenience. I am not that naive kid anymore. I learned English Language in Kenya and I learned to harness the knowledge in the internet. I learned that there are alternatives that I can use. + +#### *__I learned that there is a way to gain my digital freedom__* + +My first action was to switch to [![DuckDuckGo logo](https://fosstodon.b-cdn.net/custom_emojis/images/000/010/368/static/duckduckgo.png) DuckDuckGo](https://duckduckgo.com) from Google Search. I found that the most widely adopted service of Google is a text box for us to write our most intimate secrets in plain text. + +![Google wants user data. Users use Google Search. Google says "It's Free Real Estate"]({static}/images/it_is_free_real_estate_1.jpg) + +Dropping Google Search wasn't gonna cut it though. I still was relying on Google Contacts, Photos and Drive to backup my data. I needed something that could backup my phone properly while not giving up my data to data hungry companies. + +# NextCloud to the rescue + +NextCloud is a file hosting service with built-in CardDAV (contact sync), CalDAV (calendar sync) and WebDAV (file sync) servers. Not to mention, it supports adding more features by installing modules from its [apps library](https://apps.nextcloud.com/). It is [FOSS](https://en.wikipedia.org/wiki/Free_and_open-source_software "Free and Open Source Software") free as in freedom for everyone and int this case free as in price for non-enterprise users. Nice thing about NextCloud is that it offers _all of its features_ to both its enterprise and home/personal users. Enterprise users also benefit from technical maintenance support direct from the NextCloud. + +The way I deployed my NextCloud instance was to rent a remote VM. I am a student who can't afford to buy a machine and run it 24/7. Renting a server seemed like the most affordable and logical idea to me. Rent costs $5/month for the cheapest tier. I am careful with my pocket money and after cancelling my Netflix subscription, I had more than enough to pay $5/month. + +After renting a server, I started experimenting with different OSes. I tried Debian but its php packages were old. I tried CentOS based NethServer but default user credentials for NextCloud were wrong and I couldn't use it either. I finally settled at Ubuntu 20.04 LTS. I followed few tutorials before I found Kev's tutorial. I deviated from those tutorials because I am young and ... nevermind. I finally found Kev's tutorial and + +There still was a problem though. I am not he only one sharing data about me. My family can do that too. And I felt responsible for helping my family with claiming their digital freedom too. I decided to create accounts for them and help them migrate to my NextCloud instance. It turns out my family acknowledged the privacy they were giving up for the convenience. But they didn't know any alternatives. When I invited them to use my NextCloud instance they were excited. But moving from Google Suite to NextCloud isn't done yet. It takes time to learn new systems and their quirks. + +## Conclusion + +I think this was a successful attempt. Of course I am not done here. I may need to introduce my family to Fediverse, free social media powered by voluntaries, or Jitsi, Open Source alternative to Zoom and WhatsApp video calls services. But for now we all made good progress I would say. I will let some time pass until they get more comfortable at using NextCloud. I don't want to overwhelm them and make them regret switching. I don't want to be another reason they stay on Google. + +Meanwhile, why won't you make an attempt to gain your own digital freedom ? +I see many ways this can be achieved (Numbers in the beginning suggested how difficult they are rated out of 5): +3 - Manually install NextCloud on a remote VM +2 - Install NextCloud via Snap Package on a remote VM +4 - Manually install NextCloud on an old computer +3 - Install NextCloud via Snap on an old computer +1 - Purchase a [Synology](https://www.synology.com) NAS to serve you data backups, sync and more services +1 - Purchase a shared hosting on one of many service providers tested by NextCloud company + +## Tutorials + +__Installing on own server__: Kev beautifully explains both Snap Package way and manual way of installing in his [tutorial](https://kevq.uk/how-to-setup-a-nextcloud-server-in-ubuntu/). +__Installing on shared hosting__: But if you are intimidated with the idea of setting up your own server and managing it, you can use a shared hosting instead. Kev has a [tutorial](https://kevq.uk/how-to-install-nextcloud-on-shared-hosting/) for that too, albeit it aged a bit old. +__Repurposing old hardware__: If you have an old computer gathering dust in a closet, why not use it as a home server! You will find many tutorials on the internet on [how to install Ubuntu server](https://lbry.tv/@TheLinuxGuy:d/How-to-Install-Ubuntu-Server-20.04-LTS:5). +--- +The only reason I followed manual method was some rookie mistake I made that caused Let's Encrypt HTTPS script to not work properly 😬️ I highly doubt you will face the same issue if you follow the tutorials carefully. Even if you do face some problems with [getting HTTPS certificate using `certbot`](https://certbot.eff.org/) command isn't difficult at all. diff --git a/content/images/it_is_free_real_estate_1.jpg b/content/images/it_is_free_real_estate_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb346164e012deb7b698ee6175e0529c143bf823 GIT binary patch literal 254627 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

|UG-LKI=b?qKRm4JdHE2cxLyYt^{4C@p+c z-!`j%?C{wL{$;R&dLPz6JenCG4X73NuTiYa46medm1`&{cT*7sSp+wo9vSZZ=;D26 zn0{HOdoy*tvi>PUDevN0?Tq+nrmM(a9%jt1Q_iTCqr*aI?B?hib>j#qn_$aWY&2Dt zFomHrtOg0(7OrM$n)MU+UD{x35;{W6w!BqO(iSwB$`zl`Gliu?m4U_7{}4el57Y(3 zGlEW2oP4`GTlx3D%AcVshT}Hf*OganYT6L8wlo<}mN+?=bw)xdMGJuq_L{0SUcW?u zLX%xUarT#w(24WvlOJ8q^_o?rOzToEnUr;^JguJQ1s&dm>s5#E_F9uL;Yd_WXYc+) z6dZTkKre|&S1;%u<=9~AZZf`nojlzCD|49%jZl!@vpR!Xf&#LOQiuem@E*>>=VLX1 zPkZb}I{7TV+X(s0r{{2hVebHaNvOT}(Bp@noRGj%x6IL%lkL(#lHDS^TRJ(eP;eGf zf1O={X2Sp1Ruia6IDM}6qD&XkB7b|7gzOkH*}p9LAghYkm*VY@iV2bqY_$mvcp~y; zPKzZ;Y(;(VZdFF_yf0ZuH$ zr=Y@;QxKYnCyP7_;pnEUcIrwmr=R>_X6z;0N~T7yN~k&sQ_{8Cr3qQ2An)}4GJ-Rd*pHsMrq%9f3~ zoVP+w9iqbgUS6VF%g8~oBq0t4OQlLAEJ~PGt#1$CT7`<rMw+B8!D&dBr&)7|Bmj)R3wbN8*Cy)&GdCE54X$&JqQ?YwcfZ{OFm1uPK$9cO2w zb(`lX4tAW}NOaX%ZFKqL&|R^CB!-;<$KO&e)LeB|1sWWg_*YC;GrIBL@sNFtH_KLj z=L*#GPBP{xdzYl1Cuj4Zlu!`it&UjJerF%^`S6;$C?#m_%d&v8fMqzF(a#c_uqYAU z8re>d44CyLNc{tlWQ{G|%)K(SasJj4|U5cU5~lfF>&BB4Km&Z7~@XHRX~t35?8AbaM{A74YW|a5`h_rK9-o5A`&oq|Gx* zGxj=*SuE(?aZa;QsuZbBNLHtw(JN%d5G(6L}Ap0+s;@Mm9Nh*>~P`wEl8PU=)lTr9P zSAl9Z(}lQ8#4*f{Sv(!FUVnf{yZN&uqr9K75PDOfRw_kqyLZ1_z`tzXZs4;L&h_+j zSo^rm#Cwn1pnLvLcfr!HzNrrim?EWI$*MBl9k;lF`sZ$vR2Zw{A~bY zQU(8|<+ej1(xJFP!Uo%5T7++%jFtiKzOsS=O#5tYx2wg?nQb{s%0#jrL5sAz-jakn zbF@utjNK7$_kPJ{e=ONd67&9!`RDAB7}0?P{s;QuoV4_-}xtVJocvTiePo<9v`_&NEk4qR-S^VtHf)I>~_jlfV>wvL3q_q+$<1f zF{{O0n3!`#3kQ@E`mjpT1~&WHlg*@HGH7V8acMc;) z9t;n>(GjRteMj?k0TIj5>qtOK(tAntt4W?DtDCeooJTVl-g2BE|2s?l83skdXBftk~4nm5ef7mhoG zkucSWpYf|@Y^3u8{S?`Aqh+O8R-5A%_9j11!9>%X?`410-tP`x`)O7uXSzQ!A2)eG ze-c^b;{+V$0u%>r!(&dAKx>P(d6G$;QBOp(I=CLq*iBMX*sp=nl%(F|Pf1&D8N-q$ zS1gE5ftQOO0* zLox95ofWWDz6#2$Cyyu^rghxFg{X9P6scDAhfiW|{nV$Y&COqZGH2v%S-4|@PQoo3 zu~Lf{?tGIga1?T$EYy)7VH0tjq##CV)~sjt{Q_hTJaCSIHF_vRb^5rn z3pnSdI6UUo!-v(foaUWSo1+=etJ3P!0SXZ5*;4bw0Ud*xm5g~X`}%b&BgQMKxt6G96pb@hHr^&QfSgDSVei{}>-rjx_<8n1_BzqE`pRE|ADpSkV=r zMh>VAQHo5#L_GWDbB7jnNM-skdSiuTVx`Jo?=uXPeQ$U>} zm0^Z3u#sqi-JI@TH!;;4*>c@4`Aw8`iw=*S7a)&kyaLgEX!kHbWVdpD5F^S&d?rs= za}JNi z^j<$bbgry{UN+Wwtlildy5RTPsK6;(XcUEzO+|#Eeie*1CGs~+K3*{~NQz}9uo56Lxy0Cct8mKAJ#+U5?X6xg$9?E^+x<*e zbY(5DZap{p>qzUN4l_&q36M+lb&}$(FCO^8f+}I3Y;1m8OCw{D9+DJV+q-?+gaJP30e%c?Ujj^3 z7AW2W@vE>3w6yff086sPyw<_7uV2#2k{3YjKgcAqXn@_ewj-?SzSqS_Vjcv9*-oE= zva*2JtAG)U!jEjQ;`?cV^$dz;Mzy}b0Jc6uyOm=2tU9U#eBT7wQc}QZrmsKhHoIl4 zpp9*V{BDXseI*ix+G`=Wh`2AKL>7oM4umYp8<)5wcnTbJ@)NSAyb8kXFXxr;;~Z>_ zrp29BW8Jw5m)*Upt$bIlw8mdCw<<35O7xzKdg%LQ6_h`#bq}*b4LIA9VSSBy#^uVU zPwl&$S>A`GXNSZsd`-giIX2O#KFv*=X2_p<`4cQjEwa}}6pc_%K_#fp4ZE(QnrKC9 z9gU5_y&0hL2vEj?FnM#n^hUbK`=CSTg<mM7*CJ-Nnpr0UdgPgBW zvqvT?8VVU@qQEk`Oi89;FJeD+l#5R=(keiFF^%lzXR`%)k!`*UfVGM-Te-1wlVXKp zo$>K7MRzm;%O$FX*9#?c$||})YprNJHQ50_FLDe}$emfx$-d4=j%xDN^HUJo0`zvFP$bbp-PT-w`ZsZL;0# z*MN`t&Du%QRHFBD@?q?3hS~R^R&=!_^H3u#aqI!VPs+o}v+pUsOQ{A!(>-=oI1j>|pTh^>YWaNx#-sl<@~@DLb1~C_E7p7w@Ty13bj(@p?W(AA zsB>2qyTkqPo+49>GdG(64<>-5FH9dHF-G_Nr@1_)6ezHFP`I;BGYiM=kW=*n$pE*l zzc!T&PmCZJv~Pw?%cz-^%o&B>6^{w%YymT*f9jY|p)NXm!9G1}KwK19qFcn4!2%g0 zqBWIz3DyyvWNMCK#nolr%J{ozT^9xhA*mOkKH_b91A1Zh2D^pJu2|EV5Ggt-Y5QKq zbNu>o8Q+&MO#@OI5Yh&5N|R7cFdXqO{zv&ER1L;9Jp!zOpe>h{*XLF!C6*G+UD#Y8 zd0+(f&dmcx*KwCMx&mi@k_MliLF2q5U|3UQrG%qyC3TxH@?=~kh$_d}o~?IRwxUQ< zHXv?l=PT5p7TO@2o-(n&iNW%Y)~|3FOoiz`jPxIHbZW7cJ|2iOt=sQZNu%lLIFHG% zczE12q>oahsQ1^dcz*b?pW=k8jWi!6_@wBO=3*dD-um%)TA;8|RunNLiLEFAn%PR?#f%^qQ(@0l?U=qjBApI=P- zgp3h0f5&dl&?(lbRhk8;3j;YsqOy0A^|VaJf*cx@tH?X-mjn<#JADyaG@Z0R@JZE8 zf4To-(qkj{Yx!@fm&QM@7u#-w<-&)t^ZdXjW1>S;|3H!2Kyw}4EfhOn>Ac||x6wuI z{Azzna`TNW)&<|{NP#mGqe;tg(z8aDR^MKSVTX|e&e@90o?hp^vOCm04+<=$7KlWj zZj8Hl3lpn?9 zqTn2`RfK-8Ef0|tX1yg>{@V{VxX_Qvt^(OpA(~ji%tRrQzYm@`i)^1*lD~}<%f3pq zbJEsl#hGJ~nEWL9D@)Y+LGdGZjD)iCR~g;Dew&1{y@oY9J1v>h)8S`N#efTkOt(9SrklmaDYfSq9J z@;0OiHTFZ5!kRqnNLVgoK8s3z*oHzhlM=3|@DI`2fSzdiqZuE04V@L)?g~S)jEH_p zb<3{Lxk;J`G#P=~cs}N6Lt76CqW|%Iy(;4(lH6t}QN1o5!&VudZib9|HCbQ9zK8gS z2-!v&`t_}n!AusHRj76Ye3wDcB3u49uj1;V7Q3_h@zZ=$v z)O0od@*U0eX9nu(%ls?Qna2am#7|>>ViW@(>sAmvLkT@E8+u-bKG)B%EaG!SrcQ3@ z*U_3bgiy^z3EqGFw;=FHY&K)QB2`MxC{#*_Rup2g!rsSoZ{4|+eWORU2^@SttvmK` zZ;|VO{Nc`OAoWfSM+r?G&3=y`Oza+G$pWwUU?zpKBdutKK!io?QHNnSwa@J&y2Dai z|0XP%Xd+Fs4mH7kf|emxLxg!AsfqY?j{QiS@oO-pYAwdIK22g3)3m+{`Tg9M__d^} zbZ*ZUQP)k1^lDMoaouBQ8*Oq+Z?n+f0zIsIh4WTArD$e-XC|uODAB=WxMM%T+W3iH zdkp6JG86f*ENVIsL&uPrjbmv{$PZ472|r;-D`8{j@^)D6{&frQoDBR@$~Uas?EM zD7<|8-j2BuxG!|rm6lBw^WgRt9-a##C)R@z+uK_b%=vXq0u9b|pHM~rzMGN%+U7vW zKfebh`y1Li4vX@;DUvj-kS`y&Pr8kUzRx?c2ZptkSV?89vpf=r^m`draB0q=6MTP0 zenwNHMd^nL=>S?Sb#nDxk-@|$yO2obiJZbQ=$wpm!JigQpV;>(dRj0kP%R0WBAWD+ zx}Ko15?kHz2~*C#G>Qc1fO%Oe##J{2&Mx(^S()>ZS#8rZ7iNvh+8>2YpH&!*H7zjx z5kDtd(fnDyh0;#K{G?_6E7kj6d3;ZE5j_7h-h(Z9Y_xrgd&#a;v13dBC&X#AhqF!K~=}`A5Ucg#^t`%!Jb>fss-cm!=_) z7wEQe-D_i!=LUemGt7tN2c}WRF$Mz+H(} zZayjL)eQ6c*%>oR`y0!f=cDMid`7R=2QtC)(!yXTXXnup$jXn5v=lcrnf$6Z21z=GD`(TB4)!i%vsnHVdl)f?~>B@rte9R!fC8bAR3cB;=17ta;1W! zTR`g}_3Q%U#i-my7GvDt!Yzr`IlimvM0Cs$^`|p4bLy^P)1X&#xsNj?$(RNn?_Dh_ zQ94a>_m4EXz9b+cMZz68pgRM+P*qs13SwSbb33p*p=`<*vP!oYx9F@-ASvF2G6TtH zMOZ)n9cEw^c{CJZG0;P|2-HH({Hk-Q5OxyJYB7(K>POFX5^o=(OhW&4j#W3|ivUk! zSuP#Lw9X?z-;)}^vmN#@Q#QECVGFyf5fgyB)a50ep4Zc}tnUQa<4vFhX)*`+C^HF}mF-#N$cS%PCPleCrSK| zuY5#HnEEcBOGfBz;WB>M9pH+GtU#l(0cUTdkLY7dEOD3<0Wk!2vcMxZ%I)A~ zgln^TW&IKr@~Zw6&;U=J8#nkS%S(N(K%O%;N*$ItbB}i#DRj>J>b0w)+T?CEobna% zv|zVLb4wR@V2{z^)El=|+mdfH#P2;;q?2MAlnyB478uCZ1FJ{8Qq)l7^;51yQOJr< z@c9JmaqD^kAkm5<#?*6aSarTUX7a{+ye`avAEYd{-@se~7K9Rp4)uJ+hdb|yJ26Y( z`^x$!v?IxHczy3Un)Q3$zBy4Zvj5xM!?W;N_a{E5jn_D*_Nn*3KG6Tonslvd%tWJV zt+rE^r9^Y41U8+T4EaepXvL=o1h}k9%ABpIy_t|HOw>htAL`Kc$D7TmtJe$q6*`WK z^7)NFMo63zy)-QoqGi3G8J+-fjXzNqY=?88Q7-tr|l%$nDGk$Oe- zPb6xQCMM?(o4rPr2D|=eB0pqc{AT{blO=6fb1X`9U;qka z3Bct@$i00ZMh#1E|Exu=?=5zD;ow(&Y|zGI(<41MIE#6n3kuVN(a@ym^M4}O%boAH zRJi1O>_I|WIrT&qcG$Qyn!5%>c{ebw;NZ zBxQ`nfm|!<+ECNa_ftzDPL2Q|cIX$qL~rPCX>5)dw%atwBIR#O71W+RO>j`kHT9Zr zXD@#v+jH93V#20&{j?3agLQI!%K`wRJWJ6EXQeo`n?&$Hkz4$H=kk=}U6Kh;I^-I3 zQ*&G0+VX8jwiM1<2}{!Sh}R@{e?1m|o30=rbY}1c7V!dtr=phafFw+LrjUYycHo!C zMz;fT-<^W(!-FXVb$J%hswI)W;g>BIK4F~n{F>*00+ILB@K2-ObUaHZ5bnty2z6j+ zqgxpQQ)QpSEqrf1WV>_o^Mj-M7Eb|PM17jYPxw{B1M|GL9dje+)<>}y6?p%{zsBx& z4fZ2MCCj)0bNMd8_nE&?Zy>R*Ty+8ZKKBNmXZ;zIvS|PZQcP7BY*!L>STc6bG+nTF zJl{gO1A6`@_he?T?}Ct9^y0tp-Q^-?h1|cf)TKqqGbajw)T0M@2;iV?r3?kj?zEi! zDo^b8-uNXsd@I>74-@C?-?`$&76;b2t;8ou3;D2#3uoO5g_SPwz2{e4qj=x#rFl^7 zFkJU2G{t-2GfA^;g>oXhnW$yBLd#f=o!-{4T80m&W$0me0oVIqJ z=^h^bb8}q@6lmGXk9dP)yO~lNh(?vi{-H{+q~LD{c!;Uqk>}q(z`c=M}^*+E0QZ z38NOJ4O>AF?v-V=XyxGMc{P`A+7|$4A^%n~9+UnrA@-W%86R~+fpV_adqV0aO7>5^ z)5hf1h0`Zo_vo%ClE%+6%Xqy%Mp=D?A1&SXXj>;_eefq&+xu4C^0~}0xA=rcy_wO{ zXYP;53uVg)H*SXjT9FTQ{445Vj;h|_W%x%hXXO=ld5*=}tyPiPrwWxz?~e`ST)1S0 z&7sSCkkqA`O?La3^R+_`bQhyylmtonT#IByo(}%Ihv{3&{;#I)sk|j@mZ2w*x8Xhf zFUX(LyWi%+X-fwUPBpwxYw!w#BR5ygF*-%hYOj*k@YY$gP&?#wjjz^FZcKe zqkfIX35^+!gi%%o!-U~#`~@0z=&wG1QdI2xmHg9_1@mH+oaq)!jpn+^4wnRr^XAp# z&}mH?KeoGSzeQhcaSKdSKZ|%=ZI8ruvf`xV7Of`?Yuqs6_UGbz5ovR7)V>-^Pmc=y z633Nhz~X6u?cRbqXquvV8ms|$q-3f_e5&8=1WkPUx>MspnMk2Hr(1pz2bsfonP`pEf77h_4*mK9+=hOc6)-+ z$pz&}@)jJXraCU*Ld8Rl*sKIN@fp zx4rJ;5-axb1#)lSHoZ45&FOf3_2TZSWsZL?5rmH>gEz;)^$&4!Q2Cz6!3da2@fH!6 z$bRQym8Cm0DKO@JZpLkx8Qy11853Jf)9!V*2|_Nrn27}12T()Q)EwAc8+v!Lh-AAs zrDHq-jb3~=Ez%5li!PnFj8dxerPCoWa!-oqFdV)fgEP7=YKyLf%o7O!Y2^|XwqgbD6PR-cpVrgb)Xtxz2xqYa% zDWAU4yx>`&j2<3^>(QAvE-lIwUKPH>S$V4@?V)46v#07^_Gp>VBgI?{tnE-wH>d3M zA`4rFbFWJL7_N1gOYrEV)}H|w4wm1u+V>89 ztAbH>VSwXNV!2n*y;0ARwv}J&8Jh+*;+Y$l_VTNkwtItlg?{~cv%4CWfc@kXwsJ-Y zA$`jO!VyEi-p_K1FnUw*lTMLa#1^uXR=^^`zPX&v0Z9Y>g=!}?WJ!m=NS9!-u7&TO z8!hr@S1j>=Y+OIVO#58)5b?$|hd}bxl^KLhGo<#1m1!AL_e-4LP+vGnO(5jO+ma11AaT@A;jfUcMU1%J{2L6jXQ|0lKYY2HG@Og_iNQMGY4C3TU*KS2*Q4 zMg4)0-uV0h_nZhDAX@x)&Erbno@SFz17JWa3a1N>iE-U7Id(wFJ!;u!BSk$_MI|{x z_1Swh7Oe!nxzaj39CP9aGt__5aw&o#kqIY|kJx9V(cwD zx5`RL--+%>@ui!+r2u1N#rv}bK5l_KWm;V~?0xsFGWh!4gW!9R2)))!;W_hO=jI40 zwFP@S)?XL4x-d`PiqSY*G2b%DkKLp1GBDRS8oJtd-H7@jrhRF)-d;u3nZf5kX79dL z3`-}xl~%Cj;?Q)$>fp~qX__9u8D(UI^_Z8o$b2dnOLmhgnQz%m2<4bKP0VzpKVHEpAW{ayvo^)t?aJiYiu_mwip$V>d=~ zP-2O*iT4bn$}pRDWG1;&{U~K@nM__b)dgoTo8$7u*CT|6E?|;We7PyS-P>lmgzF3V zlzy%kU6ZTeTpwwwTFi}>K>{bJUvL3dl6m;c0FYw2`l8Ffd_qnw7Ro(eplQ=|0+#5q z(%Bfd`bqG;ec#Xpo<-ZX=DHBEr3PWn8=ini-G#`n&{bOxK zo-^_nSW+jhxRXkS#l!faai)8cn#JCC=RQG`>zPH$gxODeo`PMB?*eKYf62c=-A-=g zRfow_nsyei1AnHf*6J$&AP%AQ)g4FviR{FbX%<&SvBH4wgB1mvABkR*Y~*YJ?$}aS z?5wQyw-_=PI5;f}#9yBQR?O8J?+`a1bKP0@Gp$QQJQ!I9!6%N7041i1*&TSDP-K2ocD0H9$BbYuQv4}_2suH?I(=6Q1_k}8){NqWO8u2 z0iC4R6t1I)`%rc1QH@KukmP&?w<3#8$}#%5hrl$Hzy?ma^77?;oA@ zd56DCQvOR%O<}YbDeXe6!8mtwm#lZ~HG$16Ol=!MWY|k+A+fgreK_d7dK3PkINfqP zD(_0o7{RX=N9Amjxv9*XIwK}4@rE_)NcBRXkcq7X7s=EYr3l?-LumIezx{1EK z%eI6QUd1G4>`Od78jsU@b2IYt6`{3%hzLioU;MGVe)Hz($jd{*!tk3X%eI#$&@)OH8{N1jZOM-pyZRp)2zsGYwN`AeKB3!t9W?=gbzM2rEd}6+(A<+x9#QmzN+RR;! zCp;i+*W6{o1G4(C%d!i)9uhBY;4JoibQud)BV?)5wq-A(nfkv9&h|gWD!Q&kFNz=2 zOUwM*kL)+;xb`GDAM5v+g>tv3R*!v_Oo4?-kZ2GZrE8&ecJ%YgOtI;xI0?Kbn z0gPn;nw=~91nRz19lX^0+7=6HHPw@=1z|*3=vt5vZ?h+V3LS1TUBf55Z}ePQplKml z?ORP++Srt9a3PG}6q8h=OMtKwJ`yGlrUV>2jE0qsh9+;|G|zalQ;{F3 zzv6z+JPDIZ_P=@hfI4wx!}|i_Nzr5Xc2oAtC#-KA)Mjk6lf>&)JFlUw_wx;T2M=2p zwkQ?(RBp8g*MV1ho{{!TMf}Y!GmQX)7sIk zqTN@8je`k27C&sTJ&~*>pQGP;$X~D*ShJXgM=H?<{OIreTEI+!f4S`R{Na$R={v0I&dbPlR zVNoaG7&ss|VkAtiVzAJP#tKj-g$%Of3LWf#jfi_j!jhUY^2-f}?<&|4xh9M*j^8!; zkQ*G7`hxd?)`a%mQY`8eN1uqN&W_0qWlj%N<^cUztfx8}6 zl78mw%Tm{$g`JlEUx|M`N0&Mwm|s(Et?5x=_qRIkRLV<@W&Vm_qVzX__PupK2A!B+ zKXLMXq0CXlt#h}yA^x$VY1xm(C!FqsUx__bHM#3ZKAYby7I2En?~;5^SLB)_!R(rR z1di5i^LeV56(gg$WH7Gcgu^9IJkB^iIhQo#Ef&eEgHQtbAFnu~pT#sW;GM&-3WPt< zJ(*nb;1)LTUd@_*i%Q%716EULdTFkdFt?HIBPIJ?;V#5luOsJ2*^&KghHph3N3C@R zI@IV6;kx|I*carbt|-uWcRmlv50(+t2i~d&OMEPt_^@rdM4Nsbbj46YLE4|gG9pUs zxHouaFBvcXngj*pGOis7}mLe1R^kQmY*dj-9DIo|3 z?ou(^U#L|tre(@1M#CzG2e9(-I}`poYIP`9Jpu;K@cq5<3p2>z!cYY0)IL;F8c<W}BCzpnZ=@Q1KPkG;aa{vDN&uBbYLA!M z)y1ZU9@x}10lTPIC!tbL%+|A>PWZt2tEHc#DyOn}Z7i+noLHStd1PZvKR7l^v@z^Y zZA^=eeQz!6EfH#))Ey1V{!C4bNXMY*t~ zaA`=;N@BZ}Il%7XCw{9^q}8eULiJx!0m_706#Ej`iqxaPN!H2eP2e&!fj$I88#aQ+qWp3C$wdk>wW$GwE`>Rv@ zLu6Q|xk=OQ+y%E|(`>1+5KuHZ0Xa9jlg6uj1C(Ml7R;^|?`d_OqhN>`*zk@wEOG2bVhl=16O+1k z_Vz0joZ#QQZ?pn7CStDK`+4lpFt8fnBXSi>gMH9Lj9URW=}!d(;WQWU7NJ*#0)3RS zz5whSkXF%%GJ2~ebLdg_Q;{;05sm3zte<SAt@Uw1>wIiE z4>svLc+{wQ;e2=E!^gkwX6HdEfBqqY+?5$N9Zl2f;#BRE6nqdk?Y;e`?_{$dsJn)B zA~jYfs2*jN&FWpX-+w8z0B8Ij;H!)WTk1qw%WcB|7Iac9p*Pesl(l#$cvEAi;6WC# z*Qvg4GG>!~ZxRw~^2avz?;UgZ8-sW^@~Acn4;O&;Tf{MB!g~Z8k<74x@?oQGmqTs= zI+sGydX$+Q5a&74$N3%KUy+8Hk1f}#{^oawn)SPK-tt+o@eL)JZ~yeP`CJ#c81}ju zZ%X6eMkt6DORPkCQ1@P!Nht@U#m+BGrS|YLpZ?XNz+&;%fZFqL2mp3WS)0yiB>WH@ zMVBPA)!a9nN0%iX^e$e>mf2b8A0l-D*Uz}!kL~{uQO|yn_=|!)E#$U+V#5}L;T34M`>^h zpIETB-ktCY=N;+k7LBaDmzN~<9{h*Mq>=BBt$RXEsjG8J`>smN;F5gesRNj5bPs9y ziB@nUv-`(0i^q%$o;gpuiAX5k=bWZ43QCNYCQIKC2R5oef6pinVb?;hXXS&?U)O5u z?%kKKo%dF`KbUUCLG_I-gnPV)>L%B0Qp~UKn)`DRaswX6RrE%2v_nzsZ}lFytgWDQ zi)P$9{4VR2wGi{cdN4bi*s9GAgu5)t9-O)1Cfq*R!hjW29F&fQ`-#{=11C{ zI+0rKslL`LIftQ-<1C_Kp$v+{e$T2^4j)<*rK^iVe{o!eBCD?S!cB^_=W7TgE=~5h zTUvJ&;<&|ThZ#FAUVi3YWZarJM*AaQ*Ou-1AzQdoP};%YmKdzAV8(>Gk_|`xisRFM z8gL%^CAR1x!gEC;BPd}=6;KrR%B-2q?6Tg!qldwV9TI*n_1C9QFu=f$KI=*yHPL@y z!MJ5Qpr07}XgUi}qA;~W0 ziNsgWr37@*EgJ?)eCaUo=W>P>A5m+*IyC~FX>iQ84%p1T>30*=N1#5A;#c(>M(9$q z(u&uPZRrY4Ab+?QFu$AV$wszpg$bt?yG8xZVfVlcg_g%{2(QqG4#E3?_mqO6A2eq; zwZ*2OZjm3A$CS5 zHoNm1aeQG3T&NzqVSHEh7aN^nzr>zOE8mTzbwY+hb|4*u%uacNLk4HDC_4?)kH-m;2ncbI2%5m>F!zgBH~KOkYL;J`$5SV1I6 z7NsY^UQ}1=U`36Zw9L1RdHQnHP~D-mdVNuWiK7 zgSEup;h#VlAodq>Ir55O4)lu_MC4W(fP#7>MYAlQZTOP0x+*ZeN--(nF}#t;FB^N~ z#`=HU!UWo(Hk#x`O1!Rp|I(-n$&9!G5D~g6efp6^r1=5im{A~pGEAjT1xATbKW1MTILtkYH=a(^`%f) zq$r1JJX|de$;_=Wt6OaSw2|~9l+J?ILxV%bpa8S~yJn-7)xownMQ6Kaa zNE*E|O{*{Kpx4+hBN}O7`ThH0dFa+O4iQrkX{DO$w#JBJwIr}C53|2`1-VJTc% zT+F2T4ZaZKb5}tGtkkWfinv$*C~R3NOypjxmUm@wn`yyzRNLarPS*7h^|_ES*sMy( zY|=t7zr&nZFI@?PQyhx3S%wko(FM`mI`=uO;gxW!*!^9rVNDAE>0m{~x50ibB?oK8 z8a6P6QYy^mAkj$?4lXMcA9iJfS5%Yp6_(0ys`=e@7HsNl#t&+&dHx|1zQ0h_HRC@_ ziGeHHuL7KETyi7n3Y7j#!=U_@7o?b0&v)C+Dw^}`A(pR^ItTnTDe(=IQw5B$nF~Em z4ZXS!Gw%H=x+4a2+XzMLSy6b9mP7@nls9vpM2PswLhRy8E^+nNCl0T{z9FDOhD>kS zdZYY2cHK?Y`Dds4_i8VJyxn`Y7uBUtn}|)0(J)@XI@NRbYCp-eB*FERiQ4uCCmius z`MhTZs)Bl0;YBggbbt`I}Sq+Jlqp&n2q>hYar2p_<2*0^{7$k3ET z8Mx7CaFxMNlSorv>Wp;mr~RfMT_6$iNGyNAxAifouBmo&^3HN&7M~2ULNKkRaARCL zIrl=EkR@L?E2R*p6)Cjwx_Z_A_C=HbH!mMa|4pVN%Tru{zfblWk`~WZWA$>uAefV;TNVZ{YV(24%6lP%i8UGFpt0 zr0vkaHa^;V=&vE;cj_)e?j{Zl1#96g8DR>)XUW?L^CdI__01du2WowbAm?t$Tod`w z9F`~s!ExmZeHB?NG-_@l-Z%1g?0qNoDcmlcB|Xc(M~}Zg3h@r75>rG((%?&FN%V3O zNPP2g=RI9L*EH&WxnIX9aA307r$~!{C88mKidc~ZI1cDPfu{t7kvI(qMt)cLnUE3< z^6|>!GDVJIponVY9W>FjC>0K?)DM$~J!AyPX1IS5+IKd4jyW+KbAYB_ z!1yNOOZB3Nsiwb#HJ9rA61}rx=9dj#B?B0vF-Q8&ik}uHHB^+|a#t=Idg8OPyPfK! z*Y#PKOKAzNTCOTZ9o1yWPU&t=R~R6=g!l$#<)tYLT{j-RrqayWJ9~W?)g~0J{B6}_1w>gaStCr#k)Q>!wWjhcy!T7moOsJ z-+ej8(01jWiem4(I~MQDaTk^&{W(b-t{mH0ZWEy!7ax;+O&nrb5f69OUpPH~48I%g zUxy(vm?LqK_IU^SD6}PrNjb$tSn+ZB!FR>$4_TFj5EO=&!7&5h&%sQ}pwh3C1`U)1 zmlG2K!@I`;5H$*2tNGjco`c>aQZ(N=tW5DkoiEJlj=2Dyvo@T%#)fBGmur%yQ_8;t z9B%O=slVNUiv0bIoWL~__PJX`qb$4l;myWkCq!wkdG9UkG>k`3hpZjG=QZHbVrcN7 zOICf{?tPU}pF=1LYj5dYxbsul(#_XDVf)!(72s#0x|r<_EVEH&Cxx++7!w@CoHfW& zerOD;xO5ol)Dihzy^%P`Q#`P)fCzx<5V7+#>hG5?G@9~V2@Jbj5czi$ekP+99ha?m z-8(SumLX-qb6%q4wHlVrbGlX6L@Saqw^7y{-0VEB1kSh+#QJBhHt}Ou#e>eJPZ!z>9Uaz?;rxz01NN+MA*4xk+PCaw7qE%Y70^*V$X*?bf{l#xw z;4&b2)_1F~Xlv)yA^7M^}*`-6~8c z`xCQ@EboG%Mc(Z!%0$uR1fDRHk;${?ML64zDeY9?wyLfsLf7%aLna@N4H20l=Dm+H z8>0$8=~#y1Y?#6*pPID1y3pt~PT_)k z!~v#QLSzTQOY#qqOMF-}hmHCW^@jopp7qfZoEyTrvUgdJN{hXzgAk(rjXM?3s`p(2 zI%9Id7bR|!;n-xTx5R~EGd*x3anG45`-=zaETE<7yy-Zs%E3mWYM|;(@%G~t7UWc^ z63iVBnnK7+kP|=y9nJ+QEcB!v_8;@10RK_h5_(uJ!u-MuGc7LXd^Pn-EFfZj2PKO@ z|33ikKoP%hvTT!kwHx}Al{u9_Sx~ite39mvL|B!9!@0*$-c>4K83Fh>z#gLuoCE?M3AP%LHbuZ)t571z&QEo$oMi~=5)gEHlXsO) zc_K*~woQQb@T4QyHJ*D3A9Xl$er08#> z;;WF~QhC%r%B(ClO)1H?Bf(+!x}#;MQ~|oe((PW>ot6%cmW?7DP;7et0JmaIqs3z+ z5+H!J%a>?Q&D)vJBeOrpZ=_E@|LH)hHB2ZBgXrbUr# zJIQiW$f7#7>L4TJugyUAEsn^{SY1ci3r&+-15YKPp+k3D?4fD#LS{K8nBR5Uc-=9; znAvL7QMrU)_Cj!<^(j31k5f>T!`_6;piC!0HbvejIiSMri)8bB7cg4_F32muli{LC#X6ev&>EtIKJq$yMNrDArK zjtvemdvyyyLwjtfvs^V-%juSp&1N_zQ+1Qs1rgnpRESco�n#1q*)ai+?vliH@x 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≷l%0sRN6t)yM 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�fQVk%pz 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�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 B;bs5; literal 0 HcmV?d00001 diff --git a/content/pages/about.md b/content/pages/about.md new file mode 100644 index 0000000..6649483 --- /dev/null +++ b/content/pages/about.md @@ -0,0 +1,46 @@ +title: About + +## Ali Murteza Yesil + +Mastering life through art of making mistakes. +Smart people learn from their experiences, geniuses learn from others' experiences too. This is why I appreciate constructive criticism 😃️ + +A computer science student who wants to live in a World where everybody respects everybody else's every rights. Everybody deserves to live in such a World. So, why not make it. +This kid is looking for his calling. He may have find it in advocating for privacy. This is not to say that he is perfect at defending it, he still makes rookie mistakes. + +Nationality: Turkish +Grew up in: Kenya + +Confession: I didn't know English Language when my family and I moved to Kenya. I only learned English Language in Kenya since it was my priority, not Swahili 😐️ I still would like to call myself grew up in Kenya since this is where my personality was shaped. +Confession: I also would like to use word "nigga" in friendly way Kenyans use, not in racist way American tend to use. + +Favourite foods: Sarma (stuffed grape leaves/cabbage), matoke chips +Favourite drinks: Water, ayran + +## Blog + +This blog is where Ali Murteza Yesil's opinions embody into words. This blog is compiled into static pages to reduce its carbon footprint. Instead of running webmention or disqus based comment system, I decided to share my blog posts on Mastodon and treat messages to those toots as comments. If you want to comment to my posts, we welcome you to [Fediverse](https://en.wikipedia.org/wiki/Fediverse "Learn about Fediverse on Wikipedia"). + +Static pages generated from markdown using [Pelican](https://blog.getpelican.com/ "Static Site Generator"). + +## License + +Everything on this blog is licensed under [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode "Creative Commons Attribution-ShareAlike 4.0 International License") unless otherwise stated. You can find a human readable form below for quick reference. Below reference is just a summary of your rights and responsibilities. It is not the license itself. + +> You are free to +> +> > __Share__ copy and redistribute the material in any medium or format +> +> > __Adapt__ remix, transform and build upon the material for any purpose, even commercially +> +> Under the following terms +> +> > __Attribution__ You must give appropriate credit, provide link to license and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. +> +> > __ShareAlike__ If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + +![CC BY-SA 4.0 badge](https://licensebuttons.net/l/by-sa/4.0/88x31.png) + +## IndieWeb + +I didn't implement it in this blog just yet. I will work on it next. diff --git a/content/pages/contact.md b/content/pages/contact.md new file mode 100644 index 0000000..cb6d44d --- /dev/null +++ b/content/pages/contact.md @@ -0,0 +1,5 @@ +title: Contact + +![Fosstodon logo](https://fosstodon.b-cdn.net/custom_emojis/images/000/025/118/static/fosstodon.png) __Fosstodon__: https://fosstodon.org/@murtezayesil + + diff --git a/docs/archives.html b/docs/archives.html new file mode 100644 index 0000000..9b3bd2c --- /dev/null +++ b/docs/archives.html @@ -0,0 +1,64 @@ + + + + + Ali Murteza Yesil - Blog + + + + + + + +

+
+

Archives for Ali Murteza Yesil - Blog

+ +
+
Fri 10 July 2020
+
Privacy For The Whole Family
+
+
+
+
+

blogroll

+ +
+ +
+ + + + + \ No newline at end of file diff --git a/docs/author/ali-murteza-yesil.html b/docs/author/ali-murteza-yesil.html new file mode 100644 index 0000000..f0613fb --- /dev/null +++ b/docs/author/ali-murteza-yesil.html @@ -0,0 +1,100 @@ + + + + + Ali Murteza Yesil - Blog - Ali Murteza Yesil + + + + + + + + + + + + +
+
+

blogroll

+ +
+ +
+ + + + + \ No newline at end of file diff --git a/docs/authors.html b/docs/authors.html new file mode 100644 index 0000000..b28d865 --- /dev/null +++ b/docs/authors.html @@ -0,0 +1,61 @@ + + + + + Ali Murteza Yesil - Blog - Authors + + + + + + + + + +
+

Authors on Ali Murteza Yesil - Blog

  • Ali Murteza Yesil (1)
  • +
    + +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/categories.html b/docs/categories.html new file mode 100644 index 0000000..3e56364 --- /dev/null +++ b/docs/categories.html @@ -0,0 +1,60 @@ + + + + + Ali Murteza Yesil - Blog - Categories + + + + + + + + +

    Categories on Ali Murteza Yesil - Blog

    + +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/category/tech.html b/docs/category/tech.html new file mode 100644 index 0000000..1e9c4d2 --- /dev/null +++ b/docs/category/tech.html @@ -0,0 +1,100 @@ + + + + + Ali Murteza Yesil - Blog - Tech + + + + + + + + + + + + +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/feeds/all.atom.xml b/docs/feeds/all.atom.xml new file mode 100644 index 0000000..94d43b7 --- /dev/null +++ b/docs/feeds/all.atom.xml @@ -0,0 +1,31 @@ + +Ali Murteza Yesil - Bloghttps://murtezayesil.me/2020-07-10T11:18:00+06:00Privacy For The Whole Family2020-07-10T11:18:00+06:002020-07-10T11:18:00+06:00Ali Murteza Yesiltag:murtezayesil.me,2020-07-10:/privacy-for-the-whole-family.html<p>My story of learning about wounds in my privacy and my first steps to recover it, helping my family in the process.</p><p>According to my mother, we had internet in our house while I was a baby. Internet back in the day used to make iconic dial sound, was slow and would lose connection whenever someone called the landline. I grew up seeing webpages full of GIFs (I won't argue about its pronounciation, it was decided long ago) and banner ads injected by adwares. Flash and Shockwave were the fundamental building blocks of interactive webpages with animations.</p> +<p>All those colorful flash games sites were offering tones of free games in exchange of distributing adverts and malware in their websites. As a child attracted by colors, I believed that those games were actually free. Some of those "free" game sites are still around and powered by Google AdSense. Others moved to Facebook and started earning from Facebook Ads and in-game currencies often called "gems". Around that time my classmates started to talk about Facebook and I had to go there too.</p> +<p>I grew up since then. I came abroad to study computer science. I have my own laptop and smartphone. I was using my devices and all those free services to talk to my family from thousands of kilometres away. I was using those sweet and free services for backing up my data, photos, documents, contacts and more. These services are free for us because all those wonderful advertisers are paying them off their goodwill ...</p> +<h4><em><strong>So I thought</strong></em></h4> +<p>I was naive to upload my and my family's photos to Google Photos. I was naive to tag my friends in photos on Facebook. I was naive to use Amazon instead of taking a walk in tech market and support the independent sellers. I was feeding tech giants for convenience and damaging local economy without knowing. I didn't know any better and I confussed giving up my privacy with convenience. I am not that naive kid anymore. I learned English Language in Kenya and I learned to harness the knowledge in the internet. I learned that there are alternatives that I can use.</p> +<h4><em><strong>I learned that there is a way to gain my digital freedom</strong></em></h4> +<p>My first action was to switch to <a href="https://duckduckgo.com"><img alt="DuckDuckGo logo" src="https://fosstodon.b-cdn.net/custom_emojis/images/000/010/368/static/duckduckgo.png"> DuckDuckGo</a> from Google Search. I found that the most widely adopted service of Google is a text box for us to write our most intimate secrets in plain text.</p> +<p><img alt="Google wants user data. Users use Google Search. Google says &quot;It's Free Real Estate&quot;" src="https://murtezayesil.me/images/it_is_free_real_estate_1.jpg"></p> +<p>Dropping Google Search wasn't gonna cut it though. I still was relying on Google Contacts, Photos and Drive to backup my data. I needed something that could backup my phone properly while not giving up my data to data hungry companies.</p> +<h1>NextCloud to the rescue</h1> +<p>NextCloud is a file hosting service with built-in CardDAV (contact sync), CalDAV (calendar sync) and WebDAV (file sync) servers. Not to mention, it supports adding more features by installing modules from its <a href="https://apps.nextcloud.com/">apps library</a>. It is <a href="https://en.wikipedia.org/wiki/Free_and_open-source_software" title="Free and Open Source Software">FOSS</a> free as in freedom for everyone and int this case free as in price for non-enterprise users. Nice thing about NextCloud is that it offers <em>all of its features</em> to both its enterprise and home/personal users. Enterprise users also benefit from technical maintenance support direct from the NextCloud.</p> +<p>The way I deployed my NextCloud instance was to rent a remote VM. I am a student who can't afford to buy a machine and run it 24/7. Renting a server seemed like the most affordable and logical idea to me. Rent costs $5/month for the cheapest tier. I am careful with my pocket money and after cancelling my Netflix subscription, I had more than enough to pay $5/month.</p> +<p>After renting a server, I started experimenting with different OSes. I tried Debian but its php packages were old. I tried CentOS based NethServer but default user credentials for NextCloud were wrong and I couldn't use it either. I finally settled at Ubuntu 20.04 LTS. I followed few tutorials before I found Kev's tutorial. I deviated from those tutorials because I am young and ... nevermind. I finally found Kev's tutorial and </p> +<p>There still was a problem though. I am not he only one sharing data about me. My family can do that too. And I felt responsible for helping my family with claiming their digital freedom too. I decided to create accounts for them and help them migrate to my NextCloud instance. It turns out my family acknowledged the privacy they were giving up for the convenience. But they didn't know any alternatives. When I invited them to use my NextCloud instance they were excited. But moving from Google Suite to NextCloud isn't done yet. It takes time to learn new systems and their quirks.</p> +<h2>Conclusion</h2> +<p>I think this was a successful attempt. Of course I am not done here. I may need to introduce my family to Fediverse, free social media powered by voluntaries, or Jitsi, Open Source alternative to Zoom and WhatsApp video calls services. But for now we all made good progress I would say. I will let some time pass until they get more comfortable at using NextCloud. I don't want to overwhelm them and make them regret switching. I don't want to be another reason they stay on Google. </p> +<p>Meanwhile, why won't you make an attempt to gain your own digital freedom ?<br> +I see many ways this can be achieved (Numbers in the beginning suggested how difficult they are rated out of 5):<br> +3 - Manually install NextCloud on a remote VM<br> +2 - Install NextCloud via Snap Package on a remote VM<br> +4 - Manually install NextCloud on an old computer<br> +3 - Install NextCloud via Snap on an old computer<br> +1 - Purchase a <a href="https://www.synology.com">Synology</a> NAS to serve you data backups, sync and more services<br> +1 - Purchase a shared hosting on one of many service providers tested by NextCloud company</p> +<h2>Tutorials</h2> +<p><strong>Installing on own server</strong>: Kev beautifully explains both Snap Package way and manual way of installing in his <a href="https://kevq.uk/how-to-setup-a-nextcloud-server-in-ubuntu/">tutorial</a>.<br> +<strong>Installing on shared hosting</strong>: But if you are intimidated with the idea of setting up your own server and managing it, you can use a shared hosting instead. Kev has a <a href="https://kevq.uk/how-to-install-nextcloud-on-shared-hosting/">tutorial</a> for that too, albeit it aged a bit old. <br> +<strong>Repurposing old hardware</strong>: If you have an old computer gathering dust in a closet, why not use it as a home server! You will find many tutorials on the internet on <a href="https://lbry.tv/@TheLinuxGuy:d/How-to-Install-Ubuntu-Server-20.04-LTS:5">how to install Ubuntu server</a>. </p> +<hr> +<p>The only reason I followed manual method was some rookie mistake I made that caused Let's Encrypt HTTPS script to not work properly 😬️ I highly doubt you will face the same issue if you follow the tutorials carefully. Even if you do face some problems with <a href="https://certbot.eff.org/">getting HTTPS certificate using <code>certbot</code></a> command isn't difficult at all.</p> \ No newline at end of file diff --git a/docs/feeds/tech.atom.xml b/docs/feeds/tech.atom.xml new file mode 100644 index 0000000..f6db660 --- /dev/null +++ b/docs/feeds/tech.atom.xml @@ -0,0 +1,31 @@ + +Ali Murteza Yesil - Blog - Techhttps://murtezayesil.me/2020-07-10T11:18:00+06:00Privacy For The Whole Family2020-07-10T11:18:00+06:002020-07-10T11:18:00+06:00Ali Murteza Yesiltag:murtezayesil.me,2020-07-10:/privacy-for-the-whole-family.html<p>My story of learning about wounds in my privacy and my first steps to recover it, helping my family in the process.</p><p>According to my mother, we had internet in our house while I was a baby. Internet back in the day used to make iconic dial sound, was slow and would lose connection whenever someone called the landline. I grew up seeing webpages full of GIFs (I won't argue about its pronounciation, it was decided long ago) and banner ads injected by adwares. Flash and Shockwave were the fundamental building blocks of interactive webpages with animations.</p> +<p>All those colorful flash games sites were offering tones of free games in exchange of distributing adverts and malware in their websites. As a child attracted by colors, I believed that those games were actually free. Some of those "free" game sites are still around and powered by Google AdSense. Others moved to Facebook and started earning from Facebook Ads and in-game currencies often called "gems". Around that time my classmates started to talk about Facebook and I had to go there too.</p> +<p>I grew up since then. I came abroad to study computer science. I have my own laptop and smartphone. I was using my devices and all those free services to talk to my family from thousands of kilometres away. I was using those sweet and free services for backing up my data, photos, documents, contacts and more. These services are free for us because all those wonderful advertisers are paying them off their goodwill ...</p> +<h4><em><strong>So I thought</strong></em></h4> +<p>I was naive to upload my and my family's photos to Google Photos. I was naive to tag my friends in photos on Facebook. I was naive to use Amazon instead of taking a walk in tech market and support the independent sellers. I was feeding tech giants for convenience and damaging local economy without knowing. I didn't know any better and I confussed giving up my privacy with convenience. I am not that naive kid anymore. I learned English Language in Kenya and I learned to harness the knowledge in the internet. I learned that there are alternatives that I can use.</p> +<h4><em><strong>I learned that there is a way to gain my digital freedom</strong></em></h4> +<p>My first action was to switch to <a href="https://duckduckgo.com"><img alt="DuckDuckGo logo" src="https://fosstodon.b-cdn.net/custom_emojis/images/000/010/368/static/duckduckgo.png"> DuckDuckGo</a> from Google Search. I found that the most widely adopted service of Google is a text box for us to write our most intimate secrets in plain text.</p> +<p><img alt="Google wants user data. Users use Google Search. Google says &quot;It's Free Real Estate&quot;" src="https://murtezayesil.me/images/it_is_free_real_estate_1.jpg"></p> +<p>Dropping Google Search wasn't gonna cut it though. I still was relying on Google Contacts, Photos and Drive to backup my data. I needed something that could backup my phone properly while not giving up my data to data hungry companies.</p> +<h1>NextCloud to the rescue</h1> +<p>NextCloud is a file hosting service with built-in CardDAV (contact sync), CalDAV (calendar sync) and WebDAV (file sync) servers. Not to mention, it supports adding more features by installing modules from its <a href="https://apps.nextcloud.com/">apps library</a>. It is <a href="https://en.wikipedia.org/wiki/Free_and_open-source_software" title="Free and Open Source Software">FOSS</a> free as in freedom for everyone and int this case free as in price for non-enterprise users. Nice thing about NextCloud is that it offers <em>all of its features</em> to both its enterprise and home/personal users. Enterprise users also benefit from technical maintenance support direct from the NextCloud.</p> +<p>The way I deployed my NextCloud instance was to rent a remote VM. I am a student who can't afford to buy a machine and run it 24/7. Renting a server seemed like the most affordable and logical idea to me. Rent costs $5/month for the cheapest tier. I am careful with my pocket money and after cancelling my Netflix subscription, I had more than enough to pay $5/month.</p> +<p>After renting a server, I started experimenting with different OSes. I tried Debian but its php packages were old. I tried CentOS based NethServer but default user credentials for NextCloud were wrong and I couldn't use it either. I finally settled at Ubuntu 20.04 LTS. I followed few tutorials before I found Kev's tutorial. I deviated from those tutorials because I am young and ... nevermind. I finally found Kev's tutorial and </p> +<p>There still was a problem though. I am not he only one sharing data about me. My family can do that too. And I felt responsible for helping my family with claiming their digital freedom too. I decided to create accounts for them and help them migrate to my NextCloud instance. It turns out my family acknowledged the privacy they were giving up for the convenience. But they didn't know any alternatives. When I invited them to use my NextCloud instance they were excited. But moving from Google Suite to NextCloud isn't done yet. It takes time to learn new systems and their quirks.</p> +<h2>Conclusion</h2> +<p>I think this was a successful attempt. Of course I am not done here. I may need to introduce my family to Fediverse, free social media powered by voluntaries, or Jitsi, Open Source alternative to Zoom and WhatsApp video calls services. But for now we all made good progress I would say. I will let some time pass until they get more comfortable at using NextCloud. I don't want to overwhelm them and make them regret switching. I don't want to be another reason they stay on Google. </p> +<p>Meanwhile, why won't you make an attempt to gain your own digital freedom ?<br> +I see many ways this can be achieved (Numbers in the beginning suggested how difficult they are rated out of 5):<br> +3 - Manually install NextCloud on a remote VM<br> +2 - Install NextCloud via Snap Package on a remote VM<br> +4 - Manually install NextCloud on an old computer<br> +3 - Install NextCloud via Snap on an old computer<br> +1 - Purchase a <a href="https://www.synology.com">Synology</a> NAS to serve you data backups, sync and more services<br> +1 - Purchase a shared hosting on one of many service providers tested by NextCloud company</p> +<h2>Tutorials</h2> +<p><strong>Installing on own server</strong>: Kev beautifully explains both Snap Package way and manual way of installing in his <a href="https://kevq.uk/how-to-setup-a-nextcloud-server-in-ubuntu/">tutorial</a>.<br> +<strong>Installing on shared hosting</strong>: But if you are intimidated with the idea of setting up your own server and managing it, you can use a shared hosting instead. Kev has a <a href="https://kevq.uk/how-to-install-nextcloud-on-shared-hosting/">tutorial</a> for that too, albeit it aged a bit old. <br> +<strong>Repurposing old hardware</strong>: If you have an old computer gathering dust in a closet, why not use it as a home server! You will find many tutorials on the internet on <a href="https://lbry.tv/@TheLinuxGuy:d/How-to-Install-Ubuntu-Server-20.04-LTS:5">how to install Ubuntu server</a>. </p> +<hr> +<p>The only reason I followed manual method was some rookie mistake I made that caused Let's Encrypt HTTPS script to not work properly 😬️ I highly doubt you will face the same issue if you follow the tutorials carefully. Even if you do face some problems with <a href="https://certbot.eff.org/">getting HTTPS certificate using <code>certbot</code></a> command isn't difficult at all.</p> \ No newline at end of file diff --git a/docs/images/it_is_free_real_estate_1.jpg b/docs/images/it_is_free_real_estate_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb346164e012deb7b698ee6175e0529c143bf823 GIT binary patch literal 254627 zcmeFZbzD?i_dkAyM(L97?xBZn7&@d8fnn$#IurpZX#^<=DUnc+6jVBt?iNXDNn5@L z-aA`MlzDgc2%0Cn&KoWB*~ zRS9si2LL#n8^8eo01KdoU;+@3G6pZ2U$hlSb3)L6@Xgg}}M%zePi zDH`JkCI+Ol!3%8SNBMWI2G`bO6yk>p@(T%ql7d2ll7ixrP(el^AxTjQNl_6H4Jr89 z&V>yZ3A76GQ|pB)$iL8Nphf5x5Ri}l%Q`Hui1jZt`7inc2SNL(2Mffb{i5li7YZ&~ zx%iy_tB)@9g2?lEKncLX!otSF#KFeK#>K_Cghz&tclk0N6$vRJ867nPJsmYIEh8&G z2O~2t3oR|DI2W%VR76CCfdeKZAtcQ&EFyHF1cHl;i+3515+9#Zh>4a-=>K&(Zv%*N zE^I=FFav1B5OiY5c^AL{+KCB{=*6J^N)R-33`{I+9NbHnK|nnb0D1}?4Feq$69WT8 zhl2G01~DcH6I20vk+lNQT zC#Pp0K7RUq(XWes{!TwT_HX?n2K$AEfq{;JebFxnnm>4<6Jua9L9s{_^s#NcNSTFh z;gBh&6xOukvIrZzC%5$;y+pw(@|NxJqH8~T_P^^``2SVU{^;1B{h9;t&>`U9p%Vjg zz?tqIPesd}RS%h}lB(Q1O-;|+jV~Z_T>v^`aPGuGWwD$?WY4s}K^Jn~QJjA?%!2h+ ze9EodyxDH?FZ>%*8~d7E)<@NA$98c6uQ5Xab;c73Z2ITh&l_%|%J_=Ru61v8y1Km? zjM?+bjRI)H2?B)*YeJJ9^qB>RKLxdQ1 zCubGrH{yKy+|7rkHR_uK&WbGNb`63l+WV>YK969fufLgfWqo$_O^uQpYy1}<=`TUk z;$;CVOV^+RzC2EqDf;!udsmw$S*a89KO;~4%Xu4u%aWW7*FWXFICy>Q)|+EsOH_{j-JH=ziIdQhrdSU3 zYo8|;!ZD*!{v;AT+zGv1QUPBr%C^ML#Kpz#Wn6dB%(SuZWAobsyqny0owHXv1Vlf? z?PIP$s?AHD5%PZDadpj-KAsk}ns1-Z4&96vaIL4gDF+`{z0aAAg-n;#deVtjw)SC1 zo`!;+|H;HD6(8^3L5b;RuzfSd-a0N(a;JX{hC_+T;qV=c_Rk{X{YbWPxEHOIkq-Dk zNL9NLKsQXT@b!xD$475WELwQ<$@`o9p4LINJq2(2vv_n81g_@#Re4Z4GQ7VV5PI@% z|90I2)3QW^oHjepP8JrHBy%8fwP((i(2a1mo{E2;B`{-@k8+@Wc`WVA;s)Keqv+J@aU%YgAG^bE;N6EpHdNL1})NfgF zAFr4JWqyNV#QObQsI`?EiDv?TjQw#1$d_)V+)1RUb+g3&eSHZSwQ39 z{%#$OI<5AVF0x|dB9}9g^rFr<^~c1Tzrc>})&L<(S&Vijd34m<3$p=+8ZNVyd%h*l zRMNClnaFIFSlqK-7z1eut+{dYhXS3rzFVRlqC5)UN~8^opPJpvM!S7OC3J!PN&($F zbdT?(Ph=T~-)4-vXG`p@-nCRC6*J5CV4=kQKCSa2T~qO6x*N)w#yHCK+9^!rG=q}1 zqmq^LR!#v2`f-)X`}GAY30>mZ>+%(B*=CmQB5aM!FLsO21OsIhDoftu6?JSCodb@& z&wcavI^xofa?Fl*?1YDK^j#X-(KWjvJAI@n!xn|jmE+Po)eKjEIOLa0V>h#sD z4F85U3FrRi^BC1JUO|ehChxkRK`h5ZL>ja`3|bn#zfPr7U0diA@Hq!0P4B-r>si1e zv?TIGO+C9N-nnP9Qe|R#Jehh%$!r?FT$X{ebC3_#v-bnR(a zs3i5^^TQW+Y`#5YPj&n3dT23JLCo6EFUI|OlezfNBzj|d&-KM?zlKIXaj(UW1Nsx* z=C@G_?HC^_gFP^;)Hq@`nqSnkq?u-O#Vwc}#QJd>l!$vvtmY;K0W&$>&qAw{*vo?P z*NfrIT`bv)k%_zVdKF*ISbZM#_CDhcaxV`?omF`3KB@A@8zIjS^?2s@0ed2dx?2wK z`{>)(i~Ku!Ngt+D7Td}6ZWhho?IA|k!;}(LgY(karaK#+y{~>+!sBF&+J^EfYSIvL z>7nPQG-Z7427Kp?s|ae`$LBjyv@ja#fcP8MEKK*LQ!F3HykIe(F?H51>E=D2Szvqm zY6KcFz+0FWun+mVQy(tJz9jMVe#{k?854B>_uHT9zBy>tPBGunp740F#1b4jOmoi| zx!97<7Aib!4!rYyNjVb`Xm+r75R$n{qABgSUZk+C`_b6#AZfMku)Z`hJ9Oae1BIN+ z6{4;o-2tEtJ-vPH?2#4QM=!CLp%p^{l^xp@F7Ei9yhAaUr3W(MOP+AK%vLQH(*GX7HJ zhb{dia;*@PZ%JpQPd&bd*nJ9olk_~XX)m$WzPaV#cG|T;shf^-&`={^@;puH1#1Ze z4ZJ0tvaOBoIn*j;U2Wr2%awuo#v8ESQb%^3Fc?#wGB4+U)s+@w)0uGw*YgzQU75Xy`V*|bzUiwQP z1Kq0%YR#B5CG?5O3-DQkgUCX@mfae{2d>C+)HO8c3EeJgOjZ&86nCknSA~NWFMjp? zpsWW`FY$z_xz5Peu5qBOo^Z|e_02rWAlp2V*n;Ox*;9K4Jh36OEU856764r|3stXY z;Gi}|_Srcw$A{lDE5LpnA>@wZ$Gu9|`}*?;`rDVOn%8CaSQ&&Kn$FtwvEqdjD&#ru zA!gpynqDqvZcc<%+o|1T2T~HAduBETX`&-9J)<^(BY|G6kt9` zlkJKB3nMJFyyfLHVR?cFIT_y%c2q6CysQEwQDDv$l|b-*@P^F@w)*#dg@Vd*-U zk6u83i^%iknVc42>#L9fKQFH zxQyPFYSmxvENjbtyG-NkF-Zq9V_W5uDP+c70-cIut~nI#jh?E-OSA=*Z@0_Uje|7{ z6vjEeGhf-sEvuHgnnyZz>Sp9#zld!p$@KjGxWTwPBWS9y)vb~(iqGu1 z85!$2LR73NL*{CT4Eqo4VRV?eXB5dQw6zP8?5x>}c&WsTNt?#*gT1rx`rd4fRnNVY z+@w+`cYf*cX3O$^);#P_-|t#keoLJ!JDSrXr@0!YqfYm|4x-?GnsA6!lSG*C(W7}t zCUBc@*%{6+s+@7HVYJm+Y`_!F;4l5*p3~!CB&Veoni{r^mjz4elasj9M zcYd8+^zp*em9C(#Bvcmtch%^co0h~HfdUFEiT=<3(b zdTR(32ZT)DV8(Z?F;kuK+7t%_XU7k`j&G(J*6-IgJgFHUSrEQITG)39x{wkveYB{xI3n@lw-c3_A3Wgmixj|>QW-I?`b~C z?^beAXL^_DGZVFj>o0;nn_pqMF7DK7)GWs4HekjUVP5oHcp9*biop z*wzNv6N=^?gPdp050Fb^Qq8Z`cQu7cx8dy7uSah#k$tv%e&yR+d0f_-9>wPM7KF6E z$f$*)U3$1`6GmPH2U@Icq8>&Zp>^;mE0>6sWrX({y{@OXoW4A9)p`ysUl;2a!E-<+ zX42-?+t3^7R@Xe>QASA?SzDw!Kzrie>OcmpRye)RePa<%d$W>^&O(>Y!0F^z=;HC$aZ0x}1~6GmLbNkA5Z5`EH**mZ;F+Ey*rl_v!*^k?M%DsC1FX|DPu7%R{~tm(R}7bqY`qco>FN>#rPQ2KNR||as2Uv zW;pB1K(b^z%Va_WPvKsPuaMKyYu8-7aEvcgmf72rh%Fb&yP}6Lw&N!TVEA?$NJhtW zb|sZP$kID15HvmqUNoIjr}Enbz7@^Tp{&#`ZGW z*NaM&2ObEsM(&-ELHLAp?tFh=tjn)Vkjd@z!mUZZdmIA|wv!EL-tmGNw%`@4vdHGY zRhfJ_w-=J(*31pRZcBJloVYP&ntC-uD6!@4CKY|%f!GYo%kSJm`n-t)EHc1T;dj?FLyB?~N6DcG4ybe>|%grQC>RQ#g7S#h|1!^WrWfV~#78 zCo;H^Js9EMoA>EcvrM4qwUf&YjoGYI?s`q0N&TEOWj8v@POAp*Y^ipi6yW8AQg73A z3U7Z9VxQ6{Mn{LWe~$kiaTt3-(`a`N#CE-Vblb0bUx$D|le8UH_57FA>p^CV^t&oI zS?OI@j5(i&Kb)T~oc}y2brX+9)3Iu=o~kf`iYnaBz0)r7InMGoOpo2`8e#$^fWer^ z#yB4}6@T9PY@4ZZ9nVRgmOaI&Vj3MG+f8(^vjJF;Jq9`sFR%@ za|po%oLe!hA#fSMW&MT;aOC1Q=3=Q1&V1z&35c3t7K!DyOZJA$DYOsE$n59|@mg88 zX}R|?Bsz<{s7vOu$c*u5IZkv$gFI4pFKUGLJ!Zrc!Y&OmLSLy65aJx8nk{y0Teimb zEJ(|n-Dtp^Y*A++Rkb|2;@Q6{9du|k^+mfuMY*{_#U5g0>212~DFY{isP1$n&tL0x zI}0>hOGg-ZLIz%#!Oo;t%gd68I;O`gib=@hU{-JffCdKxvW?pNJQZ<$wu0QH37y{? zFM@^cCU@L5P2D3lp@q&GB@ctng5|@dFyZL9y-S)LDX>H_ByR!3Ga+58`#}yOMcrcd z0f?j0uAztVSLC2noAi@U$wswu3RCD5dakaaZ|NwTj_Q+fKWqc6A@W2{A4Z*x;l6+k z%_bxYr=4;0s6s?v9!H)rVq_Xp_R*qSmNsKkV^qNBleC=Y!06@Y-`z4+;8)S3X>-w3 zf-uP-`Gw%QjvyLYJeMJ8u2{q5UJRM|GIg6w4^4bgPQ!gNAiPoQ5-N23`%?WvSUDkEqUdrKS!D{+vw z@mol_E70>`ecyxCzT)U%yqPtYRrdUJy(Jz~zx6$q*PDfLQq}Pyq+KLh!R=3p01GYN zIgl6Xj4`b=d-?HG*})mQ?~1ugjCDq~woQF*Eg>&-U6b6^HaO8W$V{yh8E0_{ z6=dE+br)n*4AKnaM3>&Z4QUKPY)I({VhVpT^ey&>&a3NZhEs;Ue#06nEKf}n{jkXM zlsxZQtB?XuPr@@H1;Q{$9~G-ZV$c`r)YtlnhjEyl)e0=>eG(EwgkE!D{Oe9i4P&jTKZ+`ykl6tUM06J%9d5|J(U zoWrPaIs7U6H$NLYJ6@@!G+#B!&72d1R@4~iciJ7lp&h~O0Z#%=UzDd-%xXWTD#9T% zsn`YmBAX+1JsEK7S*1R+%qYgxHvy*yxAIF&o{b=zTM|9?s5*EnSd`)1Gxq`x=J!7% z8Xw%pT{?1!^(aXT@$QM6WkOFGwwmdsEWqb+(F|twZH!l~-ca4Fpf4?}_P&mPZ4j?U zw%(_o{e~i34~K;gl^C42uu(NwWci|C8tQDQn81i4*~CC#`1Wpn8o}x&PbzWppL!a* zf3Rd&R~REDlouce-TCNW6$fyF2iuEF^-I~7_7Vx3{Z^O++3KqlZO$tCULYPNe<{AQ z@Lu6YVd~i!8$RnHCkqR&kQ$vF)S#ETD~D7{OT+s?c>V@q~L-G$rARP0R zljx#d>Lvd816LBWHlm)_8lYRY;Zgxj8(IA64kETNrdQPq_`UHYYHRS)1p00}f+s+G zglF%=t*;LO$%dTG{>zJPwJMCU5l<{(RF{WQ8lrB(1rvO-`v<45$0dfXvQ|<<>3iN5 zJ6SK-Sr7OVr$XpoY!oDQW?O2Y$?qg8ki1ZXErSnc9v5mmq(VzHe>;H9A$^Koru6CR z@IzC@TWc+iDzHwGI7sjHSC0tsw={(Y_!3V;mp{dOE;S8t>pz(J7RyJ?Jj$F-WlP9Q znVa|t7{MsJI^GVvv9POA_%gX3tv~&+jK9e4=#yrkyWNl&E*2_&l|doM z^GkSkByBD3MBH?@v7e)}!yt`cWtq>u^95b&)j3cUy0E(GzDy9f877;~{H_6)D#5xV zOSu@^-NMoG^aRku7;&aB(J9BA5PHhLjUDUI0J ziJN^8Cfw<)c*JIxP{8x02feV@9W^bJU|%&H%PyGWhUfH5PB0x()9L|GeBbxFMotEa z_E}>5VyB6wbcPZ-ut|6oZWWZbHE}xZp~mAfcvD!!v+5b^3xmVs2GxNh9caGJSD&g! zoaou`ug2u}b~D!Y{qWhB)CR74e!Yov_Mx2KgOsm+AZ6a7bw>88Ti9i{)%$P!{a4h= zG~PKD;O()?sIX*i3q^aM1B{ojMnB%n<57*{M2~$Pl#R>i;PrLOIjSmPs-eZ!U|jR4 zR4RBZ4Sp?=tACc>W@XUUVlPP5%#Nu0h&hTyqOwn5?YL3o@ySv^b=;RuW(x<--a#1K zvuR?%?2dPxj6DQAiK0fvyM7a$L*bUMQDt$bZ(u2h^LWk+Lc`Moo`hdin|Cx{imB)c z%D6mG$ZV&AJ%T3&dHkTC5 zzAj&iQI3Czwds07Uhg?a9=S1Fl&5Azl|GDp{OAT@7V`vqY#%;zNb}jAt_2mJv;tT2 zliUGF^t7GZjwBjb$%$+wmRmFy6bbJ;dwcRF$(>m%&i>nndxJ(@x8rVmcRmC* z>iBZ>o3I>9c!lFhd)Ez|3WqA7$-rBkWhvS?GO}#_7tddvC2}nd^(Z(Pw=WPDmXqJX zBe^LVdWatiJqKK;N;AWp9&_AfbxnoPIon{vn#yW?xjEZ4dU>kmvUrQ_5b0EuqMK+( z*P%rYo^nf~yU%jp?%Ju<9Nodg?mY+0TjS0q?le<*HL}+yJ=@J1<_It-Cj5#szUtCGI`o03OtFTW2@y73bb^h2=ec&3RXW2z+u2mQwUW4n#a?xbzs zl(ft@RORA9K)pk?sbou2Zh7&8uqzxBqiNetoCTP3p*;6qPEcnvynFBS|(>Z78xGWMt5AU_AU$p45yPBXX zzwN@HRYRwdK04nRz(UWq#;zr{6!yZZW1PhT0h z{8m4R`=p}bbFPOo-{V3d?h~7-W{Xe_ zCfbq2@{91&t?5Ih%kvB9>*8K>PY>1AM6H%WUa4Aj&{nfAK6N_trZPBSjCU(_x+hqF zI#JRQCC9%Se{A}ZZiq|XDl)>HdruVkfbH$L&fa3Su#@XB>uVG#nkGUts2lmc2Ms-z zKqJ5Bi67^d4xZtD4TF+~Xb~=o^E>l>E*&n|4b1zd&X?_OOeiEt(@RcgE%Ng-q+`pxY>1-#Sq#<|7mk$tr zU-Z6gG!Afht44qKvz8uasLIzW*$tf>1R}qq^|+ItdV8558vF3E!W80I#HD*k&S&8} z`GysB@~3G#hWmbv$JJWbJN(zrfgaV}xikgols*FPJCFCxQIkVJMbPah&lB94tSR5W z3Uw}6;*Ip?#EYi&e=Nq)67!Ptn-~$YYLZglEZZ_z!FinQk;d*uXUAwWb0U|r{0n#q zHg31XTf~B{DAzqcO=vA=FWIUDc06@Q({mqJyzwjgMm{7@%Wt+Eoj!UROuFA4+yfqW z6ONj&3dJ(kYl|=@H8tlgx(9@N*$E^>Z5oxu2~^mN8?UtR#je~EPOLAwv(8H(LN`)FNqjYw(QdRW(%e=Mb)1@{OCdGCBwr#)$s?;Pi%p6Q{|PJb80Zoe{BSw{nf z$v`b>2H5gE7tyKrCh}{=g1H`xWH`jFxV|sWerE40Nfl(P6XN7ROSj1oMmt@%8h1>1 z+3|D2MhitbhK*a1End=S3#~~xBJT9zW1nO05GAN8*NjM0l{!l|W!Xx+9=aD;E+PXK z^yB<04O8iid=+upBCT2%~53Ck7GpJaN zCq`yiV^-YJdx#@ZhP_d^JutRz%4{A=- zum|3$y{Tnmb;eA$W+pTHdvNp5+#=UHWTw&@8w)V^Re;zFH(IhDO6qFB*bx^UA~n{WjR%Srq$~+p}mDwZZw^P z)}!iKDJ=cUa=!3`xUG23`ihCo+?{eWHiS3q!QC5s?Xr{3Xx-`@agWaMJy*=2RJ0HV z@*r{?vD0o8ob^O>vP!uL!n-CL=klulN@rv9W1Y$Mqm$WMuk`M~y^Nf1Rn_xzvLUsa zvU1Nb-BiR2hs}!pzT;U27z}*gKLpd!V`!Z&;%l2iS9VOS#cFLYj)mcJ<>&u&@(oJfb!~AQ`Fx>CyUT_pEwX`pi8D zEN@e>VAIc1J*I3YVQ<=XqIF*l1w{R(XP?#W~Vk-GCJIZ3z`FcaYhHJN`O_YkH@YBRe+7D0` zWJb9oO4QFNSiRBRFsZ~mHczw-Mo#ItA;;CNo}7DH)|7k2;AS0^lABxEHDALzJ~7yE z1f>$|*AQj=!d%^$O-4ukkrlx$*+qXSgXF{OQ}qH>b55T_3Vf^Rn7dtf!*4?}Gvs2c z7pPm4#IHQCLXOCAmf42$j7h((GgwIj|K^mZx1H*c5+j+Hh?l zZy9o}F635r_tP=kG2hFXRU2jnZk4J2jETY)Uf)K+pRW^&raD^;mEYBKTB!)h>XO@- z#v|UoljBpBXGmHbE{v}YQ>+^ShnoBNya|TzLs~>VjiZBm;|O* zl5^cWbx@WYR-5Vlq2O%OhR|v0$yvVFv}cd@T;V-STr=+s=`e7{Zl%Oc$B~<$*CTk{ zqXF8f`z;dkmegcg&YA=wCpQPv_}9EW+chRKtOfa;yBSkmkD~ zl{^BwX>%|7MhMV?hhIgeC zABCzItA4swozumK5oDP*NF$!1D(1VkdQ>f^-xSI$QTnnmIAA?lwQ{#LZM^WY05Q&Z zYQl$E`uli_E=yvh=~%f0)K8fw4ENwJ6v(FJw=A?2GM}W4+GXuiaf!OU=r4D5*`bdd zPMF}Om%N_XOHdbgNgcXj#Z3-dN$+DxGjc;Vw-qd14 zL=;Ue!WgkUDPFLx@r7bim78mNP5Nqi-y?mi*M3h$D1_BhV5(Agt&_?t9rRVKbb4vB z?@UDDpuKL67QM-6g!zKRLd9nUPFL4-w85s4d$LB|)QZ=rq3>*7=5<`oQ@A1j5MFhe z6VK5uIb`oMp~ho`Bl4!qVa<(qGT*jcb`BA&bRo1rn~w}yl#QmpdmQ_C2fWC+EH zEwYZ7_sH{+kNDOHyUSyjn<8jdym8y9u*01tP6PQ_v#iIf?T+lA&94&GCccYK?Tp3C z6c^tOK7sKbAavro8xPs)R_2t*?qCj-Qm!wQXvQD5%SJUE>X0*u21v!0Hj>0W#{X8| zz0gpjQ6+LcRL%KmTuY1wck73#vk$};uepnBzje!O4{Ga!zItENgPyw9B*)Yaflad`Jt&>pS$Sc?^flcNoF`E#A>8N7|^ zKGQDX*Yp0baeoRxfkJBQ5HXRNGpm!oa} zd-v?=v~X5$v%0nG;f1%W_e+1{-hW!W6SVZ${=?MN*^@cCK~@6_C$IS#hwP$9D&;C% znw$W;0%H?=z?&UQP-2ZCXf=_bRj?+ZO5gWQ)u8RcBVNKfvyX|Zy6GC+^Sw-%uhDuL zlXcyBO5cB%ds)AQs%pNI?dKPFinhiBKl7-N9rWXk(XIL^ zEN?zMs~U9PR2z49_t|mDDw_1~dcvAGQ2YW|9j|ubP#ony2@a^P+Fkx~l_aEwihxel zE2GzSV$h>}oBFh;FceANl+9*XtNjuAPL0-hyilXP$TL&oohI}^^?U3cGV{#4_${rcuQICy-L0s7t|FUI6@4Muq z7RFAtAGMubhxc1ETYJ+Ecmt^<=yu>f-)fxPe5F!6akCYe^djt4VW+*8Q@n_-_W{@H zZti|zk1vlC3ykHw|Fl=4%=rf0w7?0USVsWUONu7$4eiMLO`UkO-^uSw)3cRPO7YvD z1kF~-u2L+Bk4!|JX||Ua?@1-VBE9-AyC(EN`WcS`smc$k3G!F8Idn|?quyl!ehd2d zM)EvSS9wov5<5v^WI*Rl7rzx`*exK49iH^+cVB5(;(Re#_oZK?g-r~GL_-|cQ0^pR z*L(2t!zMxvwLMA~pKE4JM7(?Q82>63xV8=?$VO+bGeWpgn_1XdJ&TQoOum{9+L& zJ~hXI=FE|x@xj*TYvW=mEU}w8O*yC!yYSWbRo`sqjmMO+G|SneG(V=$!|1$dXvuBz zCyY$%5`xA$Xw*e`NJ+HDC0tUqBEt!EWVUQaT8+Fg8}fOIjcbM)G1oI+sg5T{ut@YB zn0>RL8EE#o=KE$?r{q{U%{Owjq4J6ff!#V&3HrLzANg!a<#J-ckH;r*IU0gQGF-wf1tk-%Xf-#jlNs^ZLe@f z?<=xY=&*umCBH1Rw8+=(+kWHpdjdyi`<AJz}L{ zmD?^zjD{y~F3T&UL~{J?Aonc21NO|n8Pd40k8Pv{eVBiUQrVRh9~kK~ zDI%9qo33)Uee#v3@Wt(t%+h3;u39Q2l9DFLT878(`A7B#X$$T9?3~?v9@`4Jv&0s%Ij0#JTI0YF+Vz|#idg7jguMLIaS%P=3bykur{ zvXfyp5!Dvd_EbVTI;jVFBMpOet|Ee55HLGtIax;O0LcJ1PdB8G4P$_tt2;_EK!*8; za!HWBU<)ua{($(n$S|9NFOVpCcq17__(k{y`M{S~{Dhc69o}~Kk_O7Ezchd)8RlQ6 z`uqFy`wR1XcsmF{VKA70ppbx&5Fd!(Lj}6~*aYyoqgZ}xP)4E<-cFuAP9E-z7aDDB zJ$!v+n8Egc7zWlLR02T8FVz?2ABs^vb^>s)AOdy-1PBNT3QF(^3h@cSE^PnVDK}4T z?LQ>{(SL4kf1pu5Dt>>q^N(oM)j&_AfB_Qa;p>e+s`w$@eOP`shVn5${^^1Lg*XWR zL)g>R7xk}(`l65*tREe9wX+uh`}kwHe>ZmVQqLdw3vW9(xq1FTUm$;@>=1uoJbk@g zf7II{1dy&sH_&nvs1f=H7L@w~{Ex<8C0ADJUT(Y|AHVBMRdau@M*K zlYrVH`NV`__Ts`YQDIv#duGN9$4M&a!DX0*_yvCz^;~Uy>^;2QWSF&_+{TIN` ziKGrncz6f?YReGm^^01rabYdr>}c2Sf6S*u%v5 zBt&dP_-tW9g7(5N1VT{4_O}uL*TxE5So_n-7rP0#kpJ}muZ4~Db^;x(>h0kMdIsE` zB<=q5QWyEpOZ}(pKaGkgxJ?Kvhzbfrp$h-FO%wG%bKMMU>|3gN}!!r=vRUCbE{oVh$slOq9$Z0ttknSjte>Co2>VCNWUmkIw zSwC3dbMu1y<1sAD_}}zj5B%2y|MkFsJ@8)-{MQ5j|MS3~U*wVQ;PKWU{F;8gg7yTi zq;y@+Kvxy6r2+{myf$~() z)6@DLnc(mF+0;dl1ppZ5yU_Lb`u~xGZwG#12O}CVf+%@}r#Bdb0%8r)V*Wm!7jz~_ zlYysnJCLpfX56L0=|F~ z;0ngi-~)4akb?pYzN=||v>pTcMm z2#5f$KPvyX#CZo8xC8AY+DCK<7_;Jc;0}6lBBFzlJ1#u&D}hlvzz`M}fjhte7<6D2 z+K&(zzpF3eTl@^{asDfg1Q9wBsO7`^KM?;rVyY~MeL&Lk-2)K~j7}&swN}T|fr#-3 z{2F1vTU30K*@QL{H@^cq9v67u_L z3ByK1p={CEIo3}`q6Q>^w<#YFgp)As`vp^18{3YGkGoDeS0lo7Jqa|#%QwJ(XK_N8 zP(RCkZ~B>9T2qEprki#+r!$MtHHl88_qp12`XG9d_~_>x6!b3i^?7Xf4gA`>9E2IP z9fpaaGLL2bbPaW#Rm%FAPFX|V#(^<+#7|+gR|lXR)NqYh zTiaHOOL{=MIdamrHXf1}pLdBtr7Uc7B5*ZpW9y{a-LM~Fl~cDa6yT~fRn$4|PRktB z8ghJpK@;CNn7|u23H`@$11%{tGyyhO}2-+udNd#sHSZ$ zm+iQXfYWsVK!AIYc|b=fL7rm5TEQ%~QJxEZFFhXp9a=%Lyv#v&LmXfk5l*YX#{kA!a*@K7_! z6I1@8WF;APk^M`;D@uvckP7?F!B_S2{7wJooZgOZ!368^R8g>Xy z@eTlG5Y*TY=$s>8HQ*3K`Gs*W4-|7|#mWC?WdNZN!M+WQTS8xHiitqF#w#tmy8|=;&J3-5ooA?G5I!qmlx1EXDt6k)uV^U)HIX5Lr@F zpcQjhly?`-PB8X|JxDkMO;91s2v-l*5TcLycY`1Sl#%R=f3Xtc`S6c20THJ^j8xV- zu}fw-v-J=5F9K7a3nL;c`QO>U%9m)nv~<%u-zh6=K9H<_zk~hmi7H$WqFA6B%cWQ# zoVbRQPX=)R1e-&XI+Z)@)S25RB+1cA=hfeI!`9RTM0}V=BSp>x zm8JjQHmK*{hxzw#&|k|f@O0X?K5`cxEfkCijB4yp=;0HuipYk)FV4)K2%yux>SoJp z&7#!TCrMcRexzrS+0OB9TF1q~1bnFpTY>kl?Lm}URfGOB)T{C#~A9FUEy4OA72QAXe_ss<<+0c11nLt z$_Dj<<(Z}IS^-sNddyl1*Fs5ZysPK9b-6UJjgGq@^2RAfV>1mhs5-hE|F zi@n0iB}Ro0$qb}Y8+ZLF206A07W6GYN)0u+)COSKGHp;t^NSuz$=)L%5mS#@ERAEp zX2x?THKncfsVPjj>r>O;;jP6_4OeK=QIjItL{n4-UJ2fp_wW*&lKq=OU>ju84eVI+ zvPfOEgt1^{@W=!uI#S^?U6^)QZ5AG0^{mS!R&0+6X=b^cb(}Z_XpNn#))&xcVz@Z*3KFh~WL;p1!*yJ0 zkF9SJv$cT-KI+~P>f{Z}yX&QT(0kOmv-T*aSJK|9|kmFsWK9>H(b z;eJ|_|Jl}sy1yi}NQ^_v54o2pwU#gVEX0JEIJ;A76y+quiMBO3_$9@e?#wHPT$!x~ z;u)#lk&dS3EVQ?~o`484KU`*!>n%WwLsg?3r8G(e3PT`8Nof(#X%45n*(+f{yeikP zef2Mj0RRbl8z z)FN)g&ib_4O|kln^}>^H;WD$R=sf*X;}7b`>K8)v-LFqPmB5=*R(@k2C9aPtqL=xO zMHw7e#tx{{8`icTSd892_LdRH z`{(Uq2QaJD8Li=RNh|F+?DJ<{d$_rxrQWBvVeVRFKoyJI5c_kxg_I_d=rqdM2!O(r zy-@WZI>3k5pSmt6G@HuMzjA(;Ai3stf{edQf60Z|o`giIPU^u|+R51D(dG9saXvAz zV1&%9;k5>^vbPG6M!psYfW3j6v-wGejq z-hC`b;<_!CxFl^tY1MFyAbIbH3r=Z4d5;s@e%XRfx#6Ii*AMr#cd_VA@I=*!k|q_k zX9km`-YResPGEscvN_1*kliO;{=@i-@lh7;U%J9p*TDy2N}lNHy^{4>89nB%CyhpI zuRdqyMrR53A9&Dh@M(>npQ(fCFWB$1;E>21{f_Ll9*?+yyb{jJrsHlu~&W z+#oNW?cwGrQmX6S!KDEwtw^!rJ6%E_|e%W?0zy!KyIxN2?>s_cAhg+ys}@`AQp>lwqr0$ z=?+yCF;i7yGwkc_)U-!Kcfl{t39D^CW&nnD8u@R#w9 zs|tcF#dfwd3CT)Yst8LuV-@vxbF8eLHlk!PI7G$yDF~uD9qstvD*m1`k!8sPj6di6 zMeQxdi~B#P@d5y_%~~6vvZbaGFlwOIN}Mv`eP7!wY_PNae@J`FsJ6b~ZIn`K6lrma z6)3cLf#O!9rD$;pA%!4?AjKWpQrwC=v}ln84;G-fy9BpDkYGvBAbs=uzxT^s_se_l zJ!h@tBzbbU%fIvk0Aei0I~#A%xeyhnULE~B`rTzBa<=w&+VMd% zpXBGh7`_aU-#%tn{;aCxhH-jt@W=ld-v8`SSAxo|UK$g3eJ9jYj$f$$EhY28`H%|* zcbtAK|B&C7ZQKauVlCVNv!{gF*O2fbI!v>YLYovUaBzQ>n3k`fX4Gk`c(R*}{pEE? z1x~R8cy?gx%D;P*bmA3$?7{8l*mWGNZrJ65q(6;HEA}tR6Q+k+8A}|bc0nu#;?peC zx?AY6@6^^xpuulIFU&vKJ4X=~@XbSL;ZRwH+Ooa)#se@_=)%|$cogdk_SKx9-u~Ih z^`{K>^%nV8;ynIaZBpNLl7Uz@^gZv^qK2-3K&Z8xOwsMq+ZJx2XT*W!@mCIM48lJ)wesX9cU0U7(h_i2^I1$zv0vn$fN5(q7Fs$KVJqQb``A70Pz+Nj<_lOJkIZ{Ju*J zW1NX4nXb>5mw&fDcRd}tF8>t(IIh+2n&$X&##&n2wh4;9iY-w*IE-;QTb`8&4LYUD zASeV8r0}qkL$ec(O$F+A{;{Y=2zps%k|@>Ffx6nFrMg~>67}9`-PE&{NYQI zyA1RU4~U{5sy7MASCZF9p3=*kfv;1}VrzA&E5@6td3u&MR~{8jco&r!Tc-O8n?j*& zgFE(n4oOVa=E$Z_2QBwgxLJ<1Ep)oDgOKI3}y3q#xkL1HPsQMC+prqt~&4yNB z_s>-LO#tA{>ao`Y46GUN7ro3hF7cJ)BU$3h0Nzo{81(gnIb%LQx6aeZeOOys;wzs6Y-VKivFd!oHYp@@ zk6!03$z7T!FMr-3efjb(gU(B3SlHOo``Pvu;AwJ<$T;sq7_zm0gZdRNfbq1I(|l{I z#kH=$FALh-zrF9kw*8I`zF=%Q<8k6xry5v334l)3v7=dyq z&s)cAvg`WYZI%@8{Z`aJ_PnkWfcUoF>H}rBzU;eLP}n%uN|AQ7#Tjlcj{;>*IYRT> zDhL0O&|Fx5D9{YKpzb+ggyJX(8DSD0G6U%4H|zc;TiGL0LYs!W7RU_QIa+A%vG^!X zPTa<p$-e%P3GTc43^Zs1jNz39C!9kD7@4iW*_A4#s|rW@<2L?i8Xj>t?)LO%dt=R|){<22OrJ3#g*1$ix6 z=RY#?yTx~0O)lF%GHntK3cG4in_qJ~m=EBDB0Q_76&V*CMt)x&Uz87Q#D@6Kmj)ah zss!E{a|Lw=OqUSOix@Th>(&I|wKa@=*A=UEd3VN!2AkxwDCago**_uO>GP9gSJ_ep z{`*?qyXH_m5`F{y;4U@dd7OCB@uzd;0yI^=3w2*Ac00vf7kygsm->Rn+2#pGqtENg zhgPY*v6T0A5JB*mlm7K%sb$)Nx*8ue)sKH9TEAt+w^g3IEnpydy!`e&Aj;zfsD8t9 zoikQG<&qY&QeG#s$|_iLOJywOc8Ehkwdi0ob!LjE{0XIBMXTtxE_mdF=9OpCJh9N? z`9e@>uSTq56;2VU;y1s;mU8-!WSE(^jCHs)AbBbD+;GZAYB!K&B!QvmoLBjZQ!VZH zzVk>N&sCYLB>=6CtLGn0SsIr0PY*%Xd#W~L9o)HjWm7Fuh0-DjCVxi8h=FZ3!lFyd-E-}nt zTBeAoEc(ITu*XDKLydQ{%%)s(<@r?|kbTLI#V#4> z;3~-~`J#(Se9d~GJV=<;qbKA`!&^&)e5b-7Kdjr2C3Z&gpexxp!qWXO>d}6Ko9Me& z%pz*#OxR^Q%T@`IbZ}JS_vBkLqUO-;m}xLvb+o%GxdozrHs)mec{qhz&Fy>?cqP5$ z=c5*=+*;dv!rj!Hy(I8lH7S0~WQbHRVtSlDTVJlHd{bLg#Jc% z)eN7Xv<;~m=IKzR(4j@G^HO5^8uMO^aH2uUpT-4Wtw*ykVl_j-jQjLO+99tJvf^zm z&?;rnve}r){-NZQAxDEsIz$P)!B`_m(qw#rp@Wga04n8HqofvD)M$F9cn$kKQV#Vz z(my$8pYmZh!E_an(*OL(`PP8!Px`O4vU?;S{}4;li~Z&$Q@h<0&ki1SV+<#Buj6tc z$$Os$Bpjn2IW9nbtGn7-*THhv@AR2YVnxPw6$A6!CXNg~&6h;rAe(*BJco7f5<-Tf z;%mRuCJ*7PNRM*U-yM9vn=i|WWXpE8_Jrws!A@g^J9<1D{-P3e(&%bXktq@5LbY+- z21)7FpN8yJ?cLJLVRA-TRBiMcq7*IRTI_in31$)1k;_?p?C!>(uXikp8fW9NS}T`-kL zj}uIsL^w4;vIAo{^`;gNTWE%zi$YXJ&XR6u{@YFPNCumjg@$aO*p|wpc)QuT3}$Y- zE(`@Nqk;ZBrAYCk)R!gRnU!&P217w_5Yz?$DIY2hPORp^uIp2Jy(}DOY&$TfO|DQJ&Wo`6VPb$W;rbV1lkgh`j?@znFp|{bQCoBLBdVbN?-rJ^` zC-=r9Hm2=c?l5<7(OLAif-C~_rQI|oWmb}k@r=!lG)O-f%eVPXFr#<>V+=2XA9 zuN$2_c#BpqjGQdYz#{xVtM-`e>o*?yPhluctvBBgt@-oUkmcj@gbP8$Zus*i?NMuxQ2(?FUL58j=sD!iGZW5A{n5zRv^5oR--rjBwyQ1&FDa zeZ+ctX}FHf4Dv(ex50Rw1K05WxgW3rb=~-CX1!OyP2fZcwpQfd>cX4{_2)vH~6wF$pA7wOD*uCM=1 zfQZEYx}htqo{TDIz|~!@BkIQL{*nB=xbCVG$i!_TSu*b_*Zb-+6vDT>%RJT{ zC^1;1T2w%73HW3{%->P(q|@+|QjP{?-YWf%%-XSs;g z!%{5L#4xQW1iZ)uBb3Q#!WZvUE8NED*c0)&g~#9iw|%m~40Cxg^+0im zQ^k=dgS}ydoV>8(%yMqYd6j8i3d3AbdYw5SC1kUJ*~ygo&ML*PsEn}lNF zSb&hHNV8LvrUY_CdR$Y=K79xJ5HQFhxhp66mT}r}6fb2po~Cnv2YxGWDOd9uG_ZzQ zvjqelnZKznNETBoPS+29(l^k+$OVs*5nlc|#RPC3P!M@*UEH4xVsy`cmQinm9I6|# z>l=wOsPb1pMn^as0z!va8ddWIxl2d1x6ar@eW;#l?0*`FcTWDwOrD%f|4i?<&Q}r= zeUm5rKYtqmRIwmA*CA@Dg*kc9hgtUfM|x7!zf;%8Ki4wjaFpeAeYNXLwX$;5@26C1 ze3&8C{up;>nMwgTS#54vYJ$n=WdlnUuw=p-cn73`k^zr-L5mkR4%h7nPYb3p&dZG} z&J=SPax6HDCORS+>{elKlSo?3UV~TX_~@Xj#$kzz#Hm@u9^ZjDDzTUW89aZ;aWFptYUO=0I8e zquWDA{`Z%1UZ3^FPwKQ+)$i%RJ6HXf_G1BDUfS>X7CnZ0L^M1u3v-WKSOCZ8EYsL! z(|}9r&Wq1ZX{Rcp2k!--*>e+7-uXu2&5(^8>rK@YX)lNunbY=F<`>qKXgJ&RU9DOd zl}fW${+=aZeUnW@0_8;TfN)gu!exRDo5PPRwg8U3!xu_#a;PW5QnYmEV{JDC)6(|a#_YEHbWTz^ z_Cp&PaOvWzt$`ySmn_GQ>zFC^>0sKJ%23u-V>?+*`ZQ-tLrS3#JJ|7;dCu8<4oKSl zxs6@F8A;y#Xa7j#iteBY&BWM=Qw$`MVQ6ajIMix_-FV~3x+%b$Qq1zoC%E zKN9Ur#x3-9V6CHpK*CRC&Y*Q)XP+qz1&~>|=)=fuNZzfJo+N;NDZ3iDaR#@Prk!0? z;TIO5QX-5buAD*Wb6JgEYP?Q+aV?y%|KdVT?2<)zd#1Yh*$fJ$Yqo3G4nIDs zJu&xfw7n7u0_dO8{2xmiAQEil(}iS&NT(NrNJB;FH@EvsXzq#t9=*uMY`V9=?M(V=?i3ey zuw~zd&W=JbTZ94(qGbx>vX8h+OuV8eA^mE4i=5;M*}W2yXSXP1&k+T9_Q-gzW(r-i zXf#1_37=zGorN(5bH6xWKldv4Ij>q<7%=XUu2@RUlqnf8?r-r>kAkVgUdT?1r4U~$ zAlXQiPBl4PV#)z*)3Q_&ok}H-ao!hbOOa$f$9VRml91X=q_SDK5J|$=-pNVZ2ICS zyccFg*Yg){75pN(wegZX<(sYT>t7%5lTfUHli4(4c@ZP|o0?BQaKSvX!#4? zW%Zi|R-`yc+du)sbzDZPCK3_FFQ9+6Uzzp>tl+T}zv)L_M7h-fnADaoHR58hMivwb z$UTa=5OOHyRS2botn|pBo`i_1*cRebGB}6&1{^$~L(j6OKMO0&Wb-*Ewi8$+5yiJe z(la#aepJT6o02s>`6l!=+)gLZj&({|7p$M}I7M#XDZ^b9HTCyqY)gDKGSQ=bd)wGR z|0_+ix%Aq%4|>1I_(*8=ZdoRPl;V~EW63iu1`_&z z3!TLru-@-I)r>u)ixoiGM-$`cr;Asz8n(tXq$DK#_kNM`>*(M8pEESE6;!1q_H=+C zWW0HyF&)+5ytQA>FPfrTb?J%N%@H~B6qNI>a1(~v@g|tob~mP)?dg{aXTtPnzYGMM zb+`B>8rm~zI0hdV*yk%Z2*tQO?x*)ztu z$`bdva(!br+xzrAxAeO;pivDd$Fc}$w5xIdTqIbBrLJ=`>dYPK8WOtfHKOh-UjQ&U zR^G09OdR?D4h9qVH3^A*p@LT2!bC8<&tOhox zQs46&Dq(l1PirPP>db5yOUiZtU27>oQcP zX6j+1X#Gl>q=K6wVYp5g+pSxCLFU;(vS4P^V%U{d6X`8u&{VkehH#y-jz+t z&3Wj+@TP!*lzX;Nh$=<~B$({*BFnS6`Hp||t?5Z!X=fyt$_$Krqf6gQViw=7^}ajN zUt~kfarxm}vp>J}=EYxEkrzF(SMJMK{`!EF(L^MzzUi{ z*rjqUS4l8n4nCK$JWRN*!?mi!%TP(<%aOal7>u%-O{Tt~f_+J{w#<~}aFGp5@^ne& z*wg0Q$V6OF`<|ja1>-p}%tLc{9wME1TWk06mSj zTgz(+kA~~Tkn+v8dlkK>G6%k_$N`tcilV5~E*E9N=~_{Bk=mhzE0ImwfX&ptMp6%2L_8KV>G5Cx{R&&E|^5kB5cH@XX?Pt*`BlGA$1)LYQ`N;GawD~ z2F4EF1{ypke^+xf&q~z2QzbmM)rxv@sH7+B;p<6#B08@!(y^_%sLDc=tR0vf4)^Yi z1(~z64zXWs%GoTQ`2px)s^fZh0sjGuPhJ;8^Y7B$FwR)@w_`}+*SoK(5^NRY=$}{cMg$28S8}?cN0vBdHGS_C;(ozj7|Kvlvvif;E9DGoZ zyRz?86K#J2Og-3Rey`Q^Vo-7hl9oS9`IKIdj{@0|E~@TODmswgB-}`DW!=MP>%Lnm z`nu#(=<00bxK(Ac+9M2pN7?}b?JHY#kVqoBWI8J|5S<*Y^O(Vt0E2;7KC`M}#r7|W zL%;F(G1=Fo2}r_A{s&L!_-Q!(!E{}s%VPyFV$=EeK{Z(WFp_6WB? z97?(nRT)kc5o-~pp$fJp{RrbFAw$;mk}qoxZFR*bu8`CRdi1k!vQ}y86FhOR*U9xh*y0(Q0?ge{f-V^)8B2BO}$l z%VQTz?D?K%M9B2^oM^ETJr3|?jT9=ltD_f2Ld1uNT0(?|h*KawnblU)l`&Z6vc)Xm zM;14hQ~jlE&Oy1YBQj==zR4P$sdY=GhyzJ&I#B3sqk>9EX&Nqm)8G9?`(lt&hKFp0 zKLR(8e(!IrkCE=P8r1Z(s2D+bdqz(~ZX-IDX zGnw5%2I=ILR*BwUOP+uLwi4EVrLS^k#DsQ4WZsZ9xaYf`zr1 z`a=}BB~537yG6b{`EQ{pFLLPD!J-FzFr_SHGmQP7HSGOe1X9SR$qVEH;p+(5^GSlK z^u&Jw#MhZbK=lm@jS6)V$i{@uhaROzPt{7CfY0P;5OP|s!AQkIFC^T}waYoK9JFy- zH>v1IgrP`yRKC-tRWfiTkPUqzbu2T``zH3*p#Sak%O_-dxi3k`?hV+IJpQ04d+3z4 zzZ00|uVjJsPuN%Bk&_P{zc>n zkQBcp{q>RS-cOQ0L^bJom{%h!KfiMQJ)y(b7M?tx-NQF;JyTxi?~#NWtfp%Lhnn&v zCSQ8A@bssd5?uvcd$p%fAEOh5bLPi|oNcvz-GpfDuR>%a#ICP$nN1j#K_1eW0g>K7 z0%Rf3KQOo5LTG)Zg!YXn`BT#i4qdSSb~azlX>Ik!G&O_u?d*+n@dO}3` zFKnp2psOJG*X`G9D}47Y>4>b52l-#`(h#+SX`PO=+KBM;tV%%V0NLfRtx*t9`y`O z(W;WO{Z#lKZePK!KbPZFCQ=Nu z(G?T-y<4qt%*k{0GtJ?2oFpJLfBvsjM zc9^CNnc{7WqXa}TO+7N>h-1-Eda-$^wT8kUE3wz5@ftzGUC1ey*{K0PV{u!w&aSt^ z!g#E&l0ak2x0TE$R!lw#*|SK#mn2VA{s<9czeH0hZyD!+c-8oS}4X8z{3J>@Ah zvBji+tB(&p7~}e`J_FIS(h^6t?m4yt)RdofwsAww_>9juBWq_4EN!Z++TF#MX>a*x zpQulFWY6H2^zE&+Dzg}-`_-FNDjil}CWBURDf>pMsZp=#O@wads;oDCH5+s~Iojcj zO_F6del@?UaTZZZ*8?fOVf?)^q!@`Girbby_iB=Wh#Gz8?Kf%fAN@}i{=@8v zAOCYDO<10kxk{2Divj4UNU+@elW>8jPXtDe8$ew|Cd06YV4)gzw*i8Vv)z;5v3@=j zmnOeXtSaU!%~aahN5iQBNk{6Y$Qfv$ucFHUfV*GzP2g%^*P&ml2^x;D40N5sKN4!b zc6Tuir-;>#xJW=AOHU44N!5#`1JhY7z`dQ4AR2V<>`vFwOZbGGgrF195D_6ekkseL#P z{4jjYxTSJb=e)fyZR;q#V-qkryd85ktJ|$sZnBQFY0f~Ffn@3QBRum2XI$+Yk0og) z>`F@dzA0BUgEBWmH9B;)m$fn*-Nm{f4;^ity5NhE7Q0?7Hsnz?!!Q75dhVzt$O*dY z1PWZ!ce1sfFK__R^+P2;Apj8$wR{mX*0ava=WC0$u+OwAdV-uEfCA2K0?;R9ix86k za$xBAbv|3=MngYO8LagdrX6GsTa+vg`ew%o!9q&jrg5m8|UA!J1~eSZ+dDq;i_V_(c>01o_1#v zg4Lw2VgRy60N3#$(-fO7Ys#MHD?{Mjf$@UOg+djr5En+9^f~+KC@&F@Yk4N)u@nW& zLlcAlEO+rslG@#LV0HL_rwR8v1&#SNjDsg(UVcbz?F6%~5$^{*YxRT?o1-1ocs4qx z?1W*IL@-BJXIDk%?^DVYzcpSRYq^STo=jL4q?NKRY~ra|{(3s0h1dfKE%HVtrPJN$ z(?I>KZI7u>i+w4Q8WA?*xr=3nIwiHo3li?EVC?~rCS^*>K(E4-}eNTT!H>LL|FQoyi3p z#m=>~h!RO>`!CDqIIknH)a^>>GGQ8rItmnr2RLVB?s)ND4}ZGxE5jkRRv-3BNXjs%^t28^r|lFmB{im&9oM=sQSOAt;PO#n^6-V3SIYTV`Ch7}PU zeiDnswEMC5eELVC=)1)JkK~=-a&@cGYM+mnw;aB_6m!t-A4{Y3#krAjvzf}|B1L>O zb2bO=URw^n{rB=<9xaF3TAsXi?&)*VjjR+ree^|1yg}%)dJ>O3$`Kep`0XNbFhWp+ zR~@tl_W8|qsumM7=|9HZlI)8VZqn>-^qbKKH|a}O30~3iW)6reYX`CG&FrSIx+wMg z_#0k!AIVb^?!QU9Zh-FEtOfK8j~uB5*#r=J*c4VSGp1ITf7v;Z?F7PoVO4muCAN<9 z&0qgWg3mHfkB9tij>;5yud~qp{KVd#at{8*{*$r9RvhY|jz;k4?xZ6x3B%UqB)pUK z%JyEMoSEkPMuu05KqF&@kti8Ov;x1VHNAh5n*Z_GrN8UeIA@Ne6xrf7g zVoOObC7zgPutQKdEB#%nkjl{4g9*R;V z{@>;fm4Dv*3{YBGGN%)mlSPc@-?@{2 zvFIVh7OSg7j#_9{$fmh~*F6dNb$k{4_rzI~G3ZF{u$(qj>8&mPV0wFy1Jtu0h!4u! z?Ag&UGdrpGEn1ahbH+AjyAopL{bl!;8Aa7~Gpfy02+1uogj4wPr6&5@xlPc%)_{?G z`c+`T&QrAi;*I@^FL#z}uCgw*$5)k_AV*FkF6WGdx*QA$4f~;68m=Yl*LbCsxBq^{ zu_s( z_rHqlpUIAq>%d7_$k=fo)8TuLV&!H>+Sx#vv0Fv7%OV|%4&F1;Tl3M1W5vYA$d#9c z*f5xY3C&~Dd-OCxzU7S62atCajvwStj<0tnnbZ3brwM|YO+d-`(n5A@6=;NF=}SNXGQ>Zqq4k=hXbMC+dER;*>`ajB+atU= zuM@ilUYcDc_0KCpz+u+|?S*NBiDdqzMN|6fhO|MmU zycREd66SNr7N(ba7-f7+6~FmuISq@9$|`nTE9{&f6XXm(eV!-}V64mcZxKrA>RWHc zWP8^BBMEH`;J98xpHlyo6r8I2nNux|U-IZF&oRRLzc)?eCntvXgUyGPEYF*!O_+_0e<#ybD z3uVEk3qEk}g>TbllizW%hSlD&PpO5opG}}XA(KXt^4M^!)-z}Dqye-2XldGC;3pEA zF#L}s&I5uvU_R1Iz&aEuC>VYMj=s5CR;mpUnn1;B2iac$ZR>h`(nrc;d2imCcJt9i z`BPC5hGTyL5|K)RTU+eIe4xpOfU)D6E(Z8-|t=d5i6frx6Da4&`Pa%Bs|6*+YrmZ0t|Yx zX;B_0yHxevj^E&q^Q>S0eZxMU^RXlU;~pyOnCEK1My zspn4!Dxe|NDftY2Mv zb;PfuqrN!a=Ov3*m!erJ^!d?n_=!vYPc;i@>u?@o``Owu-VqmvyngT99aGJ>rs?pj z>$#ueiQ|V@zZk^8T_?_-C0EQkX0XSREz2R?<<`OisTQ}Z8QjvK5QNuqJW?PO$~)zAtNDPex*xD75-qp)b-_oCp=SQ+aD{WxdG58xE+ zL1by9kLmq(_o1XZW@UIu=1PLtlP7QBB^6419!Wpx-n|2HO^1wUMsfi1Ev=5od!OlG znV$v4)bw-CysXfQcjRY$+BK}5puKtd1wa0rS$CyPT`k>vhxKBOJXO6y z*kuss>!`ne{o1yiI-3HsXCpd*kn_&A@-Dx>GE*z{gG#-%1r*I9K)&G|%er}q?CDEL zIusG|%0TS~iFZr;lC-Qxl}C6@JYVf+SLoT3!HaACxQyg5ebE>e)Rn?&sXrkN3U*c0 z$TuATQJXS$*Gsyt$zCMZ4~QM&rGCgTn`V5YrjbvRiayk2URj7uMd8=HS#IX6Zk*<0 z?>s&PChI4Mz&AFzA_K=X5d4E+=o}_&bGyP(}ys{PA zw$ty~0$>=;!DI~k!0{ySFcxHM+>Y=~ah~L$H64f>7~uALop~h^N@dztxqHz4WVsyi5^j(N>_hh;jJ;Vg?K2+gw*v|rIt?z~p549qF(vtnu zRqFM6>6MPQMq24J(;;`o-wOGFmnRdk*tr!P4)J z&T?Fx@^6juqP%i*qVjN_G;Qnj!zh?{Z|%UR&V&K#SV~?b zUf0U6EzGPF6(juph)Q~ONva;zu|CXGy#9Rp>6&Oz8y1pjC&KN#1W2+bCO?au8TH}^ z@sZDI|JI)b2C=qX^v_UCAzhHcx2xr2^4b%}^H;Q}jkV~k0yw>Nxi+Sp-*K9MTk&gJ z%@bK?e|;fSSK@$pv|f9%Ak)okKpQ!8_O=hBuf4K{ZtpIsViWqjZckGehkfGpa=p>B zV)qqcNwH6!wQ&f_7?g1ju6J}iNgpK9{Y;#~ft{)4~CPwxPDY?_*(laHRY@glMSNlZ&%-m zlb8C&y^_^z%DlC^h=#VaI-z$??eCu$mPg7<>SC`B!ZbOXH|AmSKdj6eA5Xe$>WqpMQvltOD}mS!}T8Xaf%BVqMi4A7HLva zhqr8mDMZ?V3w%tc!Ga}0M1Mt!2c@Xu%NhFjv~D^~6`-{NUH|3Y^84)n_)Y^?xh$By z4_$t!4<KT>U|IyEir6I+L-7bM&V% z7noOvbDFo|vo$85yc3O)$wH`@#1GYlJeGzW{GTK3NT@~s!f!c%W7_b!j^#&@M=}&V z!+2Sq{E?}5JA4#;3f;Y?md|Z}OJX!r&U60n1F&G&ymz?dAK|RG(Y=nbx&{9*_ww>fH%yU(7f3f@Nq z#3oP=a`iV`(SENjbn%MMR;iTp2A_i-GH(cpuzxv`zozZ#H@K1gxBrhQf;Qt)O~>TL zG+)Y^OqNoobfW`8kJ!5ib=_GO#H1f9<4nX?+w0#sY=km?+^jFuaK__fxrb2pQXQqK z*$#bv%fs~Y#=31M=f~)Wyn^0k1y2%Ven8-}r3G?aPf}jrc}+p<@RK)#Ys~3#TK_Ks zklNo_FBSErShHq+&&11Wb>8s#FyG(9ThjARQr@dgVNM&Xm-=5p`8HW?-8L(Q8_C ze}LW}&m)!6Z?5{ori@Nq)0ebu46_p7!S7%DQV`oAR`l+Q$^HL-P}FSHh<_w?gNN@Q z2~VQy?VDjHR%anHy=Q2LU^L=J`eBdc1g?NX1n;iJ@bSySLeKNRXh3JV%dIE?FQNpx zvQUjT0lY2*uVypP_oGV{V$=oNORv(r1tiSZu}#%^9!#EA`C?v&osYT9_yM=!1~BGqlK z;Vag|-5qU3ZkZx;hsIWA(0QX$geU)NQ;TwGxQ0f&?y|t+5v-sYaD>Zz^7e`2K~L>M z$`6y-!S!8Zd!^p`E_DI>Q`&rWITZu|NVZg!E=6z|8i^?W+L!eDv2?1RE!)ZR1`>u zN((nD^}9e2NY>(kfk*@tI7Wo@hS;Kp9D z)f#BLiJn&;+!Cc|Vhv3Mr$zUl4Tlp zvUJrrz+g?FKupb;(DWSc>8x)41;1w>75w1Pb>9oMui(mpHSac@K&U&59N*3fm45}o zsx^p2QRr)bLlyiyUUh9{1%5b06(_vlkNHG*A#_6~2d*xPvW!)%@o zHXWt0Mui-3_q#kg_mD}74ol4FNs2N8z{V}E+c!!Em=E`zsvzUa;or-z3VOw4NIAE#oeJqduW$TyvVy-*mg< z+&_SRz6}5I${HeVdUw3!54UcAaekWUbT*c*CnWnWgHe8y~RLL9j-gYBmN@`D~ zYQ7qJcO28=)#Tv{3`&7Ek~^Dny@rV(YpL0d6cI}qO*upCJ15_51H&D=7fe3N@V62qr0$+;l zGxRi8kNMQ7VJUdQ8<{qSn?Dr+XU008yyw`c7Tc*f*#34AxYiKaDR27P>8{ieS&a4C zjA>EC)Ev%`#7gNr3!>Qi%`1>I?x)|#e`@rD@L5uT-^MNnCr|%WP3lG*54H0VBaZbw z+nK>PCRJ^qO;BN{3Tkr~7#BKc+!Oj*TTHG+Aw_`mTbI7O=BAftcdfScvAx!NDlR&^ zorFKX+Pq*p9ZWT=g=NZ4^uvGRVXW$@e^BdBxxm5AEMB+i5814omfN_Uzk&|RrZ@Vgdb;b? z9m`MzuHrphT9i=B_q<-Pcp-B7YFI(B7K+cRRR_S zQ#s%~yg-K4qD93Z0AwgJur@z+7ocfX#nzAY2Oh3v^h`o0{49G%LF;EuD{vj8@R! z@Hv6OS53&dVET}LxqEEMZuy+;ds0)gHZWX-#D=5zcLT7ioCaCV9QD~VM48Kqdg!Be zqO)e!Cps_aDuxwd&gMSE+Ba2keF%8-pO8MeXluE?7Ya92{D}Gh%dbfi>X&1Iz^*Aj zHBHNTXid$jW*K~+sY~C1j6o@UFt^UDWYPw0{j9jpV$YetVSaafihqFrb z)S7e`7oW2{gjIh@Jk~NSDb%9+t-Tc8k4t`^#_fl;JHLjKLe>(B-gH&=pSI9-xAfRh zc5zS6gQbs;R2%v2UY}?EXYJGi{4lb!x+Xarv~hrN{sGzIvIM!G&O3yyy60%)o{|5> z+gk_6(KG#`j$>wKW@fLMY0b~vj%*;;A%*-*f6GO~)&OXn3zH{q-=buw` zZr!flkxHW(&5Wd$y0`VyhTPdL&;!H%t}4n4@Fh1+tICK$im97a7KjA4`0a zl?!}+>P*ivW@M%FwOR3zFw<{y1}?9^5Vp&xZB>vOspUs&*JK_E0%OF7D7T-Z+WI(rwiQi6%US2iCCXQGijgy?L5yqvHDWmD&5!>heGapI#HvyR*kt=m~7syl4gRL zqrS_GRAi&sq?eQ?bZ+e{&*+3#QRC%zwu#%QXZ#tdSaq`p#MaWc(Jc8Zmon;v-`{C& zWFjs_cxq1i?1$;t{z4$+SaKo^eR%D*%wEASao_F6tGx?0@`FL%@PPAKRsYJgiK9p1_3Qb21#G(<4?N(8GJI05c*l?3WJ$Xf0K%Q4S`&FCwh2X(kTBh~wktv`v@tv$KsejssM^e%4KuJEw=*Iih8xB*~xT zzAAjoKCS*E&i_IXv$ZXP{94^E9Ao67KyaQrmU*V5KtzyA-z)fQ_R61fODNKjAHVNsavP8yne(2VBf&b@hKTq zk^9x?z~JBc9MAbRnIdfyDq~cJY+09-WH?iHLpE((jX$-<(;uhwXdXx!>%>&aXrw5G z@+KU{pT0iR=fNNU|rvG zey?-%Jm&LBQLs6R2|LruiMLK(oqp=f#D$wp0s8P)Sx4x8_wuZh?kQ?VZOk_ACb~k) z8@<(M^ev_wD=|s?qf33sSut(Ar7&8bIaX~8(m(uTH9;IsO7h*3Ec#96-yt^}k~>)H z>d1Yo!eH=le=*%F+W|(*+-z6R(4gjX_^fEwzu1^uJzm9Q+h88013pW zdp8Moc|lI_A8VUo$EzKrctUl(>g@=0#fLP9>GBBgrzwWs+)TwsI_D5*ewoPQ^Gh!L zar8rrRqLHbz(75FemZ+JY1LXjeog)G*^MYBsBRdzdR- z8=3v-wghr(SJt<<=W4R&W5lk+>{Kff)=jZ+<^AgX4AZF{x=w6ce!kLD}DS=y(6lHgmP<)!}ilnj;>METgx-$IMoYo4_^*xa~S0 zX>K7*68TWLOA#?zXKKmN7>Y2s!=~_jB}Du_%E2N%%ItXA>@PUxVi(mG&)YnG*M+#s zAx|Pa#nf2S6s9B*GBDbF_K37kRLP*m`^xx{`Nb4}3LYvY}t_h+H)+-E+RZx&@PbJtX*f# z%83-5>{V80p4v;Jo=Kr-VUWF2a#trKMe^Azp*Kah+2xV$r$?qcr>thu@%5gsbz*0N z)?1z3B0PdbKsrlWo^Skb_3zgC8z_SjFPl~OD-gOY*5!UUM`rqd z@C?^5U)1Z@!*==tAiIdd8V&xK20l{Pp5s3(=%)z?HE*vj%C-- zI_RhsW?FsLUjIc6elRI3OuppO9mf_+z2ek!vr*U+Y1q+pJxo|7(RKp`eE zP6enMqnEeXx|BD&^i6GJ%j}FD4X{il}9o>xaWslgEx(vIj z^nEQ8E6=e`!JW~l4L;eR!03@POT>(GsdbQrXyz>wW{>%w%oZaIX4d~3j=i-S2@5l^ zikgUAz!nBcW32bxc}J}iHojm;pTqH##x1~+B-!&8w&E!b!r-xu4Ehi}FbAoW7v#Hi z_y&Ag_a&Ao{~dJ%|5Wlse|~Etuz-yBrz>*9RvI`i%VxwO4n$i!C%j|xm-L1*4wuDK zhccD0F!w??buMLakPbxW)yf6Z*JWkzO+t;=aG@h3Bje4j-pY^7N+dg`Gss)XTU=bj z#7xcY!GNGyO*u=xwYMpj%5(87V3^S0&l!(#Tn}jRN7$(>^EsQLP@?H{kC895oscQ3 z6`s8E)b1%)$>K*5NNot=U|HGsvM_$CL;^ArSh>UH8~*VPBFCV-BZ`jXsSmT|`k*J8 zaMP%O`Ib-BaQE%P5_-h1o;g_cEyM!D-=QrPaje_oG;Q+SOVVkV5@Y>>5if#sUz?`U zJAeMI7Hu9GH*M$Ggv|_5g?UPkVK%bR#k{*H@kZch87crEn z0A&GbI-!)Zwauy2QP#pzoB; zEH);t$OM1LIn{&rR=}{~r?w#N!V(R&o}xSbgObxr653B{Bu(k6YVmDu&?JmR2w+?GP`^x!h?`Cs( zmibX%tYReI);gGo3|(tE_G>)5AqyzLJsOUL#Ouv=5MF|L)5MukRZb?O=)rQ=mD|Rv z8+Sc*rxl0VSF7Wa`yg@&q65vH9);z7u;gjL-F(&Hx$Zbx7|{v{9!8VGUv_Of@7fOh zG=9xUm?P%uj+~eeN8s}9ITNEeGbubjuVJ90!oCKQkIZ2c94y7 zQ|;fU%fiJ}NX6k>B^ikt_ow$*D-8z_O`7U+T`-MFtT_n3R9~1ZH>a|eMG8r>+q&wA z<-=FQEjSAR(p4jS(jy|G8Jp#+3R6_={EHdCwE)+n82(IWa8ydR-|zs}oVv38U>28g zfb}kY!`)a4+6wBrQR2%EqJ2>_KPh+9xN^1gJBff*2vzkeJ=SG3hY%~$?HIxI6>6H? zGi4`C*OYUO?$_P7v7 z%}NA#F*uLn<0GZ;p;8zg!n_Yj+G$emz{BRQnTn_m#fS^YlGmHT-m?|MDXW;ntc50S zO0vc=tKnvDc9G_CIH^mL_ubPPTQF5*_f$FM_EuZfx*Ryuv@%OJlgA%23vSG9j%o2} zl(OSzR5Z7mepc?OL|K@<=U6DI1>76f%9rN^kM4I9a94HNzDT)vlN~WEJ1Mw($s$F_03SZHRf2LtLAX#VDmZRgxs&{ z4DrpUM$3`)Sd4|HXq)7YgTV^{b*USYa+yh`FWnggw&6vDysNh@Lg9@_3nrcE(@Oi= zerIYak}45N<)r}GfKmyL2#4CW4d;$m{)#Zll7uvs);dn=G6E(MTqYWw zKLYTHh37-EC8DKmh1=3eO>D_f07-z%p+t%8A$#E_af224oJ1RfTQEr5eGG1#ISDgW zC&6!d+@D1u3{OcDX~0Eq5x%!ZWz0}AGo9{rCSA5ipNHxUm)-xFU(L+enJ_l?)OJ=v znv08H26#qHS>hU(xbRPueSu#({GXKaNwEdtJSkS?uQ1|ei(<~qa-2LXY2GR~bivoW zN!=mM^h=epFJ|J^gd8+kYmr2pco8kuP!@1#k1#~433^MoOJ;2i7W*=O3vga$JuTT^ zS43+e9k?((i#fVpD?8757iGm*?8q?uV)`U**PpFMV$hLM)~@0bWMTe!l7_GM+pt5S zu2o`~dfq=rLLE3@M(P%R?iP_zsB|3i3Vx?hT)sN}b-{k@c1=3fwE@;UTLxl{o1vND!I_4-{_id=v4dP6u=y;S!v{HwX zaCXcR-PiGb_RUx8@No&w3FvqcugIYT_9o{c6|z-xyw%j)#1c&eW)(z+iNrM0qjNF1 zixuH2yZKr{hZy3QY6;yTR5W|7kj-`!{mmq`G(xJV+69?Vg)7nko(A(r$JvslA`b12 z9vQK*#HRlH>2B(|gn)^U=gD4dm-!_&5B|?mC34AgPIhoZ>43=crHUB3DA~(#7`X^Z zN-hIB<+kuSoSvoRdCq3@T$m|Z39||hIKn;F#2}{_=C)kwRX{QS`{yVS+I)h%;TWiG z-HIyw;gG$flk9MRlRZ`k%aMw_fiz(=Q9 zFM0V(ykrYV;f&KzO*>-RsrEu)6^`^b7Z>;KsqLgh;?Cu&@b5ua2kA$}CXLV{x#G@; zu2^=}bCN8eJ=se{Zm1kRhC>$AUm5 zTU|0C1#%`ntr)oo`Dau-HFvCWSVEw_EXpfpX@g=7S33sUMb>p^+aZAxRd3jG6DVd{ z?{rFwvIEq@Dm#X~wDpj>Jj%_g2bwBw2`ntEKR69cIO3yek!1<$kD1cum-aw!%Vf^d zvMf}6T;$`owiYVCFf=@6M%zsi>ZhIbKQw%oL~^Ni1(p>3RSpfToWMWtx+e& z6*%}b9S6&;$&6Vbn&~3~xzN;2?CjoA2C80ytX0e|aYonR$RAjN2718>TFK^&c6;4T zpx~&7DZ{@IY6AJ^wY%MRehWFt5;+o|Z_b|G-s05dYq7>rgpbj3IVL}HZNwB}tN zXNnkPOE#0HSzB68HFaf&R7vuCZGpkHF*g6d!CEiu~n zTVk*a<6*#n%$6E9d)?Kww%)0JJ|pc=us^Zw#2!ZtTA0+#j}iMILz52d4Du{L_7@_; z$WW)1L$ZBpd6Xj(=j;1`N{gUNo*wcEkl&){rFBl45W+*u)b4tUUFX(tixSA z+C9Jv5c8wZMTk(-qpZO)3B6lq$VcgjE3j>dwTNbO#b!d)i{_H82U9F$ZDdLZm-*q# zJ<{Jjdg;lJ{Zbk^;Djl@RX(13Bw)W58tniFzmAFtNIs(g;I7l!?}FZ1 z4+b*ewOBfW@7}eIA1G)zjWhTuzWf0Sz;h`LH)ylAj#3ieWn5hD7aEp@L0&MFHN-3Y z!?Lb3ojkZXf00I`66(%E3c&OuWlS{cyXOTlNGx1vO~>AUVMQ{sbcLF>q=z;TF*{BL74~A5+weT5P5cDP0D|Z5G6{z{q&G0g_ zY@`}&P09jK%l<b7^;_t2j2A#ekF+0WWG}HJ?u2n50$Z^Z+o||j zf5~Fk4`+8(L zv=s{Njv5lzMq7#xc@kUNy`-Vx5P#3)SXhu6fpXIZyfJ0vClvf3SyW?*Ev7EXRir3w zXIl%AZu{5bwG_*a-OAQXOb0uHwsbY>`Vs|MUaZO3e7UspO05D{Ry;=>*AaH)r~$>j z0tIiW=~nbd`Q)Gfs=qq3pE9U3PmNA z!JLsVRSVJDd`JoHSwpGcR-EDVKHIH8{7+5hRgGBRFs^?HuBY|Z$6vdB?8X1sw65Dj zy-Cc+R&hG*(u-R#(E5w#2k58??`u~s7e1~O@OQSb4KX4{49M}1g8wEJmr)GpR zp34|r$c?``mW8t;he#5mgAM1aa#<(U1Q$R^blwgSaS90Dqd1gzdcxYRbw&*NQC?;FB zee~&l*dn%vv0=CosJ(3pu4Gr!GiHf(KF| z`{wOmFQbj&XHL3Cv8V8mnDOI@PXZs%x8b@$Q^7ppbpfs5^3BX__13B57;lE0) zHYA89alugq*xJLYE@;E)CpHQ?cA}TKHrFQ`O{)7za8fg}j(NK;EPyc#wX!A4-RwN5 z=4DP}@(a<#e5}wRfpYQ&WW9m-XtH5bJkK=V7)Ejk6Jxo@4N!b#?AGX zHS1nTQRN1EA1=BG!F?Is&uZfD1DQhZQy7pcCiDdG1O)J;8{6Jo>1vje*PODb^IC6N zux~9Hhj>cTW2`9_?Q^CWV~gB`hO9`tnecTRX!#DgkmLnPaAZb`vGGpHaBS;AA{p;t zV@f%jaQV(#9QLEJZQk&bXnJsz(D#nNU{nZ!6fmN_(Y0bHn&lR?u@>W|GDU z7~g=zjq``1VZG(j*MurVR_1^oEk?pIR$!?UeaD4(f2$$kl^ynwO4X8@g-b5SZCuHj zGA6Tl4%ZWbj(Q0fh(>ivMs{z_zJ$~d?%rBKF^YK#MPEj#vz?}>slKILy0>A?0_Bi` zfHIaQWiR4tXbUm)&15M)^yK>wDKbk+t|3B=*n`LwgC_J)feTm(_Ces@_TXH!c`ioN zg<;B-Uq4w0p1BEutz`d_zeV`N#KpV4LR;@q<6M!Ln_x)7Ko(2epatT&Bo~H62|7xG zBpe3V1_#_7vz<$1lw$2BSCBYEp_SE%^FIt?E0eJcws&J-3UF8nwth4(I&~vCTy2g- zrQFa5QQM^w43aXpJLcHGN-1TJ1m)lZ8gOBhOm<;s7Np|s(` z+ONS5xqW@%ex}%F+LH!ZJUOAnf-y3g!yqUL!yydOBzQ_g!vhNd{}}x~3KMT$fdVpB za2LlZndK(3JbXgvXT8q|N(Yt1jPoHrFht67F>S5j&NH}i=1gU2f)-3b-GHy%YyyMk zZ%tlcVkB1vclp9|Xp{^7EdPxPBt_aO1~l|n4AmqbgmTs6khp{G)5f^CFhqkO#h$qj zlZYwX_+7b(Jhon92yKalN03^G9uV0J>@(C2kCqa4rpTp}&n9XOihO|^+NNW=B}VHo#iK_w)KPz5mu0Z$Q_VPjrn*C;MlV3kX0{j{hczCz5bUfl=p2KAmAJ(3Za{?;4qOSlNBxC4 z?bB8)+f>9M8xj)4CXF2l$&qs4I)H&=YXb{f$UxagJ={|(6K`k_iNAk_rSS_H)GPnlkTE20bX6c73!5CNIQ*|Et!_k>-` zN}oNlmz5P*(FY&?H?lp}8>gQ-((OA^?$Uorgk*J1PeMYI4asloeep|+cb^pdM1J>> z5!aqAt`e6UPDqIeqEE0(OU0+b*t~+F78dIqNyw(U>a?$*mSunMQlKV_Ku3loU*Hm# zuO;VTTBink$2qZC){SgQ_)t-bM&SF{j>{}))}&;9r};jh_?~X7a?W(NQI@Jryh!>c>{|!obw?=j0!AkSz2& z>ABuQ0ua%h1v?Kg)JV}~?lQSeBURtUFVkTyMtjM9oD%X1ouOjXaki%B3bt5IVIX11 z%(L5d+FMVP*8wm%<62vOwD+9iPo_=dI8n~*;h2#SDtG_X@Cg~_Pr~f>@#}28Eg?ufh}9P zjMJzJbJzeEAq5;+KC@3IEL6(n+?0< z#Ci@d>($y;i$^hE2ohtl0{q-<{52Ni7OpV$J~ALZ7&Xst!?rW!`bvO=@repU!ip>< zK~y$~kmTnQmOe}p0Z>gLkSUOHEI9g1fw#KJt1KD6NZ0ERhV%o#FkpA=yMWP;tIJ&0 zo}^o<*U|>r`C>gFH-W_T$ha7TJKMK+VqyThGtiEEc_d;7>NrK1+F1MYe1mrP9UsS*j#nibn3Kjd}}pU zaZ|0zx!j!L&)y*6Xst+tb@}RA4H~dIg%7>8LM@Z92q52BS&uLH!^|evS9vb*QlRY? zCcIgRejdpUZyO{`S3YPq#MxX(=Ye`4jyzz~vFPAc3i8dmDjJqHPF3tEzxQF@J7PrT7e%50O#l5f{BR9BubMtl#-xdXWu&Xt1`~ zmxrty_DdpKwH=vQlQi_r^(LhpreUAx3v)+H@_Q#nv27BizQ2K2bWbpfJnhH=gpu|p zR}V!4=y-?)1T#xa+vn|QjJ8%)8*(`!nL+3 zJC}#jG1EX1QVw4cF_p_a*Px!i)!TkZgHR%hQr_Z~N)z$(&_!UdKL?KX&VznpVy3PwF)(sGr1;Gq`myA=C6}lEbie)HzMR zZKy6UJ@7E`s7#(-HOA@tM|R=l(>rnP78N;KkN6SK{DHBnJF`r|$j`Zfp(`ekOPohc zI|m7+OH4LxMhEv?gY4C8{6wmqUv!kw`*()``KDdYAI#!nK6}yuIBtkUG<63|Hyk!G zUyP(^8D_jlAv2R!f2MiWVcTcx%7;!hXxN7DeF-E_)-Zv z?JzVu@&5~Pb-e1uJ)%F@@%7ir9cTUOK2}0T`|v9Fhw#KfPx=Pc#cj$*u*Fu0T%48M z7d5POfXpAD@c2qm zqwPgY$jzrS4jfDcHCo=|LeWzcNv!x*&b5SMwp^eTP9oT~Flso7{zCkGliFHaC|b!?+xGB8_Nn}M0MH}y?c+pZJog))yuW6mcc&4wZ8h^rZJ7vGt(Z=eLaFV7`$v^^dDV?ZO z6Eb-NHW}P}WG}9A4E%)vt^4d{J+<`pq>tVGj(N<`_eod`aF(s!qgpIlo@pMNypqFQPC0{@rPYIXAxx+ z1!~Wk$wZCQdGA}#kfPWb(5?Rs`J}LA0>4u;ZY1{O{`RcT; z@a3gKd%4GN{N|{UUxZvH)nwe&(~SG#XEs9T&2^Ug@)uoghNf=DT8oABI9&%3dVEqP z<*mpm?sIC%OcR7A;ZM|n)76*X*w39b=ufSVwcW2zRTcCO; zOT|LhwaRFew8Q{_+Z~N1OaIRoBLj-AY~~u%jpQ)mVB92Pv1~6tIkvGk>fGj}14A-R za$aZ@iuYW1Ka9S%=I8@pY;5`2Guu&igU3)|U@nYTI`GX2=C-J3v>@0-E4>wV4$12tvJXjAes*pS`^?KR_BQ;mICevEt zWB1xv>s{i+^FvfqneY|qPshivoMcI#Kc|!^9s68VJW*Z1)^VI?#tKp9a8yW8998$E z;o{3R(l}P6o8pdpQBwt+6T5Pa*7Qv?=?~GUj{D_*uMFmrPCSS=KguJqXf*d7be{Kf9ded!?jM3u+t)CXcb#a`c%@TpgHbd9jd<{;B3(e*g2K?HJm3-xViXmg*%Qb3r{2`(-t& zLTJK^Dbi>asVAyE*+s6}?bcm2p|5A(K+=vg?)p|A_wGwIlr85>Gm1E#5^d@pIC1)S41mHp5jhlq5C4 zP(=jBiPMDi#;kJXJ-q?C`$Xfc%ridM-^Yb`%&Iy3yiVin*;KP57iD3;tHM%IkgOt@ zAy3bexIgaXd|*r6#&~-TydDVjU7XInlv<;f zxKfQoI6N?{`w&O9|KOGXG428ai&k;kx| zex~M9F>-{5sY$C!#mFXytM{F=>xFGR(WEL31riWyWh`q3T{K2j9bC1w=$NLulh+`` zwo2B=LJOaZBpdO7kxvxRAwGSEgo1?q42=W_3-K8Yd;$T9{+S#K8iQR-6$TBHg2TjF zJTQ?`w6Jj=77H5(myC^5Ma}d#m4u|ahH+3omzk4G(caCs;Dmp{P(FY9B=YGm#52eM zXFqUn^sNVkZ@83y`xfxT`vnpvzzmbHKy35jd+36@=wtk)*?!*`nt|gcbiv0cMZjqz zRfY|0;O<*58i<^H_23mRfk*!@M0#&`*;8%%vuC90WWdG;B{Yu7&p?h7Oo@prRC%7?z0E;}2MqucdA?=iBpK+#=UFeU(+h4e+wqCou1 zW+zAX4 zF3OT$1-}JYo*jk+6N#K!(-@N}oQX6~e%pQU!cFYzR>)u9hdSTpbY#7~r|XG-F^5l) ze_;IW2h3G?@gIHy)c*p2Q7cT}@bw?F@82WLHRD@m%P(aZtAxtlMNHo?^&d0u-=lvs z2kcrdKCu4KiQg>;X9Ky-wt=%5ML)&=lTLH*f$qD`XW&xNo%44Wz>h(GK>6ps55*`VV}|?e4M7NQIQ{}05+e>{ z61R#3$`pDwzPo|1i+sxeRr!YCA=xOZY^!{xbh<(Xe}#Yl9=VP~UgXyFPrdR{2khGU zdGR(YjLc$ z&4f>NbG1o(2`22GQlBpJ&+}GKb^P;>UB_PcVk(3Y8PD?cGXzyDxvG;#9iwm+Uo?HS zNMWWu(_3Ti80zJ_1P4p@VY}o8@8c|{BZJ9MSaZN8Bu*l& zfGkexNuy{U|7j9i-01qaApy(?>SZD=sre~)A2qs1E95PAjlSbGwB59t+h5diui0r_ z-LQJfw5W|LV|Pg1e1$T21Hu|cVQ+KB-*9EUrIaZK&q{Yjx=kjh&6=4U%rsVpduM2W zHaxov;LxJV{vr|6?%)4i#*XwAHA7cKmXoQdf-BEJB3ia-qS+VV9E?{*ctaG`HN{E9 zqA$A7u7qs4()cb?^+o?%8P}c5oBPbM8;1}MZh6K?_lqW=vrkJ`D`xYgtN6$kO zbE2s-YH;q|c4OBYe?_z1UU|RL%qjIRgvNuw&No>56et2LRF`|hLs5o;CJK!m@fx^a zvu;|(H`p4Kw$)oj>l>3;pRKFF!2^Ya7gYh7!I5xuHX4s}I3s0nhAQ)x$w5~Lo* zU&{jfc^>1=3Z@fs=QN(<5Hfl~r9BWbdmlAMhq=(5iXMzyd-P*%c-b2;)CmlK_jfXq zP2#5=X;i2aUyAZbM%-GuwA7E^#dl-fNaLr;%QZb_Jx;iu4$?nGizU(5J_P4>$ut}3>F9DvWM+a z)2ugh#DxClqEH#(xsI>Y7iJT^K#F25+02+#2r#bjo%=M zVQC3B0;He5zz-pX)7skt*@l{=yGA@bZKO+ZcmJ*}A& zHla<+>`TxUy{0wSSUx2~Mf5MajSJ29@nNm<3Ik0LrT{}CpyByRhlthY!Bj-U`b0q@5B;cE@EgoT*GR|vu1rHO;xYFjh?iUcQW$M=qo=GE&7*hGFo*< z3b#CUO02ld;_v#L}nYu(2I|OJP`TF^-4%NhP-Ul!{-4Ryvn#Lwot+ z1=pRWT9)RzOMfBUhFAi%M0_;|N#X74G7e@wvs_wdRBP>A3mM>@ZsV%ry?u4V+_QdJ zv{tnW<1X-KQZfo0ZdbIi7d}!i(l|ZHjOx!%wk>G^?AJk5a1mxBnOfF+4T~Iy^q213Cmi`;mYZeC5C&XRvZ7@vYG&&W0-oaX>M;$7S7(Qf(P83c7tbL&m{e}3W1{KJVY|dUS2ODVQ8q>JkuyluD z_Q&0$P_!R~ur9(i968(ka**$bnRNtZzs^CH@zoM;a{wGqk z(|6%j{z1-i?0VPwLk~!4nO!SCNGmM>_^UF?)o7UzoJi1%#xM6-wYT>cnI@W ztCfEclS0qiu@76O;PLYNBVK<){rOFLyWspZgY;X43^hU{a@h%Sp&1crbj3}h*UPGC zh7#z}3CTdXLJ5${@+m5qd&QO)7dpIr-DIu5!AiHyQHHLBQ46Xiqsda?cGNR?pmZUp zs5%&0q9RY~^KS!I|C+OdWSONV7~JD~nHw_i7uR2BOY7tL*A0rR(PcZ1qN8A?ZdZ9*=I;d&69i4qYN?-Dp1v zsPa$D=Re|vgY_$WudOq@HR$bOpLdh4&JmGUjQb;Sw_TH&xapIaj&B`4O3f<6Ncj}q z^EIZs`=}K+zEtui+ZVFo-6~jFcNpXl>M&?1Y~gEE5)Twg#%n6Jg^UbG!B1j`mq!;| z3ORG-kh{hg@lKUhSF2e2LtVC+v#Vfo>NM#XzNqgS5z)$1ks(&2e z-Z&p(iBP}dmk2*37J+hf1l47NG&!b**P_f`sMRUQZgsURBPQ5uM@-%nUu39*&K_hV z%223hO0@u#mj+~K*ThejCN7oSM3hFXlCsXpod%!AcE#eRogqo~knfMXw7>CQrqu%C zo;n^W&4{!`n{71NESalh>;{?d;6|YrYWCA~(}kMf$@d9x9t|LWWa;Q-tiD>n78r;W z>_wLvtuu#8z2|CuPYxPbvY3+QTE8U9(G5pS)zxFoVK^X`bF} z$e$c=j9LpwFraa-x&HpXd)Y+^T%I{YQR~Kt2I|*=_oeX@%s`{UCoDV0d+=n`AU&t= z+_9OiUV5r2YxPyqn@HVKlu=w(%t5kI&J7{E;pq(VO{28ZNlVq9^=~jy$dnoPvl<|y zL-(5_nj?iC9mmVIi}6`5p8jN80C{lO@l1&cG7D<)s;`w1TCECP284*XhRWr&54`3a z^)`3Qe1e>aBW|G=U1O3m&?N7Ma^>slsQRPl{=4QO+eX#(R<}NKaN4U1R>QlDt8*eW zsAS-P5=2O$39$YSS*Z%Sr&_cUNX}hgz$R{=GT^-5TApw`*ru}+1Mp3jkQxiNO%HGJUAd!E}yfAs54mqjXS zx;g^NB(OUT7gZTP+<_z_${w+#Q+1l-cI2Zs-El2%6ukepip0R_UkEuRBjsNTU$Tf$ zsg+B-3{)$$to|6VjGEl69e1PrJceNk?Ygu1{4{`~JNT-w(ES(U7<*33X2#9ML`ymJ zuuJFNYuktpv3SkfGiM`}p@2VUi}v1!*8j=fkD*=iR^5L_2wvm&(r;I3lKAuNrV6Hm zO&j$X{nTb5n;qkBN?b&p_Y-cwKSFJ*QFI5}=sy9ME zSK&8VY=Ay>YIb(u{EZ{q(^+Ydi>o_?$+p$>Tp)XPrQxYY8vVTt|0w=e;SAuVJQ(3^ zsql5hQG?V;m)lpGlesi%NXF`+E}`4->zBU}Q;alI_^Aik(LQc4zZK4Qpgx*X#eN&b zc?pS;G6)S`X*hTIy0Ppc$(E^?_nucFK6)rMhs|{l*|-i>MWeA)J@xsecGmicpAt*w zpjjO@!v;t@6V^~FN1A;(VH+q7sxYXiQNrU-OLyp!N}n`P>o5MMdD^dmCpXBWIN`X^ zaJAf^ahB|lh%CFAyUZ_TO*V?9Pk0&PkagPhwbu23eg^$G=kQDPiBsgFTYcCtEQzVQ zjp6=yydqgS9krNaxq3}EP{}oP7=5sUK3>wcSkH@G<#&WZak`CXxw)5=rEeKYnp_Dfj2JVP$x80n>;H=js>m%w+em*O4a;gCXk=uiuk+_jO>tkHX#I!3HFdB#Ye z$RNI|T&OA7pi++fxt_Cb7}7t`>P64XLTA2kx-0~Bn2hEO#ftJ{%CPEz+nOfUddT;? zS4xTY1GNwn!wL*Z1}})U)G`{_&|)eYbSecE3~O@E8EA|WdGyGvq?fWMl2sR=!CuDLR5 zO~kh9Aa{``*$*c4GRz-1KO>%)wVPN^n%qQvlOvPqX9-+Wu4-HCA_0qVXcxSUiR|Ro zD2c{Lv^!Y`r`amVF=ZGY`+?C3=t!R5BMF>`HF2aKLx}j})h(-msl&E5OPKN0v{Bf0 z-PU3cQfKvgi}~~el2wfkauv@qBnV}z@I$kmypte?I$FOKs`e=7Uz-jU2>dOf#QLm3 zPpm=T4gNwXf`xs{1#HkM30>>7tuM8vkAz#EJeK^1>yuX0k5Q;?V_>RUb;K_wTZup? z-8>Ru6;Jiyy@`xp3`hy^hzNt9Oe){h@m5~Sd4A@o9~OfS+*BWK)l3BZ17 zp&4u&{Jbba**_or3t?UN3q{UizaJsbDO2l|Uye4adIx8lKlexs!FyCAuc&lPZV_~x zvb}UhEKxPSgRO6_=7#-cW3$jyPsWqhL%NQkM&^b|F%axiTL9QS4(eB3k}Dd3JY_b( z=25O&bmNiF&1HwBdu;4kaUPNZgSa;<%p#ugt z4K8w!s~JDmOCI3tm)Q>kAO8nq?-|xa*M*JJtMsNc=_OR@y-Amz1VU3DlVUUXzv-@cl_6w<3`>HrD@*BtCr(oL^Js182P?4q)iW<``b4|Q zj+kd{lah5FR_MZ3`O|g=*vU>fi1doHDkZuRW1``{eN0X3w7pz(pL}V1PQ@GNtMyQd z_O@N+-?>EZrxfl5=A#l=mV_KM3-#4jW8c(V-J_+aAIRAQ?PDZwJ~Y;BLDW8k5Cyxh zbG3+KL&}~k+6(B7_mMb7>5Xf6W9e$yRo6fE06Kpgz^a{oLo_rlm0*U?{r8H|LE8EMow%UkIczH62X%HL11d;`gRb3xD`4zDrYR86!r@4Ab(` z#r6)|8xI>$Z^E)pQ(q!LF=?UH5Cju0d<`5FhQ zy;MjDH{&N^=(oLMi&LA)V+p|&cQ{F!NcSD1-UKLvGdKv-2`m!02+$)~D`>53SYiCe zgz7)5H2=zI7;&zY@pi0lLY+hJbvaON4G4(+@EEDH%A;j|r&dsY8)vaBsk^l2`Vt

    |UG-LKI=b?qKRm4JdHE2cxLyYt^{4C@p+c z-!`j%?C{wL{$;R&dLPz6JenCG4X73NuTiYa46medm1`&{cT*7sSp+wo9vSZZ=;D26 zn0{HOdoy*tvi>PUDevN0?Tq+nrmM(a9%jt1Q_iTCqr*aI?B?hib>j#qn_$aWY&2Dt zFomHrtOg0(7OrM$n)MU+UD{x35;{W6w!BqO(iSwB$`zl`Gliu?m4U_7{}4el57Y(3 zGlEW2oP4`GTlx3D%AcVshT}Hf*OganYT6L8wlo<}mN+?=bw)xdMGJuq_L{0SUcW?u zLX%xUarT#w(24WvlOJ8q^_o?rOzToEnUr;^JguJQ1s&dm>s5#E_F9uL;Yd_WXYc+) z6dZTkKre|&S1;%u<=9~AZZf`nojlzCD|49%jZl!@vpR!Xf&#LOQiuem@E*>>=VLX1 zPkZb}I{7TV+X(s0r{{2hVebHaNvOT}(Bp@noRGj%x6IL%lkL(#lHDS^TRJ(eP;eGf zf1O={X2Sp1Ruia6IDM}6qD&XkB7b|7gzOkH*}p9LAghYkm*VY@iV2bqY_$mvcp~y; zPKzZ;Y(;(VZdFF_yf0ZuH$ zr=Y@;QxKYnCyP7_;pnEUcIrwmr=R>_X6z;0N~T7yN~k&sQ_{8Cr3qQ2An)}4GJ-Rd*pHsMrq%9f3~ zoVP+w9iqbgUS6VF%g8~oBq0t4OQlLAEJ~PGt#1$CT7`<rMw+B8!D&dBr&)7|Bmj)R3wbN8*Cy)&GdCE54X$&JqQ?YwcfZ{OFm1uPK$9cO2w zb(`lX4tAW}NOaX%ZFKqL&|R^CB!-;<$KO&e)LeB|1sWWg_*YC;GrIBL@sNFtH_KLj z=L*#GPBP{xdzYl1Cuj4Zlu!`it&UjJerF%^`S6;$C?#m_%d&v8fMqzF(a#c_uqYAU z8re>d44CyLNc{tlWQ{G|%)K(SasJj4|U5cU5~lfF>&BB4Km&Z7~@XHRX~t35?8AbaM{A74YW|a5`h_rK9-o5A`&oq|Gx* zGxj=*SuE(?aZa;QsuZbBNLHtw(JN%d5G(6L}Ap0+s;@Mm9Nh*>~P`wEl8PU=)lTr9P zSAl9Z(}lQ8#4*f{Sv(!FUVnf{yZN&uqr9K75PDOfRw_kqyLZ1_z`tzXZs4;L&h_+j zSo^rm#Cwn1pnLvLcfr!HzNrrim?EWI$*MBl9k;lF`sZ$vR2Zw{A~bY zQU(8|<+ej1(xJFP!Uo%5T7++%jFtiKzOsS=O#5tYx2wg?nQb{s%0#jrL5sAz-jakn zbF@utjNK7$_kPJ{e=ONd67&9!`RDAB7}0?P{s;QuoV4_-}xtVJocvTiePo<9v`_&NEk4qR-S^VtHf)I>~_jlfV>wvL3q_q+$<1f zF{{O0n3!`#3kQ@E`mjpT1~&WHlg*@HGH7V8acMc;) z9t;n>(GjRteMj?k0TIj5>qtOK(tAntt4W?DtDCeooJTVl-g2BE|2s?l83skdXBftk~4nm5ef7mhoG zkucSWpYf|@Y^3u8{S?`Aqh+O8R-5A%_9j11!9>%X?`410-tP`x`)O7uXSzQ!A2)eG ze-c^b;{+V$0u%>r!(&dAKx>P(d6G$;QBOp(I=CLq*iBMX*sp=nl%(F|Pf1&D8N-q$ zS1gE5ftQOO0* zLox95ofWWDz6#2$Cyyu^rghxFg{X9P6scDAhfiW|{nV$Y&COqZGH2v%S-4|@PQoo3 zu~Lf{?tGIga1?T$EYy)7VH0tjq##CV)~sjt{Q_hTJaCSIHF_vRb^5rn z3pnSdI6UUo!-v(foaUWSo1+=etJ3P!0SXZ5*;4bw0Ud*xm5g~X`}%b&BgQMKxt6G96pb@hHr^&QfSgDSVei{}>-rjx_<8n1_BzqE`pRE|ADpSkV=r zMh>VAQHo5#L_GWDbB7jnNM-skdSiuTVx`Jo?=uXPeQ$U>} zm0^Z3u#sqi-JI@TH!;;4*>c@4`Aw8`iw=*S7a)&kyaLgEX!kHbWVdpD5F^S&d?rs= za}JNi z^j<$bbgry{UN+Wwtlildy5RTPsK6;(XcUEzO+|#Eeie*1CGs~+K3*{~NQz}9uo56Lxy0Cct8mKAJ#+U5?X6xg$9?E^+x<*e zbY(5DZap{p>qzUN4l_&q36M+lb&}$(FCO^8f+}I3Y;1m8OCw{D9+DJV+q-?+gaJP30e%c?Ujj^3 z7AW2W@vE>3w6yff086sPyw<_7uV2#2k{3YjKgcAqXn@_ewj-?SzSqS_Vjcv9*-oE= zva*2JtAG)U!jEjQ;`?cV^$dz;Mzy}b0Jc6uyOm=2tU9U#eBT7wQc}QZrmsKhHoIl4 zpp9*V{BDXseI*ix+G`=Wh`2AKL>7oM4umYp8<)5wcnTbJ@)NSAyb8kXFXxr;;~Z>_ zrp29BW8Jw5m)*Upt$bIlw8mdCw<<35O7xzKdg%LQ6_h`#bq}*b4LIA9VSSBy#^uVU zPwl&$S>A`GXNSZsd`-giIX2O#KFv*=X2_p<`4cQjEwa}}6pc_%K_#fp4ZE(QnrKC9 z9gU5_y&0hL2vEj?FnM#n^hUbK`=CSTg<mM7*CJ-Nnpr0UdgPgBW zvqvT?8VVU@qQEk`Oi89;FJeD+l#5R=(keiFF^%lzXR`%)k!`*UfVGM-Te-1wlVXKp zo$>K7MRzm;%O$FX*9#?c$||})YprNJHQ50_FLDe}$emfx$-d4=j%xDN^HUJo0`zvFP$bbp-PT-w`ZsZL;0# z*MN`t&Du%QRHFBD@?q?3hS~R^R&=!_^H3u#aqI!VPs+o}v+pUsOQ{A!(>-=oI1j>|pTh^>YWaNx#-sl<@~@DLb1~C_E7p7w@Ty13bj(@p?W(AA zsB>2qyTkqPo+49>GdG(64<>-5FH9dHF-G_Nr@1_)6ezHFP`I;BGYiM=kW=*n$pE*l zzc!T&PmCZJv~Pw?%cz-^%o&B>6^{w%YymT*f9jY|p)NXm!9G1}KwK19qFcn4!2%g0 zqBWIz3DyyvWNMCK#nolr%J{ozT^9xhA*mOkKH_b91A1Zh2D^pJu2|EV5Ggt-Y5QKq zbNu>o8Q+&MO#@OI5Yh&5N|R7cFdXqO{zv&ER1L;9Jp!zOpe>h{*XLF!C6*G+UD#Y8 zd0+(f&dmcx*KwCMx&mi@k_MliLF2q5U|3UQrG%qyC3TxH@?=~kh$_d}o~?IRwxUQ< zHXv?l=PT5p7TO@2o-(n&iNW%Y)~|3FOoiz`jPxIHbZW7cJ|2iOt=sQZNu%lLIFHG% zczE12q>oahsQ1^dcz*b?pW=k8jWi!6_@wBO=3*dD-um%)TA;8|RunNLiLEFAn%PR?#f%^qQ(@0l?U=qjBApI=P- zgp3h0f5&dl&?(lbRhk8;3j;YsqOy0A^|VaJf*cx@tH?X-mjn<#JADyaG@Z0R@JZE8 zf4To-(qkj{Yx!@fm&QM@7u#-w<-&)t^ZdXjW1>S;|3H!2Kyw}4EfhOn>Ac||x6wuI z{Azzna`TNW)&<|{NP#mGqe;tg(z8aDR^MKSVTX|e&e@90o?hp^vOCm04+<=$7KlWj zZj8Hl3lpn?9 zqTn2`RfK-8Ef0|tX1yg>{@V{VxX_Qvt^(OpA(~ji%tRrQzYm@`i)^1*lD~}<%f3pq zbJEsl#hGJ~nEWL9D@)Y+LGdGZjD)iCR~g;Dew&1{y@oY9J1v>h)8S`N#efTkOt(9SrklmaDYfSq9J z@;0OiHTFZ5!kRqnNLVgoK8s3z*oHzhlM=3|@DI`2fSzdiqZuE04V@L)?g~S)jEH_p zb<3{Lxk;J`G#P=~cs}N6Lt76CqW|%Iy(;4(lH6t}QN1o5!&VudZib9|HCbQ9zK8gS z2-!v&`t_}n!AusHRj76Ye3wDcB3u49uj1;V7Q3_h@zZ=$v z)O0od@*U0eX9nu(%ls?Qna2am#7|>>ViW@(>sAmvLkT@E8+u-bKG)B%EaG!SrcQ3@ z*U_3bgiy^z3EqGFw;=FHY&K)QB2`MxC{#*_Rup2g!rsSoZ{4|+eWORU2^@SttvmK` zZ;|VO{Nc`OAoWfSM+r?G&3=y`Oza+G$pWwUU?zpKBdutKK!io?QHNnSwa@J&y2Dai z|0XP%Xd+Fs4mH7kf|emxLxg!AsfqY?j{QiS@oO-pYAwdIK22g3)3m+{`Tg9M__d^} zbZ*ZUQP)k1^lDMoaouBQ8*Oq+Z?n+f0zIsIh4WTArD$e-XC|uODAB=WxMM%T+W3iH zdkp6JG86f*ENVIsL&uPrjbmv{$PZ472|r;-D`8{j@^)D6{&frQoDBR@$~Uas?EM zD7<|8-j2BuxG!|rm6lBw^WgRt9-a##C)R@z+uK_b%=vXq0u9b|pHM~rzMGN%+U7vW zKfebh`y1Li4vX@;DUvj-kS`y&Pr8kUzRx?c2ZptkSV?89vpf=r^m`draB0q=6MTP0 zenwNHMd^nL=>S?Sb#nDxk-@|$yO2obiJZbQ=$wpm!JigQpV;>(dRj0kP%R0WBAWD+ zx}Ko15?kHz2~*C#G>Qc1fO%Oe##J{2&Mx(^S()>ZS#8rZ7iNvh+8>2YpH&!*H7zjx z5kDtd(fnDyh0;#K{G?_6E7kj6d3;ZE5j_7h-h(Z9Y_xrgd&#a;v13dBC&X#AhqF!K~=}`A5Ucg#^t`%!Jb>fss-cm!=_) z7wEQe-D_i!=LUemGt7tN2c}WRF$Mz+H(} zZayjL)eQ6c*%>oR`y0!f=cDMid`7R=2QtC)(!yXTXXnup$jXn5v=lcrnf$6Z21z=GD`(TB4)!i%vsnHVdl)f?~>B@rte9R!fC8bAR3cB;=17ta;1W! zTR`g}_3Q%U#i-my7GvDt!Yzr`IlimvM0Cs$^`|p4bLy^P)1X&#xsNj?$(RNn?_Dh_ zQ94a>_m4EXz9b+cMZz68pgRM+P*qs13SwSbb33p*p=`<*vP!oYx9F@-ASvF2G6TtH zMOZ)n9cEw^c{CJZG0;P|2-HH({Hk-Q5OxyJYB7(K>POFX5^o=(OhW&4j#W3|ivUk! zSuP#Lw9X?z-;)}^vmN#@Q#QECVGFyf5fgyB)a50ep4Zc}tnUQa<4vFhX)*`+C^HF}mF-#N$cS%PCPleCrSK| zuY5#HnEEcBOGfBz;WB>M9pH+GtU#l(0cUTdkLY7dEOD3<0Wk!2vcMxZ%I)A~ zgln^TW&IKr@~Zw6&;U=J8#nkS%S(N(K%O%;N*$ItbB}i#DRj>J>b0w)+T?CEobna% zv|zVLb4wR@V2{z^)El=|+mdfH#P2;;q?2MAlnyB478uCZ1FJ{8Qq)l7^;51yQOJr< z@c9JmaqD^kAkm5<#?*6aSarTUX7a{+ye`avAEYd{-@se~7K9Rp4)uJ+hdb|yJ26Y( z`^x$!v?IxHczy3Un)Q3$zBy4Zvj5xM!?W;N_a{E5jn_D*_Nn*3KG6Tonslvd%tWJV zt+rE^r9^Y41U8+T4EaepXvL=o1h}k9%ABpIy_t|HOw>htAL`Kc$D7TmtJe$q6*`WK z^7)NFMo63zy)-QoqGi3G8J+-fjXzNqY=?88Q7-tr|l%$nDGk$Oe- zPb6xQCMM?(o4rPr2D|=eB0pqc{AT{blO=6fb1X`9U;qka z3Bct@$i00ZMh#1E|Exu=?=5zD;ow(&Y|zGI(<41MIE#6n3kuVN(a@ym^M4}O%boAH zRJi1O>_I|WIrT&qcG$Qyn!5%>c{ebw;NZ zBxQ`nfm|!<+ECNa_ftzDPL2Q|cIX$qL~rPCX>5)dw%atwBIR#O71W+RO>j`kHT9Zr zXD@#v+jH93V#20&{j?3agLQI!%K`wRJWJ6EXQeo`n?&$Hkz4$H=kk=}U6Kh;I^-I3 zQ*&G0+VX8jwiM1<2}{!Sh}R@{e?1m|o30=rbY}1c7V!dtr=phafFw+LrjUYycHo!C zMz;fT-<^W(!-FXVb$J%hswI)W;g>BIK4F~n{F>*00+ILB@K2-ObUaHZ5bnty2z6j+ zqgxpQQ)QpSEqrf1WV>_o^Mj-M7Eb|PM17jYPxw{B1M|GL9dje+)<>}y6?p%{zsBx& z4fZ2MCCj)0bNMd8_nE&?Zy>R*Ty+8ZKKBNmXZ;zIvS|PZQcP7BY*!L>STc6bG+nTF zJl{gO1A6`@_he?T?}Ct9^y0tp-Q^-?h1|cf)TKqqGbajw)T0M@2;iV?r3?kj?zEi! zDo^b8-uNXsd@I>74-@C?-?`$&76;b2t;8ou3;D2#3uoO5g_SPwz2{e4qj=x#rFl^7 zFkJU2G{t-2GfA^;g>oXhnW$yBLd#f=o!-{4T80m&W$0me0oVIqJ z=^h^bb8}q@6lmGXk9dP)yO~lNh(?vi{-H{+q~LD{c!;Uqk>}q(z`c=M}^*+E0QZ z38NOJ4O>AF?v-V=XyxGMc{P`A+7|$4A^%n~9+UnrA@-W%86R~+fpV_adqV0aO7>5^ z)5hf1h0`Zo_vo%ClE%+6%Xqy%Mp=D?A1&SXXj>;_eefq&+xu4C^0~}0xA=rcy_wO{ zXYP;53uVg)H*SXjT9FTQ{445Vj;h|_W%x%hXXO=ld5*=}tyPiPrwWxz?~e`ST)1S0 z&7sSCkkqA`O?La3^R+_`bQhyylmtonT#IByo(}%Ihv{3&{;#I)sk|j@mZ2w*x8Xhf zFUX(LyWi%+X-fwUPBpwxYw!w#BR5ygF*-%hYOj*k@YY$gP&?#wjjz^FZcKe zqkfIX35^+!gi%%o!-U~#`~@0z=&wG1QdI2xmHg9_1@mH+oaq)!jpn+^4wnRr^XAp# z&}mH?KeoGSzeQhcaSKdSKZ|%=ZI8ruvf`xV7Of`?Yuqs6_UGbz5ovR7)V>-^Pmc=y z633Nhz~X6u?cRbqXquvV8ms|$q-3f_e5&8=1WkPUx>MspnMk2Hr(1pz2bsfonP`pEf77h_4*mK9+=hOc6)-+ z$pz&}@)jJXraCU*Ld8Rl*sKIN@fp zx4rJ;5-axb1#)lSHoZ45&FOf3_2TZSWsZL?5rmH>gEz;)^$&4!Q2Cz6!3da2@fH!6 z$bRQym8Cm0DKO@JZpLkx8Qy11853Jf)9!V*2|_Nrn27}12T()Q)EwAc8+v!Lh-AAs zrDHq-jb3~=Ez%5li!PnFj8dxerPCoWa!-oqFdV)fgEP7=YKyLf%o7O!Y2^|XwqgbD6PR-cpVrgb)Xtxz2xqYa% zDWAU4yx>`&j2<3^>(QAvE-lIwUKPH>S$V4@?V)46v#07^_Gp>VBgI?{tnE-wH>d3M zA`4rFbFWJL7_N1gOYrEV)}H|w4wm1u+V>89 ztAbH>VSwXNV!2n*y;0ARwv}J&8Jh+*;+Y$l_VTNkwtItlg?{~cv%4CWfc@kXwsJ-Y zA$`jO!VyEi-p_K1FnUw*lTMLa#1^uXR=^^`zPX&v0Z9Y>g=!}?WJ!m=NS9!-u7&TO z8!hr@S1j>=Y+OIVO#58)5b?$|hd}bxl^KLhGo<#1m1!AL_e-4LP+vGnO(5jO+ma11AaT@A;jfUcMU1%J{2L6jXQ|0lKYY2HG@Og_iNQMGY4C3TU*KS2*Q4 zMg4)0-uV0h_nZhDAX@x)&Erbno@SFz17JWa3a1N>iE-U7Id(wFJ!;u!BSk$_MI|{x z_1Swh7Oe!nxzaj39CP9aGt__5aw&o#kqIY|kJx9V(cwD zx5`RL--+%>@ui!+r2u1N#rv}bK5l_KWm;V~?0xsFGWh!4gW!9R2)))!;W_hO=jI40 zwFP@S)?XL4x-d`PiqSY*G2b%DkKLp1GBDRS8oJtd-H7@jrhRF)-d;u3nZf5kX79dL z3`-}xl~%Cj;?Q)$>fp~qX__9u8D(UI^_Z8o$b2dnOLmhgnQz%m2<4bKP0VzpKVHEpAW{ayvo^)t?aJiYiu_mwip$V>d=~ zP-2O*iT4bn$}pRDWG1;&{U~K@nM__b)dgoTo8$7u*CT|6E?|;We7PyS-P>lmgzF3V zlzy%kU6ZTeTpwwwTFi}>K>{bJUvL3dl6m;c0FYw2`l8Ffd_qnw7Ro(eplQ=|0+#5q z(%Bfd`bqG;ec#Xpo<-ZX=DHBEr3PWn8=ini-G#`n&{bOxK zo-^_nSW+jhxRXkS#l!faai)8cn#JCC=RQG`>zPH$gxODeo`PMB?*eKYf62c=-A-=g zRfow_nsyei1AnHf*6J$&AP%AQ)g4FviR{FbX%<&SvBH4wgB1mvABkR*Y~*YJ?$}aS z?5wQyw-_=PI5;f}#9yBQR?O8J?+`a1bKP0@Gp$QQJQ!I9!6%N7041i1*&TSDP-K2ocD0H9$BbYuQv4}_2suH?I(=6Q1_k}8){NqWO8u2 z0iC4R6t1I)`%rc1QH@KukmP&?w<3#8$}#%5hrl$Hzy?ma^77?;oA@ zd56DCQvOR%O<}YbDeXe6!8mtwm#lZ~HG$16Ol=!MWY|k+A+fgreK_d7dK3PkINfqP zD(_0o7{RX=N9Amjxv9*XIwK}4@rE_)NcBRXkcq7X7s=EYr3l?-LumIezx{1EK z%eI6QUd1G4>`Od78jsU@b2IYt6`{3%hzLioU;MGVe)Hz($jd{*!tk3X%eI#$&@)OH8{N1jZOM-pyZRp)2zsGYwN`AeKB3!t9W?=gbzM2rEd}6+(A<+x9#QmzN+RR;! zCp;i+*W6{o1G4(C%d!i)9uhBY;4JoibQud)BV?)5wq-A(nfkv9&h|gWD!Q&kFNz=2 zOUwM*kL)+;xb`GDAM5v+g>tv3R*!v_Oo4?-kZ2GZrE8&ecJ%YgOtI;xI0?Kbn z0gPn;nw=~91nRz19lX^0+7=6HHPw@=1z|*3=vt5vZ?h+V3LS1TUBf55Z}ePQplKml z?ORP++Srt9a3PG}6q8h=OMtKwJ`yGlrUV>2jE0qsh9+;|G|zalQ;{F3 zzv6z+JPDIZ_P=@hfI4wx!}|i_Nzr5Xc2oAtC#-KA)Mjk6lf>&)JFlUw_wx;T2M=2p zwkQ?(RBp8g*MV1ho{{!TMf}Y!GmQX)7sIk zqTN@8je`k27C&sTJ&~*>pQGP;$X~D*ShJXgM=H?<{OIreTEI+!f4S`R{Na$R={v0I&dbPlR zVNoaG7&ss|VkAtiVzAJP#tKj-g$%Of3LWf#jfi_j!jhUY^2-f}?<&|4xh9M*j^8!; zkQ*G7`hxd?)`a%mQY`8eN1uqN&W_0qWlj%N<^cUztfx8}6 zl78mw%Tm{$g`JlEUx|M`N0&Mwm|s(Et?5x=_qRIkRLV<@W&Vm_qVzX__PupK2A!B+ zKXLMXq0CXlt#h}yA^x$VY1xm(C!FqsUx__bHM#3ZKAYby7I2En?~;5^SLB)_!R(rR z1di5i^LeV56(gg$WH7Gcgu^9IJkB^iIhQo#Ef&eEgHQtbAFnu~pT#sW;GM&-3WPt< zJ(*nb;1)LTUd@_*i%Q%716EULdTFkdFt?HIBPIJ?;V#5luOsJ2*^&KghHph3N3C@R zI@IV6;kx|I*carbt|-uWcRmlv50(+t2i~d&OMEPt_^@rdM4Nsbbj46YLE4|gG9pUs zxHouaFBvcXngj*pGOis7}mLe1R^kQmY*dj-9DIo|3 z?ou(^U#L|tre(@1M#CzG2e9(-I}`poYIP`9Jpu;K@cq5<3p2>z!cYY0)IL;F8c<W}BCzpnZ=@Q1KPkG;aa{vDN&uBbYLA!M z)y1ZU9@x}10lTPIC!tbL%+|A>PWZt2tEHc#DyOn}Z7i+noLHStd1PZvKR7l^v@z^Y zZA^=eeQz!6EfH#))Ey1V{!C4bNXMY*t~ zaA`=;N@BZ}Il%7XCw{9^q}8eULiJx!0m_706#Ej`iqxaPN!H2eP2e&!fj$I88#aQ+qWp3C$wdk>wW$GwE`>Rv@ zLu6Q|xk=OQ+y%E|(`>1+5KuHZ0Xa9jlg6uj1C(Ml7R;^|?`d_OqhN>`*zk@wEOG2bVhl=16O+1k z_Vz0joZ#QQZ?pn7CStDK`+4lpFt8fnBXSi>gMH9Lj9URW=}!d(;WQWU7NJ*#0)3RS zz5whSkXF%%GJ2~ebLdg_Q;{;05sm3zte<SAt@Uw1>wIiE z4>svLc+{wQ;e2=E!^gkwX6HdEfBqqY+?5$N9Zl2f;#BRE6nqdk?Y;e`?_{$dsJn)B zA~jYfs2*jN&FWpX-+w8z0B8Ij;H!)WTk1qw%WcB|7Iac9p*Pesl(l#$cvEAi;6WC# z*Qvg4GG>!~ZxRw~^2avz?;UgZ8-sW^@~Acn4;O&;Tf{MB!g~Z8k<74x@?oQGmqTs= zI+sGydX$+Q5a&74$N3%KUy+8Hk1f}#{^oawn)SPK-tt+o@eL)JZ~yeP`CJ#c81}ju zZ%X6eMkt6DORPkCQ1@P!Nht@U#m+BGrS|YLpZ?XNz+&;%fZFqL2mp3WS)0yiB>WH@ zMVBPA)!a9nN0%iX^e$e>mf2b8A0l-D*Uz}!kL~{uQO|yn_=|!)E#$U+V#5}L;T34M`>^h zpIETB-ktCY=N;+k7LBaDmzN~<9{h*Mq>=BBt$RXEsjG8J`>smN;F5gesRNj5bPs9y ziB@nUv-`(0i^q%$o;gpuiAX5k=bWZ43QCNYCQIKC2R5oef6pinVb?;hXXS&?U)O5u z?%kKKo%dF`KbUUCLG_I-gnPV)>L%B0Qp~UKn)`DRaswX6RrE%2v_nzsZ}lFytgWDQ zi)P$9{4VR2wGi{cdN4bi*s9GAgu5)t9-O)1Cfq*R!hjW29F&fQ`-#{=11C{ zI+0rKslL`LIftQ-<1C_Kp$v+{e$T2^4j)<*rK^iVe{o!eBCD?S!cB^_=W7TgE=~5h zTUvJ&;<&|ThZ#FAUVi3YWZarJM*AaQ*Ou-1AzQdoP};%YmKdzAV8(>Gk_|`xisRFM z8gL%^CAR1x!gEC;BPd}=6;KrR%B-2q?6Tg!qldwV9TI*n_1C9QFu=f$KI=*yHPL@y z!MJ5Qpr07}XgUi}qA;~W0 ziNsgWr37@*EgJ?)eCaUo=W>P>A5m+*IyC~FX>iQ84%p1T>30*=N1#5A;#c(>M(9$q z(u&uPZRrY4Ab+?QFu$AV$wszpg$bt?yG8xZVfVlcg_g%{2(QqG4#E3?_mqO6A2eq; zwZ*2OZjm3A$CS5 zHoNm1aeQG3T&NzqVSHEh7aN^nzr>zOE8mTzbwY+hb|4*u%uacNLk4HDC_4?)kH-m;2ncbI2%5m>F!zgBH~KOkYL;J`$5SV1I6 z7NsY^UQ}1=U`36Zw9L1RdHQnHP~D-mdVNuWiK7 zgSEup;h#VlAodq>Ir55O4)lu_MC4W(fP#7>MYAlQZTOP0x+*ZeN--(nF}#t;FB^N~ z#`=HU!UWo(Hk#x`O1!Rp|I(-n$&9!G5D~g6efp6^r1=5im{A~pGEAjT1xATbKW1MTILtkYH=a(^`%f) zq$r1JJX|de$;_=Wt6OaSw2|~9l+J?ILxV%bpa8S~yJn-7)xownMQ6Kaa zNE*E|O{*{Kpx4+hBN}O7`ThH0dFa+O4iQrkX{DO$w#JBJwIr}C53|2`1-VJTc% zT+F2T4ZaZKb5}tGtkkWfinv$*C~R3NOypjxmUm@wn`yyzRNLarPS*7h^|_ES*sMy( zY|=t7zr&nZFI@?PQyhx3S%wko(FM`mI`=uO;gxW!*!^9rVNDAE>0m{~x50ibB?oK8 z8a6P6QYy^mAkj$?4lXMcA9iJfS5%Yp6_(0ys`=e@7HsNl#t&+&dHx|1zQ0h_HRC@_ ziGeHHuL7KETyi7n3Y7j#!=U_@7o?b0&v)C+Dw^}`A(pR^ItTnTDe(=IQw5B$nF~Em z4ZXS!Gw%H=x+4a2+XzMLSy6b9mP7@nls9vpM2PswLhRy8E^+nNCl0T{z9FDOhD>kS zdZYY2cHK?Y`Dds4_i8VJyxn`Y7uBUtn}|)0(J)@XI@NRbYCp-eB*FERiQ4uCCmius z`MhTZs)Bl0;YBggbbt`I}Sq+Jlqp&n2q>hYar2p_<2*0^{7$k3ET z8Mx7CaFxMNlSorv>Wp;mr~RfMT_6$iNGyNAxAifouBmo&^3HN&7M~2ULNKkRaARCL zIrl=EkR@L?E2R*p6)Cjwx_Z_A_C=HbH!mMa|4pVN%Tru{zfblWk`~WZWA$>uAefV;TNVZ{YV(24%6lP%i8UGFpt0 zr0vkaHa^;V=&vE;cj_)e?j{Zl1#96g8DR>)XUW?L^CdI__01du2WowbAm?t$Tod`w z9F`~s!ExmZeHB?NG-_@l-Z%1g?0qNoDcmlcB|Xc(M~}Zg3h@r75>rG((%?&FN%V3O zNPP2g=RI9L*EH&WxnIX9aA307r$~!{C88mKidc~ZI1cDPfu{t7kvI(qMt)cLnUE3< z^6|>!GDVJIponVY9W>FjC>0K?)DM$~J!AyPX1IS5+IKd4jyW+KbAYB_ z!1yNOOZB3Nsiwb#HJ9rA61}rx=9dj#B?B0vF-Q8&ik}uHHB^+|a#t=Idg8OPyPfK! z*Y#PKOKAzNTCOTZ9o1yWPU&t=R~R6=g!l$#<)tYLT{j-RrqayWJ9~W?)g~0J{B6}_1w>gaStCr#k)Q>!wWjhcy!T7moOsJ z-+ej8(01jWiem4(I~MQDaTk^&{W(b-t{mH0ZWEy!7ax;+O&nrb5f69OUpPH~48I%g zUxy(vm?LqK_IU^SD6}PrNjb$tSn+ZB!FR>$4_TFj5EO=&!7&5h&%sQ}pwh3C1`U)1 zmlG2K!@I`;5H$*2tNGjco`c>aQZ(N=tW5DkoiEJlj=2Dyvo@T%#)fBGmur%yQ_8;t z9B%O=slVNUiv0bIoWL~__PJX`qb$4l;myWkCq!wkdG9UkG>k`3hpZjG=QZHbVrcN7 zOICf{?tPU}pF=1LYj5dYxbsul(#_XDVf)!(72s#0x|r<_EVEH&Cxx++7!w@CoHfW& zerOD;xO5ol)Dihzy^%P`Q#`P)fCzx<5V7+#>hG5?G@9~V2@Jbj5czi$ekP+99ha?m z-8(SumLX-qb6%q4wHlVrbGlX6L@Saqw^7y{-0VEB1kSh+#QJBhHt}Ou#e>eJPZ!z>9Uaz?;rxz01NN+MA*4xk+PCaw7qE%Y70^*V$X*?bf{l#xw z;4&b2)_1F~Xlv)yA^7M^}*`-6~8c z`xCQ@EboG%Mc(Z!%0$uR1fDRHk;${?ML64zDeY9?wyLfsLf7%aLna@N4H20l=Dm+H z8>0$8=~#y1Y?#6*pPID1y3pt~PT_)k z!~v#QLSzTQOY#qqOMF-}hmHCW^@jopp7qfZoEyTrvUgdJN{hXzgAk(rjXM?3s`p(2 zI%9Id7bR|!;n-xTx5R~EGd*x3anG45`-=zaETE<7yy-Zs%E3mWYM|;(@%G~t7UWc^ z63iVBnnK7+kP|=y9nJ+QEcB!v_8;@10RK_h5_(uJ!u-MuGc7LXd^Pn-EFfZj2PKO@ z|33ikKoP%hvTT!kwHx}Al{u9_Sx~ite39mvL|B!9!@0*$-c>4K83Fh>z#gLuoCE?M3AP%LHbuZ)t571z&QEo$oMi~=5)gEHlXsO) zc_K*~woQQb@T4QyHJ*D3A9Xl$er08#> z;;WF~QhC%r%B(ClO)1H?Bf(+!x}#;MQ~|oe((PW>ot6%cmW?7DP;7et0JmaIqs3z+ z5+H!J%a>?Q&D)vJBeOrpZ=_E@|LH)hHB2ZBgXrbUr# zJIQiW$f7#7>L4TJugyUAEsn^{SY1ci3r&+-15YKPp+k3D?4fD#LS{K8nBR5Uc-=9; znAvL7QMrU)_Cj!<^(j31k5f>T!`_6;piC!0HbvejIiSMri)8bB7cg4_F32muli{LC#X6ev&>EtIKJq$yMNrDArK zjtvemdvyyyLwjtfvs^V-%juSp&1N_zQ+1Qs1rgnpRESco�n#1q*)ai+?vliH@x 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≷l%0sRN6t)yM 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�fQVk%pz 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�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 B;bs5; literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..812ea81 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,100 @@ + + + + + Ali Murteza Yesil - Blog + + + + + + + +

    + + + + +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/pages/about.html b/docs/pages/about.html new file mode 100644 index 0000000..e06722c --- /dev/null +++ b/docs/pages/about.html @@ -0,0 +1,91 @@ + + + + + About + + + + + + + + +
    +

    About

    + +

    Ali Murteza Yesil

    +

    Mastering life through art of making mistakes. +Smart people learn from their experiences, geniuses learn from others' experiences too. This is why I appreciate constructive criticism 😃️

    +

    A computer science student who wants to live in a World where everybody respects everybody else's every rights. Everybody deserves to live in such a World. So, why not make it. +This kid is looking for his calling. He may have find it in advocating for privacy. This is not to say that he is perfect at defending it, he still makes rookie mistakes.

    +

    Nationality: Turkish
    +Grew up in: Kenya

    +

    Confession: I didn't know English Language when my family and I moved to Kenya. I only learned English Language in Kenya since it was my priority, not Swahili 😐️ I still would like to call myself grew up in Kenya since this is where my personality was shaped.
    +Confession: I also would like to use word "nigga" in friendly way Kenyans use, not in racist way American tend to use.

    +

    Favourite foods: Sarma (stuffed grape leaves/cabbage), matoke chips +Favourite drinks: Water, ayran

    +

    Blog

    +

    This blog is where Ali Murteza Yesil's opinions embody into words. This blog is compiled into static pages to reduce its carbon footprint. Instead of running webmention or disqus based comment system, I decided to share my blog posts on Mastodon and treat messages to those toots as comments. If you want to comment to my posts, we welcome you to Fediverse.

    +

    Static pages generated from markdown using Pelican.

    +

    License

    +

    Everything on this blog is licensed under CC BY-SA 4.0 unless otherwise stated. You can find a human readable form below for quick reference. Below reference is just a summary of your rights and responsibilities. It is not the license itself.

    +
    +

    You are free to

    +
    +

    Share copy and redistribute the material in any medium or format

    +

    Adapt remix, transform and build upon the material for any purpose, even commercially

    +
    +

    Under the following terms

    +
    +

    Attribution You must give appropriate credit, provide link to license and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.

    +

    ShareAlike If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.

    +
    +
    +

    CC BY-SA 4.0 badge

    +

    IndieWeb

    +

    I didn't implement it in this blog just yet. I will work on it next.

    +
    +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/pages/contact.html b/docs/pages/contact.html new file mode 100644 index 0000000..9fdc292 --- /dev/null +++ b/docs/pages/contact.html @@ -0,0 +1,61 @@ + + + + + Contact + + + + + + + + +
    +

    Contact

    + +

    Fosstodon logo Fosstodon: https://fosstodon.org/@murtezayesil

    +
    +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/privacy-for-the-whole-family.html b/docs/privacy-for-the-whole-family.html new file mode 100644 index 0000000..aa15f59 --- /dev/null +++ b/docs/privacy-for-the-whole-family.html @@ -0,0 +1,103 @@ + + + + + Privacy For The Whole Family + + + + + + + + +
    +
    +
    +

    + Privacy For The Whole Family

    +
    + +
    +

    According to my mother, we had internet in our house while I was a baby. Internet back in the day used to make iconic dial sound, was slow and would lose connection whenever someone called the landline. I grew up seeing webpages full of GIFs (I won't argue about its pronounciation, it was decided long ago) and banner ads injected by adwares. Flash and Shockwave were the fundamental building blocks of interactive webpages with animations.

    +

    All those colorful flash games sites were offering tones of free games in exchange of distributing adverts and malware in their websites. As a child attracted by colors, I believed that those games were actually free. Some of those "free" game sites are still around and powered by Google AdSense. Others moved to Facebook and started earning from Facebook Ads and in-game currencies often called "gems". Around that time my classmates started to talk about Facebook and I had to go there too.

    +

    I grew up since then. I came abroad to study computer science. I have my own laptop and smartphone. I was using my devices and all those free services to talk to my family from thousands of kilometres away. I was using those sweet and free services for backing up my data, photos, documents, contacts and more. These services are free for us because all those wonderful advertisers are paying them off their goodwill ...

    +

    So I thought

    +

    I was naive to upload my and my family's photos to Google Photos. I was naive to tag my friends in photos on Facebook. I was naive to use Amazon instead of taking a walk in tech market and support the independent sellers. I was feeding tech giants for convenience and damaging local economy without knowing. I didn't know any better and I confussed giving up my privacy with convenience. I am not that naive kid anymore. I learned English Language in Kenya and I learned to harness the knowledge in the internet. I learned that there are alternatives that I can use.

    +

    I learned that there is a way to gain my digital freedom

    +

    My first action was to switch to DuckDuckGo logo DuckDuckGo from Google Search. I found that the most widely adopted service of Google is a text box for us to write our most intimate secrets in plain text.

    +

    Google wants user data. Users use Google Search. Google says "It's Free Real Estate"

    +

    Dropping Google Search wasn't gonna cut it though. I still was relying on Google Contacts, Photos and Drive to backup my data. I needed something that could backup my phone properly while not giving up my data to data hungry companies.

    +

    NextCloud to the rescue

    +

    NextCloud is a file hosting service with built-in CardDAV (contact sync), CalDAV (calendar sync) and WebDAV (file sync) servers. Not to mention, it supports adding more features by installing modules from its apps library. It is FOSS free as in freedom for everyone and int this case free as in price for non-enterprise users. Nice thing about NextCloud is that it offers all of its features to both its enterprise and home/personal users. Enterprise users also benefit from technical maintenance support direct from the NextCloud.

    +

    The way I deployed my NextCloud instance was to rent a remote VM. I am a student who can't afford to buy a machine and run it 24/7. Renting a server seemed like the most affordable and logical idea to me. Rent costs $5/month for the cheapest tier. I am careful with my pocket money and after cancelling my Netflix subscription, I had more than enough to pay $5/month.

    +

    After renting a server, I started experimenting with different OSes. I tried Debian but its php packages were old. I tried CentOS based NethServer but default user credentials for NextCloud were wrong and I couldn't use it either. I finally settled at Ubuntu 20.04 LTS. I followed few tutorials before I found Kev's tutorial. I deviated from those tutorials because I am young and ... nevermind. I finally found Kev's tutorial and

    +

    There still was a problem though. I am not he only one sharing data about me. My family can do that too. And I felt responsible for helping my family with claiming their digital freedom too. I decided to create accounts for them and help them migrate to my NextCloud instance. It turns out my family acknowledged the privacy they were giving up for the convenience. But they didn't know any alternatives. When I invited them to use my NextCloud instance they were excited. But moving from Google Suite to NextCloud isn't done yet. It takes time to learn new systems and their quirks.

    +

    Conclusion

    +

    I think this was a successful attempt. Of course I am not done here. I may need to introduce my family to Fediverse, free social media powered by voluntaries, or Jitsi, Open Source alternative to Zoom and WhatsApp video calls services. But for now we all made good progress I would say. I will let some time pass until they get more comfortable at using NextCloud. I don't want to overwhelm them and make them regret switching. I don't want to be another reason they stay on Google.

    +

    Meanwhile, why won't you make an attempt to gain your own digital freedom ?
    +I see many ways this can be achieved (Numbers in the beginning suggested how difficult they are rated out of 5):
    +3 - Manually install NextCloud on a remote VM
    +2 - Install NextCloud via Snap Package on a remote VM
    +4 - Manually install NextCloud on an old computer
    +3 - Install NextCloud via Snap on an old computer
    +1 - Purchase a Synology NAS to serve you data backups, sync and more services
    +1 - Purchase a shared hosting on one of many service providers tested by NextCloud company

    +

    Tutorials

    +

    Installing on own server: Kev beautifully explains both Snap Package way and manual way of installing in his tutorial.
    +Installing on shared hosting: But if you are intimidated with the idea of setting up your own server and managing it, you can use a shared hosting instead. Kev has a tutorial for that too, albeit it aged a bit old.
    +Repurposing old hardware: If you have an old computer gathering dust in a closet, why not use it as a home server! You will find many tutorials on the internet on how to install Ubuntu server.

    +
    +

    The only reason I followed manual method was some rookie mistake I made that caused Let's Encrypt HTTPS script to not work properly 😬️ I highly doubt you will face the same issue if you follow the tutorials carefully. Even if you do face some problems with getting HTTPS certificate using certbot command isn't difficult at all.

    +
    + +
    +
    +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/tag/nextcloud.html b/docs/tag/nextcloud.html new file mode 100644 index 0000000..2dca25e --- /dev/null +++ b/docs/tag/nextcloud.html @@ -0,0 +1,100 @@ + + + + + Ali Murteza Yesil - Blog - nextcloud + + + + + + + + + + + + +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/tag/privacy.html b/docs/tag/privacy.html new file mode 100644 index 0000000..fd60596 --- /dev/null +++ b/docs/tag/privacy.html @@ -0,0 +1,100 @@ + + + + + Ali Murteza Yesil - Blog - privacy + + + + + + + + + + + + +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/tag/self-hosting.html b/docs/tag/self-hosting.html new file mode 100644 index 0000000..ad64c6d --- /dev/null +++ b/docs/tag/self-hosting.html @@ -0,0 +1,100 @@ + + + + + Ali Murteza Yesil - Blog - self-hosting + + + + + + + + + + + + +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/tags.html b/docs/tags.html new file mode 100644 index 0000000..c19e716 --- /dev/null +++ b/docs/tags.html @@ -0,0 +1,63 @@ + + + + + Ali Murteza Yesil - Blog - Tags + + + + + + + + + +
    +

    Tags for Ali Murteza Yesil - Blog

  • nextcloud (1)
  • +
  • privacy (1)
  • +
  • self-hosting (1)
  • +
    + +
    +
    +

    blogroll

    + +
    + +
    + + + + + \ No newline at end of file diff --git a/docs/theme/css/main.css b/docs/theme/css/main.css new file mode 100644 index 0000000..9bf9a11 --- /dev/null +++ b/docs/theme/css/main.css @@ -0,0 +1,474 @@ +/* + Name: blueidea + Date: Oct 2013 + Description: A Pelican theme inspired by the default theme notmyidea + Version: 1.0 + License: MIT + Licensed by: Smashing Media GmbH + Original author: Enrique Ramírez + Customized by : Nassim Kacha +*/ + +/* Imports */ +@import url("reset.css"); +@import url("pygment.css"); +@import url("typogrify.css"); +@import url(//fonts.googleapis.com/css?family=Yanone+Kaffeesatz&subset=latin); + +/***** Global *****/ +/* Body */ +body { + background: #f2f3f3; + color: #000305; + font-size: 87.5%; /* Base font size: 14px */ + font-family: 'Trebuchet MS', Trebuchet, 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; + line-height: 1.429; + margin: 0; + padding: 0; + text-align: left; +} + +/* Headings */ +h1 {font-size: 2em } +h2 {font-size: 1.571em} /* 22px */ +h3 {font-size: 1.429em} /* 20px */ +h4 {font-size: 1.286em} /* 18px */ +h5 {font-size: 1.143em} /* 16px */ +h6 {font-size: 1em} /* 14px */ + +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.1; + margin-bottom: .8em; + font-family: 'Yanone Kaffeesatz', arial, serif; +} + +h3, h4, h5, h6 { margin-top: .8em; } + +hr { border: 2px solid #EEEEEE; } + +/* Anchors */ +a {outline: 0;} +a img {border: 0px; text-decoration: none;} +a:link, a:visited { + color: #008db8; + padding: 0 1px; + text-decoration: none; +} +a:hover, a:active { + text-decoration: underline; +} + +/* Paragraphs */ +div.line-block, +p { margin-top: 1em; + margin-bottom: 1em;} + +strong, b {font-weight: bold;} +em, i {font-style: italic;} + +/* Lists */ +ul { + list-style: outside disc; + margin: 0em 0 0 1.5em; +} + +ol { + list-style: outside decimal; + margin: 0em 0 0 1.5em; +} + +li { margin-top: 0.5em;} + +.post-info { + border-top: 1px solid; + text-align: right; +} + +.readmore { float: right } + +dl {margin: 0 0 1.5em 0;} +dt {font-weight: bold;} +dd {margin-left: 1.5em;} + +pre{background-color: rgb(238, 238, 238); padding: 10px; margin: 10px; overflow: auto;} + +/* Quotes */ +blockquote { + margin: 20px; + font-style: italic; +} +cite {} + +q {} + +div.note { + float: right; + margin: 5px; + font-size: 85%; + max-width: 300px; +} + +/* Tables */ +table {margin: .5em auto 1.5em auto; width: 98%;} + + /* Thead */ + thead th {padding: .5em .4em; text-align: left;} + thead td {} + + /* Tbody */ + tbody td {padding: .5em .4em;} + tbody th {} + + tbody .alt td {} + tbody .alt th {} + + /* Tfoot */ + tfoot th {} + tfoot td {} + +/* HTML5 tags */ +header, section, footer, +aside, nav, article, figure { + display: block; +} + +/***** Layout *****/ +.body {clear: both; margin: 0 auto; width: 800px;} +img.right, figure.right {float: right; margin: 0 0 2em 2em;} +img.left, figure.left {float: left; margin: 0 2em 2em 0;} + +/* + Header +*****************/ +#banner { + margin: 0 auto; + padding: 2.5em 0 0 0; +} + + /* Banner */ + #banner h1 {font-size: 3.571em; line-height: 0;} + #banner h1 a:link, #banner h1 a:visited { + color: #000305; + display: block; + font-weight: bold; + margin: 0 0 .6em .2em; + text-decoration: none; + } + #banner h1 a:hover, #banner h1 a:active { + background: none; + color: #008db8; + text-shadow: none; + } + + #banner h1 strong {font-size: 0.36em; font-weight: normal;} + + /* Main Nav */ + #banner nav { + background: #000305; + font-size: 1.143em; + height: 40px; + line-height: 30px; + margin: 0 auto 2em auto; + padding: 0; + text-align: center; + width: 800px; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + + #banner nav ul {list-style: none; margin: 0 auto; width: 800px;} + #banner nav li {float: left; display: inline; margin: 0;} + + #banner nav a:link, #banner nav a:visited { + color: #fff; + display: inline-block; + height: 30px; + padding: 5px 1.5em; + text-decoration: none; + } + #banner nav a:hover, #banner nav a:active, + #banner nav .active a:link, #banner nav .active a:visited { + background: #008db8; + color: #fff; + text-shadow: none !important; + } + + #banner nav li:first-child a { + border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + -webkit-border-top-left-radius: 5px; + + border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -webkit-border-bottom-left-radius: 5px; + } + + /* Search form */ + #banner #search input { + background: #272822 url('../images/icons/search.png') no-repeat 165px; + border: none; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + color: #fff; + float: right; + height: 25px; + margin-top: 6px; + margin-right: 10px; + padding-left: 10px; + width: 180px; + font-size: small; + } + + #banner #search input:focus { + background: #272822; + box-shadow: inset 0 0 5px #fff; + } + + /* Submenu */ + #banner #submenu { + background-color: #fff; + border: 0px; + border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + height: 25px; + line-height: 20px; + margin: -2.3em auto 2em auto; + padding: 0px; + text-align: center; + width: 790px; + } + #banner #submenu ul {clear: both; list-style: none; margin: 0;} + #banner #submenu li {float: left; display: inline; margin: 0;} + #banner #submenu li a:link, #banner #submenu li a:visited { + display: inline-block; + font-size: small; + font-weight: bold; + height: 25px; + padding: 0px 1.5em; + } + #banner #submenu li a:hover, #banner #submenu li a:active { + background: #008db8; + border-top: 1px solid #008db8; + -moz-border-top: 1px solid #008db8; + -webkit-border-top: 1px solid #008db8; + color: #fff; + text-decoration: none; + } + #banner #submenu .active a:link, #banner #submenu .active a:visited { + background: #008db8; + border-top: 1px solid #008db8; + -moz-border-top: 1px solid #008db8; + -webkit-border-top: 1px solid #008db8; + color: #fff; + text-decoration: none; + } + #banner #submenu li:first-child a { + border-bottom-left-radius: 5px; + -moz-border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + } + +/* + Featured +*****************/ +#featured { + background: #fff; + margin-bottom: 2em; + overflow: hidden; + padding: 20px; + width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +#featured figure { + border: 2px solid #eee; + float: right; + margin: 0.786em 2em 0 5em; + width: 248px; +} +#featured figure img {display: block; float: right;} + +#featured h2 {color: #008DB8; font-size: 1.714em; margin-bottom: 0.333em;} +#featured h3 {font-size: 1.429em; margin-bottom: .5em;} + +#featured h3 a:link, #featured h3 a:visited {color: #000305; text-decoration: none;} +#featured h3 a:hover, #featured h3 a:active {color: #fff;} + +/* + Body +*****************/ +#content { + background: #fff; + /*margin-bottom: 2em;*/ + overflow: hidden; + padding: 20px 20px; + width: 760px; + + border-radius: 10px 10px 0 0; + -moz-border-radius: 10px 10px 0 0; + -webkit-border-radius: 10px 10px 0 0; +} + +/* + Extras +*****************/ +#extras { + margin: 0 auto 0 auto; + overflow: hidden; + background: #000305; + border-radius: 0 0 10px 10px; + -moz-border-radius: 0 0 10px 10px; + -webkit-border-radius: 0 0 10px 10px; + padding-bottom: 10px; +} + +#extras ul {list-style: none; margin: 0;} +/*#extras li {border-bottom: 1px solid #fff;}*/ +#extras li {margin-top: 0;} +#extras h2 { + color: #008db8; + font-size: 1.429em; + margin-bottom: .25em; + padding: 0 3px; +} + +#extras a:link, #extras a:visited { + color: #fff; + display: block; + /*border-bottom: 1px solid #F4E3E3;*/ + text-decoration: none; + padding: .3em .25em; +} + +#extras a:hover, #extras a:active {background: #008db8; color: #fff;} + + /* Blogroll */ + #extras .blogroll { + float: left; + width: 615px; + } + + #extras .blogroll li {float: left; margin: 0 20px 0 0; width: 185px;} + + /* Social */ + #extras .social { + float: right; + width: 175px; + } + + #extras div[class='social'] a { + background-repeat: no-repeat; + background-position: 3px 6px; + padding-left: 25px; + } + + /* Icons */ + #extras .social a {background-size: 18px;} + #extras .social a[href*='facebook.com'] {background-image: url('../images/icons/facebook.png');} + #extras .social a[href*='github.com'], + #extras .social a[href*='git.io'] {background-image: url('../images/icons/github.png');} + #extras .social a[href*='plus.google.com'] {background-image: url('../images/icons/google-plus.png');} + #extras .social a[href*='groups.google.com'] {background-image: url('../images/icons/google-plus.png');} + #extras .social a[href*='last.fm'], .social a[href*='lastfm.'] {background-image: url('../images/icons/lastfm.png');} + #extras .social a[href*='linkedin.com'] {background-image: url('../images/icons/linkedin.png');} + #extras .social a[type$='atom+xml'], .social a[type$='rss+xml'] {background-image: url('../images/icons/rss.png');} + #extras .social a[href*='twitter.com'] {background-image: url('../images/icons/twitter.png');} + #extras .social a[href*='vimeo.com'] {background-image: url('../images/icons/vimeo.png');} + #extras .social a[href*='youtube.com'] {background-image: url('../images/icons/youtube.png');} + + +/* + Footer +*****************/ +#contentinfo {text-align: right; font-size: x-small;} +#contentinfo a {font-weight: bold;} + +/***** Sections *****/ +/* Blog */ +.hentry { + display: block; + clear: both; + border-bottom: 1px solid #eee; + padding: 1.5em 0; +} +li:last-child .hentry, #content > .hentry {border: 0; margin: 0;} +#content > .hentry {padding: 1em 0;} +.hentry img{display : none ;} +.entry-title {font-size: 3em; margin-bottom: 10px; margin-top: 0;} +.entry-title a:link, .entry-title a:visited {text-decoration: none; color: #333;} +.entry-title a:visited {background-color: #fff;} + +.hentry .post-info * {font-style: normal;} + + /* Content */ + .hentry footer {margin-bottom: 2em;} + .hentry footer address {display: inline;} + #posts-list footer address {display: block;} + + /* Blog Index */ + #posts-list {list-style: none; margin: 0;} + #posts-list .hentry {padding-left: 10px; position: relative;} + + #posts-list footer { + border-top: 1px solid; + margin-top: -1.3em; + } + + /* About the Author */ + #about-author { + background: #f9f9f9; + clear: both; + font-style: normal; + margin: 2em 0; + padding: 10px 20px 15px 20px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + + #about-author strong { + color: #C64350; + clear: both; + display: block; + font-size: 1.429em; + } + + #about-author .photo {border: 1px solid #ddd; float: left; margin: 5px 1em 0 0;} + + /* Comments */ + #comments-list {list-style: none; margin: 0 1em;} + #comments-list blockquote { + background: #f8f8f8; + clear: both; + font-style: normal; + margin: 0; + padding: 15px 20px; + + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + #comments-list footer {color: #888; padding: .5em 1em 0 0; text-align: right;} + + #comments-list li:nth-child(2n) blockquote {background: #F5f5f5;} + + /* Add a Comment */ + #add-comment label {clear: left; float: left; text-align: left; width: 150px;} + #add-comment input[type='text'], + #add-comment input[type='email'], + #add-comment input[type='url'] {float: left; width: 200px;} + + #add-comment textarea {float: left; height: 150px; width: 495px;} + + #add-comment p.req {clear: both; margin: 0 .5em 1em 0; text-align: right;} + + #add-comment input[type='submit'] {float: right; margin: 0 .5em;} + #add-comment * {margin-bottom: .5em;} diff --git a/docs/theme/css/pygment.css b/docs/theme/css/pygment.css new file mode 100644 index 0000000..99f2169 --- /dev/null +++ b/docs/theme/css/pygment.css @@ -0,0 +1,66 @@ +.highlight pre +{ + background: #272822; + color: #f8f8f2; + border: 1px solid #272822; + /*border-radius: 5px;*/ +} +.highlight .hll { background-color: #49483e } +.highlight .c { color: #75715e } /* Comment */ +.highlight .err { color: #960050; background-color: #1e0010 } /* Error */ +.highlight .k { color: #66d9ef } /* Keyword */ +.highlight .l { color: #ae81ff } /* Literal */ +.highlight .n { color: #f8f8f2 } /* Name */ +.highlight .o { color: #f92672 } /* Operator */ +.highlight .p { color: #f8f8f2 } /* Punctuation */ +.highlight .cm { color: #75715e } /* Comment.Multiline */ +.highlight .cp { color: #75715e } /* Comment.Preproc */ +.highlight .c1 { color: #75715e } /* Comment.Single */ +.highlight .cs { color: #75715e } /* Comment.Special */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .kc { color: #66d9ef } /* Keyword.Constant */ +.highlight .kd { color: #66d9ef } /* Keyword.Declaration */ +.highlight .kn { color: #f92672 } /* Keyword.Namespace */ +.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ +.highlight .kr { color: #66d9ef } /* Keyword.Reserved */ +.highlight .kt { color: #66d9ef } /* Keyword.Type */ +.highlight .ld { color: #e6db74 } /* Literal.Date */ +.highlight .m { color: #ae81ff } /* Literal.Number */ +.highlight .s { color: #e6db74 } /* Literal.String */ +.highlight .na { color: #a6e22e } /* Name.Attribute */ +.highlight .nb { color: #f8f8f2 } /* Name.Builtin */ +.highlight .nc { color: #a6e22e } /* Name.Class */ +.highlight .no { color: #66d9ef } /* Name.Constant */ +.highlight .nd { color: #a6e22e } /* Name.Decorator */ +.highlight .ni { color: #f8f8f2 } /* Name.Entity */ +.highlight .ne { color: #a6e22e } /* Name.Exception */ +.highlight .nf { color: #a6e22e } /* Name.Function */ +.highlight .nl { color: #f8f8f2 } /* Name.Label */ +.highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +.highlight .nx { color: #a6e22e } /* Name.Other */ +.highlight .py { color: #f8f8f2 } /* Name.Property */ +.highlight .nt { color: #f92672 } /* Name.Tag */ +.highlight .nv { color: #f8f8f2 } /* Name.Variable */ +.highlight .ow { color: #f92672 } /* Operator.Word */ +.highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +.highlight .mf { color: #ae81ff } /* Literal.Number.Float */ +.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ +.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ +.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ +.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ +.highlight .sc { color: #e6db74 } /* Literal.String.Char */ +.highlight .sd { color: #e6db74 } /* Literal.String.Doc */ +.highlight .s2 { color: #e6db74 } /* Literal.String.Double */ +.highlight .se { color: #ae81ff } /* Literal.String.Escape */ +.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ +.highlight .si { color: #e6db74 } /* Literal.String.Interpol */ +.highlight .sx { color: #e6db74 } /* Literal.String.Other */ +.highlight .sr { color: #e6db74 } /* Literal.String.Regex */ +.highlight .s1 { color: #e6db74 } /* Literal.String.Single */ +.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ +.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ +.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ +.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ +.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ diff --git a/docs/theme/css/pygment.css.save b/docs/theme/css/pygment.css.save new file mode 100644 index 0000000..fdd056f --- /dev/null +++ b/docs/theme/css/pygment.css.save @@ -0,0 +1,205 @@ +.hll { +background-color:#eee; +} +.c { +color:#408090; +font-style:italic; +} +.err { +border:1px solid #FF0000; +} +.k { +color:#007020; +font-weight:bold; +} +.o { +color:#666666; +} +.cm { +color:#408090; +font-style:italic; +} +.cp { +color:#007020; +} +.c1 { +color:#408090; +font-style:italic; +} +.cs { +background-color:#FFF0F0; +color:#408090; +} +.gd { +color:#A00000; +} +.ge { +font-style:italic; +} +.gr { +color:#FF0000; +} +.gh { +color:#000080; +font-weight:bold; +} +.gi { +color:#00A000; +} +.go { +color:#303030; +} +.gp { +color:#C65D09; +font-weight:bold; +} +.gs { +font-weight:bold; +} +.gu { +color:#800080; +font-weight:bold; +} +.gt { +color:#0040D0; +} +.kc { +color:#007020; +font-weight:bold; +} +.kd { +color:#007020; +font-weight:bold; +} +.kn { +color:#007020; +font-weight:bold; +} +.kp { +color:#007020; +} +.kr { +color:#007020; +font-weight:bold; +} +.kt { +color:#902000; +} +.m { +color:#208050; +} +.s { +color:#4070A0; +} +.na { +color:#4070A0; +} +.nb { +color:#007020; +} +.nc { +color:#0E84B5; +font-weight:bold; +} +.no { +color:#60ADD5; +} +.nd { +color:#555555; +font-weight:bold; +} +.ni { +color:#D55537; +font-weight:bold; +} +.ne { +color:#007020; +} +.nf { +color:#06287E; +} +.nl { +color:#002070; +font-weight:bold; +} +.nn { +color:#0E84B5; +font-weight:bold; +} +.nt { +color:#062873; +font-weight:bold; +} +.nv { +color:#BB60D5; +} +.ow { +color:#007020; +font-weight:bold; +} +.w { +color:#BBBBBB; +} +.mf { +color:#208050; +} +.mh { +color:#208050; +} +.mi { +color:#208050; +} +.mo { +color:#208050; +} +.sb { +color:#4070A0; +} +.sc { +color:#4070A0; +} +.sd { +color:#4070A0; +font-style:italic; +} +.s2 { +color:#4070A0; +} +.se { +color:#4070A0; +font-weight:bold; +} +.sh { +color:#4070A0; +} +.si { +color:#70A0D0; +font-style:italic; +} +.sx { +color:#C65D09; +} +.sr { +color:#235388; +} +.s1 { +color:#4070A0; +} +.ss { +color:#517918; +} +.bp { +color:#007020; +} +.vc { +color:#BB60D5; +} +.vg { +color:#BB60D5; +} +.vi { +color:#BB60D5; +} +.il { +color:#208050; +} diff --git a/docs/theme/css/reset.css b/docs/theme/css/reset.css new file mode 100644 index 0000000..1e21756 --- /dev/null +++ b/docs/theme/css/reset.css @@ -0,0 +1,52 @@ +/* + Name: Reset Stylesheet + Description: Resets browser's default CSS + Author: Eric Meyer + Author URI: http://meyerweb.com/eric/tools/css/reset/ +*/ + +/* v1.0 | 20080212 */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + background: transparent; + border: 0; + font-size: 100%; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; +} + +body {line-height: 1;} + +ol, ul {list-style: none;} + +blockquote, q {quotes: none;} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins {text-decoration: none;} +del {text-decoration: line-through;} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/docs/theme/css/typogrify.css b/docs/theme/css/typogrify.css new file mode 100644 index 0000000..c9b34dc --- /dev/null +++ b/docs/theme/css/typogrify.css @@ -0,0 +1,3 @@ +.caps {font-size:.92em;} +.amp {color:#666; font-size:1.05em;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua",serif; font-style:italic;} +.dquo {margin-left:-.38em;} diff --git a/docs/theme/css/wide.css b/docs/theme/css/wide.css new file mode 100644 index 0000000..88fd59c --- /dev/null +++ b/docs/theme/css/wide.css @@ -0,0 +1,48 @@ +@import url("main.css"); + +body { + font:1.3em/1.3 "Hoefler Text","Georgia",Georgia,serif,sans-serif; +} + +.post-info{ + display: none; +} + +#banner nav { + display: none; + -moz-border-radius: 0px; + margin-bottom: 20px; + overflow: hidden; + font-size: 1em; + background: #F5F4EF; +} + +#banner nav ul{ + padding-right: 50px; +} + +#banner nav li{ + float: right; + color: #000; +} + +#banner nav li a { + color: #000; +} + +#banner h1 { + margin-bottom: -18px; +} + +#featured, #extras { + padding: 50px; +} + +#featured { + padding-top: 20px; +} + +#extras { + padding-top: 0px; + padding-bottom: 0px; +} diff --git a/docs/theme/images/icons/_licence.txt b/docs/theme/images/icons/_licence.txt new file mode 100644 index 0000000..787d861 --- /dev/null +++ b/docs/theme/images/icons/_licence.txt @@ -0,0 +1,15 @@ +Copyright (C) 2011 Natko Hasi, http://www.designerschair.com +No attribution link is required, but it's greatly appreciated. + +Make sure you share these icons using this link only: +http://www.designerschair.com/freebies/mono-dc-monochrome-social-icons/ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program 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 General Public License for more details. \ No newline at end of file diff --git a/docs/theme/images/icons/facebook.png b/docs/theme/images/icons/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..83b8cb3f7da3f7ada0b630b2878f19b09616b8ad GIT binary patch literal 1204 zcmaJ>ZD<>19KW<(TGp19A-0hT$7L^0mV0dyb0mf|mo6zw>C$KeqU+`EX>(?G&+YEI zTw81x#m#C(P(dl^HtEN0n1cHvbsfG`{UU6Wq4UFvL(qL#6qSL+_*~a?elQ-~Jum!z zzyI5hn;#xJ)VcGKofw97rjkMit+?~HwV>~J=JFg`JXRuSjlglMBpLvV$uJM_lqybu z3=rk1<6nU=hBf0#HfQD1hj|IAr08HsTh$R8!@^Np7o{Sw@I07Mv^)W%7V|kj!w;lpTGvskTBMfZC zLZ=8(uq>UYs8Xp!mN*g`6BH8)g&Yl*^&y1MoYE}O_GzZKt{?zYG8ElXpoTk&VjfOf z5dvj;zXVm^metIyHlc=5wy0AKNjoLgf$8-BLsfMfZCV-dAm9HKHnUSYpfbROlZJ!_ zH|}*p>3rM(q6LjCgvaV#94(;%q``o{+Mo-NgefRITF1%MR&#y^<=4#%j;&wZ~o^2#dEC9&!(j8Q$iu1LE12u8ek4Uk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{LEamTaeV8P z^V+G2636ZDIq4lPeH@f-xb&jyM)Qqj>Y^NDZI0lP3$uc zEIM4xe0^~(ufr6HrBed^L>a8-rPyku{Cuey(IQzd@@=I_#=q-yxMt`LA}UdK$*x;GFDnUoyE zS?C=kJ-zAe1ZrItzO`Dci%kIkhcEz<-Ofx{` Nny0Iu%Q~loCIEF}?J@uW literal 0 HcmV?d00001 diff --git a/docs/theme/images/icons/google-plus.png b/docs/theme/images/icons/google-plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6854b60f8eee24f89f746f3fe5a02ef13beeb58b GIT binary patch literal 1411 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4Uk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L z0}B_JUYGpj(%jU%5}4i;gkCe8dO-;xw*Y9fOKMSOS!#+~QGTuh*uz$txZPrm(>$o& z6x?nx!Kqgt=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6N+F9$3IRgXZPfr)e5RcT_z@o6L(X7E=^B`p$*qr`^jmzS8ko>ivr6_wQ7n+uQ!%{`;N9 zEXNBb`5hDVO_{SKnIp^ej912jyE|IsZuMSZ&|WR5+PV24L(^(bMF;NyA+I%)r+g6b zt(aob7~$oo{mQg;PSBx5pMXOT3q*MOd=CZdRCNj+T{68emUDZh_axPM!ir~X7S}63 zi(`ws`dX9AM(K#Z(wzkpEm~J`+Sqe$-twVW=}`WX_=62~dsx^lmu{y5%+>-55 z;Tg4D_`2l6c2=P~DhCW|V-ilqANse3f9DB>$g&fUCp{Ir@XUDnDx()naiMR@8)lp< z?_-YNdD@Dh`$)&7m7nK2`v@IOod;`N;|QCK+CR?{WOrnNP=rsv_=1%%0d+ a_nbc|MPU06Es6c0V$svp&t;ucLK6U$3j^2y literal 0 HcmV?d00001 diff --git a/docs/theme/images/icons/lastfm.png b/docs/theme/images/icons/lastfm.png new file mode 100644 index 0000000000000000000000000000000000000000..3a986e4976f97c7d53c367df31ef3df36bd40ffb GIT binary patch literal 1395 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4Uk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?oc!l_pu=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6N+VO5G9|Hs9OHUWa5Rc<; zulRag2^3-dApbvX)=$CAX912HiBlYPZ?y(Gt8C%)>=1Kwx!|VZ#8GS*5hBncqO0s| z&|!B$N#GWX;H_0hcXS?*Su~056leR&nb+OcxVX99X1Tk$^1aSG>*ssE=ZUB!pFEhN zCF$j&WjUjV_2Q4T_1V_5lFoWL2d~+7`1MEKz!z(yV|7nV?O1T@*42gPTpx=nSr@v9 zJekV*Q6t24TGYeHnb~gM&I@{u~ zuGQwrZkuCQ@g$47rLta+(VTZMJZF+Pi~XBpOPb#9crZcFd7tQcg+uyji;G0(S*FgH zeN|f$>;Ex(&5_+ZWAFL(oX9GVod5XRY@NJ?g8gaN=kMLZp2?q@y5_>FpwvQcb^*&r z)9l=1HXVygWt(&DeV_3q?!8Cu|GxTSlVh*o`Yje}>tlDPU7lB!bjoV(=VzB}SXm7@ z|F+o_Tuw}RTX=PWqVv05D+)KhpELbqsaWI$W832?e}33c6x;AYb^nvkpPkgW&M%vG zC&5di)9L%|60dbBFD*6mFE6yt@@|{fS)D8&r@@;nulBBW+O{YDC-a223%|W~2~-Sv My85}Sb4q9e06s|qZU6uP literal 0 HcmV?d00001 diff --git a/docs/theme/images/icons/linkedin.png b/docs/theme/images/icons/linkedin.png new file mode 100644 index 0000000000000000000000000000000000000000..0d0d0a0c66e0d0eaf2503405c659b6f63e5b6c10 GIT binary patch literal 1257 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4Uk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L7{gLsvsb3ky>>6Cm5z&C<=> z$Q-8EB|o_|H#M&WrZ)wl*950tP(sKp0NU)5T9jFqn&MWJpQ`}&uvI2*w;19y52`l> zw_A*G>eUB2MjsTdNYM-v0;U}h6P{>+9C)%%%>$Zs1_s7>PZ!4!kK<>j z?DuvG6gh4mt9eFFwaIi(laz{9VX25xdruVaqO}{ho(+7lzQTKQ^MA(+Hy%AJxXbd8 zw@s15DP>Q&RLHM|H-9Hy_^J2&&cl1}zt4GZ>vdt-x{T;<{~Nm&`8t}GtyJ&UEatEG zn0Zp^>#=>4K2<688GPVWJm=Hd!2KJ^6C&g~d6rW>a zJ0Ej-c8bAjc0nZ#z7FA3&SvqvyVN8b0G%h6B73s3ikAW z+}+~JqWJ6Oo#ic}3}N+UkMeo$Tx6Sd?7-j2?`^hxx}LLX*25!mdnZ1&+jR0(e7?$l z@2$^S>h3%K@{+S^)PJGy-OKCjy0Zt&zcQMgT{k7f(R*3w+O6^*+oN`ePW5rz&n%Mn Ve8rNu4mD8Wvd$@?2>^Dly}SSb literal 0 HcmV?d00001 diff --git a/docs/theme/images/icons/rss.png b/docs/theme/images/icons/rss.png new file mode 100644 index 0000000000000000000000000000000000000000..32896db8a50ed40849635d85e945b4d3268b2a4a GIT binary patch literal 1441 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 G2~7ad!UFRE literal 0 HcmV?d00001 diff --git a/docs/theme/images/icons/vimeo.png b/docs/theme/images/icons/vimeo.png new file mode 100644 index 0000000000000000000000000000000000000000..b37fe1138967365326996a058a04254ab401b0ea GIT binary patch literal 1322 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4Uk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?nx#;I2y=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6N`YfA-5d#C`0#6sm5Rc~a7;=tu6ymN?v7@Y4`H*@Ike~76(@WMZMIT7Xl`Tu{~|Lc!sT zOuB&F&h+~~bmL5R9A0+!MtBVKhRi>8>(9^d-+0r%(a?$EONIBtt=DJ!9x#%QVG3}% zQkb&WJtEzeMVKBO>C?D9y=|8{cmkP-?d%Az_ z=LnM(&orl(iRJOk`~Syf*T$lK_nqEN$yr|f&r#}TkWt|j&xv1sZN0k|_xP-sF>Tr7 luSb6B{hMH6A2(g?qW&VaFR}NpRxSpWUY@RgF6*2UngABb*a`pu literal 0 HcmV?d00001 diff --git a/docs/theme/images/icons/youtube.png b/docs/theme/images/icons/youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..0e139c3041c24dd3ed82cba592744a8aa9b8be76 GIT binary patch literal 1504 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4Uk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?nx!Kqgt=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6N`rXaYNem23VV*9IAs)x) zUUkd}2^V2|ke?Rk1Yd0Y?yJuW7a{Tixz%r#@lC~JdiTU;_=Qs<@$F%*PZ*n z|NlJcvlkwRyMN8l6Z83f&*_Qn_VUuDF1~g9uWha|n_j5H_4sbA=fSMW42GH?*B$++ zk#cLQi9Dlqi;u{p!u8UH3yryE=hQq~|LS*Wsf(lSkqyO@{J47=uN*gjSCQmoza#TN zsrsE9nS`r;m8&o5NjXM!ml%t9WC~AM|6=bylL*Fa-Vf^;rkLN&*m_C8p;DX6wVIX3 z>-rhq;2jFfUMN)r&Ydl=kt0+}`)tOC-K#%cdljTCd#g4vqncOk?xye#W~RC|k>wrh8kl|L?QauW~#eF7>Nz z+G6;4pV`B8#^-*X@{I42{+RDuC)+9%bs+gqGqX{ho7;YGyNPT6b1z&L7`V>LzHyV? z+8yezXWryZU$kdq)3sH<3U$J-oiDtwAa7;3<;KI^UiErEFUkcA?fbgV{>hy0JLj)j z5N)y1+3%o^o}^i;X8TctSDQTfYqsp|aJMLw*MP V^C?^SJ2r#LTu)a&mvv4FO#pO{G${Z8 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/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/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/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/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA new file mode 100644 index 0000000..3119fa9 --- /dev/null +++ b/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/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD new file mode 100644 index 0000000..3ccbab9 --- /dev/null +++ b/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/__init__.cpython-38.pyc,, +cachecontrol/caches/__pycache__,, +cachecontrol/caches/__init__.cpython-38.pyc,, +cachecontrol/_cmd.cpython-38.pyc,, +cachecontrol/compat.cpython-38.pyc,, +cachecontrol/__pycache__,, +CacheControl-0.12.6.dist-info/INSTALLER,, +CacheControl-0.12.6.virtualenv,, +cachecontrol/serialize.cpython-38.pyc,, +cachecontrol/caches/file_cache.cpython-38.pyc,, +cachecontrol/wrapper.cpython-38.pyc,, +cachecontrol/filewrapper.cpython-38.pyc,, +cachecontrol/heuristics.cpython-38.pyc,, +cachecontrol/adapter.cpython-38.pyc,, +CacheControl-0.12.6.dist-info/__pycache__,, +cachecontrol/caches/redis_cache.cpython-38.pyc,, +cachecontrol/controller.cpython-38.pyc,, +cachecontrol/cache.cpython-38.pyc,, \ No newline at end of file diff --git a/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/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/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt new file mode 100644 index 0000000..af37ac6 --- /dev/null +++ b/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt @@ -0,0 +1 @@ +cachecontrol diff --git a/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv b/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/INSTALLER b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/LICENSE.rst b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/METADATA b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/METADATA new file mode 100644 index 0000000..55c0f82 --- /dev/null +++ b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/METADATA @@ -0,0 +1,106 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 2.11.2 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/jinja +Project-URL: Issue tracker, https://github.com/pallets/jinja/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +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 :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* +Description-Content-Type: text/x-rst +Requires-Dist: MarkupSafe (>=0.23) +Provides-Extra: i18n +Requires-Dist: Babel (>=0.8) ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} + + {% endblock %} + + +Links +----- + +- Website: https://palletsprojects.com/p/jinja/ +- Documentation: https://jinja.palletsprojects.com/ +- Releases: https://pypi.org/project/Jinja2/ +- Code: https://github.com/pallets/jinja +- Issue tracker: https://github.com/pallets/jinja/issues +- Test status: https://dev.azure.com/pallets/jinja/_build +- Official chat: https://discord.gg/t6rrQZH + + diff --git a/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/RECORD b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/RECORD new file mode 100644 index 0000000..413fef4 --- /dev/null +++ b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/RECORD @@ -0,0 +1,61 @@ +Jinja2-2.11.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-2.11.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-2.11.2.dist-info/METADATA,sha256=5ZHRZoIRAMHsJPnqhlJ622_dRPsYePYJ-9EH4-Ry7yI,3535 +Jinja2-2.11.2.dist-info/RECORD,, +Jinja2-2.11.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +Jinja2-2.11.2.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61 +Jinja2-2.11.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=0QCM_jKKDM10yzSdHRVV4mQbCbDqf0GN0GirAqibn9Y,1549 +jinja2/__pycache__/__init__.cpython-38.pyc,, +jinja2/__pycache__/_compat.cpython-38.pyc,, +jinja2/__pycache__/_identifier.cpython-38.pyc,, +jinja2/__pycache__/asyncfilters.cpython-38.pyc,, +jinja2/__pycache__/asyncsupport.cpython-38.pyc,, +jinja2/__pycache__/bccache.cpython-38.pyc,, +jinja2/__pycache__/compiler.cpython-38.pyc,, +jinja2/__pycache__/constants.cpython-38.pyc,, +jinja2/__pycache__/debug.cpython-38.pyc,, +jinja2/__pycache__/defaults.cpython-38.pyc,, +jinja2/__pycache__/environment.cpython-38.pyc,, +jinja2/__pycache__/exceptions.cpython-38.pyc,, +jinja2/__pycache__/ext.cpython-38.pyc,, +jinja2/__pycache__/filters.cpython-38.pyc,, +jinja2/__pycache__/idtracking.cpython-38.pyc,, +jinja2/__pycache__/lexer.cpython-38.pyc,, +jinja2/__pycache__/loaders.cpython-38.pyc,, +jinja2/__pycache__/meta.cpython-38.pyc,, +jinja2/__pycache__/nativetypes.cpython-38.pyc,, +jinja2/__pycache__/nodes.cpython-38.pyc,, +jinja2/__pycache__/optimizer.cpython-38.pyc,, +jinja2/__pycache__/parser.cpython-38.pyc,, +jinja2/__pycache__/runtime.cpython-38.pyc,, +jinja2/__pycache__/sandbox.cpython-38.pyc,, +jinja2/__pycache__/tests.cpython-38.pyc,, +jinja2/__pycache__/utils.cpython-38.pyc,, +jinja2/__pycache__/visitor.cpython-38.pyc,, +jinja2/_compat.py,sha256=B6Se8HjnXVpzz9-vfHejn-DV2NjaVK-Iewupc5kKlu8,3191 +jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775 +jinja2/asyncfilters.py,sha256=XJtYXTxFvcJ5xwk6SaDL4S0oNnT0wPYvXBCSzc482fI,4250 +jinja2/asyncsupport.py,sha256=ZBFsDLuq3Gtji3Ia87lcyuDbqaHZJRdtShZcqwpFnSQ,7209 +jinja2/bccache.py,sha256=3Pmp4jo65M9FQuIxdxoDBbEDFwe4acDMQf77nEJfrHA,12139 +jinja2/compiler.py,sha256=Ta9W1Lit542wItAHXlDcg0sEOsFDMirCdlFPHAurg4o,66284 +jinja2/constants.py,sha256=RR1sTzNzUmKco6aZicw4JpQpJGCuPuqm1h1YmCNUEFY,1458 +jinja2/debug.py,sha256=neR7GIGGjZH3_ILJGVUYy3eLQCCaWJMXOb7o0kGInWc,8529 +jinja2/defaults.py,sha256=85B6YUUCyWPSdrSeVhcqFVuu_bHUAQXeey--FIwSeVQ,1126 +jinja2/environment.py,sha256=XDSLKc4SqNLMOwTSq3TbWEyA5WyXfuLuVD0wAVjEFwM,50629 +jinja2/exceptions.py,sha256=VjNLawcmf2ODffqVMCQK1cRmvFaUfQWF4u8ouP3QPcE,5425 +jinja2/ext.py,sha256=AtwL5O5enT_L3HR9-oBvhGyUTdGoyaqG_ICtnR_EVd4,26441 +jinja2/filters.py,sha256=_RpPgAlgIj7ExvyDzcHAC3B36cocfWK-1TEketbNeM0,41415 +jinja2/idtracking.py,sha256=J3O4VHsrbf3wzwiBc7Cro26kHb6_5kbULeIOzocchIU,9211 +jinja2/lexer.py,sha256=nUFLRKhhKmmEWkLI65nQePgcQs7qsRdjVYZETMt_v0g,30331 +jinja2/loaders.py,sha256=C-fST_dmFjgWkp0ZuCkrgICAoOsoSIF28wfAFink0oU,17666 +jinja2/meta.py,sha256=QjyYhfNRD3QCXjBJpiPl9KgkEkGXJbAkCUq4-Ur10EQ,4131 +jinja2/nativetypes.py,sha256=Ul__gtVw4xH-0qvUvnCNHedQeNDwmEuyLJztzzSPeRg,2753 +jinja2/nodes.py,sha256=Mk1oJPVgIjnQw9WOqILvcu3rLepcFZ0ahxQm2mbwDwc,31095 +jinja2/optimizer.py,sha256=gQLlMYzvQhluhzmAIFA1tXS0cwgWYOjprN-gTRcHVsc,1457 +jinja2/parser.py,sha256=fcfdqePNTNyvosIvczbytVA332qpsURvYnCGcjDHSkA,35660 +jinja2/runtime.py,sha256=0y-BRyIEZ9ltByL2Id6GpHe1oDRQAwNeQvI0SKobNMw,30618 +jinja2/sandbox.py,sha256=knayyUvXsZ-F0mk15mO2-ehK9gsw04UhB8td-iUOtLc,17127 +jinja2/tests.py,sha256=iO_Y-9Vo60zrVe1lMpSl5sKHqAxe2leZHC08OoZ8K24,4799 +jinja2/utils.py,sha256=OoVMlQe9S2-lWT6jJbTu9tDuDvGNyWUhHDcE51i5_Do,22522 +jinja2/visitor.py,sha256=DUHupl0a4PGp7nxRtZFttUzAi1ccxzqc2hzetPYUz8U,3240 diff --git a/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/WHEEL b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/lib/python3.8/site-packages/Jinja2-2.11.2.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/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/entry_points.txt b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/entry_points.txt new file mode 100644 index 0000000..3619483 --- /dev/null +++ b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract [i18n] + diff --git a/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/top_level.txt b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/lib/python3.8/site-packages/Jinja2-2.11.2.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/INSTALLER b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/LICENSE.md b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/LICENSE.md new file mode 100644 index 0000000..2652d97 --- /dev/null +++ b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/LICENSE.md @@ -0,0 +1,29 @@ +Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the Python Markdown Project nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/METADATA b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/METADATA new file mode 100644 index 0000000..99396d0 --- /dev/null +++ b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/METADATA @@ -0,0 +1,57 @@ +Metadata-Version: 2.1 +Name: Markdown +Version: 3.2.2 +Summary: Python implementation of Markdown. +Home-page: https://Python-Markdown.github.io/ +Author: Manfred Stienstra, Yuri takhteyev and Waylan limberg +Author-email: waylan.limberg@icloud.com +Maintainer: Waylan Limberg +Maintainer-email: waylan.limberg@icloud.com +License: BSD License +Download-URL: http://pypi.python.org/packages/source/M/Markdown/Markdown-3.2.2-py2.py3-none-any.whl +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +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 :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Communications :: Email :: Filters +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries +Classifier: Topic :: Internet :: WWW/HTTP :: Site Management +Classifier: Topic :: Software Development :: Documentation +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Filters +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.5 +Requires-Dist: importlib-metadata ; python_version < "3.8" +Provides-Extra: testing +Requires-Dist: coverage ; extra == 'testing' +Requires-Dist: pyyaml ; extra == 'testing' + + +This is a Python implementation of John Gruber's Markdown_. +It is almost completely compliant with the reference implementation, +though there are a few known issues. See Features_ for information +on what exactly is supported and what is not. Additional features are +supported by the `Available Extensions`_. + +.. _Markdown: https://daringfireball.net/projects/markdown/ +.. _Features: https://Python-Markdown.github.io#features +.. _`Available Extensions`: https://Python-Markdown.github.io/extensions/ + +Support +======= + +You may report bugs, ask for help, and discuss various other issues on +the `bug tracker`_. + +.. _`bug tracker`: https://github.com/Python-Markdown/markdown/issues + + diff --git a/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/RECORD b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/RECORD new file mode 100644 index 0000000..fcc3fb9 --- /dev/null +++ b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/RECORD @@ -0,0 +1,74 @@ +../../../bin/markdown_py,sha256=oWKrrqAaBkPRzNf4m8WLtU6sa2eePDRetT5FQeB78gU,235 +Markdown-3.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Markdown-3.2.2.dist-info/LICENSE.md,sha256=bxGTy2NHGOZcOlN9biXr1hSCDsDvaTz8EiSBEmONZNo,1645 +Markdown-3.2.2.dist-info/METADATA,sha256=zgAbjRRuBBmQaECWiKBHfwpPd1JjR8qQ3-39oaAHHaI,2409 +Markdown-3.2.2.dist-info/RECORD,, +Markdown-3.2.2.dist-info/WHEEL,sha256=S8S5VL-stOTSZDYxHyf0KP7eds0J72qrK0Evu3TfyAY,92 +Markdown-3.2.2.dist-info/entry_points.txt,sha256=j4jiKg-iwZGImvi8OzotZePWoFbJJ4GrfzDqH03u3SQ,1103 +Markdown-3.2.2.dist-info/top_level.txt,sha256=IAxs8x618RXoH1uCqeLLxXsDefJvE_mIibr_M4sOlyk,9 +markdown/__init__.py,sha256=002-LuHviYzROW2rg_gBGai81nMouUNO9UFj5nSsTSk,2065 +markdown/__main__.py,sha256=MpVK3zlwQ-4AzDzZmIScPB90PpunMGVgS5KBmJuHYTw,5802 +markdown/__meta__.py,sha256=1KPSWlbs623C1QTn8qYSTfbDKrYQFyydYwlRep-5ATk,1630 +markdown/__pycache__/__init__.cpython-38.pyc,, +markdown/__pycache__/__main__.cpython-38.pyc,, +markdown/__pycache__/__meta__.cpython-38.pyc,, +markdown/__pycache__/blockparser.cpython-38.pyc,, +markdown/__pycache__/blockprocessors.cpython-38.pyc,, +markdown/__pycache__/core.cpython-38.pyc,, +markdown/__pycache__/inlinepatterns.cpython-38.pyc,, +markdown/__pycache__/pep562.cpython-38.pyc,, +markdown/__pycache__/postprocessors.cpython-38.pyc,, +markdown/__pycache__/preprocessors.cpython-38.pyc,, +markdown/__pycache__/serializers.cpython-38.pyc,, +markdown/__pycache__/test_tools.cpython-38.pyc,, +markdown/__pycache__/treeprocessors.cpython-38.pyc,, +markdown/__pycache__/util.cpython-38.pyc,, +markdown/blockparser.py,sha256=JpBhOokOoBUGCXolftOc5m1hPcR2y9s9hVd9WSuhHzo,4285 +markdown/blockprocessors.py,sha256=l4gmkAN9b2L340EX0gm24EyWS7UzBviPqX6wYrcgEco,23736 +markdown/core.py,sha256=Hm1VMHvmHJiVMta9y1vFyUx04OWjTP3yRJ-al4Rqz1U,15278 +markdown/extensions/__init__.py,sha256=nw2VtafIf5zHjAcUuykQbaNY6taOmNn7ARn11-Pe080,3661 +markdown/extensions/__pycache__/__init__.cpython-38.pyc,, +markdown/extensions/__pycache__/abbr.cpython-38.pyc,, +markdown/extensions/__pycache__/admonition.cpython-38.pyc,, +markdown/extensions/__pycache__/attr_list.cpython-38.pyc,, +markdown/extensions/__pycache__/codehilite.cpython-38.pyc,, +markdown/extensions/__pycache__/def_list.cpython-38.pyc,, +markdown/extensions/__pycache__/extra.cpython-38.pyc,, +markdown/extensions/__pycache__/fenced_code.cpython-38.pyc,, +markdown/extensions/__pycache__/footnotes.cpython-38.pyc,, +markdown/extensions/__pycache__/legacy_attrs.cpython-38.pyc,, +markdown/extensions/__pycache__/legacy_em.cpython-38.pyc,, +markdown/extensions/__pycache__/md_in_html.cpython-38.pyc,, +markdown/extensions/__pycache__/meta.cpython-38.pyc,, +markdown/extensions/__pycache__/nl2br.cpython-38.pyc,, +markdown/extensions/__pycache__/sane_lists.cpython-38.pyc,, +markdown/extensions/__pycache__/smarty.cpython-38.pyc,, +markdown/extensions/__pycache__/tables.cpython-38.pyc,, +markdown/extensions/__pycache__/toc.cpython-38.pyc,, +markdown/extensions/__pycache__/wikilinks.cpython-38.pyc,, +markdown/extensions/abbr.py,sha256=pqp2HnOR2giT-iYKyqtsp2_eUOWBR0j_hUfjvUV5c88,2916 +markdown/extensions/admonition.py,sha256=HWHHjuYZPAPOg5X8hbpDuSbw8gB6k0odw8GuTT1v_N4,3124 +markdown/extensions/attr_list.py,sha256=m9a1H-S33rV2twtlFYuoxSiCAf22ndU5tziSzNF2dNg,6003 +markdown/extensions/codehilite.py,sha256=ChzzzrRIQZQwhQ7dLEIXDKTnemZzmEJCoNFcw6Sp5gk,9838 +markdown/extensions/def_list.py,sha256=iqRXAEl2XnyF415afCxihAgOmEUOK1hIuBPIK1k7Tzo,3521 +markdown/extensions/extra.py,sha256=udRN8OvSWcq3UwkPygvsFl1RlCVtCJ-ARVg2IwVH6VY,1831 +markdown/extensions/fenced_code.py,sha256=dww9rDu2kQtkoTpjn9BBgeGCTNdE1bMPJ2wgR6695iM,3897 +markdown/extensions/footnotes.py,sha256=a9sb8RoKqFU8p8ZhpTObrn_Uek0hbyPFVGYpRaEDXaw,15339 +markdown/extensions/legacy_attrs.py,sha256=2EaVQkxQoNnP8_lMPvGRBdNda8L4weUQroiyEuVdS-w,2547 +markdown/extensions/legacy_em.py,sha256=9ZMGCTrFh01eiOpnFjS0jVkqgYXiTzCGn-eNvYcvObg,1579 +markdown/extensions/md_in_html.py,sha256=ohSiGcgR5yBqusuTs0opbTO_5fq442fqPK-klFd_qaM,4040 +markdown/extensions/meta.py,sha256=EUfkzM7l7UpH__Or9K3pl8ldVddwndlCZWA3d712RAE,2331 +markdown/extensions/nl2br.py,sha256=wAqTNOuf2L1NzlEvEqoID70n9y-aiYaGLkuyQk3CD0w,783 +markdown/extensions/sane_lists.py,sha256=ZQmCf-247KBexVG0fc62nDvokGkV6W1uavYbieNKSG4,1505 +markdown/extensions/smarty.py,sha256=0padzkVCNACainKw-Xj1S5UfT0125VCTfNejmrCZItA,10238 +markdown/extensions/tables.py,sha256=bicFx_wqhnEx6Y_8MJqA56rh71pt5fOe94oiWbvcobY,7685 +markdown/extensions/toc.py,sha256=C45ZZxlp9uDTE1WW9EvLTKT24H2SY0HM3nUDfGlzgng,13477 +markdown/extensions/wikilinks.py,sha256=GkgT9BY7b1-qW--dIwFAhC9V20RoeF13b7CFdw_V21Q,2812 +markdown/inlinepatterns.py,sha256=EnYq9aU_Hi1gu5e8dcbUxUu0mRz-pHFV79uGQCYbD5I,29378 +markdown/pep562.py,sha256=5UkqT7sb-cQufgbOl_jF-RYUVVHS7VThzlMzR9vrd3I,8917 +markdown/postprocessors.py,sha256=25g6qqpJ4kuiq4RBrGz8RA6GMb7ArUi1AN2VDVnR35U,3738 +markdown/preprocessors.py,sha256=dsmMVPP2afKAZ0s59_mFidM_mCiNfgdBJ9aVDWu_viE,15323 +markdown/serializers.py,sha256=_wQl-iJrPSUEQ4Q1owWYqN9qceVh6TOlAOH_i44BKAQ,6540 +markdown/test_tools.py,sha256=qwF7x7QZa9Wa509Y4KJfmc1O3udrtXgH1AXj33TpDso,6823 +markdown/treeprocessors.py,sha256=NBaYc9TEGP7TBaN6YRROIqE5Lj-AMoAqp0jN-coGW3Q,15401 +markdown/util.py,sha256=3-F0KcHEYOIOayAt8FIeoUxNfLlfMeiSF3EE3dWzxg8,15499 diff --git a/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/WHEEL b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/WHEEL new file mode 100644 index 0000000..c57a597 --- /dev/null +++ b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/entry_points.txt b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/entry_points.txt new file mode 100644 index 0000000..f49693d --- /dev/null +++ b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/entry_points.txt @@ -0,0 +1,23 @@ +[console_scripts] +markdown_py = markdown.__main__:run + +[markdown.extensions] +abbr = markdown.extensions.abbr:AbbrExtension +admonition = markdown.extensions.admonition:AdmonitionExtension +attr_list = markdown.extensions.attr_list:AttrListExtension +codehilite = markdown.extensions.codehilite:CodeHiliteExtension +def_list = markdown.extensions.def_list:DefListExtension +extra = markdown.extensions.extra:ExtraExtension +fenced_code = markdown.extensions.fenced_code:FencedCodeExtension +footnotes = markdown.extensions.footnotes:FootnoteExtension +legacy_attrs = markdown.extensions.legacy_attrs:LegacyAttrExtension +legacy_em = markdown.extensions.legacy_em:LegacyEmExtension +md_in_html = markdown.extensions.md_in_html:MarkdownInHtmlExtension +meta = markdown.extensions.meta:MetaExtension +nl2br = markdown.extensions.nl2br:Nl2BrExtension +sane_lists = markdown.extensions.sane_lists:SaneListExtension +smarty = markdown.extensions.smarty:SmartyExtension +tables = markdown.extensions.tables:TableExtension +toc = markdown.extensions.toc:TocExtension +wikilinks = markdown.extensions.wikilinks:WikiLinkExtension + diff --git a/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/top_level.txt b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/top_level.txt new file mode 100644 index 0000000..0918c97 --- /dev/null +++ b/lib/python3.8/site-packages/Markdown-3.2.2.dist-info/top_level.txt @@ -0,0 +1 @@ +markdown diff --git a/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/METADATA b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..c50370d --- /dev/null +++ b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/METADATA @@ -0,0 +1,105 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 1.1.1 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: The Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/markupsafe +Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +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.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* +Description-Content-Type: text/x-rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + >>> # escape replaces special characters and wraps in Markup + >>> escape('') + Markup(u'<script>alert(document.cookie);</script>') + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup('Hello') + Markup('hello') + >>> escape(Markup('Hello')) + Markup('hello') + >>> # Markup is a text subclass (str on Python 3, unicode on Python 2) + >>> # methods and operators escape their arguments + >>> template = Markup("Hello %s") + >>> template % '"World"' + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +libraries that use it. In order to grow the community of contributors +and users, and allow the maintainers to devote more time to the +projects, `please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +* Website: https://palletsprojects.com/p/markupsafe/ +* Documentation: https://markupsafe.palletsprojects.com/ +* License: `BSD-3-Clause `_ +* Releases: https://pypi.org/project/MarkupSafe/ +* Code: https://github.com/pallets/markupsafe +* Issue tracker: https://github.com/pallets/markupsafe/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/markupsafe + * Windows: https://ci.appveyor.com/project/pallets/markupsafe + +* Test coverage: https://codecov.io/gh/pallets/markupsafe +* Official chat: https://discord.gg/t6rrQZH + + diff --git a/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/RECORD b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..95c3339 --- /dev/null +++ b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/RECORD @@ -0,0 +1,16 @@ +MarkupSafe-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-1.1.1.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-1.1.1.dist-info/METADATA,sha256=IFCP4hCNGjXJgMoSvdjPiKDLAMUTTWoxKXQsQvmyMNU,3653 +MarkupSafe-1.1.1.dist-info/RECORD,, +MarkupSafe-1.1.1.dist-info/WHEEL,sha256=VEyGcIFAmk_1KbI6gaZGw_mMiT-pdGweASQLX-DzYaY,108 +MarkupSafe-1.1.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=oTblO5f9KFM-pvnq9bB0HgElnqkJyqHnFN1Nx2NIvnY,10126 +markupsafe/__pycache__/__init__.cpython-38.pyc,, +markupsafe/__pycache__/_compat.cpython-38.pyc,, +markupsafe/__pycache__/_constants.cpython-38.pyc,, +markupsafe/__pycache__/_native.cpython-38.pyc,, +markupsafe/_compat.py,sha256=uEW1ybxEjfxIiuTbRRaJpHsPFf4yQUMMKaPgYEC5XbU,558 +markupsafe/_constants.py,sha256=zo2ajfScG-l1Sb_52EP3MlDCqO7Y1BVHUXXKRsVDRNk,4690 +markupsafe/_native.py,sha256=d-8S_zzYt2y512xYcuSxq0NeG2DUUvG80wVdTn-4KI8,1873 +markupsafe/_speedups.c,sha256=k0fzEIK3CP6MmMqeY0ob43TP90mVN0DTyn7BAl3RqSg,9884 +markupsafe/_speedups.cpython-38-x86_64-linux-gnu.so,sha256=SbJwN321Xn7OPYGv5a6Ghzga75uT8RHQUGkoQUASF-o,48016 diff --git a/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..ae40efd --- /dev/null +++ b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.1) +Root-Is-Purelib: false +Tag: cp38-cp38-manylinux1_x86_64 + diff --git a/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/AUTHORS b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/AUTHORS new file mode 100644 index 0000000..3dc2234 --- /dev/null +++ b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/AUTHORS @@ -0,0 +1,231 @@ +Pygments is written and maintained by Georg Brandl . + +Major developers are Tim Hatch and Armin Ronacher +. + +Other contributors, listed alphabetically, are: + +* Sam Aaron -- Ioke lexer +* Ali Afshar -- image formatter +* Thomas Aglassinger -- Easytrieve, JCL, Rexx, Transact-SQL and VBScript + lexers +* Muthiah Annamalai -- Ezhil lexer +* Kumar Appaiah -- Debian control lexer +* Andreas Amann -- AppleScript lexer +* Timothy Armstrong -- Dart lexer fixes +* Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers +* Jeremy Ashkenas -- CoffeeScript lexer +* José Joaquín Atria -- Praat lexer +* Stefan Matthias Aust -- Smalltalk lexer +* Lucas Bajolet -- Nit lexer +* Ben Bangert -- Mako lexers +* Max Battcher -- Darcs patch lexer +* Thomas Baruchel -- APL lexer +* Tim Baumann -- (Literate) Agda lexer +* Paul Baumgart, 280 North, Inc. -- Objective-J lexer +* Michael Bayer -- Myghty lexers +* Thomas Beale -- Archetype lexers +* John Benediktsson -- Factor lexer +* Trevor Bergeron -- mIRC formatter +* Vincent Bernat -- LessCSS lexer +* Christopher Bertels -- Fancy lexer +* Sébastien Bigaret -- QVT Operational lexer +* Jarrett Billingsley -- MiniD lexer +* Adam Blinkinsop -- Haskell, Redcode lexers +* Stéphane Blondon -- SGF and Sieve lexers +* Frits van Bommel -- assembler lexers +* Pierre Bourdon -- bugfixes +* Martijn Braam -- Kernel log lexer +* Matthias Bussonnier -- ANSI style handling for terminal-256 formatter +* chebee7i -- Python traceback lexer improvements +* Hiram Chirino -- Scaml and Jade lexers +* Mauricio Caceres -- SAS and Stata lexers. +* Ian Cooper -- VGL lexer +* David Corbett -- Inform, Jasmin, JSGF, Snowball, and TADS 3 lexers +* Leaf Corcoran -- MoonScript lexer +* Christopher Creutzig -- MuPAD lexer +* Daniël W. Crompton -- Pike lexer +* Pete Curry -- bugfixes +* Bryan Davis -- EBNF lexer +* Bruno Deferrari -- Shen lexer +* Giedrius Dubinskas -- HTML formatter improvements +* Owen Durni -- Haxe lexer +* Alexander Dutton, Oxford University Computing Services -- SPARQL lexer +* James Edwards -- Terraform lexer +* Nick Efford -- Python 3 lexer +* Sven Efftinge -- Xtend lexer +* Artem Egorkine -- terminal256 formatter +* Matthew Fernandez -- CAmkES lexer +* Michael Ficarra -- CPSA lexer +* James H. Fisher -- PostScript lexer +* William S. Fulton -- SWIG lexer +* Carlos Galdino -- Elixir and Elixir Console lexers +* Michael Galloy -- IDL lexer +* Naveen Garg -- Autohotkey lexer +* Simon Garnotel -- FreeFem++ lexer +* Laurent Gautier -- R/S lexer +* Alex Gaynor -- PyPy log lexer +* Richard Gerkin -- Igor Pro lexer +* Alain Gilbert -- TypeScript lexer +* Alex Gilding -- BlitzBasic lexer +* GitHub, Inc -- DASM16, Augeas, TOML, and Slash lexers +* Bertrand Goetzmann -- Groovy lexer +* Krzysiek Goj -- Scala lexer +* Rostyslav Golda -- FloScript lexer +* Andrey Golovizin -- BibTeX lexers +* Matt Good -- Genshi, Cheetah lexers +* Michał Górny -- vim modeline support +* Alex Gosse -- TrafficScript lexer +* Patrick Gotthardt -- PHP namespaces support +* Olivier Guibe -- Asymptote lexer +* Phil Hagelberg -- Fennel lexer +* Florian Hahn -- Boogie lexer +* Martin Harriman -- SNOBOL lexer +* Matthew Harrison -- SVG formatter +* Steven Hazel -- Tcl lexer +* Dan Michael Heggø -- Turtle lexer +* Aslak Hellesøy -- Gherkin lexer +* Greg Hendershott -- Racket lexer +* Justin Hendrick -- ParaSail lexer +* Jordi Gutiérrez Hermoso -- Octave lexer +* David Hess, Fish Software, Inc. -- Objective-J lexer +* Varun Hiremath -- Debian control lexer +* Rob Hoelz -- Perl 6 lexer +* Doug Hogan -- Mscgen lexer +* Ben Hollis -- Mason lexer +* Max Horn -- GAP lexer +* Alastair Houghton -- Lexer inheritance facility +* Tim Howard -- BlitzMax lexer +* Dustin Howett -- Logos lexer +* Ivan Inozemtsev -- Fantom lexer +* Hiroaki Itoh -- Shell console rewrite, Lexers for PowerShell session, + MSDOS session, BC, WDiff +* Brian R. Jackson -- Tea lexer +* Christian Jann -- ShellSession lexer +* Dennis Kaarsemaker -- sources.list lexer +* Dmitri Kabak -- Inferno Limbo lexer +* Igor Kalnitsky -- vhdl lexer +* Colin Kennedy - USD lexer +* Alexander Kit -- MaskJS lexer +* Pekka Klärck -- Robot Framework lexer +* Gerwin Klein -- Isabelle lexer +* Eric Knibbe -- Lasso lexer +* Stepan Koltsov -- Clay lexer +* Adam Koprowski -- Opa lexer +* Benjamin Kowarsch -- Modula-2 lexer +* Domen Kožar -- Nix lexer +* Oleh Krekel -- Emacs Lisp lexer +* Alexander Kriegisch -- Kconfig and AspectJ lexers +* Marek Kubica -- Scheme lexer +* Jochen Kupperschmidt -- Markdown processor +* Gerd Kurzbach -- Modelica lexer +* Jon Larimer, Google Inc. -- Smali lexer +* Olov Lassus -- Dart lexer +* Matt Layman -- TAP lexer +* Kristian Lyngstøl -- Varnish lexers +* Sylvestre Ledru -- Scilab lexer +* Chee Sing Lee -- Flatline lexer +* Mark Lee -- Vala lexer +* Valentin Lorentz -- C++ lexer improvements +* Ben Mabey -- Gherkin lexer +* Angus MacArthur -- QML lexer +* Louis Mandel -- X10 lexer +* Louis Marchand -- Eiffel lexer +* Simone Margaritelli -- Hybris lexer +* Kirk McDonald -- D lexer +* Gordon McGregor -- SystemVerilog lexer +* Stephen McKamey -- Duel/JBST lexer +* Brian McKenna -- F# lexer +* Charles McLaughlin -- Puppet lexer +* Kurt McKee -- Tera Term macro lexer +* Lukas Meuser -- BBCode formatter, Lua lexer +* Cat Miller -- Pig lexer +* Paul Miller -- LiveScript lexer +* Hong Minhee -- HTTP lexer +* Michael Mior -- Awk lexer +* Bruce Mitchener -- Dylan lexer rewrite +* Reuben Morais -- SourcePawn lexer +* Jon Morton -- Rust lexer +* Paulo Moura -- Logtalk lexer +* Mher Movsisyan -- DTD lexer +* Dejan Muhamedagic -- Crmsh lexer +* Ana Nelson -- Ragel, ANTLR, R console lexers +* Kurt Neufeld -- Markdown lexer +* Nam T. Nguyen -- Monokai style +* Jesper Noehr -- HTML formatter "anchorlinenos" +* Mike Nolta -- Julia lexer +* Jonas Obrist -- BBCode lexer +* Edward O'Callaghan -- Cryptol lexer +* David Oliva -- Rebol lexer +* Pat Pannuto -- nesC lexer +* Jon Parise -- Protocol buffers and Thrift lexers +* Benjamin Peterson -- Test suite refactoring +* Ronny Pfannschmidt -- BBCode lexer +* Dominik Picheta -- Nimrod lexer +* Andrew Pinkham -- RTF Formatter Refactoring +* Clément Prévost -- UrbiScript lexer +* Tanner Prynn -- cmdline -x option and loading lexers from files +* Oleh Prypin -- Crystal lexer (based on Ruby lexer) +* Xidorn Quan -- Web IDL lexer +* Elias Rabel -- Fortran fixed form lexer +* raichoo -- Idris lexer +* Kashif Rasul -- CUDA lexer +* Nathan Reed -- HLSL lexer +* Justin Reidy -- MXML lexer +* Norman Richards -- JSON lexer +* Corey Richardson -- Rust lexer updates +* Lubomir Rintel -- GoodData MAQL and CL lexers +* Andre Roberge -- Tango style +* Georg Rollinger -- HSAIL lexer +* Michiel Roos -- TypoScript lexer +* Konrad Rudolph -- LaTeX formatter enhancements +* Mario Ruggier -- Evoque lexers +* Miikka Salminen -- Lovelace style, Hexdump lexer, lexer enhancements +* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers +* Matteo Sasso -- Common Lisp lexer +* Joe Schafer -- Ada lexer +* Ken Schutte -- Matlab lexers +* René Schwaiger -- Rainbow Dash style +* Sebastian Schweizer -- Whiley lexer +* Tassilo Schweyer -- Io, MOOCode lexers +* Ted Shaw -- AutoIt lexer +* Joerg Sieker -- ABAP lexer +* Robert Simmons -- Standard ML lexer +* Kirill Simonov -- YAML lexer +* Corbin Simpson -- Monte lexer +* Alexander Smishlajev -- Visual FoxPro lexer +* Steve Spigarelli -- XQuery lexer +* Jerome St-Louis -- eC lexer +* Camil Staps -- Clean and NuSMV lexers; Solarized style +* James Strachan -- Kotlin lexer +* Tom Stuart -- Treetop lexer +* Colin Sullivan -- SuperCollider lexer +* Ben Swift -- Extempore lexer +* Edoardo Tenani -- Arduino lexer +* Tiberius Teng -- default style overhaul +* Jeremy Thurgood -- Erlang, Squid config lexers +* Brian Tiffin -- OpenCOBOL lexer +* Bob Tolbert -- Hy lexer +* Matthias Trute -- Forth lexer +* Erick Tryzelaar -- Felix lexer +* Alexander Udalov -- Kotlin lexer improvements +* Thomas Van Doren -- Chapel lexer +* Daniele Varrazzo -- PostgreSQL lexers +* Abe Voelker -- OpenEdge ABL lexer +* Pepijn de Vos -- HTML formatter CTags support +* Matthias Vallentin -- Bro lexer +* Benoît Vinot -- AMPL lexer +* Linh Vu Hong -- RSL lexer +* Nathan Weizenbaum -- Haml and Sass lexers +* Nathan Whetsell -- Csound lexers +* Dietmar Winkler -- Modelica lexer +* Nils Winter -- Smalltalk lexer +* Davy Wybiral -- Clojure lexer +* Whitney Young -- ObjectiveC lexer +* Diego Zamboni -- CFengine3 lexer +* Enrique Zamudio -- Ceylon lexer +* Alex Zimin -- Nemerle lexer +* Rob Zimmerman -- Kal lexer +* Vincent Zurczak -- Roboconf lexer + +Many thanks for all contributions! diff --git a/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/INSTALLER b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/LICENSE b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/LICENSE new file mode 100644 index 0000000..13d1c74 --- /dev/null +++ b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2006-2019 by the respective authors (see AUTHORS file). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/METADATA b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/METADATA new file mode 100644 index 0000000..ff19f5d --- /dev/null +++ b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/METADATA @@ -0,0 +1,48 @@ +Metadata-Version: 2.1 +Name: Pygments +Version: 2.6.1 +Summary: Pygments is a syntax highlighting package written in Python. +Home-page: https://pygments.org/ +Author: Georg Brandl +Author-email: georg@python.org +License: BSD License +Keywords: syntax highlighting +Platform: any +Classifier: License :: OSI Approved :: BSD License +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: End Users/Desktop +Classifier: Intended Audience :: System Administrators +Classifier: Development Status :: 6 - Mature +Classifier: Programming Language :: Python +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: Operating System :: OS Independent +Classifier: Topic :: Text Processing :: Filters +Classifier: Topic :: Utilities +Requires-Python: >=3.5 + + +Pygments +~~~~~~~~ + +Pygments is a syntax highlighting package written in Python. + +It is a generic syntax highlighter suitable for use in code hosting, forums, +wikis or other applications that need to prettify source code. Highlights +are: + +* a wide range of over 500 languages and other text formats is supported +* special attention is paid to details, increasing quality by a fair amount +* support for new languages and formats are added easily +* a number of output formats, presently HTML, LaTeX, RTF, SVG, all image formats that PIL supports and ANSI sequences +* it is usable as a command-line tool and as a library + +:copyright: Copyright 2006-2019 by the Pygments team, see AUTHORS. +:license: BSD, see LICENSE for details. + + diff --git a/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/RECORD b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/RECORD new file mode 100644 index 0000000..7c92270 --- /dev/null +++ b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/RECORD @@ -0,0 +1,463 @@ +../../../bin/pygmentize,sha256=oJ27IYVp_hf-7N0nHPgqMrMNAB3w_Rkedj1CS5uKXIQ,236 +Pygments-2.6.1.dist-info/AUTHORS,sha256=PVpa2_Oku6BGuiUvutvuPnWGpzxqFy2I8-NIrqCvqUY,8449 +Pygments-2.6.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Pygments-2.6.1.dist-info/LICENSE,sha256=RbiNNEnDeAZZR1i_PEhNnZixKx7MFj9lQx_gf-pgJfA,1331 +Pygments-2.6.1.dist-info/METADATA,sha256=nrRK1IyAspMOw3-uN_SPDbJo1XIALm7ZbRV9aui-FtM,1833 +Pygments-2.6.1.dist-info/RECORD,, +Pygments-2.6.1.dist-info/WHEEL,sha256=p46_5Uhzqz6AzeSosiOnxK-zmFja1i22CrQCjmYe8ec,92 +Pygments-2.6.1.dist-info/entry_points.txt,sha256=NXt9BRDRv6tAfDwqKM0bDHrrxaIt2f1nxH9CwjyjSKc,54 +Pygments-2.6.1.dist-info/top_level.txt,sha256=RjKKqrVIStoebLHdbs0yZ2Lk4rS7cxGguXsLCYvZ2Ak,9 +pygments/__init__.py,sha256=Hmd0jgKuzYTHVCXGJrUr5E7R0tAINEf8WuhKUmC7ITY,3036 +pygments/__main__.py,sha256=JV6RSKzbYgMQHLf0nZGzfq1IXxns2iGunsfkY3jxFKo,372 +pygments/__pycache__/__init__.cpython-38.pyc,, +pygments/__pycache__/__main__.cpython-38.pyc,, +pygments/__pycache__/cmdline.cpython-38.pyc,, +pygments/__pycache__/console.cpython-38.pyc,, +pygments/__pycache__/filter.cpython-38.pyc,, +pygments/__pycache__/formatter.cpython-38.pyc,, +pygments/__pycache__/lexer.cpython-38.pyc,, +pygments/__pycache__/modeline.cpython-38.pyc,, +pygments/__pycache__/plugin.cpython-38.pyc,, +pygments/__pycache__/regexopt.cpython-38.pyc,, +pygments/__pycache__/scanner.cpython-38.pyc,, +pygments/__pycache__/sphinxext.cpython-38.pyc,, +pygments/__pycache__/style.cpython-38.pyc,, +pygments/__pycache__/token.cpython-38.pyc,, +pygments/__pycache__/unistring.cpython-38.pyc,, +pygments/__pycache__/util.cpython-38.pyc,, +pygments/cmdline.py,sha256=-mJqcK1Cic8Z-z-ITdj0yjN9exJdPew8m9BwHvtesJY,19479 +pygments/console.py,sha256=QF0bQHbGeFRSetc3g5JsmGziVHQqIZCprEwNlZFtiRg,1721 +pygments/filter.py,sha256=hu4Qo6zdyMcIprEL3xmZGb-inVe1_vUKvgY9vdAV5JU,2030 +pygments/filters/__init__.py,sha256=L_K0aapWqkqDPBkMVGoXvp17zsv7ddl0bNQdMsK43tg,11534 +pygments/filters/__pycache__/__init__.cpython-38.pyc,, +pygments/formatter.py,sha256=Zyz1t_dRczxwuuQkgkwOIOd2TRZpHMbjVHOL_ch37JQ,2917 +pygments/formatters/__init__.py,sha256=d8AnTX9J39ZKoh2YJIiFcOk79h28T0cJ7Yn6rs4G3UI,5107 +pygments/formatters/__pycache__/__init__.cpython-38.pyc,, +pygments/formatters/__pycache__/_mapping.cpython-38.pyc,, +pygments/formatters/__pycache__/bbcode.cpython-38.pyc,, +pygments/formatters/__pycache__/html.cpython-38.pyc,, +pygments/formatters/__pycache__/img.cpython-38.pyc,, +pygments/formatters/__pycache__/irc.cpython-38.pyc,, +pygments/formatters/__pycache__/latex.cpython-38.pyc,, +pygments/formatters/__pycache__/other.cpython-38.pyc,, +pygments/formatters/__pycache__/rtf.cpython-38.pyc,, +pygments/formatters/__pycache__/svg.cpython-38.pyc,, +pygments/formatters/__pycache__/terminal.cpython-38.pyc,, +pygments/formatters/__pycache__/terminal256.cpython-38.pyc,, +pygments/formatters/_mapping.py,sha256=QvLAVzGeldQ6iE8xeGOYtclUBMV0KclGiINcsCaK538,6175 +pygments/formatters/bbcode.py,sha256=_K7UzwyT70snOYAiT3UkItbXRwQYVuTHpr1AZtRHL6Y,3314 +pygments/formatters/html.py,sha256=Eoa4EJxTmE3g0kgMiNN7Ihh5A9lNWUnBlZ1eXFC-yl4,32625 +pygments/formatters/img.py,sha256=iajPfAvg5cB79wS0Mu3pv5Vy2TgghWQcl1OWIz1NcKg,20701 +pygments/formatters/irc.py,sha256=nU9jSjARuRaZpCuCey7bnRwGTGKeCTEhm_yDDYxzKQ8,5869 +pygments/formatters/latex.py,sha256=IOqv1C-LyWs6v2cgecfZ-CkfNNF6VQqcNkPUs3aHUjU,17711 +pygments/formatters/other.py,sha256=Qfc5OixOxM7YEy0d0NJBT750ukj-uPyhxKtHGTm0Vlc,5140 +pygments/formatters/rtf.py,sha256=z8LTTuEXwx3hpLaG0qeJumZCkUfseLIBsxhZE-0tEKg,5050 +pygments/formatters/svg.py,sha256=QUPMQIhXN4JA6auaUTj6z6JaeffyF7OpVoQ8IENptCo,7279 +pygments/formatters/terminal.py,sha256=q0QuanTWnUr4fuNuxnSnjLwjlyUJSMXqBK58MZCAk8Q,4662 +pygments/formatters/terminal256.py,sha256=x9n-YSOwDZhOaLGmYKLO259ZNBCqSydm_KxZJh2Q-Eg,11126 +pygments/lexer.py,sha256=FBy1KBXYiwf1TYtXN25OSrnLGbm9oAWXCsq6ReqtvNA,31559 +pygments/lexers/__init__.py,sha256=3dDjsioYkLz3fRbX3gV9xoi-SkpRRCtYurrWrylAZCo,11310 +pygments/lexers/__pycache__/__init__.cpython-38.pyc,, +pygments/lexers/__pycache__/_asy_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_cl_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_cocoa_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_csound_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_lasso_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_lua_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_mapping.cpython-38.pyc,, +pygments/lexers/__pycache__/_mql_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_openedge_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_php_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_postgres_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_scilab_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_sourcemod_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_stan_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_stata_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_tsql_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_usd_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_vbscript_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/_vim_builtins.cpython-38.pyc,, +pygments/lexers/__pycache__/actionscript.cpython-38.pyc,, +pygments/lexers/__pycache__/agile.cpython-38.pyc,, +pygments/lexers/__pycache__/algebra.cpython-38.pyc,, +pygments/lexers/__pycache__/ambient.cpython-38.pyc,, +pygments/lexers/__pycache__/ampl.cpython-38.pyc,, +pygments/lexers/__pycache__/apl.cpython-38.pyc,, +pygments/lexers/__pycache__/archetype.cpython-38.pyc,, +pygments/lexers/__pycache__/asm.cpython-38.pyc,, +pygments/lexers/__pycache__/automation.cpython-38.pyc,, +pygments/lexers/__pycache__/basic.cpython-38.pyc,, +pygments/lexers/__pycache__/bibtex.cpython-38.pyc,, +pygments/lexers/__pycache__/boa.cpython-38.pyc,, +pygments/lexers/__pycache__/business.cpython-38.pyc,, +pygments/lexers/__pycache__/c_cpp.cpython-38.pyc,, +pygments/lexers/__pycache__/c_like.cpython-38.pyc,, +pygments/lexers/__pycache__/capnproto.cpython-38.pyc,, +pygments/lexers/__pycache__/chapel.cpython-38.pyc,, +pygments/lexers/__pycache__/clean.cpython-38.pyc,, +pygments/lexers/__pycache__/compiled.cpython-38.pyc,, +pygments/lexers/__pycache__/configs.cpython-38.pyc,, +pygments/lexers/__pycache__/console.cpython-38.pyc,, +pygments/lexers/__pycache__/crystal.cpython-38.pyc,, +pygments/lexers/__pycache__/csound.cpython-38.pyc,, +pygments/lexers/__pycache__/css.cpython-38.pyc,, +pygments/lexers/__pycache__/d.cpython-38.pyc,, +pygments/lexers/__pycache__/dalvik.cpython-38.pyc,, +pygments/lexers/__pycache__/data.cpython-38.pyc,, +pygments/lexers/__pycache__/diff.cpython-38.pyc,, +pygments/lexers/__pycache__/dotnet.cpython-38.pyc,, +pygments/lexers/__pycache__/dsls.cpython-38.pyc,, +pygments/lexers/__pycache__/dylan.cpython-38.pyc,, +pygments/lexers/__pycache__/ecl.cpython-38.pyc,, +pygments/lexers/__pycache__/eiffel.cpython-38.pyc,, +pygments/lexers/__pycache__/elm.cpython-38.pyc,, +pygments/lexers/__pycache__/email.cpython-38.pyc,, +pygments/lexers/__pycache__/erlang.cpython-38.pyc,, +pygments/lexers/__pycache__/esoteric.cpython-38.pyc,, +pygments/lexers/__pycache__/ezhil.cpython-38.pyc,, +pygments/lexers/__pycache__/factor.cpython-38.pyc,, +pygments/lexers/__pycache__/fantom.cpython-38.pyc,, +pygments/lexers/__pycache__/felix.cpython-38.pyc,, +pygments/lexers/__pycache__/floscript.cpython-38.pyc,, +pygments/lexers/__pycache__/forth.cpython-38.pyc,, +pygments/lexers/__pycache__/fortran.cpython-38.pyc,, +pygments/lexers/__pycache__/foxpro.cpython-38.pyc,, +pygments/lexers/__pycache__/freefem.cpython-38.pyc,, +pygments/lexers/__pycache__/functional.cpython-38.pyc,, +pygments/lexers/__pycache__/go.cpython-38.pyc,, +pygments/lexers/__pycache__/grammar_notation.cpython-38.pyc,, +pygments/lexers/__pycache__/graph.cpython-38.pyc,, +pygments/lexers/__pycache__/graphics.cpython-38.pyc,, +pygments/lexers/__pycache__/haskell.cpython-38.pyc,, +pygments/lexers/__pycache__/haxe.cpython-38.pyc,, +pygments/lexers/__pycache__/hdl.cpython-38.pyc,, +pygments/lexers/__pycache__/hexdump.cpython-38.pyc,, +pygments/lexers/__pycache__/html.cpython-38.pyc,, +pygments/lexers/__pycache__/idl.cpython-38.pyc,, +pygments/lexers/__pycache__/igor.cpython-38.pyc,, +pygments/lexers/__pycache__/inferno.cpython-38.pyc,, +pygments/lexers/__pycache__/installers.cpython-38.pyc,, +pygments/lexers/__pycache__/int_fiction.cpython-38.pyc,, +pygments/lexers/__pycache__/iolang.cpython-38.pyc,, +pygments/lexers/__pycache__/j.cpython-38.pyc,, +pygments/lexers/__pycache__/javascript.cpython-38.pyc,, +pygments/lexers/__pycache__/julia.cpython-38.pyc,, +pygments/lexers/__pycache__/jvm.cpython-38.pyc,, +pygments/lexers/__pycache__/lisp.cpython-38.pyc,, +pygments/lexers/__pycache__/make.cpython-38.pyc,, +pygments/lexers/__pycache__/markup.cpython-38.pyc,, +pygments/lexers/__pycache__/math.cpython-38.pyc,, +pygments/lexers/__pycache__/matlab.cpython-38.pyc,, +pygments/lexers/__pycache__/mime.cpython-38.pyc,, +pygments/lexers/__pycache__/ml.cpython-38.pyc,, +pygments/lexers/__pycache__/modeling.cpython-38.pyc,, +pygments/lexers/__pycache__/modula2.cpython-38.pyc,, +pygments/lexers/__pycache__/monte.cpython-38.pyc,, +pygments/lexers/__pycache__/mosel.cpython-38.pyc,, +pygments/lexers/__pycache__/ncl.cpython-38.pyc,, +pygments/lexers/__pycache__/nimrod.cpython-38.pyc,, +pygments/lexers/__pycache__/nit.cpython-38.pyc,, +pygments/lexers/__pycache__/nix.cpython-38.pyc,, +pygments/lexers/__pycache__/oberon.cpython-38.pyc,, +pygments/lexers/__pycache__/objective.cpython-38.pyc,, +pygments/lexers/__pycache__/ooc.cpython-38.pyc,, +pygments/lexers/__pycache__/other.cpython-38.pyc,, +pygments/lexers/__pycache__/parasail.cpython-38.pyc,, +pygments/lexers/__pycache__/parsers.cpython-38.pyc,, +pygments/lexers/__pycache__/pascal.cpython-38.pyc,, +pygments/lexers/__pycache__/pawn.cpython-38.pyc,, +pygments/lexers/__pycache__/perl.cpython-38.pyc,, +pygments/lexers/__pycache__/php.cpython-38.pyc,, +pygments/lexers/__pycache__/pony.cpython-38.pyc,, +pygments/lexers/__pycache__/praat.cpython-38.pyc,, +pygments/lexers/__pycache__/prolog.cpython-38.pyc,, +pygments/lexers/__pycache__/python.cpython-38.pyc,, +pygments/lexers/__pycache__/qvt.cpython-38.pyc,, +pygments/lexers/__pycache__/r.cpython-38.pyc,, +pygments/lexers/__pycache__/rdf.cpython-38.pyc,, +pygments/lexers/__pycache__/rebol.cpython-38.pyc,, +pygments/lexers/__pycache__/resource.cpython-38.pyc,, +pygments/lexers/__pycache__/ride.cpython-38.pyc,, +pygments/lexers/__pycache__/rnc.cpython-38.pyc,, +pygments/lexers/__pycache__/roboconf.cpython-38.pyc,, +pygments/lexers/__pycache__/robotframework.cpython-38.pyc,, +pygments/lexers/__pycache__/ruby.cpython-38.pyc,, +pygments/lexers/__pycache__/rust.cpython-38.pyc,, +pygments/lexers/__pycache__/sas.cpython-38.pyc,, +pygments/lexers/__pycache__/scdoc.cpython-38.pyc,, +pygments/lexers/__pycache__/scripting.cpython-38.pyc,, +pygments/lexers/__pycache__/sgf.cpython-38.pyc,, +pygments/lexers/__pycache__/shell.cpython-38.pyc,, +pygments/lexers/__pycache__/sieve.cpython-38.pyc,, +pygments/lexers/__pycache__/slash.cpython-38.pyc,, +pygments/lexers/__pycache__/smalltalk.cpython-38.pyc,, +pygments/lexers/__pycache__/smv.cpython-38.pyc,, +pygments/lexers/__pycache__/snobol.cpython-38.pyc,, +pygments/lexers/__pycache__/solidity.cpython-38.pyc,, +pygments/lexers/__pycache__/special.cpython-38.pyc,, +pygments/lexers/__pycache__/sql.cpython-38.pyc,, +pygments/lexers/__pycache__/stata.cpython-38.pyc,, +pygments/lexers/__pycache__/supercollider.cpython-38.pyc,, +pygments/lexers/__pycache__/tcl.cpython-38.pyc,, +pygments/lexers/__pycache__/templates.cpython-38.pyc,, +pygments/lexers/__pycache__/teraterm.cpython-38.pyc,, +pygments/lexers/__pycache__/testing.cpython-38.pyc,, +pygments/lexers/__pycache__/text.cpython-38.pyc,, +pygments/lexers/__pycache__/textedit.cpython-38.pyc,, +pygments/lexers/__pycache__/textfmts.cpython-38.pyc,, +pygments/lexers/__pycache__/theorem.cpython-38.pyc,, +pygments/lexers/__pycache__/trafficscript.cpython-38.pyc,, +pygments/lexers/__pycache__/typoscript.cpython-38.pyc,, +pygments/lexers/__pycache__/unicon.cpython-38.pyc,, +pygments/lexers/__pycache__/urbi.cpython-38.pyc,, +pygments/lexers/__pycache__/usd.cpython-38.pyc,, +pygments/lexers/__pycache__/varnish.cpython-38.pyc,, +pygments/lexers/__pycache__/verification.cpython-38.pyc,, +pygments/lexers/__pycache__/web.cpython-38.pyc,, +pygments/lexers/__pycache__/webidl.cpython-38.pyc,, +pygments/lexers/__pycache__/webmisc.cpython-38.pyc,, +pygments/lexers/__pycache__/whiley.cpython-38.pyc,, +pygments/lexers/__pycache__/x10.cpython-38.pyc,, +pygments/lexers/__pycache__/xorg.cpython-38.pyc,, +pygments/lexers/__pycache__/zig.cpython-38.pyc,, +pygments/lexers/_asy_builtins.py,sha256=zO_y8v-bp6kjlIwvbmse79qY8P7qAUhoVObaX9Qy3S8,27311 +pygments/lexers/_cl_builtins.py,sha256=x-mRhM6ukZv0pxYtqCq7SlsezhL8L9fpcCQ-gou0Z9w,14018 +pygments/lexers/_cocoa_builtins.py,sha256=h8CT9tpHtyg7PF1tQsLj0NCoN6o9TzzIOBA5UTadEQs,39962 +pygments/lexers/_csound_builtins.py,sha256=6OzL4rwy_qgAenQ8uN0n2u39NlfoVMSZEOy4tdLNHOE,17619 +pygments/lexers/_lasso_builtins.py,sha256=1jR-3eDhf1CUcPSSEXgbJMymAkQaJqpWIPjYM4rL6Sk,134534 +pygments/lexers/_lua_builtins.py,sha256=VkZNUZW9_lTBBcTFOl8NDepWTBfwha6tkV8BXR1EzaM,8297 +pygments/lexers/_mapping.py,sha256=KQJCLXu0jKEF8g9N8Ysg3giPGOFByjdgiOIEMA1yoqw,58920 +pygments/lexers/_mql_builtins.py,sha256=MS7566jpdiud7gEa_y4iJpHLkqjpo-7Y8WwB9MyMUhY,24737 +pygments/lexers/_openedge_builtins.py,sha256=hCqbIZd_qcBTlLyQGME8mqijUDCIm5P9HtIsv8JCEG8,48362 +pygments/lexers/_php_builtins.py,sha256=6-lirHeDcuo-5U5Yh9D4Fgx0sGmN2gq_dmCzjY3wEQg,154390 +pygments/lexers/_postgres_builtins.py,sha256=OI0j7i72gKoNGJomATjK_P00D7cVT6bpPqeeSB4k0aM,11210 +pygments/lexers/_scilab_builtins.py,sha256=ffgN-8Jj5KLRIwdD9j51zvScUbim2DaYv9WmF8_JCNA,52401 +pygments/lexers/_sourcemod_builtins.py,sha256=BSnleYNoGBZ0IrTJz17r-Z9yz7OHwgJVy1oRvvqXg38,27074 +pygments/lexers/_stan_builtins.py,sha256=BfSr_PiG5QE0-7hUfX4g_jdwugKf1zWtGE2w33FotvA,10481 +pygments/lexers/_stata_builtins.py,sha256=rZ8lopR_vKuDCBeCF9oPf71sHkD6n-tN6T5QpyOVEg4,25228 +pygments/lexers/_tsql_builtins.py,sha256=5qrkZJHk_m1SgTnhCrKp5jXJxexjCaf4GtRkY5_PTEA,15484 +pygments/lexers/_usd_builtins.py,sha256=eiB5M8wMXpllmheEzX3BuId6zXGQWaMcJs92E114P7U,1514 +pygments/lexers/_vbscript_builtins.py,sha256=chotaveFeFC-A6qcRAghQC7fAwrDmV-BKE_TW-hrZwk,4249 +pygments/lexers/_vim_builtins.py,sha256=Il_pjrP0PWUjMLCRPOZPoLgd_3jauvv9SGtBOkzmU2A,57090 +pygments/lexers/actionscript.py,sha256=jQTpfKe0OwRQTknMs132_WhqEDIW7lQbLW0HU5D0cOs,11181 +pygments/lexers/agile.py,sha256=0yI_Bq_-ekqFCiMzkcnJfNQ12iyA4QmPk70RCfl1Xa0,900 +pygments/lexers/algebra.py,sha256=vMjSoC9CgSWUMoaNu7gysQDdAc46t_Y6U4dX2mEzNCc,7201 +pygments/lexers/ambient.py,sha256=1_B2JkmFVgGq-JuEhmrXIu-q5WP2e7Ir5DSpO7qXN9E,2557 +pygments/lexers/ampl.py,sha256=HWeNZxYsNhPuGmW1lgNUxMe5zMtbMQ-xNFoj9oVOvq8,4123 +pygments/lexers/apl.py,sha256=gzIuS7p2Qz-pN5M0i45uvDow_gsNNus5k6zrwe19M9c,3174 +pygments/lexers/archetype.py,sha256=luJBCChBsH6fdJOboz5pVTSNCHh7miLd1xtLnI7TH88,11136 +pygments/lexers/asm.py,sha256=0gX4w_cbEbWWUp0kBla41r0ZMAY8NUxaaeW-faRRiqE,39356 +pygments/lexers/automation.py,sha256=9oR495kiyEbl-ev7PWF4Mw-jvtuSbOkmKJRmOvUzQb8,19640 +pygments/lexers/basic.py,sha256=siXk3fQfTEfJNeSW2sI-rfssoUpyj7drMdMrs5csYrs,27576 +pygments/lexers/bibtex.py,sha256=fxbIyhfV1yrFfd7oyAp-fyss27T0Bfv8VqRdVnLg63Y,4725 +pygments/lexers/boa.py,sha256=OB_W242mpr2vwbhg0MO4BpZcdhjaXuM6ffQ54zn3-ZI,3942 +pygments/lexers/business.py,sha256=onAZDADHM7atSEFKsmODBvPc8GlOTDwPgfsh_hVGXNI,27666 +pygments/lexers/c_cpp.py,sha256=dfPzKNoZeqoprqM4a7pTqWin7scz6VYg5_q9MzbnjH0,10638 +pygments/lexers/c_like.py,sha256=UusXq2S5d0v0CpGsxkmVludmu58WsLZQHWnsb0YwhK4,25080 +pygments/lexers/capnproto.py,sha256=pC3zXFSfYFHEIBq3OqLPGKl71K5HtdWnAEqMz6n8KFY,2194 +pygments/lexers/chapel.py,sha256=qzglX8OKh7aaUgXqAVXFkerNjTMIJKdMbihP_o2VFWk,3908 +pygments/lexers/clean.py,sha256=XG0_2KVyxbRFp-_U5HgT1wN9srL522kOe_9T51HeQmA,6362 +pygments/lexers/compiled.py,sha256=iGwVkCJ-SXoovHegOBSnOG518hHkDudegb9_qS-8vW0,1385 +pygments/lexers/configs.py,sha256=YO1NWPpNENDBN4fr-yBYdBWwIqotSquTeaKfY24a7mk,32127 +pygments/lexers/console.py,sha256=tj_ARAplXlqt2sGb2ycxsOy8xIL4NCAMOd3bZ0Zjojg,4120 +pygments/lexers/crystal.py,sha256=hTz20yWrjuam9JVG9Xxr6I7x50M_sIlfdBs0_gg5hKQ,16845 +pygments/lexers/csound.py,sha256=_OqMoEegHcp0NV7zuiLt6h_aY17adQRlJe1DG-pQP4M,16739 +pygments/lexers/css.py,sha256=EvJYfYeaT-TkDHpqXc4ssz0BoXSnBfWT3Vb9MKCeNQg,31467 +pygments/lexers/d.py,sha256=ZWc365C_vRjee-ATfen2OmHCFW3QMoMNE9JEeTplk94,9686 +pygments/lexers/dalvik.py,sha256=tAoPPa_iRXhWG_MzslSvBE99NlGnkx0WKnwdDQ3XU9o,4420 +pygments/lexers/data.py,sha256=_-dqdUSm7Edmh-zaljABFodHjwMCECW1Y-IlyjnWibM,19072 +pygments/lexers/diff.py,sha256=8jKEVtSA2YKprutpONqFvMKBhK1U_IFdxaScTuRNeU4,4873 +pygments/lexers/dotnet.py,sha256=oGL8kWok74zOLn92iwjOYX6Do9tnk96-YTFlJSdkBaQ,27582 +pygments/lexers/dsls.py,sha256=qv0kHmfQOHkHMnXyFbgYrDjUpsCkuXPLig1hma2zcJ0,35837 +pygments/lexers/dylan.py,sha256=LkWTiLsU561_VQL-PUirryEt7ewbseLRJfN-H1twmiA,10402 +pygments/lexers/ecl.py,sha256=5ivxyk5lzMottCuIxyE7DBvWYJV5KTuaHNRkvOtgM7c,5875 +pygments/lexers/eiffel.py,sha256=He2DwoUqWqMt8_PDzoP3NuBl9AZ9K3_SmpGkIgSzWuI,2482 +pygments/lexers/elm.py,sha256=91CM_h3PPoBLLm2stJqNZi3lgjhZH7NvzNKWdXAe8CA,2997 +pygments/lexers/email.py,sha256=ap9imSi6jbbP7gPBAyc3rcNurVDSNmRKIWv0ByR6VOQ,5207 +pygments/lexers/erlang.py,sha256=bZBqAKFa-EsRpvai0EpwZkKMPCd2q6pDfZapq9gh9Qg,18985 +pygments/lexers/esoteric.py,sha256=I7YEPnQdftxEOasCec8_dxVr7zgypMtoYtds0v2srNQ,9489 +pygments/lexers/ezhil.py,sha256=R26b4iXSpdMkgXewJN2INhJXL0ICXhW2o9fu3bn078U,3020 +pygments/lexers/factor.py,sha256=nBYhJoNLkSxtshGrF08tSQKUq_TtgVp1ukKX4Zromm8,17864 +pygments/lexers/fantom.py,sha256=3OTJDka8qeNRykM1Ki1Lyek6gd-jqOa-l5IgRbX8kSg,9982 +pygments/lexers/felix.py,sha256=DoSGdEntZgG3JUbeBA9fqUtg3lODbqwY3_XS6EIfXt4,9408 +pygments/lexers/floscript.py,sha256=eza4Rw3RI3mFjIIAA2czmi2SlgbcSI1T8pNr7vUd0eY,2667 +pygments/lexers/forth.py,sha256=Yqm9z-PjymjQjaleCW-SNJdCCc_NWeFXMz_XvjtAStI,7179 +pygments/lexers/fortran.py,sha256=XqwbZg25atjNDN8yUnqkxm1nfqbzSgZDqmKUIFNQSHk,9841 +pygments/lexers/foxpro.py,sha256=i1B6wX4U5oY8FJO5BGtTR0RaVWbO6P45PXxndi5HcpE,26236 +pygments/lexers/freefem.py,sha256=bYEPIZ1mysE2Ub9WO8NPHefz-CaGqPiE0WbHZeMHPsQ,27086 +pygments/lexers/functional.py,sha256=gJqzgp1ujTa8Zk5hjzXdutz8vvSJpRxhqTVCkK03Ij0,698 +pygments/lexers/go.py,sha256=aRdc0lsKbF7xxTcUnu35m-_e3SD7s2eBAllq1y7_qY8,3701 +pygments/lexers/grammar_notation.py,sha256=0INMOPjLnMohU0QCUIvBaJdty7A7i1hS4ZItB4ehPnA,7941 +pygments/lexers/graph.py,sha256=v013Gzn_RIuLrEz_DJuUah_vCpv6aVSMZpHGov19BMY,2756 +pygments/lexers/graphics.py,sha256=xfr7jZ_JF81kh-RFxIFSKOa06W4z0YxWzOxXAmrLwMA,38259 +pygments/lexers/haskell.py,sha256=VXzPclm0SiawKT2E4L4ZO8uPKcNYMVDWKY4NPcLKFsg,32245 +pygments/lexers/haxe.py,sha256=uWeORmR1BBCtA_HKRJIhzl26GfkzxzVd7c8or-REw7s,30959 +pygments/lexers/hdl.py,sha256=Xpf_1SJ-Uwf94J6MK_C5wR7JyXQkDKtlNdJ7MLL6uzs,18179 +pygments/lexers/hexdump.py,sha256=7y6XhpOGaVfbtWPSzFxgen8u4sr9sWCbnRUTmvnW1KI,3507 +pygments/lexers/html.py,sha256=B-XSH62dR1GZSJ6E3rDOoF6WO-FcKAnrCqTYvvm8jow,19280 +pygments/lexers/idl.py,sha256=hg7CnizaVt7br6ydWkt4VU9UMNax7gg4ToA3_rnqM1M,14986 +pygments/lexers/igor.py,sha256=FP_3Uz06p1emRB1BqpJ_11KY5k38D5nBLP9nFLnXsHA,30917 +pygments/lexers/inferno.py,sha256=iB07whrTd_qnsABOUalv999QhFYB2nhIHfTp_ECsTxM,3117 +pygments/lexers/installers.py,sha256=QVPOqFLmDydPhBJYmQcyjq6XQvcPb1Hxhpbv5JvgL-M,12866 +pygments/lexers/int_fiction.py,sha256=-jBktm0onIUz_hzsP0lUd3g9aLXJ4KLls0gjIwSB46o,55779 +pygments/lexers/iolang.py,sha256=Sv9qzhNgvVz1xmStZOLm3KTvlcI2A1zywAWQTo6ahs0,1905 +pygments/lexers/j.py,sha256=2wqBgvkxF99yBTdyslEsaeweZuqNO_yNZPjTKRwNTdo,4527 +pygments/lexers/javascript.py,sha256=cOcijZB6rFr1aclYt94LHInEKs1KgZZ4Xg4i2zDvW28,60194 +pygments/lexers/julia.py,sha256=ObRU-RjNe_N6zcQZgq5nws526X_j_4c4KPUFwwROFns,14179 +pygments/lexers/jvm.py,sha256=Qsg2PugXHCD55g_w4GVI4FDFCfOBICYW70xKhWMfNiQ,70347 +pygments/lexers/lisp.py,sha256=oUWEXl8czd_ovmKgkROzATeDjy01jPXAne18zXtEYRY,143609 +pygments/lexers/make.py,sha256=dbnhkZWxESvkvV69TrQEZYdo4yiUGoBBIE-VpXX1uBM,7326 +pygments/lexers/markup.py,sha256=6ACdRUnjI6CGRwes8szHfUjZU-nR7C42y2dbP5EdJeI,20704 +pygments/lexers/math.py,sha256=74YS-Z0zpBP6JYk1fsauYbW7XeZ-XPDTqKakbkX0v1Y,700 +pygments/lexers/matlab.py,sha256=23FUS7UgeE9c0gPr9xnyIBz_0Qr7f8ks8DCumF0fGdU,30403 +pygments/lexers/mime.py,sha256=hf-dShZ8AUSIzTELUEnlel7gnZLZpiOd-OFehEDSba0,7975 +pygments/lexers/ml.py,sha256=SV44RnHSqsCQX7wZHZe_bJtzl0hTFrlY5UF8nhO9ozU,31376 +pygments/lexers/modeling.py,sha256=n4gorBPf3gttlsITHGYeOnrUjUWz3nCh5oLYkDMOnrM,13409 +pygments/lexers/modula2.py,sha256=zenAwJk17hVa1FnOTZHJAwLrDrmcurxu4yw7pUoa_Qk,52561 +pygments/lexers/monte.py,sha256=tIn0lsLdG0iHRX_01KI9OkR4iazyiV5F8H3OlkKdFZQ,6307 +pygments/lexers/mosel.py,sha256=N8J6mCnzTUd4KADnhMAAQ2X5OZGxXI-i2Xvq8HfzjNA,9211 +pygments/lexers/ncl.py,sha256=0U8xDdO0guIlnQKCHKmKQPXv91Jqy1YvrkNoMonaYp4,63986 +pygments/lexers/nimrod.py,sha256=ERUF4NVMUlbirF_FvN8EIXXFRv6RJqchq4rr9vugHPI,5174 +pygments/lexers/nit.py,sha256=FSQCdLNjKUrw_pisiCH-m15EQcz30lv6wvvbTgkrB-Y,2743 +pygments/lexers/nix.py,sha256=RTgXFxL2niA9iG1zLHRWdNZy70he_vE1D0-FcoU1cfw,4031 +pygments/lexers/oberon.py,sha256=HMOnehgSbLaTV6l1e5b44aZttyE2YIfA2hzyj6MW5xU,3733 +pygments/lexers/objective.py,sha256=FA7gniip1eEDC9x1UIvdI8flRtFxehTHId0MlqB0llo,22789 +pygments/lexers/ooc.py,sha256=lP6KSoWFrq9Q7w5F_aRSaLYUryh4nuBcPfnUkwyBQsU,2999 +pygments/lexers/other.py,sha256=0xuOYQ0uI9eLONFTNBv2e-hltZhQcN531NVi7e2AcQQ,1768 +pygments/lexers/parasail.py,sha256=YEgpP3B62qHYOBFcoChOfgzATczrSPj1WyovIgqW3gg,2737 +pygments/lexers/parsers.py,sha256=fhTyqwzifEpFFfW8emQ9WYYBwlUs48Sv_qykCUQoWHE,27590 +pygments/lexers/pascal.py,sha256=YpIQHj54lSJrBFdWSo_nkV8M_dYHfJyJMjLk6W6UNZY,32624 +pygments/lexers/pawn.py,sha256=LN0m73AC00wHyvBlbTPU1k2ihBdmDkfIFq24uAWvsF0,8021 +pygments/lexers/perl.py,sha256=Plh4ovtDulyq5oxJTIijQlJ8Td5ga7s3uQ0sbV7uES8,39155 +pygments/lexers/php.py,sha256=yU7DdvXBQlnEvX6WBb7c9kgSw9COwYp6psvzGmCebs4,10834 +pygments/lexers/pony.py,sha256=h6S-MGKN7q7sk869oWjC1OcgV7zwXloYnGFshhTFxHk,3269 +pygments/lexers/praat.py,sha256=aFOD7K8wEVjcr4Jb3DAGn5AmjhMDSHY8pVC4WQfjGlc,12292 +pygments/lexers/prolog.py,sha256=TNj3F1ossufZ_XKVVrWJlRtPDRU1ExGO6NS0-TBq7gw,12405 +pygments/lexers/python.py,sha256=7VkiN5v5IAIL9bDQGdwtmt2__plhedbEi3rzh397Nec,51187 +pygments/lexers/qvt.py,sha256=_lXPT5SdDEqhCmuq4TcO9JRrP703kIT3a1Y_ZW9NTCY,6097 +pygments/lexers/r.py,sha256=VGb5x89r844B-a_V49wAwu8i0245tbdyLKZWq_wRG74,6276 +pygments/lexers/rdf.py,sha256=RAerwJHNjrtXXtua4UXRfUQkMQ36uqfQZlSj63yoQA8,14608 +pygments/lexers/rebol.py,sha256=3bhOFMMneP38O9aJFjPZlNTS6cwbcnDlJaDbfvF4x1g,18624 +pygments/lexers/resource.py,sha256=xbAErtO3-d4LQJJPnLfhD7Kxz_NVQp4WiYrFu52UX-o,2926 +pygments/lexers/ride.py,sha256=lMlEAtdFILb1vd2WC17UaNwFJqOKb1du7EPG5jwX3Xk,5074 +pygments/lexers/rnc.py,sha256=OxpGllFDAM6Vn_alGiaEKMzQDoqRCrl82ocOO4s6L_k,1990 +pygments/lexers/roboconf.py,sha256=9eZkX5xkajimTV1F5wr0Y8QHPfuEB659Lde8H5AzFfM,2070 +pygments/lexers/robotframework.py,sha256=R0x05_jTPu9bErGS4v_mh-9kyCOG4g4GC-KUvxYkSKo,18646 +pygments/lexers/ruby.py,sha256=rqBelW7OJZIP-J3MVPgQzhXTh3Ey41MjMmpbGQDv390,22168 +pygments/lexers/rust.py,sha256=auhHzIX7VaYzgkj26USy9ZH5DZbPQ1LJYW7YDQB8Wgs,7844 +pygments/lexers/sas.py,sha256=guELd_4GLI1fhZr3Sxtn80Gt6s6ViYFf4jWnK23zzDc,9449 +pygments/lexers/scdoc.py,sha256=raoQeCR0E6sjvT56Lar0Wxc_1u6fB-gFjptjT0jE56g,1983 +pygments/lexers/scripting.py,sha256=kH-Kezddx8HzQMgA2z1ZRB-lcvc9qVyEvZnVjJ_YUBU,69759 +pygments/lexers/sgf.py,sha256=R5Zqd5oVOyUd-NewEXMmACaEO5RX_F7eYUZaJXGTY4g,2024 +pygments/lexers/shell.py,sha256=00dGjndFJ6ZWZzsfKW3nKjIKG-CBwTHH-VYQQs57700,33870 +pygments/lexers/sieve.py,sha256=79MOyJl8iAuvzhphpK-Qu_oybyFTdgzrP6d1Hj9-Lqc,2313 +pygments/lexers/slash.py,sha256=WN2f0VirklPe6djATJtbNMkFGRiuIykKZjqG19Rlgk8,8522 +pygments/lexers/smalltalk.py,sha256=xwRETRB2O_cKHZU9w18QXZpiz87WOw0lULDhMxc9xnA,7215 +pygments/lexers/smv.py,sha256=rbXxBG2rGtm7oPP_Il6v3BbUH3i5q4RtiDaweeN7fLA,2793 +pygments/lexers/snobol.py,sha256=YFOOuPk4yBxg6stlIm6R3UiUgzkMjz06ac7dW3LRxNk,2756 +pygments/lexers/solidity.py,sha256=fW_aQc_HyRawyStUxllYhUn-NYJPCqzDH-ABWTeKcOI,3255 +pygments/lexers/special.py,sha256=N0msqSMphQf0_7Vx9T7kABoHx_KkYLHUxP2FcyYmshg,3149 +pygments/lexers/sql.py,sha256=7evoMDWdBz0kXPIt1jy0YXrQ9KJFYnjN2cslkDrfB88,31823 +pygments/lexers/stata.py,sha256=E46GbEy8ET3yBw1l3KQLSknKW3_qS6Sq3V_hkpVotn0,6459 +pygments/lexers/supercollider.py,sha256=llVW-HUi7m4MNGy4wEp8bF2BJGTXdwF0oNfJfJ_sI8M,3516 +pygments/lexers/tcl.py,sha256=ORf0CBXHwC2MFBpZpcK2sPBCCTyJ3rcwcYOIhN9s0AI,5398 +pygments/lexers/templates.py,sha256=AE6yF5ohbqy52-rn8xUJ5A6OZCkoIs72j7wUnwp25vE,73612 +pygments/lexers/teraterm.py,sha256=2DdFVGyKIF85efcB5QdqqQQNGjqRHoWzVc5psdhSD7c,6310 +pygments/lexers/testing.py,sha256=JfFVWAh_8zaqaiPrewb3CGTmGNuHu6hFR4dtvcFCYRE,10753 +pygments/lexers/text.py,sha256=7cwhjV2GwLRH0CPjlOb7PLVa6XEiRQhDNFU1VO3KNjE,1030 +pygments/lexers/textedit.py,sha256=7F9f0-pAsorZpaFalHOZz5124fsdHCLTAWX_YuwA9XE,6092 +pygments/lexers/textfmts.py,sha256=Ctq-u_o2HVb-xvvsKfpuwkgNzVCNxXJHkirqhpsC8lE,15184 +pygments/lexers/theorem.py,sha256=c51ir2FdsyczFRu059z9wKFZplBETdhwWuWX0Y9wMtM,18908 +pygments/lexers/trafficscript.py,sha256=BYTyTAlD4oDVZ9D1aRrmy4zIC4VJ_n2Lgkgq92DxeJM,1546 +pygments/lexers/typoscript.py,sha256=Leb81-51KKuK9FHoo1xKWJGPqTIsyVoeZkGcsK5tQzU,8224 +pygments/lexers/unicon.py,sha256=xo0E3hnBW0gbdszL6n96Cdzume3l1DI7scgkIQ8koaw,18001 +pygments/lexers/urbi.py,sha256=Zq3PCTC-KI7QYuLZ7NSdikm9-MrAhrYH9DGXVSTT89I,5750 +pygments/lexers/usd.py,sha256=uEPjTqbXu0Ag_qJOB9IEwAGj4-R8_5yBbNRlUPtSlbY,3487 +pygments/lexers/varnish.py,sha256=Y2t_JY7uVz6pH3UvlpIvuaxurH4gRiQrP4Esqw5jPnk,7265 +pygments/lexers/verification.py,sha256=rN6OD2ary21XXvnzUTjknibiM9oF9YjxmLyC7iG6kuo,3932 +pygments/lexers/web.py,sha256=4thoq-m_kGixnDR2baWwN5eEqpFAeH3aRaOMK4J_GOE,918 +pygments/lexers/webidl.py,sha256=TTHSlvRlmdpMPNCMvrrUULY6Y6Q7l53HMR9CGyisq9I,10473 +pygments/lexers/webmisc.py,sha256=pJUyS7bcr77iHQshVzllZmIaZQoVkdGZi1D3FqlJEg0,40054 +pygments/lexers/whiley.py,sha256=J9ZuO8Yv9DYl9Mb6IHyZz2zguGxZXBKxTSwDcxaii8o,4012 +pygments/lexers/x10.py,sha256=Lu35QT0l-objbi6mCm-rxZU_7gO1rZQhjA6JnZ-EBRI,1965 +pygments/lexers/xorg.py,sha256=FDN0czbxMD6YDOqwL6ltspElwMoxxNVKW11OL--keQY,887 +pygments/lexers/zig.py,sha256=C3kbdZ_rJUb0hMK61UiFsjzJVvC_QIPJZ6glZDNPi78,4147 +pygments/modeline.py,sha256=ctgJHLjLF23gklYyo7Nz6P3I3Z8ArewlT5R2n2KNatQ,1010 +pygments/plugin.py,sha256=QFSBZcOqSJqAVQnydwDg8_LG7GzkxUgWjb0FzqoQHEM,1734 +pygments/regexopt.py,sha256=yMZBB3DRudP4AjPGAUpIF__o_NWOK4HrNfFV6h04V1w,3094 +pygments/scanner.py,sha256=tATA_g4QYMfFS2Tb-WIJtr_abdUetPb4tC1k7b0e97w,3115 +pygments/sphinxext.py,sha256=OVWeIgj0mvRslxw5boeo0tBykJHuSi5jSjIWXgAmqgk,4618 +pygments/style.py,sha256=DhwzS-OOt088Zkk-SWY6lBVy-Eh_2AcP2R_FdTYO9oI,5705 +pygments/styles/__init__.py,sha256=TBRYkROPEACN-kE1nQ1ygrhU4efWVShENqI6aqjk5cE,2894 +pygments/styles/__pycache__/__init__.cpython-38.pyc,, +pygments/styles/__pycache__/abap.cpython-38.pyc,, +pygments/styles/__pycache__/algol.cpython-38.pyc,, +pygments/styles/__pycache__/algol_nu.cpython-38.pyc,, +pygments/styles/__pycache__/arduino.cpython-38.pyc,, +pygments/styles/__pycache__/autumn.cpython-38.pyc,, +pygments/styles/__pycache__/borland.cpython-38.pyc,, +pygments/styles/__pycache__/bw.cpython-38.pyc,, +pygments/styles/__pycache__/colorful.cpython-38.pyc,, +pygments/styles/__pycache__/default.cpython-38.pyc,, +pygments/styles/__pycache__/emacs.cpython-38.pyc,, +pygments/styles/__pycache__/friendly.cpython-38.pyc,, +pygments/styles/__pycache__/fruity.cpython-38.pyc,, +pygments/styles/__pycache__/igor.cpython-38.pyc,, +pygments/styles/__pycache__/inkpot.cpython-38.pyc,, +pygments/styles/__pycache__/lovelace.cpython-38.pyc,, +pygments/styles/__pycache__/manni.cpython-38.pyc,, +pygments/styles/__pycache__/monokai.cpython-38.pyc,, +pygments/styles/__pycache__/murphy.cpython-38.pyc,, +pygments/styles/__pycache__/native.cpython-38.pyc,, +pygments/styles/__pycache__/paraiso_dark.cpython-38.pyc,, +pygments/styles/__pycache__/paraiso_light.cpython-38.pyc,, +pygments/styles/__pycache__/pastie.cpython-38.pyc,, +pygments/styles/__pycache__/perldoc.cpython-38.pyc,, +pygments/styles/__pycache__/rainbow_dash.cpython-38.pyc,, +pygments/styles/__pycache__/rrt.cpython-38.pyc,, +pygments/styles/__pycache__/sas.cpython-38.pyc,, +pygments/styles/__pycache__/solarized.cpython-38.pyc,, +pygments/styles/__pycache__/stata_dark.cpython-38.pyc,, +pygments/styles/__pycache__/stata_light.cpython-38.pyc,, +pygments/styles/__pycache__/tango.cpython-38.pyc,, +pygments/styles/__pycache__/trac.cpython-38.pyc,, +pygments/styles/__pycache__/vim.cpython-38.pyc,, +pygments/styles/__pycache__/vs.cpython-38.pyc,, +pygments/styles/__pycache__/xcode.cpython-38.pyc,, +pygments/styles/abap.py,sha256=weNa2ATjBDbWN-EJp36KuapOv_161OYudM6ilzp_5tU,751 +pygments/styles/algol.py,sha256=aVMDywxJ1VRTQ-eYd7CZVQ1BFIWehw2G9OcGg5KmfFI,2263 +pygments/styles/algol_nu.py,sha256=xgZhMlsdR8RppCyaGliUKBWVvianjxt5KrIcWCJDVMM,2278 +pygments/styles/arduino.py,sha256=MtP75GT5SqaAX2PfaC116iPETAPOaD6re6cZ1d9xehQ,4492 +pygments/styles/autumn.py,sha256=setTunOOFJAmdVHab3wmv5OkZmjP6-NVoZjMAyQ2rYY,2144 +pygments/styles/borland.py,sha256=UOFktPmmU_TK6prVMETvVm6FhT01oqsd9_HcG1NZq_Y,1562 +pygments/styles/bw.py,sha256=t0kQytwvh_0SMBcOcmM5foPcc3JWiSd8VWBIXkoP17s,1355 +pygments/styles/colorful.py,sha256=NV-MuEX61J0HH1M0dmurc0RNinp5eA9qIHTjhZ3M6ek,2778 +pygments/styles/default.py,sha256=j124bQ-0TFJaQ2U3ZICWq8_KUOQdjUSxFVknFcpSF40,2532 +pygments/styles/emacs.py,sha256=zNGOC_fHnCZxVphHkieHr7f-zxKkSg_PrFEwWGfQw2U,2486 +pygments/styles/friendly.py,sha256=55qszHEliWiT8h1dW5GjnEA47CpXpJ0BX0C-x6EmZsQ,2515 +pygments/styles/fruity.py,sha256=zkSwyKzmWDs9Jtzgq3rG4DathCH6Pq2JVLuUW8auKXI,1298 +pygments/styles/igor.py,sha256=6GFYt43btx70XZoVDSAqljc1G7UJb6_r9euz0b5nWpY,739 +pygments/styles/inkpot.py,sha256=ecGBxZQw0UhueDHZA06wvgWizu2JzXg9YkYCoLYJuh4,2347 +pygments/styles/lovelace.py,sha256=PBObIz9_gAjMJ8YgNrm-_z2P_wG7moQ1BosKLThJl20,3173 +pygments/styles/manni.py,sha256=EmN6YSp-U-ccxqLqjfnIPg-qkIhUAlSb78tIBvwFCsA,2374 +pygments/styles/monokai.py,sha256=hT5jhhqRQoOmjdK1lZ56hspKke4UDCCiUc3B8m5osLY,5086 +pygments/styles/murphy.py,sha256=ppT--IJLWtcbxKCNRBuusP4zdSmbR8YShosCdd3hpXs,2751 +pygments/styles/native.py,sha256=xkphXXv8PvfbgawNSTR28LcEe1TQxFtdrk_sQcGeo2E,1938 +pygments/styles/paraiso_dark.py,sha256=3a4BSgZQMfB8E2bUMi1WAWkDr98oFUfaPygcsl9B9ZM,5641 +pygments/styles/paraiso_light.py,sha256=QsZyh5oPQb6wYgnoQAkH2MRBkJjRPqAu5De77diOeN8,5645 +pygments/styles/pastie.py,sha256=duELGPs_LEzLbesA39vu0MzxtwkPJ2wnV2rS_clTu2E,2473 +pygments/styles/perldoc.py,sha256=Wf54Io76npBZEsVt8HuM-x7mpzJ7iwPgj5PP_hOf91w,2175 +pygments/styles/rainbow_dash.py,sha256=IlLrIcl76wy4aIiZIRWxMzUILOI9ms7YEX0o6UL9ROc,2480 +pygments/styles/rrt.py,sha256=xQp_B5sDo4BJ4Mzx4PWVK6AW_pZs_XmIoM8zLwpfVTs,852 +pygments/styles/sas.py,sha256=jC6iVFl7-xp0MKwFkPM9QbEInzxVlnhsluPR69iqMZE,1441 +pygments/styles/solarized.py,sha256=f_E9bd-THUcJUJR36hQgbu9BVIjLi6yiI_n07oRu2u4,3747 +pygments/styles/stata_dark.py,sha256=K1AKYh93Jd9E_eWXhDw7-tM6fJbIuFeJcAR5jVE1Nkc,1245 +pygments/styles/stata_light.py,sha256=cN0ulhqteDqKkGnOqAL1aNHy3AvYbmu-fS35XaMptKM,1274 +pygments/styles/tango.py,sha256=1VtAeshYeFh4jWITdb5_wf-7avl1DwtGWrQkvSKqJJo,7096 +pygments/styles/trac.py,sha256=wWJokrY8EWWxJTChPxxYsH_cB-CNN7coa1ZBihzbiG4,1933 +pygments/styles/vim.py,sha256=9PtHne1K4TmKIFcPoM4NY_HRV3naKXRIeEvMC437t7U,1976 +pygments/styles/vs.py,sha256=-mK8_RJJk12gbR-TXP1zedQpflKS2zc9xQQzHbZTB1E,1073 +pygments/styles/xcode.py,sha256=s3NuWSoZ8dRCuU0PU0-aDop4xqgAXP4rVefg5yFgQVg,1501 +pygments/token.py,sha256=J1LOX6vjhiN3pTShN9Mj0MfbWPzhypuPQYZuw29E8As,6167 +pygments/unistring.py,sha256=V4LPrb9dhNBGR-AdEnopDNmwpxFSodqPBuHOlqG9b0g,64569 +pygments/util.py,sha256=586xXHiJGGZxqk5PMBu3vBhE68DLuAe5MBARWrSPGxA,10778 diff --git a/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/WHEEL b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/WHEEL new file mode 100644 index 0000000..3b5c403 --- /dev/null +++ b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/entry_points.txt b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/entry_points.txt new file mode 100644 index 0000000..756d801 --- /dev/null +++ b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +pygmentize = pygments.cmdline:main + diff --git a/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/top_level.txt b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/top_level.txt new file mode 100644 index 0000000..a9f49e0 --- /dev/null +++ b/lib/python3.8/site-packages/Pygments-2.6.1.dist-info/top_level.txt @@ -0,0 +1 @@ +pygments diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/DESCRIPTION.rst b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..4b318b2 --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,237 @@ +Unidecode, lossy ASCII transliterations of Unicode text +======================================================= + +It often happens that you have text data in Unicode, but you need to +represent it in ASCII. For example when integrating with legacy code that +doesn't support Unicode, or for ease of entry of non-Roman names on a US +keyboard, or when constructing ASCII machine identifiers from +human-readable Unicode strings that should still be somewhat intelligible +(a popular example of this is when making an URL slug from an article +title). + +In most of these examples you could represent Unicode characters as ``???`` or +``\\15BA\\15A0\\1610``, to mention two extreme cases. But that's nearly useless +to someone who actually wants to read what the text says. + +What Unidecode provides is a middle road: the function ``unidecode()`` takes +Unicode data and tries to represent it in ASCII characters (i.e., the +universally displayable characters between 0x00 and 0x7F), where the +compromises taken when mapping between two character sets are chosen to be +near what a human with a US keyboard would choose. + +The quality of resulting ASCII representation varies. For languages of +western origin it should be between perfect and good. On the other hand +transliteration (i.e., conveying, in Roman letters, the pronunciation +expressed by the text in some other writing system) of languages like +Chinese, Japanese or Korean is a very complex issue and this library does +not even attempt to address it. It draws the line at context-free +character-by-character mapping. So a good rule of thumb is that the further +the script you are transliterating is from Latin alphabet, the worse the +transliteration will be. + +Note that this module generally produces better results than simply +stripping accents from characters (which can be done in Python with +built-in functions). It is based on hand-tuned character mappings that for +example also contain ASCII approximations for symbols and non-Latin +alphabets. + +This is a Python port of ``Text::Unidecode`` Perl module by Sean M. Burke +. + + +Module content +-------------- + +The module exports a function that takes an Unicode object (Python 2.x) or +string (Python 3.x) and returns a string (that can be encoded to ASCII bytes in +Python 3.x):: + + >>> from unidecode import unidecode + >>> unidecode(u'ko\u017eu\u0161\u010dek') + 'kozuscek' + >>> unidecode(u'30 \U0001d5c4\U0001d5c6/\U0001d5c1') + '30 km/h' + >>> unidecode(u"\u5317\u4EB0") + 'Bei Jing ' + +A utility is also included that allows you to transliterate text from the +command line in several ways. Reading from standard input:: + + $ echo hello | unidecode + hello + +from a command line argument:: + + $ unidecode -c hello + hello + +or from a file:: + + $ unidecode hello.txt + hello + +The default encoding used by the utility depends on your system locale. You can +specify another encoding with the ``-e`` argument. See ``unidecode --help`` for +a full list of available options. + +Requirements +------------ + +Nothing except Python itself. Unidecode supports Python 2.7 and 3.4 or later. + +You need a Python build with "wide" Unicode characters (also called "UCS-4 +build") in order for Unidecode to work correctly with characters outside of +Basic Multilingual Plane (BMP). Common characters outside BMP are bold, italic, +script, etc. variants of the Latin alphabet intended for mathematical notation. +Surrogate pair encoding of "narrow" builds is not supported in Unidecode. + +If your Python build supports "wide" Unicode the following expression will +return True:: + + >>> import sys + >>> sys.maxunicode > 0xffff + True + +See `PEP 261 `_ for details +regarding support for "wide" Unicode characters in Python. + + +Installation +------------ + +To install the latest version of Unidecode from the Python package index, use +these commands:: + + $ pip install unidecode + +To install Unidecode from the source distribution and run unit tests, use:: + + $ python setup.py install + $ python setup.py test + +Frequently asked questions +-------------------------- + +German umlauts are transliterated incorrectly + Latin letters "a", "o" and "u" with diaeresis are transliterated by + Unidecode as "a", "o", "u", *not* according to German rules "ae", "oe", + "ue". This is intentional and will not be changed. Rationale is that these + letters are used in languages other than German (for example, Finnish and + Turkish). German text transliterated without the extra "e" is much more + readable than other languages transliterated using German rules. A + workaround is to do your own replacements of these characters before + passing the string to ``unidecode()``. + +Unidecode should support localization (e.g. a language or country parameter, inspecting system locale, etc.) + Language-specific transliteration is a complicated problem and beyond the + scope of this library. Changes related to this will not be accepted. Please + consider using other libraries which do provide this capability, such as + `Unihandecode `_. + +Unidecode should use a permissive license such as MIT or the BSD license. + The maintainer of Unidecode believes that providing access to source code + on redistribution is a fair and reasonable request when basing products on + voluntary work of many contributors. If the license is not suitable for + you, please consider using other libraries, such as `text-unidecode + `_. + +Unidecode produces completely wrong results (e.g. "u" with diaeresis transliterating as "A 1/4 ") + The strings you are passing to Unidecode have been wrongly decoded + somewhere in your program. For example, you might be decoding utf-8 encoded + strings as latin1. With a misconfigured terminal, locale and/or a text + editor this might not be immediately apparent. Inspect your strings with + ``repr()`` and consult the + `Unicode HOWTO `_. + +I've upgraded Unidecode and now some URLs on my website return 404 Not Found. + This is an issue with the software that is running your website, not + Unidecode. Occasionally, new versions of Unidecode library are released + which contain improvements to the transliteration tables. This means that + you cannot rely that ``unidecode()`` output will not change across + different versions of Unidecode library. If you use ``unidecode()`` to + generate URLs for your website, either generate the URL slug once and store + it in the database or lock your dependency of Unidecode to one specific + version. + +Some of the issues in this section are discussed in more detail in `this blog +post `_. + + +Performance notes +----------------- + +By default, ``unidecode()`` optimizes for the use case where most of the strings +passed to it are already ASCII-only and no transliteration is necessary (this +default might change in future versions). + +For performance critical applications, two additional functions are exposed: + +``unidecode_expect_ascii()`` is optimized for ASCII-only inputs (approximately +5 times faster than ``unidecode_expect_nonascii()`` on 10 character strings, +more on longer strings), but slightly slower for non-ASCII inputs. + +``unidecode_expect_nonascii()`` takes approximately the same amount of time on +ASCII and non-ASCII inputs, but is slightly faster for non-ASCII inputs than +``unidecode_expect_ascii()``. + +Apart from differences in run time, both functions produce identical results. +For most users of Unidecode, the difference in performance should be +negligible. + + +Source +------ + +You can get the latest development version of Unidecode with:: + + $ git clone https://www.tablix.org/~avian/git/unidecode.git + +There is also an official mirror of this repository on GitHub at +https://github.com/avian2/unidecode + + +Contact +------- + +Please make sure to read the `Frequently asked questions`_ section above before +contacting the maintainer. + +Bug reports, patches and suggestions for Unidecode can be sent to +tomaz.solc@tablix.org. + +Alternatively, you can also open a ticket or pull request at +https://github.com/avian2/unidecode + + +Copyright +--------- + +Original character transliteration tables: + +Copyright 2001, Sean M. Burke , all rights reserved. + +Python code and later additions: + +Copyright 2019, Tomaz Solc + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2 of the License, or (at your option) +any later version. + +This program 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 General Public License for +more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., 51 +Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. The programs and +documentation in this dist are distributed in the hope that they will be +useful, but without any warranty; without even the implied warranty of +merchantability or fitness for a particular purpose. + +.. + vim: set filetype=rst: + + diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/INSTALLER b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/LICENSE.txt b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/METADATA b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..c73f056 --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/METADATA @@ -0,0 +1,261 @@ +Metadata-Version: 2.0 +Name: Unidecode +Version: 1.1.1 +Summary: ASCII transliterations of Unicode text +Home-page: UNKNOWN +Author: Tomaz Solc +Author-email: tomaz.solc@tablix.org +License: GPL +Platform: UNKNOWN +Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Text Processing +Classifier: Topic :: Text Processing :: Filters +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +Unidecode, lossy ASCII transliterations of Unicode text +======================================================= + +It often happens that you have text data in Unicode, but you need to +represent it in ASCII. For example when integrating with legacy code that +doesn't support Unicode, or for ease of entry of non-Roman names on a US +keyboard, or when constructing ASCII machine identifiers from +human-readable Unicode strings that should still be somewhat intelligible +(a popular example of this is when making an URL slug from an article +title). + +In most of these examples you could represent Unicode characters as ``???`` or +``\\15BA\\15A0\\1610``, to mention two extreme cases. But that's nearly useless +to someone who actually wants to read what the text says. + +What Unidecode provides is a middle road: the function ``unidecode()`` takes +Unicode data and tries to represent it in ASCII characters (i.e., the +universally displayable characters between 0x00 and 0x7F), where the +compromises taken when mapping between two character sets are chosen to be +near what a human with a US keyboard would choose. + +The quality of resulting ASCII representation varies. For languages of +western origin it should be between perfect and good. On the other hand +transliteration (i.e., conveying, in Roman letters, the pronunciation +expressed by the text in some other writing system) of languages like +Chinese, Japanese or Korean is a very complex issue and this library does +not even attempt to address it. It draws the line at context-free +character-by-character mapping. So a good rule of thumb is that the further +the script you are transliterating is from Latin alphabet, the worse the +transliteration will be. + +Note that this module generally produces better results than simply +stripping accents from characters (which can be done in Python with +built-in functions). It is based on hand-tuned character mappings that for +example also contain ASCII approximations for symbols and non-Latin +alphabets. + +This is a Python port of ``Text::Unidecode`` Perl module by Sean M. Burke +. + + +Module content +-------------- + +The module exports a function that takes an Unicode object (Python 2.x) or +string (Python 3.x) and returns a string (that can be encoded to ASCII bytes in +Python 3.x):: + + >>> from unidecode import unidecode + >>> unidecode(u'ko\u017eu\u0161\u010dek') + 'kozuscek' + >>> unidecode(u'30 \U0001d5c4\U0001d5c6/\U0001d5c1') + '30 km/h' + >>> unidecode(u"\u5317\u4EB0") + 'Bei Jing ' + +A utility is also included that allows you to transliterate text from the +command line in several ways. Reading from standard input:: + + $ echo hello | unidecode + hello + +from a command line argument:: + + $ unidecode -c hello + hello + +or from a file:: + + $ unidecode hello.txt + hello + +The default encoding used by the utility depends on your system locale. You can +specify another encoding with the ``-e`` argument. See ``unidecode --help`` for +a full list of available options. + +Requirements +------------ + +Nothing except Python itself. Unidecode supports Python 2.7 and 3.4 or later. + +You need a Python build with "wide" Unicode characters (also called "UCS-4 +build") in order for Unidecode to work correctly with characters outside of +Basic Multilingual Plane (BMP). Common characters outside BMP are bold, italic, +script, etc. variants of the Latin alphabet intended for mathematical notation. +Surrogate pair encoding of "narrow" builds is not supported in Unidecode. + +If your Python build supports "wide" Unicode the following expression will +return True:: + + >>> import sys + >>> sys.maxunicode > 0xffff + True + +See `PEP 261 `_ for details +regarding support for "wide" Unicode characters in Python. + + +Installation +------------ + +To install the latest version of Unidecode from the Python package index, use +these commands:: + + $ pip install unidecode + +To install Unidecode from the source distribution and run unit tests, use:: + + $ python setup.py install + $ python setup.py test + +Frequently asked questions +-------------------------- + +German umlauts are transliterated incorrectly + Latin letters "a", "o" and "u" with diaeresis are transliterated by + Unidecode as "a", "o", "u", *not* according to German rules "ae", "oe", + "ue". This is intentional and will not be changed. Rationale is that these + letters are used in languages other than German (for example, Finnish and + Turkish). German text transliterated without the extra "e" is much more + readable than other languages transliterated using German rules. A + workaround is to do your own replacements of these characters before + passing the string to ``unidecode()``. + +Unidecode should support localization (e.g. a language or country parameter, inspecting system locale, etc.) + Language-specific transliteration is a complicated problem and beyond the + scope of this library. Changes related to this will not be accepted. Please + consider using other libraries which do provide this capability, such as + `Unihandecode `_. + +Unidecode should use a permissive license such as MIT or the BSD license. + The maintainer of Unidecode believes that providing access to source code + on redistribution is a fair and reasonable request when basing products on + voluntary work of many contributors. If the license is not suitable for + you, please consider using other libraries, such as `text-unidecode + `_. + +Unidecode produces completely wrong results (e.g. "u" with diaeresis transliterating as "A 1/4 ") + The strings you are passing to Unidecode have been wrongly decoded + somewhere in your program. For example, you might be decoding utf-8 encoded + strings as latin1. With a misconfigured terminal, locale and/or a text + editor this might not be immediately apparent. Inspect your strings with + ``repr()`` and consult the + `Unicode HOWTO `_. + +I've upgraded Unidecode and now some URLs on my website return 404 Not Found. + This is an issue with the software that is running your website, not + Unidecode. Occasionally, new versions of Unidecode library are released + which contain improvements to the transliteration tables. This means that + you cannot rely that ``unidecode()`` output will not change across + different versions of Unidecode library. If you use ``unidecode()`` to + generate URLs for your website, either generate the URL slug once and store + it in the database or lock your dependency of Unidecode to one specific + version. + +Some of the issues in this section are discussed in more detail in `this blog +post `_. + + +Performance notes +----------------- + +By default, ``unidecode()`` optimizes for the use case where most of the strings +passed to it are already ASCII-only and no transliteration is necessary (this +default might change in future versions). + +For performance critical applications, two additional functions are exposed: + +``unidecode_expect_ascii()`` is optimized for ASCII-only inputs (approximately +5 times faster than ``unidecode_expect_nonascii()`` on 10 character strings, +more on longer strings), but slightly slower for non-ASCII inputs. + +``unidecode_expect_nonascii()`` takes approximately the same amount of time on +ASCII and non-ASCII inputs, but is slightly faster for non-ASCII inputs than +``unidecode_expect_ascii()``. + +Apart from differences in run time, both functions produce identical results. +For most users of Unidecode, the difference in performance should be +negligible. + + +Source +------ + +You can get the latest development version of Unidecode with:: + + $ git clone https://www.tablix.org/~avian/git/unidecode.git + +There is also an official mirror of this repository on GitHub at +https://github.com/avian2/unidecode + + +Contact +------- + +Please make sure to read the `Frequently asked questions`_ section above before +contacting the maintainer. + +Bug reports, patches and suggestions for Unidecode can be sent to +tomaz.solc@tablix.org. + +Alternatively, you can also open a ticket or pull request at +https://github.com/avian2/unidecode + + +Copyright +--------- + +Original character transliteration tables: + +Copyright 2001, Sean M. Burke , all rights reserved. + +Python code and later additions: + +Copyright 2019, Tomaz Solc + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2 of the License, or (at your option) +any later version. + +This program 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 General Public License for +more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., 51 +Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. The programs and +documentation in this dist are distributed in the hope that they will be +useful, but without any warranty; without even the implied warranty of +merchantability or fitness for a particular purpose. + +.. + vim: set filetype=rst: + + diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/RECORD b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..9a23f0c --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/RECORD @@ -0,0 +1,394 @@ +../../../bin/unidecode,sha256=hYd6juH3iOi5GL_zJq4Dv0l1IhPWiWCfOUGfnAVGFlM,234 +Unidecode-1.1.1.dist-info/DESCRIPTION.rst,sha256=1qgo-PnPYFf7RjSFGEnFbEL6FdtVq5GJMUDpysakI6A,9474 +Unidecode-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Unidecode-1.1.1.dist-info/LICENSE.txt,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092 +Unidecode-1.1.1.dist-info/METADATA,sha256=tYiBHi608dh-oJ4Eev65ipZFvIjgAVbj-peGVHYr73I,10442 +Unidecode-1.1.1.dist-info/RECORD,, +Unidecode-1.1.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +Unidecode-1.1.1.dist-info/entry_points.txt,sha256=ItDp7W6CoSJQAKqdiUkzmecugvKvWzjfN7MMK52GM10,51 +Unidecode-1.1.1.dist-info/metadata.json,sha256=uK7I5vPstQ58Y3hzy2i7dCLyq5GjVCJPIxQk1MZt8x0,1200 +Unidecode-1.1.1.dist-info/top_level.txt,sha256=4uYNG2l04s0dm0mEQmPLo2zrjLbhLPKUesLr2dOTdpo,10 +unidecode/__init__.py,sha256=OdPRbXia-xzzGelCHnVh_zmcHJA2s2wP6RGocPnCihU,3094 +unidecode/__main__.py,sha256=VWYWCclyJsdhtNMQtryMFbgsCZtNUsWcEuS7ZOlH1Jc,40 +unidecode/__pycache__/__init__.cpython-38.pyc,, +unidecode/__pycache__/__main__.cpython-38.pyc,, +unidecode/__pycache__/util.cpython-38.pyc,, +unidecode/__pycache__/x000.cpython-38.pyc,, +unidecode/__pycache__/x001.cpython-38.pyc,, +unidecode/__pycache__/x002.cpython-38.pyc,, +unidecode/__pycache__/x003.cpython-38.pyc,, +unidecode/__pycache__/x004.cpython-38.pyc,, +unidecode/__pycache__/x005.cpython-38.pyc,, +unidecode/__pycache__/x006.cpython-38.pyc,, +unidecode/__pycache__/x007.cpython-38.pyc,, +unidecode/__pycache__/x009.cpython-38.pyc,, +unidecode/__pycache__/x00a.cpython-38.pyc,, +unidecode/__pycache__/x00b.cpython-38.pyc,, +unidecode/__pycache__/x00c.cpython-38.pyc,, +unidecode/__pycache__/x00d.cpython-38.pyc,, +unidecode/__pycache__/x00e.cpython-38.pyc,, +unidecode/__pycache__/x00f.cpython-38.pyc,, +unidecode/__pycache__/x010.cpython-38.pyc,, +unidecode/__pycache__/x011.cpython-38.pyc,, +unidecode/__pycache__/x012.cpython-38.pyc,, +unidecode/__pycache__/x013.cpython-38.pyc,, +unidecode/__pycache__/x014.cpython-38.pyc,, +unidecode/__pycache__/x015.cpython-38.pyc,, +unidecode/__pycache__/x016.cpython-38.pyc,, +unidecode/__pycache__/x017.cpython-38.pyc,, +unidecode/__pycache__/x018.cpython-38.pyc,, +unidecode/__pycache__/x01d.cpython-38.pyc,, +unidecode/__pycache__/x01e.cpython-38.pyc,, +unidecode/__pycache__/x01f.cpython-38.pyc,, +unidecode/__pycache__/x020.cpython-38.pyc,, +unidecode/__pycache__/x021.cpython-38.pyc,, +unidecode/__pycache__/x022.cpython-38.pyc,, +unidecode/__pycache__/x023.cpython-38.pyc,, +unidecode/__pycache__/x024.cpython-38.pyc,, +unidecode/__pycache__/x025.cpython-38.pyc,, +unidecode/__pycache__/x026.cpython-38.pyc,, +unidecode/__pycache__/x027.cpython-38.pyc,, +unidecode/__pycache__/x028.cpython-38.pyc,, +unidecode/__pycache__/x029.cpython-38.pyc,, +unidecode/__pycache__/x02a.cpython-38.pyc,, +unidecode/__pycache__/x02c.cpython-38.pyc,, +unidecode/__pycache__/x02e.cpython-38.pyc,, +unidecode/__pycache__/x02f.cpython-38.pyc,, +unidecode/__pycache__/x030.cpython-38.pyc,, +unidecode/__pycache__/x031.cpython-38.pyc,, +unidecode/__pycache__/x032.cpython-38.pyc,, +unidecode/__pycache__/x033.cpython-38.pyc,, +unidecode/__pycache__/x04d.cpython-38.pyc,, +unidecode/__pycache__/x04e.cpython-38.pyc,, +unidecode/__pycache__/x04f.cpython-38.pyc,, +unidecode/__pycache__/x050.cpython-38.pyc,, +unidecode/__pycache__/x051.cpython-38.pyc,, +unidecode/__pycache__/x052.cpython-38.pyc,, +unidecode/__pycache__/x053.cpython-38.pyc,, +unidecode/__pycache__/x054.cpython-38.pyc,, +unidecode/__pycache__/x055.cpython-38.pyc,, +unidecode/__pycache__/x056.cpython-38.pyc,, +unidecode/__pycache__/x057.cpython-38.pyc,, +unidecode/__pycache__/x058.cpython-38.pyc,, +unidecode/__pycache__/x059.cpython-38.pyc,, +unidecode/__pycache__/x05a.cpython-38.pyc,, +unidecode/__pycache__/x05b.cpython-38.pyc,, +unidecode/__pycache__/x05c.cpython-38.pyc,, +unidecode/__pycache__/x05d.cpython-38.pyc,, +unidecode/__pycache__/x05e.cpython-38.pyc,, +unidecode/__pycache__/x05f.cpython-38.pyc,, +unidecode/__pycache__/x060.cpython-38.pyc,, +unidecode/__pycache__/x061.cpython-38.pyc,, +unidecode/__pycache__/x062.cpython-38.pyc,, +unidecode/__pycache__/x063.cpython-38.pyc,, +unidecode/__pycache__/x064.cpython-38.pyc,, +unidecode/__pycache__/x065.cpython-38.pyc,, +unidecode/__pycache__/x066.cpython-38.pyc,, +unidecode/__pycache__/x067.cpython-38.pyc,, +unidecode/__pycache__/x068.cpython-38.pyc,, +unidecode/__pycache__/x069.cpython-38.pyc,, +unidecode/__pycache__/x06a.cpython-38.pyc,, +unidecode/__pycache__/x06b.cpython-38.pyc,, +unidecode/__pycache__/x06c.cpython-38.pyc,, +unidecode/__pycache__/x06d.cpython-38.pyc,, +unidecode/__pycache__/x06e.cpython-38.pyc,, +unidecode/__pycache__/x06f.cpython-38.pyc,, +unidecode/__pycache__/x070.cpython-38.pyc,, +unidecode/__pycache__/x071.cpython-38.pyc,, +unidecode/__pycache__/x072.cpython-38.pyc,, +unidecode/__pycache__/x073.cpython-38.pyc,, +unidecode/__pycache__/x074.cpython-38.pyc,, +unidecode/__pycache__/x075.cpython-38.pyc,, +unidecode/__pycache__/x076.cpython-38.pyc,, +unidecode/__pycache__/x077.cpython-38.pyc,, +unidecode/__pycache__/x078.cpython-38.pyc,, +unidecode/__pycache__/x079.cpython-38.pyc,, +unidecode/__pycache__/x07a.cpython-38.pyc,, +unidecode/__pycache__/x07b.cpython-38.pyc,, +unidecode/__pycache__/x07c.cpython-38.pyc,, +unidecode/__pycache__/x07d.cpython-38.pyc,, +unidecode/__pycache__/x07e.cpython-38.pyc,, +unidecode/__pycache__/x07f.cpython-38.pyc,, +unidecode/__pycache__/x080.cpython-38.pyc,, +unidecode/__pycache__/x081.cpython-38.pyc,, +unidecode/__pycache__/x082.cpython-38.pyc,, +unidecode/__pycache__/x083.cpython-38.pyc,, +unidecode/__pycache__/x084.cpython-38.pyc,, +unidecode/__pycache__/x085.cpython-38.pyc,, +unidecode/__pycache__/x086.cpython-38.pyc,, +unidecode/__pycache__/x087.cpython-38.pyc,, +unidecode/__pycache__/x088.cpython-38.pyc,, +unidecode/__pycache__/x089.cpython-38.pyc,, +unidecode/__pycache__/x08a.cpython-38.pyc,, +unidecode/__pycache__/x08b.cpython-38.pyc,, +unidecode/__pycache__/x08c.cpython-38.pyc,, +unidecode/__pycache__/x08d.cpython-38.pyc,, +unidecode/__pycache__/x08e.cpython-38.pyc,, +unidecode/__pycache__/x08f.cpython-38.pyc,, +unidecode/__pycache__/x090.cpython-38.pyc,, +unidecode/__pycache__/x091.cpython-38.pyc,, +unidecode/__pycache__/x092.cpython-38.pyc,, +unidecode/__pycache__/x093.cpython-38.pyc,, +unidecode/__pycache__/x094.cpython-38.pyc,, +unidecode/__pycache__/x095.cpython-38.pyc,, +unidecode/__pycache__/x096.cpython-38.pyc,, +unidecode/__pycache__/x097.cpython-38.pyc,, +unidecode/__pycache__/x098.cpython-38.pyc,, +unidecode/__pycache__/x099.cpython-38.pyc,, +unidecode/__pycache__/x09a.cpython-38.pyc,, +unidecode/__pycache__/x09b.cpython-38.pyc,, +unidecode/__pycache__/x09c.cpython-38.pyc,, +unidecode/__pycache__/x09d.cpython-38.pyc,, +unidecode/__pycache__/x09e.cpython-38.pyc,, +unidecode/__pycache__/x09f.cpython-38.pyc,, +unidecode/__pycache__/x0a0.cpython-38.pyc,, +unidecode/__pycache__/x0a1.cpython-38.pyc,, +unidecode/__pycache__/x0a2.cpython-38.pyc,, +unidecode/__pycache__/x0a3.cpython-38.pyc,, +unidecode/__pycache__/x0a4.cpython-38.pyc,, +unidecode/__pycache__/x0ac.cpython-38.pyc,, +unidecode/__pycache__/x0ad.cpython-38.pyc,, +unidecode/__pycache__/x0ae.cpython-38.pyc,, +unidecode/__pycache__/x0af.cpython-38.pyc,, +unidecode/__pycache__/x0b0.cpython-38.pyc,, +unidecode/__pycache__/x0b1.cpython-38.pyc,, +unidecode/__pycache__/x0b2.cpython-38.pyc,, +unidecode/__pycache__/x0b3.cpython-38.pyc,, +unidecode/__pycache__/x0b4.cpython-38.pyc,, +unidecode/__pycache__/x0b5.cpython-38.pyc,, +unidecode/__pycache__/x0b6.cpython-38.pyc,, +unidecode/__pycache__/x0b7.cpython-38.pyc,, +unidecode/__pycache__/x0b8.cpython-38.pyc,, +unidecode/__pycache__/x0b9.cpython-38.pyc,, +unidecode/__pycache__/x0ba.cpython-38.pyc,, +unidecode/__pycache__/x0bb.cpython-38.pyc,, +unidecode/__pycache__/x0bc.cpython-38.pyc,, +unidecode/__pycache__/x0bd.cpython-38.pyc,, +unidecode/__pycache__/x0be.cpython-38.pyc,, +unidecode/__pycache__/x0bf.cpython-38.pyc,, +unidecode/__pycache__/x0c0.cpython-38.pyc,, +unidecode/__pycache__/x0c1.cpython-38.pyc,, +unidecode/__pycache__/x0c2.cpython-38.pyc,, +unidecode/__pycache__/x0c3.cpython-38.pyc,, +unidecode/__pycache__/x0c4.cpython-38.pyc,, +unidecode/__pycache__/x0c5.cpython-38.pyc,, +unidecode/__pycache__/x0c6.cpython-38.pyc,, +unidecode/__pycache__/x0c7.cpython-38.pyc,, +unidecode/__pycache__/x0c8.cpython-38.pyc,, +unidecode/__pycache__/x0c9.cpython-38.pyc,, +unidecode/__pycache__/x0ca.cpython-38.pyc,, +unidecode/__pycache__/x0cb.cpython-38.pyc,, +unidecode/__pycache__/x0cc.cpython-38.pyc,, +unidecode/__pycache__/x0cd.cpython-38.pyc,, +unidecode/__pycache__/x0ce.cpython-38.pyc,, +unidecode/__pycache__/x0cf.cpython-38.pyc,, +unidecode/__pycache__/x0d0.cpython-38.pyc,, +unidecode/__pycache__/x0d1.cpython-38.pyc,, +unidecode/__pycache__/x0d2.cpython-38.pyc,, +unidecode/__pycache__/x0d3.cpython-38.pyc,, +unidecode/__pycache__/x0d4.cpython-38.pyc,, +unidecode/__pycache__/x0d5.cpython-38.pyc,, +unidecode/__pycache__/x0d6.cpython-38.pyc,, +unidecode/__pycache__/x0d7.cpython-38.pyc,, +unidecode/__pycache__/x0f9.cpython-38.pyc,, +unidecode/__pycache__/x0fa.cpython-38.pyc,, +unidecode/__pycache__/x0fb.cpython-38.pyc,, +unidecode/__pycache__/x0fc.cpython-38.pyc,, +unidecode/__pycache__/x0fd.cpython-38.pyc,, +unidecode/__pycache__/x0fe.cpython-38.pyc,, +unidecode/__pycache__/x0ff.cpython-38.pyc,, +unidecode/__pycache__/x1d4.cpython-38.pyc,, +unidecode/__pycache__/x1d5.cpython-38.pyc,, +unidecode/__pycache__/x1d6.cpython-38.pyc,, +unidecode/__pycache__/x1d7.cpython-38.pyc,, +unidecode/__pycache__/x1f1.cpython-38.pyc,, +unidecode/util.py,sha256=qR0aGIMExGrFUGmojfAMdbRklcXrAPvXpU1evPXCa4g,1782 +unidecode/x000.py,sha256=dxTi7LcLTlbF3ZGGk9xPjx8sx2M6qPBIs2b5RS2DVNY,3041 +unidecode/x001.py,sha256=ylHh3UVaPtibVuUEEWvdSeDFK0OXrWt4-LnxAgYD6qo,3891 +unidecode/x002.py,sha256=Hoks5fu8uyhwDuJt93BiC6iYv_HVY4bIvKklyAtBoFI,3889 +unidecode/x003.py,sha256=UdskMuqktghKcjLeegwYkyfhDH3lgi_G5rr7ID5W0-s,3875 +unidecode/x004.py,sha256=85Sh4Rem7dRS7kIx6yGQqA7U7MxqCD40DGoqaob9MzI,4071 +unidecode/x005.py,sha256=qPEepEySMuoXFtVhrFw-y69wnVQGcFmk_0vtcUzDYTo,3997 +unidecode/x006.py,sha256=4fZWzc5DGZVFD1zvHtkywMHykQTiFgA7M6LMowpaGI0,3961 +unidecode/x007.py,sha256=k2kkTXdbKqMFOQy2TlGmRnoRYMCOvqTfjusGV76u9SE,4122 +unidecode/x009.py,sha256=aZrWpXwsS2yIyO8oZIIN3Uo4j0XdpaJq5VGdCu3e8cc,4075 +unidecode/x00a.py,sha256=UrXdvZ-qVMfWRSRW8HwrxfNXB-Jp0lgW2iPs6roZXz4,4121 +unidecode/x00b.py,sha256=MjqdSyCxXLZ6wUrgeS8A-wop9S78EEK9e-BJ4HpAqLA,4132 +unidecode/x00c.py,sha256=y-y0RqVolrIBfsj1DtT_rQUbmxxjoKnWlZDMPPC6Om4,4102 +unidecode/x00d.py,sha256=OVfHvb44WS_aMXSWrZt-693xJ70L4sepcyJFIkl23TY,4121 +unidecode/x00e.py,sha256=9N9w09V225dx1-e8w0HRaIoD66mpDhHgoQ-RlPZznmA,4092 +unidecode/x00f.py,sha256=Vak8Z6Dy6ucFysFSNBt24ZE4h2ZSXQcBLiWCSC27bSA,4061 +unidecode/x010.py,sha256=9vck5PTRcz5Q64F_2dIMQoPGEFTHWjvwq7ZE90nvOK4,4110 +unidecode/x011.py,sha256=8EN-PZS-ythtQlU3HZYNkGePm3oWFzSOgOorkeQUBV4,4135 +unidecode/x012.py,sha256=2onQfsL5e7X4RB9DKehMUcG81gaSav4UwGalXulnxOE,4318 +unidecode/x013.py,sha256=Nl9CnUVkJkXBux5TEia5Vq1nPjTICUUyT77GhkChbrQ,4247 +unidecode/x014.py,sha256=CkrW473dLq_AllpcK8teAUQSeglML_MZ6t9TsK5g9wE,4300 +unidecode/x015.py,sha256=TB6O4l2qPxbmF2dejlxXLqX5tTfjl95cMYx1770GHs0,4329 +unidecode/x016.py,sha256=M9kiUT0ScE5acj-tkomNZ0eND1lvau0i6tJOWepU1FA,4140 +unidecode/x017.py,sha256=nsZP_7vWKOTYY8LOE535g67qwwaMdGblZ-79MbfTNX8,4190 +unidecode/x018.py,sha256=_qBETpive71IdV6nD0md6KaSHaxaSpPUsTTHtVlE4KM,4099 +unidecode/x01d.py,sha256=EwAYkMVHAFvbKRzsQ-e4cRcvS_eia3kYCM2GcaqkBWY,3701 +unidecode/x01e.py,sha256=oVdWd4v85k-Slc3V0i2NZ4i5G866X6Qw7bKXJDmbXig,3853 +unidecode/x01f.py,sha256=pG-fs1iD7O3vSwIx6Ibz5MhpZI_NsQWEDlHiRpxgZC0,3899 +unidecode/x020.py,sha256=k9PWwEJiWl7yUFTVR89cl2XuYqWDEiVfrXvSqOaeJH4,4010 +unidecode/x021.py,sha256=Ns9H51Q51tDB-mRSERyMN1y2EiE7UPQx9K3BxwaFrQs,4012 +unidecode/x022.py,sha256=OzIXC-VMfUskTtEe5_m3zpmgtKtJSDY0XBZ5C0codi8,4329 +unidecode/x023.py,sha256=FFgn4hJ7Q4SbsxFtHUa8SuQ0VBJ9hkod5QTWaMmkk9U,4341 +unidecode/x024.py,sha256=pMZqUxkwfgz9n9NXpUaAaNr-p9ACNCyfTQKo2PFJ11w,4049 +unidecode/x025.py,sha256=-dvBV3byxxngHQcQx7Jjt9dwtehBaQwRoCnX3ZAzWe0,3871 +unidecode/x026.py,sha256=N7i11hEwuiW9mSEp0Dk4Aa9iIsHsxAYhLAplqZnUMs0,4020 +unidecode/x027.py,sha256=wZ1l328qv5BWbk-FPr34ayyJ4rWQG3EQIsPxd7GilFg,3783 +unidecode/x028.py,sha256=FZPCZ9w3N3WOI42h2gHEQgVOAlLBNTZjMu_KQQkIMdk,5069 +unidecode/x029.py,sha256=TlYRf7ym0R-L7DncmX4RNZX5kKctvGFLbtu8GPkxqpE,3584 +unidecode/x02a.py,sha256=WD3uhv1sNhQB45ugiKUk4Btj3aj8qcH_kpwrV3jRWJw,3589 +unidecode/x02c.py,sha256=zRG2Elxv5SlYrBpJb1NUz7WsJOFAkzwSi991cMyhnJs,3596 +unidecode/x02e.py,sha256=_ntc-U9pwAkGQkFC3zdQgJNUZSv9W4115ouIbINGyw4,4461 +unidecode/x02f.py,sha256=9cxem6MFm7acjUDcmYLk9lbxEyfP2xMjfE3c-6PUEbg,4572 +unidecode/x030.py,sha256=aHVHcoSl5FcxX9QQALaW5n1zYJ0Ymap-wgWuzojXLyY,4037 +unidecode/x031.py,sha256=vRlzxBKPo5s3ZDpUojrXelZKjTEwR8fsnm3vUeB5bp8,4125 +unidecode/x032.py,sha256=BSZV_t8jVsWX_RsoqajWAqigQaHh3wXmoMG5wUZtgos,4485 +unidecode/x033.py,sha256=ImTd4BRRPgCqWmrvJPoikoL0dJMKH8eQgd48vksi60A,4513 +unidecode/x04d.py,sha256=d5K-HbR3Gg1VBdMk1GO6PJdoseRRIV5ef4aQbslnsBo,4528 +unidecode/x04e.py,sha256=z04XMxt3y016alep4Xg8Zjh4cvBj6CddjD9Qv6sr6v4,4646 +unidecode/x04f.py,sha256=zEf_S6bDF755svnPRWyreVf2Q4SekYMxIpGf1Jb2alc,4607 +unidecode/x050.py,sha256=MNhEf7TRcQ2CdgkMcFloEGSbTtrsXK-6r6Ru7HDG6hU,4682 +unidecode/x051.py,sha256=VY0jC10xdU7bm21Cig5omd7L-4hiSk_rk2UTR_yTF3g,4685 +unidecode/x052.py,sha256=a09eo_5pL6jpU9TW-zG2w2iXTYp6awtQ4OxGnLdcwKg,4654 +unidecode/x053.py,sha256=so5U-CQ5jRbp7AYZZPCdmkdnNtfNn_-Nl_761eBMtIU,4616 +unidecode/x054.py,sha256=Htu6ZFPTTyBHUU1Ia-mc7Y3Dy4j1cp-fRwag0HGwmwk,4583 +unidecode/x055.py,sha256=WzgwsrHInE1H-O519FOIybJpofzdyfu7w5NZ5I2OtQI,4599 +unidecode/x056.py,sha256=t4ZVJlxic1vcqhrypLWRd3LyIfEuWoPIz343pCrfW7k,4615 +unidecode/x057.py,sha256=ndJuRj4TnvSe6aLX-yzDYHnWEl1JfqA6HnQvzsf2Fyo,4631 +unidecode/x058.py,sha256=nkaS7T1PVlhKlxVd-WrDw4Gx14mciLEZQrUt-9NpkD0,4678 +unidecode/x059.py,sha256=9wAKGpczWuyqMb89px7Ldy1McHecDXd8RMJ7lXwcBCU,4644 +unidecode/x05a.py,sha256=F150z3X248dkDgTq-0lyL-bLRqZZd7U0mkUI6PJRwwM,4636 +unidecode/x05b.py,sha256=LeJj8prX04qvLHFaeG-b2YE9LqIbnUec6pFD-7E918c,4668 +unidecode/x05c.py,sha256=Citt0KhdqvWkErFdpeSyg6x5CviH1opVRPSD6eBWjsA,4612 +unidecode/x05d.py,sha256=w1vKjN5RWPiwP535FCiqakz1IbeB4MGe2ANVM_bcdq4,4670 +unidecode/x05e.py,sha256=6Z7gnAXq9tVwvFIwh632oLQuEiHz1atcqIDREeoqldM,4668 +unidecode/x05f.py,sha256=Ho5tdX7JErho7LjeVCxf29XlWeEpDt5RUJC3nbw2j8M,4660 +unidecode/x060.py,sha256=2x6hmUwn_V3icd1kdfzkkDp5iEdmij7zpUWizfVIE7Q,4642 +unidecode/x061.py,sha256=hwSoPcP4PLy5zPITLdSVaYGwt_fIH9kJPpshKJZi-LA,4662 +unidecode/x062.py,sha256=rH9eYXX_t-Z4-pOy9-lyVm68zXt114X3lAIBI5JG_Qs,4620 +unidecode/x063.py,sha256=n8aXYOPurrEbBzz4DAl-tFOFiqMJ-r1Yt3WpM3ZGTq0,4656 +unidecode/x064.py,sha256=uBebjkUmgQVzK0tKWjxLZwQ1oC9KMEppv0W6caB8v1g,4655 +unidecode/x065.py,sha256=cFnHSLoNwMG6PJvxWWeWShSkHoB9IYTS2LJCc8W0l4I,4638 +unidecode/x066.py,sha256=gV2vx0TqIA44PBOzF02wetf3dxXcXmg8Jr2CtzxMDFU,4677 +unidecode/x067.py,sha256=9ck2UFSv8UL3c0RHPTdV4Rzq7ogZVedwsMAYhGE1lmM,4635 +unidecode/x068.py,sha256=aTAAeHLr5-VnMqNF0h9KC4tFOusV9PpWdywp7xllAA0,4674 +unidecode/x069.py,sha256=8_VMN2vGqNAPrP8iPxICRI9PN81Hts21FM1A4n1_7to,4673 +unidecode/x06a.py,sha256=e7ahJ-j5YvomZvQcIxfAMbHgijbKncYoTN9TakDQqig,4674 +unidecode/x06b.py,sha256=lBRWVhTMJPBKWAyAT23PueHtw9wXTuUG9S2UVWjosr4,4608 +unidecode/x06c.py,sha256=i8xXjlNwhXxvrHdnTbdy-jTfml_fD0uFURctA1BQKk0,4643 +unidecode/x06d.py,sha256=BvgJd7TNj6cL6I5bjPXngi3tJPo0YfhISCHSXvfmsTk,4651 +unidecode/x06e.py,sha256=jZ6VeQbASYGtx0QXySzZzRQf_LqtPAU6jhTo3U_nFTU,4640 +unidecode/x06f.py,sha256=W0A95toB7w7pLrohCaet_d0-S3V84fjzTKgZ6vhUtok,4650 +unidecode/x070.py,sha256=lVM1qXUltqIrKIi0WPH1F5Feuq4M007nm3lOkR_EB2s,4693 +unidecode/x071.py,sha256=v2V3WNKPVEhuJ_RX6rZA45rFIukgMCJ8rqPoUwj05zc,4670 +unidecode/x072.py,sha256=NhOkJEqApO9shkYgwdWVarVUDmWailI4N1vNiLGkOSM,4659 +unidecode/x073.py,sha256=loYg-ZrK1rdy2CkbQfd4qydW8lCeiNywEzT6gLTN-GI,4646 +unidecode/x074.py,sha256=FLIumUZcrCy9Y6eXL5BLpa_hE5HMGbPo-PWtFBh-rBs,4696 +unidecode/x075.py,sha256=P3SrhI5BQ5sJ66hyu_LWDONpuzLZJBKsl7f-A37sJXc,4675 +unidecode/x076.py,sha256=3enaJAMy951MK_yBnhJiOmoTdzU0eJ2uEgoRgZRTUn0,4639 +unidecode/x077.py,sha256=XH_TjHspGSnu4v3qgNOqFNMvZKZcA-HH6q_GWB48Cos,4675 +unidecode/x078.py,sha256=L9XOo8UH_x-prQC_edArnTs-j2asZR940sLaPST2iy0,4648 +unidecode/x079.py,sha256=6e29mgaXPmtMrU8_QRfmZpWZW8o-yEeeIOgAHOoepo8,4602 +unidecode/x07a.py,sha256=fMACYuAsIumgE8XkYnM2795HtFA6weH4YLn7jgJLbbw,4669 +unidecode/x07b.py,sha256=UH8ZXsR11pINz0AaxJ8etTTyaXiCawjuLcctzp4FwZc,4669 +unidecode/x07c.py,sha256=fpqGGsF0-rEVxBeVFf0RM8fjweUlg-9UduAtxAjL5vc,4663 +unidecode/x07d.py,sha256=EKFrTQTNFLGnsm3qI76ALxrxGCcDuyEbapi9j9jy1B4,4678 +unidecode/x07e.py,sha256=n2OG5xe8I-V0pn98Q2E-7PbXSQQI72ozNNUXFnMZHvM,4682 +unidecode/x07f.py,sha256=g455qjG3LBu9ujuuTt5xrRn2djK_iVXAJ4dUVl-bYfs,4664 +unidecode/x080.py,sha256=Fuqy0RgnvfvFFdmGiaHwK2B60UCU5Aw4fyF79kBfhr8,4651 +unidecode/x081.py,sha256=rQg3Hjqo61bEKCpb7TybHDLv2Hgu-_ghKdW6xk9xOhU,4673 +unidecode/x082.py,sha256=sRjOiGrYy2RtqqH_xQdL6_i17I-wJZI6ag7404mL4M8,4649 +unidecode/x083.py,sha256=8hCxGV2o1kFA6hMFvk4Ici_QKynDCYjDWjzCuMyfmHI,4643 +unidecode/x084.py,sha256=jIDgDPhwssUcLgA7N0ZINrB_qZn1P4C7lHyvP7yKA6o,4646 +unidecode/x085.py,sha256=5063XP5F72OEYuqjETqFlN_7IaU1A0feVuvIup9R0rI,4636 +unidecode/x086.py,sha256=ovNLdMRRHm4jngDGXmwG66zZH6l-V-uMtoYnXB_W_QY,4614 +unidecode/x087.py,sha256=-VmLJWGVMGF9BxYD8VcTc8TS83W27qcERuycKCfpLBc,4649 +unidecode/x088.py,sha256=E63aAVUF0B1f-5XL7fOUWqXL2juUJLU9TwO_LHKvd2Q,4645 +unidecode/x089.py,sha256=mrKWneiJ2hIFkM4cu4bU0IQMvTRWgXZ8rsDW575jp9A,4628 +unidecode/x08a.py,sha256=NjMp9ck824PXG2gcJXfi_9oQCFgXhhiallO3bYCtXCE,4647 +unidecode/x08b.py,sha256=W1kAtliqhm5x28Kxc6kUrjzqo-xc_HmYY0BjHhEV2x4,4643 +unidecode/x08c.py,sha256=aDhwugSrvtUhDdwbACfjS0EkBqGojwny-qbrQRJfPhA,4630 +unidecode/x08d.py,sha256=oyydBTJng0ip79lUTBHoTIqGjxmHTb0twkPZqE7LxeU,4636 +unidecode/x08e.py,sha256=w-FysLX-LgmggEuhmPZjyT67-i4_EB8Hx44i_X_Q3Nc,4659 +unidecode/x08f.py,sha256=adygkkCQn4W6YhJUknf2O-2eM_LzH1LfjjpgenbPh80,4651 +unidecode/x090.py,sha256=j-5qrCDDHYKJnbHL5A_fm5ISrdFVgDR5bXQbP18G-14,4631 +unidecode/x091.py,sha256=S8jlVjjPNLPCsSXK8qKXqGGoTLj-LWje5J-f-2AAEXY,4655 +unidecode/x092.py,sha256=uSF8NVYh_UGJE2pcl4JrVU2Prb-T2crGLCE4XQe7DfQ,4648 +unidecode/x093.py,sha256=oMiZM1VfvfKnwVKSJh28iynWJG8iQtKu_1zsrbPdPNs,4666 +unidecode/x094.py,sha256=MShhNv4E9bj9jmQEtWHi_8ZjeS4p2Iz6j3j9kJb5rK0,4661 +unidecode/x095.py,sha256=BQ1R6QwhWjC_Eb7zIbWP0A2ro7bI-t6fTAQWLFMmzAM,4671 +unidecode/x096.py,sha256=N9hLQrZhbTXC9boxDcWu3WESTIB6En82kJkBY-6qBRI,4610 +unidecode/x097.py,sha256=K4waHuw6tNchmcY7Glc-Su6cTG3-iF_X_egYuG-E4fA,4643 +unidecode/x098.py,sha256=CFFcb5gpK7FBqPsFwRoLP0YcYFJBGgh3l-Rf4PzXbjc,4645 +unidecode/x099.py,sha256=e9w1-tsa3tCYYQXn71Ey1bg_n2UYudMQ0y-zSSCdajE,4629 +unidecode/x09a.py,sha256=Z8pQsTc62CWgm0JPnj3kokKKf9_qfzRpo0u5iH61CaE,4623 +unidecode/x09b.py,sha256=piSZ2AAK5GavHJEa8qwI_lrldSSgNhxYvLua0Au_1aA,4655 +unidecode/x09c.py,sha256=NveMhN85_Cm4H1cnfHDTcnSj675MOVBq9Lkjpw3YxA0,4659 +unidecode/x09d.py,sha256=2Sj376QIs8rJ7VDrPW5RELhkJ8LI5JI4NRbFcl4DXlE,4632 +unidecode/x09e.py,sha256=z1bF6AML_d20dQm9HD7YBrnKqTQVjeTTI999hcLEe0M,4615 +unidecode/x09f.py,sha256=T-pS5hli39rA1GDDqZYfyHRupPALqklPXA-1i8pgc1I,4509 +unidecode/x0a0.py,sha256=EpopPuuocybgCcpX19Ii-udqsPXJjSces3360lqJ8vs,4428 +unidecode/x0a1.py,sha256=0hvF77d5E640SujjdHVqy5gMUH85gEdOv80eRvCEAGM,4469 +unidecode/x0a2.py,sha256=9Icpfk_ElebYd_xN09OMziFrpAGPXEUNVmawpnhbBaQ,4503 +unidecode/x0a3.py,sha256=G1lPrnCqYz0s4wsSa1qM0WgrZBWO_beRk3AgK0iVZLA,4521 +unidecode/x0a4.py,sha256=vS-wPpkfMmwRJjXTBYM4BGpzBfDoKWMadNNWaTPYcpI,4437 +unidecode/x0ac.py,sha256=wj7hl88VlCdc_eGpOL4m4CBJILyQqd9atObC5Xvd0aA,4709 +unidecode/x0ad.py,sha256=Rz5rn0fM-CqRjaN4TvSq_1StAQdyAF2WX3cUvcQHaWU,4766 +unidecode/x0ae.py,sha256=jNIBVB-Pw2ZNihAeyWbDIEq9Yt9zlhdfGylfvAaxUks,4875 +unidecode/x0af.py,sha256=Am5YC8Zfrun5NUKxU6LrU2-d5GgkGSBs7fZt2rqSi74,5012 +unidecode/x0b0.py,sha256=1bgHerCDAqIcJHYeGddJjJfRWiHCKtU2B0J-XGvcbbc,4853 +unidecode/x0b1.py,sha256=Six-lzGdvgJx4YsIa0lTusnBEV1zbCKQCquq17TDJoQ,4746 +unidecode/x0b2.py,sha256=HQDbmglNi4QfiRSGucUclgq_4FGpRjbJkWU1JTLAFGc,4680 +unidecode/x0b3.py,sha256=1lqxghVZiiStOAx1IG_vc1zZTXrAa7Z__QY6ZWvo2aA,4741 +unidecode/x0b4.py,sha256=V6BNSTxpyP8VuqF7x5z7bpF3MQAkwZfKtEu6NFr_vSg,4762 +unidecode/x0b5.py,sha256=9NVd2hNLyRlLceVlznba1dreqBGeKU_0gzmkgAw0gyg,4919 +unidecode/x0b6.py,sha256=V_vRsB0GICu9hqhO4pnbPWreDSevJ3bbmLRJkuQUxnE,4996 +unidecode/x0b7.py,sha256=CwBaCBICyVagnFjUpkwabuDvBJw7gAeqkSRpfBAVv8s,4833 +unidecode/x0b8.py,sha256=xYp-xy2LIwq95OWyS9vYMc_Z5od9dud0W1dxeg4P_Jk,4714 +unidecode/x0b9.py,sha256=z3hKNzBq_MeK9V3AyQzaY58cgi0-VGOsLk3-UFmszLQ,4704 +unidecode/x0ba.py,sha256=4gubifoBeJUUrwXEI4litJygekufEycmWDLrJ-Qvs14,4765 +unidecode/x0bb.py,sha256=bsCTABUdC6yTn8_0vhYe5jRP1z_BoAdificB8Y1c1hA,4730 +unidecode/x0bc.py,sha256=AhQvAz7yHlbQ_4c2KOIisq07eZJ5JQn6cV8I31oT9kg,4707 +unidecode/x0bd.py,sha256=IGtyVxIUr1mU3hokn6iUDJhXZezQozVvfWOyf4Pa5dI,4752 +unidecode/x0be.py,sha256=1D-hXu3p3wvOnGVMjEqVsrltYe7UuSwit2yqN5eFizc,4849 +unidecode/x0bf.py,sha256=NkEXqr2ER3BNFkTasDV9CHnkRBuX_Ao5OHGv_NgKAew,5010 +unidecode/x0c0.py,sha256=zDlHpyM0omza5TqGLb8Rhl7Wd-LlV1AjvH_xdnEnNFw,4856 +unidecode/x0c1.py,sha256=AC6xJyx9UblKAGNqGN7AH2Idb3_3vbc-I5U0Myig5fA,4765 +unidecode/x0c2.py,sha256=siRYLA8Cv9Z8XsRp3WQOBdRrPkjJOuEh8z1-3SMXOzQ,4710 +unidecode/x0c3.py,sha256=hlAFe6lsz0aLMixlpeFjV4I-WTIiA3B2BU58yGlTwRg,4975 +unidecode/x0c4.py,sha256=z3xZwSkf5ru1FCdBMHOr5fyglzVdyPhQVtWjq9xInsQ,5024 +unidecode/x0c5.py,sha256=F-DR0eVMRkemOnNXOtDjI5i6gW9136XLmWM_yMVvc84,4581 +unidecode/x0c6.py,sha256=7p_jMrHf3WUa_zANms-RGVN1bAeshgWLkC16_VcSawA,4490 +unidecode/x0c7.py,sha256=5eOAq4jFsPZ-zKO7lHzAGj_EvXdaMC4Kud7gvE-B7Tg,4564 +unidecode/x0c8.py,sha256=wltKvhBgn51jULzwUnEbmyDuK9JvQpQee0uTKK42-20,4733 +unidecode/x0c9.py,sha256=GoARON07wCoHN2wRHb5fvzqE9L3Yme2hKeciynUIAIk,4722 +unidecode/x0ca.py,sha256=BsBZTNj3npIkdo3L9pSEX7XvDT68KV7wFtOOwyEb2So,5007 +unidecode/x0cb.py,sha256=8T7vnJMRmYGyySYthMWz0bgN-MremktGImjejodFeMo,5012 +unidecode/x0cc.py,sha256=GKoHN-4vL4Y3EL42G0xbN74Tgspew1oMvxQtsIa3ess,4749 +unidecode/x0cd.py,sha256=7sZ05OjugbaombMRDYOVxgstZbXMcuX5kHFheKv4W2E,4738 +unidecode/x0ce.py,sha256=mOEHFrsAwIvcTnh7OKVK5qbuXUXHfJOR7D4FtXsQmao,4708 +unidecode/x0cf.py,sha256=H9PeYcbOG68F_yc7zsELUuN05ANfFNOUX-e3-gzx7Ow,4713 +unidecode/x0d0.py,sha256=eULqcGHPmaoEdl0EwRB5wWSu8M43bp4HoFo5gGljacg,4706 +unidecode/x0d1.py,sha256=BClLDAjPgsAX6MJCsuHfmfuhH9qfzUy_vb-d9zBs3Oc,4767 +unidecode/x0d2.py,sha256=e74nqGo4E4sF1sy8qBFu2ecWoRfJdoXI1xRFRPqYEz8,4724 +unidecode/x0d3.py,sha256=8-UmvJ3-ILXo9d3GA-ReOE4OfUenL3tVUJYldZ9gHu0,4705 +unidecode/x0d4.py,sha256=fwUmzksoddTKB8fH2rZMxRK3pJtLrxhcrYpHfBauAwE,4758 +unidecode/x0d5.py,sha256=rANSL5ndzLgSgYJQNEw57AfXpicRe7pvHRlKTPb4-QQ,4680 +unidecode/x0d6.py,sha256=fT8_cRzp7y60IIhn87kM9lLehKGAg5wYmfFOwgGp6e0,4765 +unidecode/x0d7.py,sha256=0zY-KFUnKk-CuYpb1zSYj3QdS6UsfZ_lsemOuRSeDwM,4559 +unidecode/x0f9.py,sha256=2PD0_fpDnaFO9ftICjYSOhnjAfBppjsj1TcLIuYjnCI,4567 +unidecode/x0fa.py,sha256=6X94S2GbR6XOwkzx2SYynZzBMHAbRHC9GvW_vXaTDRU,4406 +unidecode/x0fb.py,sha256=qaAP_vF3_-M--wKkyb0DfBjIdnGKuk4GQLxV7fp2-_4,3838 +unidecode/x0fc.py,sha256=KcyQnyv7gxNeVcAnRwQrm4NlabZE3CrnmtLqXj_7te8,3595 +unidecode/x0fd.py,sha256=fq1BGexi73J3QPUwnL4_LZT4uh8mxYqAgMNtofbfVKE,3764 +unidecode/x0fe.py,sha256=mpt-K-jqk36iouLz5HOcthOQJczqsca9aYkEGhJ6Wk4,3825 +unidecode/x0ff.py,sha256=KGE3aIdJCR-3kAVaXOyuY44M-KfCA9UQt4B9AlEJiq0,3983 +unidecode/x1d4.py,sha256=ZS_7TAX87oGtT7b8tIlWcmeHChVINZ4W9jl9wA6JfmU,3839 +unidecode/x1d5.py,sha256=Cuh3bUzoyp8c8lJ7Y_gLmAKQ03XHMCsgTZf3uE2-G2o,3839 +unidecode/x1d6.py,sha256=6fIRGTFODh3kysq10Xr_8EmG6HZuWztLjr4vitkk8OQ,3974 +unidecode/x1d7.py,sha256=jIs9oZBMbSh5OQvPiyUI4aAdji9EbzeOXigTq4Oq_kY,3645 +unidecode/x1f1.py,sha256=CcmetFXD5Xxt9ZY0xKAjQbe16Wlq-YccWvJ_eqdzeTc,3937 diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/WHEEL b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/entry_points.txt b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/entry_points.txt new file mode 100644 index 0000000..3016afe --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +unidecode = unidecode.util:main + diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/metadata.json b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/metadata.json new file mode 100644 index 0000000..64bbf15 --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Text Processing", "Topic :: Text Processing :: Filters"], "extensions": {"python.commands": {"wrap_console": {"unidecode": "unidecode.util:main"}}, "python.details": {"contacts": [{"email": "tomaz.solc@tablix.org", "name": "Tomaz Solc", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}}, "python.exports": {"console_scripts": {"unidecode": "unidecode.util:main"}}}, "generator": "bdist_wheel (0.29.0)", "license": "GPL", "metadata_version": "2.0", "name": "Unidecode", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "summary": "ASCII transliterations of Unicode text", "version": "1.1.1"} \ No newline at end of file diff --git a/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/top_level.txt b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..051b14c --- /dev/null +++ b/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +unidecode diff --git a/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc b/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93da7cbb6c02b2d4c7d7a1a361a604512a7c9fe1 GIT binary patch literal 3959 zcmZu!&2!tv72jQeAV^WNEXS_=m7s2?2|F=4ttV}oQ9X8Ir}2!dabr74(RNUXSc;H9 zfZ1IpHVd8PnWUHW(qkthrziK=zoLi!1-SO)f1#K5_ZFl+Y_GJ7hsA!peed^v`}lBq zxy?{Ut{=U%#@K)8<#=h}9<)N22iTi|w&7=|f zQtY%6Z`V~{V`MXHkC(zFPP6^2GhPmtt=!61#;3wlR&HmjCC}v372d8?5W@^-^41*+1c^A@SL5wl6`Ny9BX>QW7 z3`~K~GWa4@W*TRK%pn!|Smx$A?87z(oF4Nc@O0)?2M|iO!*=+e*;j06?f1mr<0Yrw zh$jxTaN~6>&<;>;rP@qQn&}|Uvf@h}OtnGl-*=>i(XYI{oiYbX^5@!{v# zq(vSK(@ef+*Bco#(eL&9Niop9$zwAr@?N2~``7wut_}9UGm(#aBQwr^kSsR8y4cMw zca@gYZM)um+PoOT94S;hR08Wxw?{!z1wKKLm5@Xp=al_)TO5}Q%gjJLEE9Q{};0$1e?3pI{S z;2OsGDsKy)pW{AnqptATk8rrb2*%K+w~-ZtIMdgAFE6p#6=8=WM5S8@k|I}U zu^c*GnrUCu8T2UHM$v{<`)FliJnf-jzAri*bq-Qj%vKIj-y>;uN=q}Hn4-wE?dXc< zWbo%M4d>O$uce9a!6_e7;3)L8hL9pXkpsNAcZ!E-9XhFXe0xp zvQQ*EbP^mxHuf3#v}GBUhfV1xjl_Gx_IcQX+)R8cw=H+It7cRyG5hdlFos$IVFUq0 zip}|~CJ}3dG~c!?mX0R{yqg4v2M@+YGDV1Q4(O1J(tN^KV{#o zeaZxThy8|q%>K^qW9&P)y-2sutW5o%p$8%DY*tJ1ksL(z*{h|jh?DtCw^OY~x9;43 z@bJN%yZ7smto-3L%kp?ED;EgeRTp59syT{vY>cWrnl4qa{-$dy-{`$es3<&RM7_yjq$ z`RvR>vtw>Lp&NzLD|Fk#O>j&%VYS6&uinOZbrnt5sg-fbma0$P)__M=B*$%{Y99@= z`uN8*I*t{-*IyX$Lmk}1CLJJv zM@4dkn`0^+>2(>i=mdHdjn7@-a!<6+!oLl{6@3NwELm69hVF`L>CSk9e~NikwIJQK zP#s|Ki9+VQfogM>LuT?4kvLC?pPGrAG$6SNNBsEJnP`4Hfb$pYZ=P@vIfodND z0q4>y6zeV48_+Qqg=F%uRq%ZXbBen@3k-6KAu@-OA2^gxB;q_HYWr4v11hcho^WM*@I~|Axh?`Uz&MpHf5iv-%v{>IiV};_L5Ft#uKWuA-g+>WM;z zq@sU_<`6qD8h#fzHt(h12!7~(1;d36N~zQ@F?2w=+@g?79=6^HAiNBhQj|{VK5d); zjrs+~*5~*+BrJVMso+TDuHbI86pNuF%}bO?7D!Q#5Om>~Eo+Y*;fFxID0J*awS;TH zi6z??2fz(-N`VW}@((T{5xM1pg}Mzme>#!M8o^!@mL-Woh+CwJB9PSKF)T+tL#h!) zgDln>VR7Ul;;J!f%~h7)JwChq@)2m|#SQ1Z5(f6ZTApt*kXg3a$nJIvo7k+%YCWPY zDdv3cySAtMy1GU~D92KiJ=7PPyHlh&1vEJU3zD1dX;lEJ>U@EOnNs029~RYeYMBbD zW-s0vsPh;Rt{nBzPb15kVatpZl5He4iukm?9BtO7=$^G)ShXlCLZXWl+CvI1l?fdz zX5o&keRtcgM+~C~IW>?7;PyO~ho6EnPhJ%mmA_Gk)ph#mXMOKFu!QJ1{zVu0ZGG8x Q#OhmX4lZ4>w!F6Ve{FEL{r~^~ literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/__pycache__/appdirs.cpython-38.pyc b/lib/python3.8/site-packages/__pycache__/appdirs.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98ea35f77c34c9137780f472944032904d53e141 GIT binary patch literal 20510 zcmeHPU2GiJb)K1>{o(RQltjytEZbwsmbkLCl&!?F6-6-hLraOYQbfvebP&w`cMRI z-0z(E*&nV*#c>)W5CzTNnK}2~bMHO(p6{G{?pzxj%q#e->bdgTO-1=nx@rF#!p*z* z?>*2IMJT2sR8tk&x@Mw^zL2U^gZL-r6TvY?P6XKuUw3E%hO{@Wr?_oCn2=47ZO zbDQ{r7!*VIRdZN;QEU^#NNpEyiS1$sQai+Pu~Up7wNtz;c8TYa8WHb^-C_??&xsRa zuXq8eUGFJkpLp@UB3`tgzn3z1iTO9$#f!Zreqvoip*e@{E>4fT|h$<{+ zzxk@Yk16&h6yFLd>^vnpVa!*B# z1#y^vciRW-gW`xNew;E7*<)vw5BHg`P#N)G1_}Cq2LHXk$Hm87yQRr* zG%??9<>W|HSyP)Sxlg3(FA053_tiyhJ>~07{hsAap z6ptNi$sRR8LdDRH;m&oE$JF$DVa_PIj(ylzY2K$!XQ|Wp%dUlc3JJVx@OWjp>y- zM7UO4=_sn|$CbIuEb5Tmy5+2J^NYqbb=VwodB&_&xkX(Z^;6OKz-<^yR%dZ_%kzv$ ztLE863f8RInr&45w$|UVrH6UM{cJggTc=rN)r{zQIFxqHUa}qZD%WRYs)U2v!8;9l z#71>~!8ewzFbBF5!vV&tbH)moeBX5XDi33bS)G!55bvr-I{GVhp|r0S!i3>>jk5NK1H>j?Hkjw!NU;t zhaHPo2ggx?RI7+)N+`QD_Lgrfp$?i4NYbK+qNGQnYV|D5vHfLN-lEzYbhOx4!W9J7d?UifD*zO1`v{} zV~d1MtTe`rE5?}P`bIQF1*-1MiJ7x*r9pEq)KF8lPYa7TbCQOh*2GgY?JYP9p_w7} zCwN6W#p%wb#C5gTL+n0PT^Fgb82^Zi&rtPoqh~X(ktBDuiW|c9S+8I`4T2qv8N5(tx<)x%BU)4Tura%mEDfVilA35S zlF+6~DHuF6b>ZyA^2C)ZBs{^+@b=>6GZV?fNtpxb>Pwr8vpLuyfvZEE^*_o5nNU>* zn(GBRt>Zxsiz74-QrpV&wqFLQDWeO7EdzbgtvW&8z6-@9NDPAvC~W6WAroY+P;Cc& zNQ6o;$VN+ikd4MCNLO43T9Pb}M~d8opI=OjFStwg_)@515n8(%qqPS>YmA0~&_s$6n*KnMKgW9= z2<>!)l=PJBuw8)9RdDvuB zg2;>h`$|(^@1u7Q)w8e(*3#hNUx3v9HZ0|V(gafbL*);YITaYZ|9-BS4(Wh2|0683 znWmZ@yb*(Ylr`YZDdm9zD<{_^J1E44>84I4g>MT(RuxcobIeCeB8;qOh>su@6nKn7 zl4YNk-Dil8dVzHO?*!rtaVyrv4S>0BNvLBOsla0~h^)l0^$^rZ$FMIiR4WUFWXX;N zYGFu6b`DfM>=mO1GlDuLo;{x7Eijtx!e)s*W1LPD41qc*ESR{kCddMslkSp{=zy~q zu1*0^b+8i`bC@v8!SRMC$9v+MgNHk^0m^h2YY>J3;OvBIv}h-7VMMzrRQom1*^_yv zrt#Y@td_JWL`EUZdomiD06-2=#jl8d-p7zy5r`a{gwx>_V-(d~k?uSshrmuKQ^rD7 zz_u|Cg-ZEQn*j?j%%v0y9ZVmOO6@GIH?+ZA+i#rb8URWfFw-Q)hUGLgd5z-{%x=M- z(0cO#xXGv`;c8)8lBTa8{V)bMQQqqlS4$U4@0~Etx-1Y-&BzBEDy)P2CTvD%)VoX@UiK1E{v^$NviVQ_3GO}e9%U3wS$%~jP=alWCwX#u zuwoPX4NQ}#X(tu34;N;7q{Z|Dg)l@r!>N$rmq9GI)5XB$kt#7NB)wNx~e1!UTXt-)XhS~t(zeC8`f&Zvo z)Q4yA-@Abe!1o|XijAUvl4wPSbaGY{G`JoP(;ry`T^nFlT0vG{Fx z&{|8%*1(KqE4p~(k+%pHw3*!rF4@Fm7FO8lEbH`^ow;0^yzt)U{<1?6=-HYj=Bb5d zp4OSu#>AHHobDz?o}5P-0~hwvl+0~}mD@^P?SmsG%=suADp2x5gj$r8WeYyA76qta zZJg*z`Fuje8ah$a!8RV0ux#>%{1Aj5sbl5ET&Lfoh-V#ok8~d44)%NeF%ps9JLJQU z(Zqf*`zStvF8c(!EVT}ALFgB71T@w;Nar6dmW#!1@>8WpmMzoEtb)`~4wW*s&~Ph~c~fi-e0utD6`ysuY3Z1K)e z-L~NHxntF^30QTKlH0XccNqy0IVNItw>hJquaBWiaX!Hf(BA5nBY=l1k=HNtCUoc% z`rLg3uR}?7C|5S|bMZiJu#A6ob6&oPD%c|Kve?-k{x7^t?BUh@EJ7{S`x`LU<*Nxh zYz`-SpV|5Ec6LJZJQt!1vT@sNbhgYHXB?y#2k0_J7cQ@5Xm9Ik(LaNRy$Z@pIW>>% zlVN>8?KZ3BIH;yOkVS_@{ZDuu?Wl-&M}^{Fc-NwBM+J8Ck2mh9aLkMD4263fiH)6- zKaQV>G@+0r3g$cfJdA=N>pY3))&>`nffnRnp?NVH1s5U2 z30`9mCmRQ>N1+T8_i;z=wuq5g8+-M=qD3n4#M>GXwD#1QE3c)_lUmztTr%aT@D`ad z2DB3U#XBALH?C~8%g`3z@tI;SW|--O({@~dU4n4`qOFdJdYv{PW;Thoh)U!lFDJoq z?7-&@FRw9=4SCw?q@WiX=Sx#(ONMYOi2RB+xY%t?yF(nrV$8cS6e9AQJpvqVwl+Va z=r@WZqsT7`o{I&=K^$o0NMiOnWM+)Yj-#^TeJ%>exY^;jxEXFc6p9A=0_=8d*4D94 z5{VA&W_t)#KyVng=?*mzh9(bjbLSCY>hPjYuduxVD#N~OEg{U!YlS2gi^Z8s?keJ} zteHt{_073=X%C3Qv1U$2DGu4`8biuBQCYHQ5T;~Ha2dXzd82qV9F!{;N*6AdP8ic1 zCD?Ef@`}MgXJEE@-IJ?#Z!g;bKUg-7`T%?91U5n-l`S_zb(3QejIw}G~njh_^iNGwAk_?ll|O3VKgve z(Cxd3c0^n`a0MZ}-l3qacEva}iQj%wFlc8-#lfKD-6(~MvQ=h#3@2rihe5?Lk6jLm zAXJLn08)x4NGbA00Jh0H0wCY)rToZb=MC@&NJQqk!NzZjuev}OL1aSHfs+)%887-c zK7wN@+C2n4;us4y%B2(LX<}1=&GJz{vk6Tm+Csk%Q~Q3Lv(41bT7UD@$`S#j&s62J z=)=$x`MZAJg9VtPFJSjKPMRHybNt@u1FbuN%g z{Co^`E{cuy(DvKPP#-HHjPHbT;ouVNdnhNk1rP`x?Rvx(F-5m7lTIXS8ipl%b;w%f zhyr%?SOx~oqvaa`k70YZuyLv7v7GjHC~z_1HVj1=M&2YA^2Aa`tw|vSbYk1TUBI~< zwzNN+jm!r(a1x_ks5w|*($uLHK?+JbROwpv7OWXNbe9kIXxgW zoGyJX$imkFVCJp9amIDvW2xFs1rj4^yuvUzoIm07mUt3J!jaT?#nNO2NFn*7GzD}r zq@fO>)3arqkiZouZ*kRVFQJ^mxmu;H3q*Yu)KZ~$+(iNTapXn!?Alzb2j0n_6 zTB)FMFeL|wfPI#g9ESwDO-gB_c=pN&EJHmX3+QFu%@TO4)Mi!CDliw$f&-_dWajls{z*olxa z+Ft8s?1}wF#DDo@#=7?RHZYc00VG15QU{4kvBW`?D15h|OJ0+@gsoR^5#3)AQ#?aS z%06A))!A3EEALn5NPa0~hOC}i)~8{H=>D#YnURj3i5B)k zx>PDnP8J3OtSfXHv|JAIoDIVTbQwD9We#oTldW-v1@#>F7Tidx|#W z75O|8KBC?PqN{7_n(E{@rLC#-9S#8v^8+k%hyvrV`=*KoFAGyKg&_PiR&PX9&tT6N zUoXHSSjeq@kJU5002ZH_4^Pa~5#{P_1YrPq%mSF;{5W6=A6jX^p^pky{PPW*^Z~5FshtMxYuHA`mGp@LfCz6n(nvU?Z-g-E5Eny3fb+`)nR!dTWU^Mn zZo=x&8Fy(3j(Qqkx*rTTe4^V&DcOf^krc(xF7?%Sr*N`*8E5NeF2(1pXCfFgbEW}K z9RL0BQ2)%iyY-qYZ8u&Z9QazpmMia5{K~nzC?Q|*s-nh1C(nU5bGt`%M2AHAd62q= zvQkjQfsXwYyGwwA7rRcDmg$^QIqvX(AklgWB`axN&1<=orsCiK>bmwndWHat_DfwK zR^>%dbchs%caY*@k@|BaScsG*2-K3crm0Z(2-sKgSqf{5fVHYh#wJ%Kc%&zZKY5Jovg(wvB>eN0se!B3)J&jbA z7P?7!8OiBFUy!NLobb%&D$<4ruN;k5dA2b(M`xBD9Oy- z!gm1d8VI&`kL&dy&4x}qh-ISh59cj}%=3d3Dw7}Ju{7zOj@vi8NAZQ8qZl&(i+K50 z)Xw>t$B?!UXI{loYfV;AOUE$ME?+W?|Aw1n7+D2`^A*ohwbT;kDCTZzF};`(`Uo9U zrjQ*h_D}(sxr@2QKAwwtq4@o{AK=+dIR+L75k`!`Zfc7|>)V>?_2GxgLv?*S3q}?q zkZWdnzW4b%nthQ7G$8^x%=hozZZ>oBXI-`JL~Z$Ieto2wg|VPR41U(T^k%jt76mm( zEjm^~WlQfdnIhct=*L(vo(s~Jl-7!w<=NhFqyUvU65SP%y;!eVK8)8TF2&4TuR3S# zIWu=@;zs$(#PoSHy=vq88)kNj77<8B?m`K!ce{Ja9hyIaZVONL^LjA=`*i@Rm%2obo(-wHG`WB} z(c?GqLojK{!lw+%X8O_!G_2WoX$9(+KCy#Y!e$ah>c?!jKdSiG9s8 zjvQHit^Ls$?~o^7(K#4>``}<XaVYRRGl zj?g{*ErK$htau!D7!0)MlC*ZqDax3OB|69hW=r3rUNm#`oh_;e+x}jNH29Pu57VZ2 zHORQLi$G+IHyI(Y2I2LGD>rj zsN2jmA!vO6tB#4`2Rb<%Or4(b3~Q5T){CSOg51dvo1Y@w>wOa!Jr5TQoH03V2nQ1B zFe3J4p!Ud3lSyZ^jGjN9Kb;@TAIra!Ka@W;$R4BuEbeABn; z=CUc@*0Lqv_Ogv{yPj+0m-8n3e7P7D{pmIH za|X_=jd9=d5B;`v!tl$RdDRTejneW&^GIMmob(R|Q>&&w<3Ck1AKA+j{t^G^2gdTW zf6RXx--q5d{NsM{1H&%{6MOb@8P_NLaa@lFQ@B2i>u3CDas6y?7}qoYNk5PGp2Gd- z`~vP5q~8%-KkvVQ>lftuD6SoU0@oA4QM`8y*Dv~$xSo{jr*VDCpThN&^gk}EFtLKu zoB8Dv!HMsi>XQGG|1#!!#{YzW2H(#%%l>R~r=st4%D~jw`pL#~%g>p{dq(q_oDn>~ zS;E^L)8Jq5!m{(e(Jb9E{7?GlFp7hjU-3(rxg;~ci0e6j8rRdoi-7bLuFv~pxE>42 zxIXP$H;l@wo%w3383lKvdTr%(=M`tgt8Q+!R1`X1(|3aAy4S1*ji8AeQOk+e1E<&D zX|()yJ@|-hu~aeRydT_d2aj>Gt-P%;o=&2YtfAe5XOg8;MY`8jodKuTkUA@Mxaz&4BJ~< zDhR`PG8stT{Kx{Z73(7#UmxYr#Pzip|UF2&R(e7mMfDTaDm+qphN# zC4zvk>G>#9wUu@hEGh+d$Vct1dLZD(Mc4If;0E+sYDL!?ctEBN{7PP(zzX8AMgTPV zVQgctxS+4pvv|})wK~b3({6P=sBXH+3oqebNaPu&1$<4LN30^S$FoVZV3kbuGM-i0 zq5ng^xr8Hp9Zg_BEgDpbP=}UpLtJw~exu;$sC4$sLf_*q_d-8V2rD3W7!oY5jZmvycZp!CD@0Z29R zJDNE5-=+{bp}JnMZE1sJ6l0K z&a*pSy^T|ig?JP zo_)iJsDACvg#|L3v%L=X43rbLS2TfZA?X{|d|9j4d(c|NlJOK;YfjB#aCHt%#TI@M zUQ{pgh85e@dMM04yuvb+T{6#ltF`I6^LQaFpfT(sxVm%Zz|{`Ew^S)n@|s>FfaH}R zsA3RAxw*HYrIIHQVZT*%U4b{Yy_IS_opN;|iCjcHA!|?W%;8QSyS^$^D6M;|`649e?)A`bTzraD>8nwH^Z(am}@mA`A zkchT36G7U@?UvefywLGeyEQ^EGw$H3BI6;rBC;OAW^|2*_9F_a<^2<6Ldz;lZ_nTIf3c=jzgoXd*U*&)+HzTB+%fM)poN=QJO1d4{u_4KUno(dz@OTJ3W!N zjdmD0N>oPZoTUml+xOx-cVKF3zE&MzN=-Tk^S8D`r$v_DrVO{5!7Jfz5o|Pa}K|R%O1q8bEoEI!w~vfwMLMuDv%}gfqP}~-Rp}B^EVf- zyonC0u(s=Nwc%`oTFn4UaXjDGNF~C<2riJPdmt1Xja1$Fq3mN&sJ`D(iVqKZ5^|tTDhE)F;45ebOS9tkj$P%Xl2p zq8L*J)B0u3>O4CP_gt^{lNb{3vl)LnUW#rYuht~qs-XF*Lw4yy|GZ`kulWR=0i@o&b_Vgs%_gjGI)c`1hPGRlDOw0oDPVxC$HLhzQW&9t6c)HtCH3FNR?| za8AGW+GjugIkD4z5P7wF*z2X~G=gI4^B~Z-NGdU;rOtEvh}2K?0i$E%HL4YUhjjEJ z;{jZY`^J59RbsIZigeMsVs@6Q=#YIl8H2qSaD->kJTM;`kBmP&Zej@fyC0hG!B6{) z@m1rx@mJ7J{6^q`Gj$Z*E2aSc*ot$WBF}Da`ysEWYQzTX6$?}5YfZ@b2B#vp20W_)Af~3l7^T@DBPE$PjSa1#^|L*j@{onn)Kgh57=T zcx(;A05?9)(IL}4^L^y(^|awJ^x-=tY^_PxEW%hxATwzmvnItM@4R>rj^KFe_x33^ zVq$@Vk)ANVI5x264Xk;?egrp7GkA`Hn>Z(MVubH9Ku2j_;h1|IR^&L>dHG<-`jq%S z=%}y-I{HGL$w;8vgD~Cz`63Hp*lZGpATLadQ%qc8OUhc+h&iY5^Xbxs|;!ZbqI$AZ*3 zvb_Jr3D}E1@*AD$beWR)IF>9li8tRDt#iwWk_9(^)V1Wjw-9q9LhYO+0Uv@{${{Orui<+gh9B1teJBH~tce(Z~Jo}Db&#NCJqAg&IqWZDiFY*38jQ5%Tv7S$eH1@Fg$nbL~49=?l`yS^(ye#C( zFLjRYBUcF0bWV@F?Rcx88QeY9+Mcbv^%0CQgGMSMp{t@;t6xWhIGLTGL9Wh!ebHUK zwXpc^&1>&0xeHh4uPt3$dRutggI@)|-41s`9Wd3Jt1Sf2qG=ap7zv!zCwXookQx$B z2}3@_!;r2#6ATvkV%jWPC97z|=`hRSlydH*Sw;X|%1tALo-qr>viY%ct3$D+N^zum zW`;tmXL6;0&<9peM_^ z2)}&m;=sK~?F@EeM-hAHf)H@9`)aKTJ3Hc)3)OnyH95KrFaA-(+eFO6=(BGn48uPT zWIF4ZS=AUZT^xk%!b;2ENoGLm5RO+J*#sTB3`{b-(tWG!&ER}tLdx(j;z^G3XmHmQTGPvXlBXG>=VfB{B|-3+rN~{{;`VQLsAC4;t&9tE0PW zU&qn|eT^f_Xg7IAYp7_u{sD*fa84G?X=?yvJnFd}l#eHKJHXrHipc=)buf71F-f4= zj#>>^3Hnw$$V0UdiIG>q5J(*%DrV4xBqu$8&sl-vwwXBp3oSnohkhjUBw69v3p#sn zaju0_=>XeT$V98dyu%3+=7Hz_vHY`2t~hY`On~;Ym8_yCG9%e$bxv?GThXF2;FXhY zc!-&!@_}K3kCnO3OqL7&DwbBY@1akh3KK$8%l!n0W*oCqPB3<`TSIFgQ<9Fbh^eQp zzK-hyt@=;<<~ZD&BT4Y>)012mK?|qRaFU1SBP8;&wP8tIO`I3>qzn8iZVfMx7UO3) zMl3MV|Bpwz=c4~VUiA|L|H`q8XrTJbMZ0MK3gm<~pco%=uO}N3HzMR48cPRLzl`}c z_1Azc7w%4~IIMWWZ3f$J1Wg}A2<%&RKe-4Kw8f=fhhgjy3BTY9C7wb~x^sL8s)HFN z^MB70I-#LX>2KurEN*N>c_#Rgwl_8kdvK@tox(k)zKOTgF*aA&yo(0;dTi$a74aC% z6McR44L%zc?vir9#Gy5qc?2#(=fr;4QwEgvp*uf3&w$s48rjvvaetV5gg~XA74yo) z3j(0}4W1G5*xqVwJx;R3V{mCCNz4-_G2%S$tPEqDyb9+rDclYrv1^p7c(l!k0_vIX&Q6#}9@W`9*)8%P&$cQlt8c3_bJVT|Y zdumkYdRtA@epB*zFq!qBFPU@Nx!T&6#2i&VP1bBhE+eF@Ri;wKJxB*mHtS~LWX@p% z^c(VMWEgDhC8`vL+R5hGR@mO^o5&N01}75BafYMJMR%h!=bSU!XGR&1kx;D;0mIn^ zpsm(+MdpbM8ZAqY^CR6+A+T8KULzWuBq)+;$hJ^I`||@&LP)wDorTmQKOq%? zb>P90TE&ok94=rB#GDKHpA6z(oog|Lk-aaDV8Qh2Fpf3wJ*dCAYGq5{9fo-i6m6=uP-Rk24VF2o> z3K@WA-Y`3dQw$$$OvuCHb&$(5^QH$rNc|(O&!(8^o8lmyZ>MvRRV8OI-kL$ifVv;M z?x|_A;u7<)dNWO}qp$MV49O*x`S}cj(!e4U&qKXG_+C#$$jAuoGtZ(#&qC46?;{PN z<`MGgeIpGfcau3eAC{=mc_0eVR?I| z_UDjb?z|`nqydn9eQNwdk=2t%m~8~V6$LEhTu))B)lAtM+DaE=is zuO)j~$l?S8uo8S80_!t4Va^iUE0AY!Qc;1=HlT}`DAKtBTQP^Gev{2rG~AwVt!yk8 z(a0Kxkw1|T5S&Xm!dqwtJwaV?vVX5T-C$rn+j5Z= zc=#Uor~O0tF8O8uFuo^PV~6ia{|LD2sG@Q4eh)B>@S4jrIo}$PB zr&OvA69}xlNG$qWa6^N;9`~Jx^Gb_p!54f>qyS`?!88EvYKZ9m8}e*Un~g-{&5Ap? z$|8hHMfOMJ99w&0S$RMFme^9U$zqo0VT$=0H_Bz`Z5n59Aoa1rDjZ}#{K2Hh&`31k zIyshl8eq;lL6gQEVG;apT~o)|lDX<|NqVj`fjUiKIZ_>J!qIGx{ZsI;c8Zde1IUqm zc%JblHA!Ubfjb8RPQ?xgUd6^`e`d;XN))WDDDnl&;R<-tv+@RU6}`pHxZlUU&*k|NiQ( zjg+8`9W-P@u=!v@VMzqmdGo5?q66rtWyFq8B+=FyXo?(uhJP+CEj~(0DZ&9cCuuqJ z)0~}#_ksBU&P3Pvq4i;!O^~HxN0w?2d$3j&fq1ncl-5`fYdWP#&yo>r!%>`5`p)$b z;BK|0KtlTV8F1m6WdHS{vrBjXfXQc5aj*mnpU#+j`s`B5`2b zr%|nFJj}!5+mBd%!=#SsO#_(gfu;^i0#X9?q6jdRE)5wXmlM|3njY%w0xg&n;RVQR z>e%)KSJ(7}P(g6;clMDTbM_bL%-2H}`cUXun7iY^Y=Db2Kp1}*j9Ha{PnppR$g~rf zj0z{k9;TejlkQqzgEt z1}_y*EuLNLA!3?GCh7-J_Ld1@jzZY^n?)AjBw~V~yUt`lY8;Z>M^DJEVcV%159QX#{<$dx2U!qT}An&ug z-6DztiX0L1pk>iN`WL#zT~uP+p1p;mTTmaOPDa9)uGRYEZXVoSSW?7=#FKB`M98+Z z1P#mVxsvS>MzUJNew$~EO|U0-hUYZv@g!V`poT;cc&XY8nd9ly&gduc6n}HT;8Gk% z_yQ~Op(Fv|CXwn84+^#anK&o%4RbPw+8UJC=7a++ct|`aKNhVSoK4DAzamIY(Nbk< zWR8@yQQu>8pAGepXczTIJR?sj5utND>zRy9N+bXY2_bI*o(ZH~#_)HfIEBC5h|L}9 zVt&Fm(Da8!l8IqGei6xXsm1Rv1=iuweQY%>vm(EwsLDH^yo|^NMVUw{R$GlN?1!$@ z>a}PGI;X~6N(3_*n+`B1DNe>GG@*8kdv(7N3#`CE5A%=Ur_f3;&ON)J%eihy__U7U zR{{hJ3gyR;UAl|eRN$Y_Vqo<-He6?%2Q$EHCeTWdP7%Y#^i|&Ip_7mPljtns!~kKX zI`nA&%soe6%ntkE!*i}hBwA9AP%~8LY0PVCBa>`wijnEjQ!BjGO%a{=6GD*~wr2+B zALuqox!cd}8Z|Qqk4}h5)3l>5#=60;`zL_tQRz1~HQM*hgW)FBl;@ zsd!n7>RWhFI+x4f@liiDzB{d%;Hk^#R33*Cfo>-#lk>`^KsIeYvrs=1~u?AIjFrok4k z`xQp-5HiGoE!9B(s+N&-+;jXb1^hc_%TuUTXxBX*QOiy~ZF!Z&2-q=bHDUOqegVIB z33WNW#Onu*tP>BY7ykk>1R7XYk0YE12pW7RsG}&N@7HZ83P1>;{q$<1m%2FZyo>5$ zEP%-dU3zy8AkbYuaBRSQQ?+$b^!_AY#&{x%hzSR)3?{X|pk10IKvq8lZTi?kID(Ay z%RVkV(zlwPB0z`i!*d=BI3$K+zB)DTe}S8$SYDL81)x)jKRP&1;%g1a7njJ12;%5m z<{3PR^#(4GJ1Ev-+VGRJY{sFL1q@Z(in(-f#-F_Wb3h=v64FvEA>&_pNlW0T@KD=u zDq{SW1=~u9(ZJN9PPdH9FE3gx{3?fPi$82b=)oV$;HL*6`k_b_P*aO77hU{F#^o;) z$IyHQ8|iUD$7b?-H~l*wsu)F|N9x$59!LszWUE-VeHHURYKqMg8*wb?PN3=pIn7WK zlJNw7FNdF2$S#&nrHDIAM$+bk>+Zv5W;~E0PKs(smhdJTY*tGmWzw8P9B-MHA%|i8 zPp(kP&A@Fq0<;wmmyeWZ%U6r1%FmW(%H?vQ{K7PyigIa!o82rHEL*^Cv3$Ec^M6PF B7l{A> literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/__pycache__/distro.cpython-38.pyc b/lib/python3.8/site-packages/__pycache__/distro.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05f3750dab7a569198ff67c3bc81631c830dd557 GIT binary patch literal 36551 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 s@kDW7aS#6$_7x5lPk_~o26JXJLQFPs><{r~^~ literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/__pycache__/pyparsing.cpython-38.pyc b/lib/python3.8/site-packages/__pycache__/pyparsing.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e5a0aac77299e73404b6caa6d80c02005aa244a GIT binary patch literal 240322 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

    *e>)-xgcG0mq literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b41b9dc3f179cabbe13ffe3b7905f146c0be068 GIT binary patch literal 29069 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 JW$J{r{{V(4 z|C$=!F!t+5TdhCIx%FT7^_&B}|15l`2kq8qt35P2)Lt{XrfOAd+H2dx?RD+-?fZVS zespa$bR)9iMr62s|Ebo_jXPRHtycHnz53KM8bkMAA0)5&pxcjBgLAw8l>FL(LH8e$ z8tw;fe|Yz$o?f>tI4}5#;GCcmbOdh*<^+EbEDBx|yexQ2a9VIea8WQNI3;*SkOY?m zV}c36jNp$wsNYccdGQVjP6}QWJRx{p@MFO%f@cMn1>=Haf-{2W1p5TX1q*_w1qTJ+ z6C4%1DVP+T6=5X8qB|n^mSC^o>w?~|ORM{R!8Zh7 z5qw*4P4G3rmjt^6`vs2)ek6Fj2Px#Q$lWUVgy2EJ#|7^QbjjV%3qC3Mlpq%Su&m93 z?SgfJj|sL2^b^=!FZhB$Uv2k(!3Mzt0{sql^%K0@*(}Hgb9ugc7{7|q>@EO5p zdk{N~AHn`!M7&rXc}tnOgMQSd$5sBU>MOL#LH`IQU0%{{C0$C=9VOjX(lsXCYSJAg zU3b#uB|VU&n@)N;NiQeqj*?zU(kn@NNJ$r(beBo5B0Ko~klSoSA4z&x zp!b~geI&j1r0*^1p(lM1NuNPH>ZI=|=^>>@1p082K7*u>GwEYW`cjfUp`@=O=^IS? z)RI216d&w9S^99w{SErP3|cQseXP2@VMk3!WDo5xgMKXP=G=jtPznP6$p4UKG3}I3>_eS~@K_BRDH~S@4P=e*RyT z^_oC`G?V_&C;d6T{$5^}H7+6iCl`8$YP zjr#})w*kZhF<#t9PAU>X#tI%TQpCans33+_pM^I-i=NGjGl=0vlMNCajkoEZ7&Vn=qgllUv~)D z89BE&TaZ6wwpg~DL~bRamrD>cin;LWEy`?(kziMG6&4HEfC@`AbvdYMMR7nT%1Kcc z*>H0Yj%-lOH5EH3w~buP%I>Vo2xc)VmQlhb8?ymqBbKX;m}T$m_{%=6I2Ns)D@9uR3^eAYgY6E&#Z7Qh5!jv ztb#;eLx)OV6@wwiY$nCLVKKCkaj}r1Heyh)BEjTXs9-H8i^~76RlmQxu$OoT2GNGa z%ry$GjX)U`i$x;-Ld0?+3)%GQ-Mg?|hB3=}iEPA}(nd7_D)=vk?8Q{VZTe@neu;M> z%j9vm%|;fBCL7__nkwl!!PY`oNA_vh1yl`{fQ)?7k4pMx?Mrkm4{}l~H>nRM)s8}{M3Fd`D z)~p;QVx|HwtW^OqDvdKa-9xb$2`pAZ4Eda8JkD4>R&Iod6@l5P&3!!xDN%hOwBrF(9>U!zK?3Z!%mfLyD}aG<8Fu zDS3cAwicoc$kvE)ZtR8HV)syNlO`2eC}cmv78^2)IT)WgBF4gSO~oq0g&YC_oJPf} zuwod-Vtl%XLM$xy7Z$bb1q&4`!!`L;;W9KU_r4MdiIr(pdzfCO9IP| zBw-dj_LuvjELQA~1j=!wxz>icMn)7KF(X64%29GLD*CcaicN+}WOHC=mc6|rI%aJ2SL)M>Fm|K6Ob!ua#rX?qQ28yEiqIgM!Qh38nlL9y;OacBhe#P zZ&`)8)Y1VK*|6-bS=QX*LGT(-Y{kWjrgzS4QDO45hSh))WLo14Vn#teXB7qdQpu5v z!^DxrEKSx^>a(ciEFPC_Ek`C+Pp;24P%!~>O`w>yy_k#2ax4xHE1YfQ%8F+chbdMd z+SFRMRQ+sC+qhdi8y~kg7746ncRxU>=!H3~wMZ1RM!x6X_-BeOdlAKrTY`6h)&Jp9 zYsxv5+!;}pOXLLZ#a8HlA}vG`KgKV>9P5_ zg{jWe#cC{#cc$i+wq2;I`LSwta(Zgv{MdBW=~QWHlOz|a&e-huOtrLOdVF?raeT76 zy6Mu?YuZ&UK>?9qozC?i>5B7Dl)CsA6SO4@Bojd!onY+ST;Zmg^!B zy&lgxE&nW@xS9G@OJI6XHxGCg%}Wd2I$ z{M_uG-TOy+qgK1-$0siIx?dPkm+h)EqIo8@y&0Xqd;ZGOh9`RF;&k<-{^6qwg5hn$ X+lSw6ty?p6^WWFjZ@g&_t-1Ce9yAgE literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61a25f00e527b292bfb871728cc6b8a5e3fe7e74 GIT binary patch literal 22190 zcmeI4S(jXO6~(KQ&LAXeK+!nQCTh|GMo|&S1VJ;9Fhtv->~vkbOM0@pLP$j6gQyR_ z`3ZdV-FY6`S#T&P9Ka!twYO{Wle5mf*6przr&+>cuYJzm=lst(eLKA6?(N&JX!QSS zk8W+Ad|jjQu!8^oXG=f0rT^dJi~7)Nj5k^%<0D0*7-?;2ZETIUHnlc?Z1ebr)|NXP zySMIYj5Hd(fAyW6J{cH#|9rA}!;`~0tp<3v_Ybw-I5g<}U9Cpz!2f={cevlL_in)n z!5xD42;L=_5R3~B3FZY0f>VOq1x>--g5!eof_ntF2@VQAAh=g>m!Kn<5-j$i`a-?y zfGN~D-bI7f@Wbm;Twd7#oAp|qjAP{0P zBV65s`8BV~yKD}_=SeNV@MQ~s255z44XzfR^l_ZyRveL>XGY+r!IE8# zePNl8R;8*1x`bs04Ox27ip=LO+{Kn~AygO^wqzr6uxb^bS+&_JmTaxkTz0iASK6Rd zU?BJN9)a279KhzNzf&EfE!?8UveDBLpn6G86Zb3IT#gY9LJUbVe`_^WrM1`TUvp@ zGJ`VL`i)TGA+uaKi9-&NspNRgER?aw5LxxH8N)2>8$$1qlZ`g)ocG{e*2;33TJ7W5)WWERp{|65kBiU)WuYgq8o*}C>3+u~wHbX|39on7JPl1XddI zt}U659Ol3Vu!M>%98Q<4b9IjU;qxpElrhZJjM{47iq#=LRI3$#X!#e%wfqW|vf#@? z=c<7x?eh^m5J1i>8;IM}r8YN`hwV(#Z%w|kg$_Dk7HW;=LHY&YAsgN~rE(lr9P4Rg*hk=Eq zu>@hQLjL>hl22}&&p zX55tD6z0nq4X7m-nr72yKIF1mEIdgL zhFZ#4hB9_@&LL`PtJM&)Ss2YMKt}QJFaxq5Eh@iJ&ShT{H=vBB&IL

    w%~)&1x8som_yfQZv-=4 zE_cRS?3T?O7IcU&gqaW;U|HYHYx#7g_p`wI+$sp+5U3VtfR9$>)&*m5*5ZDs+2-5@ zAB^?sOc&RN2GnL1L8X1hFr#KU)Zwtzc*B$OGaAm|Yt@B=g^$4lp%Riaqs*4%q1RuJgO|=6 zK7ndq_S1Job{EV~G@ZKg;3JPc{=lO*-+E!&x%OOZ{@mi8Yp>h4Z+!ES;!LMFw|n!_ zj>+kXPP04TobR-XPIGo*VQI%grEN<+|*2aak@EEbh|}oX`5Ou7TxCD#B8y&b!K92>g>c+aeVj2@tvn{ zKdu3q2aoJO)x7IO^Teq`hfg(+?Z0Du$C1MaP8~koJi7n*ZOvmR4jn$abk*thoZSBz z_Sk%@nE6zr^BMg;f`W@D$EN3Ji?P|Woo;bqV(gxFr+ao{X6(Ss{M6V?`^?zF`R?@m z-1U2J80!yR>{*zYythBc;+W=Z72PpSHtj>qs`uW7^GjQA?9;O|#ZCHKCKvVhFOKdU OeXy}#MiHlzV literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..553db0f0a304c437c5fcb2d6874ac7658faeeb60 GIT binary patch literal 22169 zcmeI4*^``Q8O1xvWD$uNKomsWHBpm6P(($DpeRa+nt(bkW0P)YMrO08gNCxoKfr&% zOK-gLPQ+dB)GK!#_uW=;#VxLV4wgT1>V4aHHYE0+zS)0%2^woPs8wz}Io+dDft6P=x%UGLvDwY{_Z zSnI%^{jF`S*5F@5W^WiYhQUA2ByT@69Y?CcyMup7e#eHv;O~-}7zh6MuODR`q`TCgm5r{Gh9PYXUH`0Nly zUubYxyjKct67&SG608XNg0~A^EBKt?q+m)gBe+HII>FlnpBKDIa8z(yFe{i7v<0^d z-YodS5UTzLUlip_f-eicBKWG{4T7%;zApHN;G2R~!M6n87ThWLj^Mk3?+LyyI3c)I za7^$6!4C!cV>9@%;3tBg3VtT|xnLmph2WQhUkP>!E)(1#Un2rdykPw*7M zm4bH(CIv4Nyio95!Se+#5IkFOq2L0+@DFus@F>CM0{!#``veyYo+-Fi@I=8?f`fub z2p%oiE_jLHJi%`S=L()BI3ze<@EF0(0{vMSTrapzaFO5~f&L^9o+fy#V6R}m;PHYd z37#srP4HX6?*zXW{6TP^;E{q$1qTFA5IkA%N5K_>rweuo^zX014T2+rX9(UR_>{J!dWhIU4bhyCxH%?3$l+WGK0h1_C8=bTL$on23jP zRci3K1psg4l-*2rYH*4?WM-+MT#Z7RRWVMjX@tLOgcJ`Exf`>t*)BY<6;kd7FJ`%r z8>E~m&PgMp()}=wHKLL=x{eSag3_R7N=P9P4oDd@*$waO2B~XMO5GsG)to|cguhbc zH^Lu08YN!TNQvwK8;;zK2DQ>%OlG%g3MC?^)f(MW#5Ek*X+)%>yXLWZkeya*bS>bN zh}1Pdge%urA1P`k$NC;)Ho8tN6|uuLh%y(7q_)XJrX z$J`Bp5}6ugW;ujw2G=}BEh5HQEgDP5EMtz?4V9pbb{b?- zY*2H=L!n&dMWd7=75nm<$4aiCFbj_w5e}$1qTz@xjS|mYRv@i@p7_0B*R#>(@rdBz zln7C3rN}BKJA&dG4N^zuc>;mhyfkZaX%89^k;a%)cY_jXX)J19#$&@MC|4X1GNo| z{G^?7gNPz!f(QyushMYRm$X!a;)s+nEBglSI)zLG#WklqN$O}lUah@YYWD~Pj|oRSPFkXv2XLWMjjp9g*BE)32EZ~V`!&{b%3bi{nrB^$ zjc71I6l4S(m0n}E6m87GLOHI%_od+pFGDTdlUl%O2{;%Ju@*J+qG7#okF|(Md6Jr= zbwixQc5RY|QyQ$`C{orhjX}2YAhVkv#{pZ0K&T)9&ni5`9*9QdiKtamOrp%@9&<_! zUd%@7S=Vsy8Ul_?;UPx>Tq6W{k_pI`r?GjFpTrCMvLIgIIf@kbtO}0^Woj|ulr9c9 z1jfyyK}3TH<%k#~;tgssW=eqVmcTX;b!uS2sL^%gS;+QM(nE!=$)0sBHY(Mu61+`L z!=GJYEjF)uVZxM+*<)i=s-D-~;BLEWjbK zW`AxtGGGIfG3zu`AX@7i2XRvR3rsuC1ZM|R3A?%ice z93Vi=QHhLvkk^xjXzAV2@?L@US=GwXwLEW_;uIUys_$Afx}};a(Xc!aDx*_Oj^>Tk z#b0dh22eU3h8!VS;J60cedff5f25j-yBEp|O4?F>6uRXvF$7Z~(=%XhaG*qToeZ zB10hxUNz+x#=a(3rOY#hs6=+H)bJRMh)D5FjVHsT_lOz-@g$9PN8AsSRU5o!vLQAK zN~C@*9tujSTdH}CtDzE614>h=P-cv^>=f{E!U5kB9+5?Z67SM=!?VxA*Bj2iYu+ht4vMG;=HAW?qrP>hNJ|qz=DOA2L8*ZX0=!0zSx2M~>hAy>I4wotIa1%iwdyi4QF?=#RXjoMY}D#i ze{16(r~0ABms;Zl%kZU%EDEKR@{*FDkgbQe!_hk3s@_wLn;`lpuXPPFHzmzP%N`g3=7r+e-G+|ud= zcXYeU)7{0H`MH(Z>G^KI-|elQE6J5^e|oXK&|Td#-(H+K*`Dd%a$v{Qg~R8Euir2v z9A7%B7mu`;r}oOr%|qIerA~K#^}PE@D!TB&R!{#)P{Zk?le0?;-N}WMy?*zu_T+7I zz5dDe{N(lXOEZ)6bGJ_}pX$#pEna!(>dB$e?!o2ui93dGuT08Qr`w;DoBmLFK~Ei8 jKDD~%nqhcyzI(0yQ;;j?4`JfsiTAd4Zr}Fbzfb=g)K$Jr literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3620e747c6847d246837beef4cde706b8a66374f GIT binary patch literal 22192 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9096b039edefdc71693595396a86e6c7dae8df48 GIT binary patch literal 3376 zcmeHJPj4GV6rY*>(sNGb9xVjU~AfVVElO1Z4e9n+)6mlI<%0FTDk$Y*8lm>xC3kF-g`qL>IL?+_7)!T}KlN%yUAN)&6P zG6woFs=95(kNkB!|QUQd&|d zePMzd)!D?HceaVqo@R${Q-+KV_(wZ@Nos7k)9gm4jJT2A=%UfRBiY$@&(CXs7ny-j z~ zoVdR&l?q^6;&I;Ywl(L;6p!k$<_*X*-T*dE3cRW04sZ1OT`g7OC>cxrlqPm8qbB_3 zd1}b{Q}V1@-t2W`xzkr#4(jFmZKeD5sQhWvYn7w+MtOTzZ}z(HFD#bhwwCkT^~S?` zOU7lqPe@&k%u}~bdM|A6sv>w-$Jb%r5?Z7#%)zVUh%6lYekwE-+9ir&5L|x`9`f~k^*ZlajUCqeC1Z+@)#Sj$rLCst-T`fVa z650rT3`bfvp^fErB99WgDW%Y`FTMzbP@j4*eailH8FDtArXCxd%fuM>WMYfH;b-t( z2L@1q4za}m$0^J*4QOrI`v!kNm#8a(?Xm79lnQGW?cx6yK-ZZe7a>w}WRDG*U|@L{ zErEAuj0~{ORa@W9{B-Bn!NGMb0W;D+8<^ckq7Rl@>p%Sb$CdTpuLCk~gF>N)>MbCN z756&^yONcH=IEZTM~UC)b(?J=yA62~sA3CJf295%jyZxXpf*F;Ty`E{vjH~S^5|eL z16g)=X#zVT77}zqpYu*n^dsa0&Uc`Xr5e+eObbXn=v2@|^{#piA8`o@_F?rN5a^s~ zh#NABI3M#I{+}eu^b73158#Wjw|F#gJ%>@>!p|$3-dru6OA1HToAyQ1f)Yn|`<*xi zZx%L(*1emz6=q9l-KbTN)PPj(BU!~IaGc-PYBfATu4 i;!9A+0S%bVY)HP$v>3@unpqL{|N6g;&oAz~cHu9-AxAI( literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94d2338d6bbf0e2d08e6e562211b9741982353c7 GIT binary patch literal 2239 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 A2><{9 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/sbcharsetprober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/sbcharsetprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fac3ca8812ddc142c5394c628b2b09ef587f9cf2 GIT binary patch literal 2992 zcmZ`*&2JmW6`$D;a!HZ2B&&8*B@PQDX&AI-fFw;*I8|bqmKDg9YtlinNHL%|BXY?l zm!4h5kwTp;AlF{olXUbY=&66qo?7JOOPh0m!u`EjF_PkFiFurlH*em&kKda|<#LhX z3mi|ZUSsS#8l3+e3_d}N-v^OQ@{oGpkJ#u_!Fz&Sy%%saL^?0hr zU9}wyRT%W6NOmFX!bb|y7w>{7=5xt>OLE_qmhVX0cclYGu71PzxXerMsNm;KzaWc8 zp6{uGT#%(B_LTcY^vkkh`U~=kTs&faNiNA{{FlFB4)ZIx&PsZ{1qDNOdp}VZZuI;U zXb^yp_4ds7pY`6~|3=@l^}EgPTv0F)53^5O{24k4OZbdEwT`V5#@P&gVb3g3XJ&)C zl7Z$7%^T_&S}?RYW5)}$PckUTo3&Ev#?y(?ItS6ICqys~5+Tx@7)4TrX+dc9rP8sI zX-SMbBPAxrC+UI+J8>c+EtO8oB36$@H=2&&p%`mPlypLxJR5Z3!L%s$G;vbj)hbp= z%}JeDg?p)+9q7%^^B2w?_l!dm(Z!Lm5YN~Tf2#MRk*bfTI#CCm`saa8rk${UJB)hu zFxah6_LF`ze(&b*>v52%-%dK+VW+3!Ivp%kQjd43hvT!`+??#|0u1nLw0H%C@e0pb z`0=yfLG==E-ke*lOW`~JsQ;tm{(!+n$4TQjY4v#G9J?oMC371&GB1gGhQe)dl-+#( z0ur8+>{?NK_%jaE%hW3qaY54Mo=U`cIuhM1O9B<^3awrtvPfhJHgNiYnR>JxbUTGTiCuqf?frgu>sQ+q66Nd5mIgymogW#nrZ3O z6DGQ9wx+}N4I%_L`ZXd($1_D~bsa6Hpk+|gvku<4OvUr!U(%EuWHcp_FKc>iOMU{a z=el}fXWW}2l4?$-=j+&J^h|A-{%4gXmb+-@mAy2Q=JLB_!udy$NjEi$4iHzQC>b$c zK|1ppR6GQYZ;)|~i2=B)?9fW=8Gp*}u)qBC3+vE6bN~|$=G~c_I0JXc^q*(ImqAY2 zA2JJ|F>@gykNJO@dGB=I!))QgO7V0Ba57kk|1n=j47=CaAz%pl;iQ?3({ke*nOutS zLE+_f%$8<3m#v~Ce2A2}1u2OC!sB<192YY3=vhg5P#Ic(Dq&x)>eD#a~yDQ=V5!}QTrTo4)EQBab2l)r@hp>yYr}dM{KoGjWX5O znvKm*FWueTX^Z=fTET!@>g}THVxQK(B4v4y@^0#ydZh{CjbGB@nQlKpnbg@+O5O)& zybZ#55kCibSmcYgmn)(|P%BZT08TDii|8!_ifFdNJ*;@#V%7@>Gp5fi?)=Yj09LPF z23B`#I&f@cz;h9dF=LMDiM#JuwDf7fgI ztg4v$Vycff_icvURB231)vU}TT>r$xx(1dRT1=IQ!MbES=Y_>RSZxvZbNInqm)YuK zWYw&@&Ds@u!I)=*z*B>sFw;=sHB%DeG2RE+ihc`c>9>izL!?fGFxC{n)Weei529p0 zD?$e0e@CmNEM7X6H)F}2i`QG#j;xtIzTUBUdUN~Kh^cri!KtDExOtmV`4 rg@=eHf2S^GXl$}mQ>K~Xo)!GFO88?rOubv#MgK^(GNuhBzGD9$mOjq$ literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37ea5771ab1320e77c01dea4eb2e06019c11db1e GIT binary patch literal 1602 zcmaJ>O>f&a7$zlImTk$F9Vboq0qkmQi`EuSa~Osp0hSe8iw({;fEPiQSX&Eedz9QZ zg?n;={)rtDV3+#Qz4=E(+Y$R=xQzav`GXTA(rp!J$) z%MRU0cQ+Yso1v=C*`v|n{m;&(Np4;Q<(t^y*LO3!|Ix2 z*9%Dm(aU+l$3VqtSMkkqpPv5(bL$_*won4=xYo#wl#LvbmFf_ z9G2ZRd4;F-GP(kKyt1@xY1v-U%bk_Avac*kR^;dKvcICJPwXoo^@?2XVn!LkqMm$p zHrT6b#d5)w>OtC-7svT5FXLEYDGKXSH3S!-j^H6Q5b$ED7J`p}4Nz@_Ea4M(Z;wcNJdbpb~wkzh7JWWKrZSFtIi{-o4 zx3p@+aVnCch~u~9ukWMjT=GaRRmoo_(T}+*VNY}nM@AwaM~jPcI-fl_IEsqAGoXeP>Wc9I}n5D z(w}ixDotSs>p;QAWeV0zU|o^SCh6w;p-1@t!D|SegBR3hCnPpZwc4kIFL`QgEljIW7TZ(jb)Q1vW$g#v$^sn5~-+bzSSJv fCTvdSeGXC3-7h`_t-u@LQ=fihhctvq>Bs&DHrAu{ literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2120da9694e8413f1bbb98a04aa0dcfb1218608f GIT binary patch literal 2460 zcmZ`5%WfMtkmNqJl2@`~*RP@|9H2P}ZLI?BA%~!7V!N?}SPm?uKo=<3wMfe=@2(W? z3Wx>eWEZ*S6YOJtqKAG4uRZw}a!F^nQY|+qS0slVlJlO?%WAbkphdRF|Ev-6H!kLz z4U38kHLgWExbj9*p8VdUBr2?bA@TW&T19j->+3()K_^X|J7! zxjYEFr%@_lcfI{=zr7P>xr&ZQc{E5Lr(t}aMH%3h5w|@^bNM=-+pgj^Zy)f3!=2sd z4W@mhF?(A3)5i^=E^u|HS<_Ya0su(@DoDWIk`pSZV3%HC8Q2mwz_xURBiu`JK?4_H zBR0S#Q5Ka;5_n=k_%N5>5}O1SP(xK$khwzUE~;eK5JuYAvmao{Nlqu^f?cs|LP>7r z_64lDle-rL=2GsNxjZ3P6+9tGo4lv3#)5XT(NHQ?hDWr=d6Y&u=L#QIF7B1PM$tS= z6gq)k5p(M0A?kMw_Z`I5yM=oH-PVqhnatl)ZD%q*fw|0iHx9Fm^Y`S#^XBOwkmyqJm@v!=(ssN&rb*G_gfE}S(M9fhhg_D?8&Uz1!oX4Z)W`{8yb(; z8lEd3Sa<+EGpVi461Qdo{=YWAfEVs+b3*!7p;y$J!q*$NT7b!DP1O-v z#Ni$e%Q&pyu!;j>zk!~i_6Tq_uHPDU%c$oQX3)Ibc*lbQ$df*u5oU&x_E80(S)PW8 zEa)1Nw{+Lw>Ua1CgMqN|+8ovS%l}Ut85Tge!CKmT77oJ{Y*|QV1ied8dvTcdMqnTG z#~Iam-Oun{!x3@?4gIDB-H6))!Hw?e1$;Z?w-0X^h|jL937xPFa!ub@6Y%Z6bH>yQ zz_?c>0e;^1pqD4?+6LdR^cTS6A+@}tue?{jIbVhIeZbT{!7KvCH#F+kYeo_GS%E9oK(ROt91Cj=POTGwoC5mfo;hVs zz}Z_Yyh4RL<$xIuR)GK2Gxmgs*w165vs38bOpz za~}#Dc*qS$J>2zt^)+042tC__fzUd9n0jo;At|2>}`^z_P|r2B<1IGK7=Y(NLN><1*9wE7z)*`DNNoqDHm(mSI{%ey&m;T zzRhUG!tUKSIlI-U1&hh?G!GV$q0sg9QekrAQ%Ui^!W6@xj)&)KpDBld+aGq*{B=?P tTzE2rLTL)8Bhyim8Sgi7QWT3@ehq~DYVT2@lOM76WLU<)38r7&`Ui5TMn?bu literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..297003ad2468a5ea1b84388eb22b3866683d038e GIT binary patch literal 5804 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 Bv`PQ~ literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0d1e09a595194b6051b714cb92606223ce1c8db GIT binary patch literal 412 zcmYk2zfQw25XKXl(kiGc^Nn=CMk)iU5UMH|x)g~*hc1y5yNQMWM7C2%p9V%|-X<$= zz{rGKQi+r9vp(HP_w)BO7{q}u9`%!N|98J3<%evI)_A7&W~lp*l;F<|Ij4FmJlnle?z3yn9&8?&lwYIrcH^ z +# +# 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/lib/python3.8/site-packages/chardet/big5prober.py b/lib/python3.8/site-packages/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/chardistribution.py b/lib/python3.8/site-packages/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/charsetgroupprober.py b/lib/python3.8/site-packages/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/charsetprober.py b/lib/python3.8/site-packages/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/cli/__init__.py b/lib/python3.8/site-packages/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/python3.8/site-packages/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/lib/python3.8/site-packages/chardet/cli/chardetect.py b/lib/python3.8/site-packages/chardet/cli/chardetect.py new file mode 100644 index 0000000..f0a4cc5 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/codingstatemachine.py b/lib/python3.8/site-packages/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/compat.py b/lib/python3.8/site-packages/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/cp949prober.py b/lib/python3.8/site-packages/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/enums.py b/lib/python3.8/site-packages/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/escprober.py b/lib/python3.8/site-packages/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/escsm.py b/lib/python3.8/site-packages/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/eucjpprober.py b/lib/python3.8/site-packages/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/euckrfreq.py b/lib/python3.8/site-packages/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/euckrprober.py b/lib/python3.8/site-packages/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/euctwfreq.py b/lib/python3.8/site-packages/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/euctwprober.py b/lib/python3.8/site-packages/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/gb2312freq.py b/lib/python3.8/site-packages/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/gb2312prober.py b/lib/python3.8/site-packages/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/hebrewprober.py b/lib/python3.8/site-packages/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/jisfreq.py b/lib/python3.8/site-packages/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/jpcntx.py b/lib/python3.8/site-packages/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/langbulgarianmodel.py b/lib/python3.8/site-packages/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/langcyrillicmodel.py b/lib/python3.8/site-packages/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/langgreekmodel.py b/lib/python3.8/site-packages/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/langhebrewmodel.py b/lib/python3.8/site-packages/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/langhungarianmodel.py b/lib/python3.8/site-packages/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/langthaimodel.py b/lib/python3.8/site-packages/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/langturkishmodel.py b/lib/python3.8/site-packages/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/latin1prober.py b/lib/python3.8/site-packages/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/mbcharsetprober.py b/lib/python3.8/site-packages/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/mbcsgroupprober.py b/lib/python3.8/site-packages/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/mbcssm.py b/lib/python3.8/site-packages/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/sbcharsetprober.py b/lib/python3.8/site-packages/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/sbcsgroupprober.py b/lib/python3.8/site-packages/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/sjisprober.py b/lib/python3.8/site-packages/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/universaldetector.py b/lib/python3.8/site-packages/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/utf8prober.py b/lib/python3.8/site-packages/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/version.py b/lib/python3.8/site-packages/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/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/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/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/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/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/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA new file mode 100644 index 0000000..c455cb5 --- /dev/null +++ b/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/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD new file mode 100644 index 0000000..5dfeec4 --- /dev/null +++ b/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.dist-info/__pycache__,, +colorama/ansitowin32.cpython-38.pyc,, +colorama/__pycache__,, +colorama-0.4.3.virtualenv,, +colorama/initialise.cpython-38.pyc,, +colorama/win32.cpython-38.pyc,, +colorama/ansi.cpython-38.pyc,, +colorama-0.4.3.dist-info/INSTALLER,, +colorama/__init__.cpython-38.pyc,, +colorama/winterm.cpython-38.pyc,, \ No newline at end of file diff --git a/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/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/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt new file mode 100644 index 0000000..3fcfb51 --- /dev/null +++ b/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt @@ -0,0 +1 @@ +colorama diff --git a/lib/python3.8/site-packages/colorama-0.4.3.virtualenv b/lib/python3.8/site-packages/colorama-0.4.3.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.8/site-packages/colorama/__init__.py b/lib/python3.8/site-packages/colorama/__init__.py new file mode 100644 index 0000000..34c263c --- /dev/null +++ b/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/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6056a2dc982829c35623479fe0b6544115c55be7 GIT binary patch literal 417 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 JO>Oqt{{oY8)HMJA literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/colorama/__pycache__/initialise.cpython-38.pyc b/lib/python3.8/site-packages/colorama/__pycache__/initialise.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e78f9aafcc3fd2c69057fd4c332e8869e0f87085 GIT binary patch literal 1678 zcma)6OK&4Z5bo~j8IQ-0JQfy+7O-+a8VS}C5eOj`@eny6;mevVvR1MhcVka7p0TRi zgaq$}kKPxV({)sL-K!f<3V9{yfq>>o1L zheYEm6zfoFrg_c=%QqizZ;OG@LI-&;l>^DqLxm_2N)08}Qq^^+qf0hO^sbI|{gMwF zI?)YWX&Qdq(oNmEWEXtU)@{9ot6O?o@8Ek|^T#Z`_X7XSdM`NYlvj@j=JduadxdQ^=PvhmP5UCv!q2V;#J zsyu(r0Kr(Qe}Cvs%Bks2=itn_>KK+i8@pf&GE`He5#qM75822Bz=M31s9=YP7DK8BVX_J6us)+ zD|*E%RCSlwOV_w+y4E#E*n~<5x-{sWe|QRN_UKUM)^tW?@k^eKob8-uZqiZ3S*LUp z104n9M}3%^e%h`AT&|KMmCwz003}p`J+oD`L>)rBo;M7@T|UTY(~o9GukzC%8x1gO zy0PiMRL=aCxuGr#Q$u{gYOl4J9b65H_S2c|NR|BpJ@x*LaNjm*5?GRI3 zl5+PJ&g^@rnAqiU81YCXJPO(` zU0m4+3T<{NZ4Q1-XhTa zFZnE7gjf8U!TusV7SFIQu`&cTmHX%q#20uI)lHWfH0-3D=XyvCBdQaD(+J)tzs)az z`c_q25+7c{7PfKodlXCkgK>$EK{A}9s-dub zy7H9Tr*DBvu6c%eKs}6fzAu@(yjSg;qo%6B_69zYKbVeqF)j5xH(yeI aeFeqH%UCo63|)8$;xKs-*RX!#xb`2s=vF!a literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc b/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a53d52aa4b1192e31b5aaf8ad700d04c956ba2c9 GIT binary patch literal 3954 zcmai1OLH5!5e6_14ylJJ`6bI*o3_`EnRuzqx>8A{9M@V8KdQ8nOO#i;Q%OyY2v8zD zTPDZU_@U)bDW^T%KJQso}eT)h-7v417H0CB;$d0&}GQKpU&^Z9W~$S z=~Nwr^Ix}g+6$xkg(%*hk6K&vyZh-*+`V7>-F(tY)n~h5<7K$5lKDm)#X9VS^H~4> z7q#8}%zF@poh=zYoW$fmp)gGm`Tyoh@t4O+L^PpuT?WE)>GYU zq&=-Nw-GdULY)_DhuHA&6o=mkj5D`<4{SZsL3xY9k6=v>en0 z)GqaIJ3eAwdhkk77U7jrHoLgCT3=gP4(f~R%gd|5!i&d`m)C=5tB=D| zFpaod+o@%)+^e?^R92RIi#?sh`gsg6TX8oV+k2Fzy0z6yRg!s$-fVScyqBGqdtZgG zTb*7f@1W5Q^5^kK{5Z-YO7av$@;+;`c1{I&%kWm4cpC*=o5aeRm;F)41b1>#gmb zR9}D?F>5C(YM#WPCO2n=AOLnja1D)Q7KCxZUFMo%6Qv*3?+`kzKss7cYm6c$9d2z${f@Vua zG6^)9He&lpoKlP;EwhA>@whEuEcftp-`fRE(o-&^g(&ci3+KS3?2x_TDO{L}K0oA# z;*ChHzBuG{W{ybJHnU_`gC{CojJru3sd_^z)m`W{n@T_HHe)@8nKFATj-#rTxjSK3 zMk=!#$yO^XB)vvMCCP~O2Kn&-p&IVC0t8|DM~qJ>v>2=xTrl^@7Wxj_4eA{IXzRv$ za#@NHl;SN*c?yd`twY`vOAPyf{Z(uA)aC_75C934OCWvrr%7y{(Z;_<>Ut$8W98fC zX8EefMD6p8?|f)}@xiw0s@J>vAz5g$oy`P0xHht@+Jh)=gi-RaHdIC?vBK_tHbH3C zQ~5N9%B^oKt-aXDs9s)QA6abZX`I>tF+e~z98x#svI7g1S6N$7wNY!`@9iqWC9!dRQl1odHLZm8GkFu7GNJ&)m;6C&Lu zx#b_&d-;r^9a@_JBxCh`)Ef=5>G&h;hxmSn1_jYyaFY7G%_V=ylR0q6_Aj}vP*9N^ z5-~$HUPUu3M_$X+O7SLYJ8$g1Wm7V>+wN}>N&z=*fp)>PMT!IpA3ABV@ANIg0THe# zEB{EOTGH21X-Ws0!dnxx`W_KVk@_-`86xE6?8*pkr*DX=n*-z&;f-*ZY{?`+AzIjPgP`xG)(>h>L^1m_LvcEQ{?2DYk~$NL0k&0K|> z6VDrRbLK2jGS23L$E_$DWWBXsy4y<^ap#APROv@~)^olKqn@f3a>Q)&Byc0u-A;Eh zCrLw{8g#O;Zm$#U=~kMm?#~~cvzI!ANeMZQqH&y;cu7!_%zq|T5;$k0Mwp(U_6~>0 z;KSeH=o`$y8O+?&24;@I%;~#?8KHF$Rz5Orc*^cpb_M|5t5C+Tjl3@IRq*(TyY!NP zFpjm%ua0|_I}HLd*~|f{RC9m0xj)DSx(n$%iZj=U0aVjntm#;2%Gkae644gdyqfX9#ZN_UW3@kN@8%{ z%6yvJ;LBo0xS~Am3H!*kJb{|K|8eb{vxl5G;V=%fymt!&ozv}n7T2@K3!Yt?_DWvq Ezji`$jQ{`u literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/colorama/__pycache__/winterm.cpython-38.pyc b/lib/python3.8/site-packages/colorama/__pycache__/winterm.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c3cfab6e0e58669954f9d42da0281ca392fc361 GIT binary patch literal 4638 zcmcgwTUQ&`6`nIUjRpY%lRzBDAx`2%X=~cJZQL|XxEQb#EV8&XwN|@k37r8X3yGc? z)iG=6>RR<{(!T(2b$?19`UB2upZE)T>bLjINJz$ctXQ+pKG)foZ|{AE-SKhXz^`e0 z!R$xGV(EPhqv(UGtgTBLk8+}(6&@XV` zk>0jZDP9O1QxV#E+U(r@xPi{lk7gI~L_Y-yjhc`~&6J{MNwa24tL8|%=1QklkZ#SB zg<4U1HD4BSvah{wnw^zyyQ?m+*HCoSg-OIBLV8>{L|h^TkZNU2dqL2tAB91n{UA8% z%3hoJQV{&PS8r!C&hp06%2(Q6-q>B$&idBsYE|1SkC&?2+FHG@3y+r8SF1Zq+I_sb zv9bA$wz1^#3q!q*cQEfvv#Q1S{_zk{0*d9an%@FRU$GDqTTA|)}y5j?JjRUTz{~mr_wf9hNafGHg~J{ z2kNKXEbS!$rtn0hK`K0ty(BVexkwAY2N{Sg&F2QdU`ZP-;3i$Pj+~dCEIt>2#yfIM zmcSL{EjcbHz{43Xh|A)jag+kRK^vdSYKZcbAq}h6=;Za&Lb> zR1Z7*UF~k~+~3^Ysf|5dieuH>>&0ONXv=WF-fPFY7=>|A$4sQ1V85$EJ)X~{T_@NB z{v~P_fm!Xw>^eJ|I#d@)41K5God~c#xao zJ>YFxh_eV`0^-askQKQn5)qp%3y-~Q@QA~nw5p1d ztfHiYP#VZe7E+|8dW#5&UNO~A&}io`^>!~D5ntWH6s_X;F@!HBE(zcFa`n~Hlh(i? zn>52A85H__2UJS%ftATjS(-tU!qDcIt9MAaF?v-a1tZ%!m%7;P05mdGYD98fR3XdP zZc}Q{JKx!eZJG zO@J5xy(?VP7SramI4R{oqeK3GTB=_{5-4~ZO&TQw1sQom3R3W^U(-^u%cy#vVC*wI zKdK%b(IBVgKjQmNWDs8EM2c>ddxj#MlZtJr53xCoYnIc>B80Qil``JLhIKpSQ(4(pZxk(=w8xezO_=I8u+M#D>Jv%Ye8boCcs!?QRZY=G5SnR)Q)QxH8j@XxSjxr4r-r5p^T-Kb92I2*D_ z`l|g2>vC^d=?=hR4M4P%6MD`!+aB)-++ z*(LqS9JQ(RpiuU89<|GOBehAo@Bo`Ki=@`@#f&(4Ew{+fTCO-lZZBdt-5J>+{{h1W zp@2*clDQfNu@k#x!xTi_83P8&`vvNwS7P7UO;F(^@vpmOl{4xBwzUO(q?|c5d{|2wbr@BtBAlmKj iwZcZs{}SMjY+i8HJGA#%`mc}A$qjrrFWKd>vhzPbhNiCo literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/colorama/ansi.py b/lib/python3.8/site-packages/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/lib/python3.8/site-packages/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/lib/python3.8/site-packages/colorama/ansitowin32.py b/lib/python3.8/site-packages/colorama/ansitowin32.py new file mode 100644 index 0000000..359c92b --- /dev/null +++ b/lib/python3.8/site-packages/colorama/ansitowin32.py @@ -0,0 +1,257 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + except AttributeError: + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/lib/python3.8/site-packages/colorama/initialise.py b/lib/python3.8/site-packages/colorama/initialise.py new file mode 100644 index 0000000..430d066 --- /dev/null +++ b/lib/python3.8/site-packages/colorama/initialise.py @@ -0,0 +1,80 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream diff --git a/lib/python3.8/site-packages/colorama/win32.py b/lib/python3.8/site-packages/colorama/win32.py new file mode 100644 index 0000000..c2d8360 --- /dev/null +++ b/lib/python3.8/site-packages/colorama/win32.py @@ -0,0 +1,152 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/lib/python3.8/site-packages/colorama/winterm.py b/lib/python3.8/site-packages/colorama/winterm.py new file mode 100644 index 0000000..0fdb4ec --- /dev/null +++ b/lib/python3.8/site-packages/colorama/winterm.py @@ -0,0 +1,169 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/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/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/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/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA new file mode 100644 index 0000000..f4d89c4 --- /dev/null +++ b/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/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD new file mode 100644 index 0000000..f031682 --- /dev/null +++ b/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.dist-info/INSTALLER,, +contextlib2-0.6.0.virtualenv,, \ No newline at end of file diff --git a/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/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/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt new file mode 100644 index 0000000..03fdf8e --- /dev/null +++ b/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt @@ -0,0 +1 @@ +contextlib2 diff --git a/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv b/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.8/site-packages/contextlib2.py b/lib/python3.8/site-packages/contextlib2.py new file mode 100644 index 0000000..3aae8f4 --- /dev/null +++ b/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/lib/python3.8/site-packages/dateutil/__init__.py b/lib/python3.8/site-packages/dateutil/__init__.py new file mode 100644 index 0000000..0defb82 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +try: + from ._version import version as __version__ +except ImportError: + __version__ = 'unknown' + +__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz', + 'utils', 'zoneinfo'] diff --git a/lib/python3.8/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0138cfabe651b705af9e3bc3b9ba26ecb3a85d2b GIT binary patch literal 349 zcmYjLu};G<5VhT;35i;Do!+~f$)q9)uURSH(tIDpf0RjFr0xdV&42(kq@|oua!c%fM$~9s;Q=K> z0pskRSawHX1R3Noh5}01dn|Yc)soEX51MS|G!`3$opv@By^m)I%f z6I4b9y-}b{kUU51jfyPnV%`UBI$rLaRobrH^*oQI_%%e90%9%xv=FhrYQ4j7iRdsE zLP%qTcp+G)%OCnYZbIuDul=I8UOuc9EVfTdnZ?n`Ds8r>4alH|*hUC#br9mvKgaT{ Xb&$R~A2PdXB1UI)N-I`TM%dRk%E@20 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/__pycache__/_common.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/__pycache__/_common.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86704d3c15b63f517ea7cc05cd07b76d7df050ef GIT binary patch literal 1395 zcmZuxK~EDw6rP#gw#y0?qamo5YDC=_;6jWhhDZqL#hM5N-OHrx3{tx7mYHn`&3b|# zqKOy$NqhBQcrbo%mlg_6Gc#}Iz3%(I_rBeonHis9{Bk|{(_!p49j*=+hqst^9*bfj zd&d-4;*2Sw`Kc2Me#20 z0G!#pcC2+rwN7&0Yetk}G{_d1>zH;HOU5%MSthU|^%gtl&2wQmJci-|CwHxm_b+eG znW@6@XJt9<_LuwZ{^Fq5Z$%xg7LO0Kju%&6?&Ie8^|ETEdXTo`Wf>K?oX5bVI z@+m2!xMi)B1&KhI3cQ7{U{WqM+!4B{6~|J};ADv=<34xAReWW@4SXJA3w*0EhK~tf z#(~kX4`6fHyyKY0E;_r#c3E%EWvS@+<`rl3`%>J0hOE#(r@6Te^y4Pv^|drL?Y%*& zH;hRP8blQGN|GLEbDcz0N_`~dT}0SvEQ||24;ppu@nQY4&=eF=j?o~S3Rln|ZKNnI zprf?=;uNqi%9^_eEqibYFW_ZGsa})Cq&O)b;@(ny2#L$xzgNpyhTJIUSfliMW+-Jx zOph8{<{)bSq2AL{K7z{@0-7L9t_i{vGA8^K2UY0mKKn*HxA!uTR?rol_Qf0kkh;*H zpcaY`A49Rd6N=pp?C(Rd`6(1zYnVI3+Jb$)@InQKRC^(~oZIVgAvdG@M#?7yxU7(m z*I`m{Wk|rAflmVMwYuPu`%;!471+~K9t~RYg$H`KagvhW>5+yiXzH|3Pt6@#NE}zt z6rH0tplB+cEd9abp733->Uo%@9-H_e)TC5NguK;c?@&i+sf5e!kDr!%Z%T}-B(0(& GZsi~BTnokk literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/__pycache__/_version.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/__pycache__/_version.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e211a24cdced1b9da6984f4d5bba2bbf4fc722b5 GIT binary patch literal 161 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/__pycache__/rrule.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/__pycache__/rrule.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24214e30628a2744f5042b284ff9d8d422eaf433 GIT binary patch literal 43478 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 leoA6VYH3Mkj($lMP_te^Gu94j{D zRkO`M#6W=}{iNA;)nDkU=Ta{#aD$?RMe$OX_r-G$eZI97c^H3GYMtNLJ?~Ev?vD_{ z3w+EGCgHU`;fo;khe12=X&t8FFl>jzO1lDiLsZ4uYrkC;>!SABYp;n%BEt8&sGNH7 z=8cKY2FkEuE{asLyx*7FunU<<%~O`-*_F(c%o53XCRkxrs_ZrE7g=Ieo*CB9H4~Dj zD!X7~We1VqR$4WbrV&Mr2D^eeC~_gBXtmg3j zF*laM=e?IQu^-G~5#zmF8g5flk>B~{+BBQEstIIenC0VgJ;{eXL|RtJnXcf6IM8eK zdm!vPPj6uP_u;-Bj`l}tR4=j-PcEgXj|Wnw_2*v$ETi#v`*fP{vrm(0jIPV7%~9Dc z95-au+l+ioQbN}}AGD@m+?7AYV&c67$}b=3#}n_AB!2?@zwuA8>#qAZsJpCAr8Ta; z-R?B6ZkM@BqvEqXV;NUh61O`;EVk0?Y584Gpe=A;{UUWJm#_G6gcd6-Cjh*0gbace}Iv={IsNfBIL(X$;fmn38k=EIISeZN{;MoBu zeL&k?=v-OIJ}*++nO1z|l<2#C_QN8C-JPFK&vy1${ovbXvl*{wkC3F@T{XAsLfL(G z*gSY%Zyw-}9UQj4Y_jvS<7e?6n|X+rmfqKFHJe{Fo0$K%um9|)-u#OEI7c(G5O&$n zL=IMig16rH}R{o7#TP5e*1 z+i((Wc$2UKrAt5mY!Y08K?2VQuf+b%z!m0v$p9ci;Lkk{V^H{lHWm%fStc*=LiRut zLeW!7FQ+qug7@&C;K>ACXb^_{rQqqb5O@hg-ZOEf9SVCu(_vW^GPS&nmS)~B#wIiRlqlr`<#XCB8r0c5Z&fRlF d)UI9WYu``*LpY+NhHj{`wi#@P(RS_Ae*h=*V{HHc literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/_common.py b/lib/python3.8/site-packages/dateutil/_common.py new file mode 100644 index 0000000..4eb2659 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/_common.py @@ -0,0 +1,43 @@ +""" +Common code used in multiple modules. +""" + + +class weekday(object): + __slots__ = ["weekday", "n"] + + def __init__(self, weekday, n=None): + self.weekday = weekday + self.n = n + + def __call__(self, n): + if n == self.n: + return self + else: + return self.__class__(self.weekday, n) + + def __eq__(self, other): + try: + if self.weekday != other.weekday or self.n != other.n: + return False + except AttributeError: + return False + return True + + def __hash__(self): + return hash(( + self.weekday, + self.n, + )) + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] + if not self.n: + return s + else: + return "%s(%+d)" % (s, self.n) + +# vim:ts=4:sw=4:et diff --git a/lib/python3.8/site-packages/dateutil/_version.py b/lib/python3.8/site-packages/dateutil/_version.py new file mode 100644 index 0000000..eac1209 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/_version.py @@ -0,0 +1,4 @@ +# coding: utf-8 +# file generated by setuptools_scm +# don't change, don't track in version control +version = '2.8.1' diff --git a/lib/python3.8/site-packages/dateutil/easter.py b/lib/python3.8/site-packages/dateutil/easter.py new file mode 100644 index 0000000..53b7c78 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/easter.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +""" +This module offers a generic easter computing method for any given year, using +Western, Orthodox or Julian algorithms. +""" + +import datetime + +__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] + +EASTER_JULIAN = 1 +EASTER_ORTHODOX = 2 +EASTER_WESTERN = 3 + + +def easter(year, method=EASTER_WESTERN): + """ + This method was ported from the work done by GM Arts, + on top of the algorithm by Claus Tondering, which was + based in part on the algorithm of Ouding (1940), as + quoted in "Explanatory Supplement to the Astronomical + Almanac", P. Kenneth Seidelmann, editor. + + This algorithm implements three different easter + calculation methods: + + 1 - Original calculation in Julian calendar, valid in + dates after 326 AD + 2 - Original method, with date converted to Gregorian + calendar, valid in years 1583 to 4099 + 3 - Revised method, in Gregorian calendar, valid in + years 1583 to 4099 as well + + These methods are represented by the constants: + + * ``EASTER_JULIAN = 1`` + * ``EASTER_ORTHODOX = 2`` + * ``EASTER_WESTERN = 3`` + + The default method is method 3. + + More about the algorithm may be found at: + + `GM Arts: Easter Algorithms `_ + + and + + `The Calendar FAQ: Easter `_ + + """ + + if not (1 <= method <= 3): + raise ValueError("invalid method") + + # g - Golden year - 1 + # c - Century + # h - (23 - Epact) mod 30 + # i - Number of days from March 21 to Paschal Full Moon + # j - Weekday for PFM (0=Sunday, etc) + # p - Number of days from March 21 to Sunday on or before PFM + # (-6 to 28 methods 1 & 3, to 56 for method 2) + # e - Extra days to add for method 2 (converting Julian + # date to Gregorian date) + + y = year + g = y % 19 + e = 0 + if method < 3: + # Old method + i = (19*g + 15) % 30 + j = (y + y//4 + i) % 7 + if method == 2: + # Extra dates to convert Julian to Gregorian date + e = 10 + if y > 1600: + e = e + y//100 - 16 - (y//100 - 16)//4 + else: + # New method + c = y//100 + h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 + i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) + j = (y + y//4 + i + 2 - c + c//4) % 7 + + # p can be from -6 to 56 corresponding to dates 22 March to 23 May + # (later dates apply to method 2, although 23 May never actually occurs) + p = i - j + e + d = 1 + (p + 27 + (p + 6)//40) % 31 + m = 3 + (p + 26)//30 + return datetime.date(int(y), int(m), int(d)) diff --git a/lib/python3.8/site-packages/dateutil/parser/__init__.py b/lib/python3.8/site-packages/dateutil/parser/__init__.py new file mode 100644 index 0000000..d174b0e --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/parser/__init__.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +from ._parser import parse, parser, parserinfo, ParserError +from ._parser import DEFAULTPARSER, DEFAULTTZPARSER +from ._parser import UnknownTimezoneWarning + +from ._parser import __doc__ + +from .isoparser import isoparser, isoparse + +__all__ = ['parse', 'parser', 'parserinfo', + 'isoparse', 'isoparser', + 'ParserError', + 'UnknownTimezoneWarning'] + + +### +# Deprecate portions of the private interface so that downstream code that +# is improperly relying on it is given *some* notice. + + +def __deprecated_private_func(f): + from functools import wraps + import warnings + + msg = ('{name} is a private function and may break without warning, ' + 'it will be moved and or renamed in future versions.') + msg = msg.format(name=f.__name__) + + @wraps(f) + def deprecated_func(*args, **kwargs): + warnings.warn(msg, DeprecationWarning) + return f(*args, **kwargs) + + return deprecated_func + +def __deprecate_private_class(c): + import warnings + + msg = ('{name} is a private class and may break without warning, ' + 'it will be moved and or renamed in future versions.') + msg = msg.format(name=c.__name__) + + class private_class(c): + __doc__ = c.__doc__ + + def __init__(self, *args, **kwargs): + warnings.warn(msg, DeprecationWarning) + super(private_class, self).__init__(*args, **kwargs) + + private_class.__name__ = c.__name__ + + return private_class + + +from ._parser import _timelex, _resultbase +from ._parser import _tzparser, _parsetz + +_timelex = __deprecate_private_class(_timelex) +_tzparser = __deprecate_private_class(_tzparser) +_resultbase = __deprecate_private_class(_resultbase) +_parsetz = __deprecated_private_func(_parsetz) diff --git a/lib/python3.8/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d97d60ee4b860c5460c7bea0a920ec96dc21aea5 GIT binary patch literal 2047 zcmb_dOK&4Z5bo}ovBz&aS(e>J!0s;G(jVcD;VhG?D>zb;y$4ZH!KJMeYWZ^kXZWjw5b-uByZ z$L~-g8?t#u{U-1>@HX%k@RqF04)Bgx-zD8!uP6lHwY4)0R3>%FFr}*n50gQvYfo`W zZ7Y?kF4K)C+h081|7!2)<7d0u&va{{?)k+;m+IU5$#Ig7lf5vOlQfZE2Pz4ZLs%(u zF48{d;HDC0>0&eYN@Ng>vXIzFYDn-9l!L?t(#Lq04_cxj^6YaUf|_d6QwsH5(-jN4BuPrx$ce=j4pe$c)a|z!Huqox5lBlua2_q`dPA91#fC8LMEJP15g@ zAeN_In0bLWRN+aGOK&hr`gxcpUXTbc4qkW%N(RT?ILx1?qud)88Q=Fpki#hQ4x|^S zCsG*uRC!9GQ{jaPxXMRLdM8q4;4tf5Qf=d6AH!HaSQyOoZ5Y{YAanL3nbVy9#3-4Q zDVfrjbeCMx9Vo4h+v~L_a;RiKz%Z950BeCd%yj7(Ob)Y4OVfe2;_Ohni;%NR^840i z9uGH%;c#P=41@l$6dU8`Qbrq}eg=6D#}76I)L@i{(PnXio1BM9m~-A6zR)eP*jEaU zWqK1s#@Gp~)5#}*fa~=|IgMR!D@yx8ls)X-FhB=gM^{X}(=^Id101P4Ky+!4syN8C z%Q@ByP-Q7BO=0o|N_UaGhU6X)efM8CN1Ln(gwQ&5na!H4MAvME^3nJo^BMBtCSI&wha3@hwP&&8(RXsX&jNyS_aGbKijktjWhW>dKdA zYC^w0)RpO#l42>Zu>CG5bL$%0ITUG1&e)MPrBn72`Ip zZ{dzr&f`>!B0#IIbN)MfB2@0vgr#viMDH4B<%@U2(7MGW8+oaL>3rhZ{bU z-|8AyG8;wtL6Awj+j%}&-tF87`DCZN2G@TvtNwD&o7)|Ju|(lN)!g$%JXmUmvh4&A;=C<7R KHf=MP;`=A_6#O~> literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c711f3c7abcddabff29b53f6edc2a89d8985eeb0 GIT binary patch literal 40422 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 +- `W3C Date and Time Formats `_ +- `Time Formats (Planetary Rings Node) `_ +- `CPAN ParseDate module + `_ +- `Java SimpleDateFormat Class + `_ +""" +from __future__ import unicode_literals + +import datetime +import re +import string +import time +import warnings + +from calendar import monthrange +from io import StringIO + +import six +from six import integer_types, text_type + +from decimal import Decimal + +from warnings import warn + +from .. import relativedelta +from .. import tz + +__all__ = ["parse", "parserinfo", "ParserError"] + + +# TODO: pandas.core.tools.datetimes imports this explicitly. Might be worth +# making public and/or figuring out if there is something we can +# take off their plate. +class _timelex(object): + # Fractional seconds are sometimes split by a comma + _split_decimal = re.compile("([.,])") + + def __init__(self, instream): + if six.PY2: + # In Python 2, we can't duck type properly because unicode has + # a 'decode' function, and we'd be double-decoding + if isinstance(instream, (bytes, bytearray)): + instream = instream.decode() + else: + if getattr(instream, 'decode', None) is not None: + instream = instream.decode() + + if isinstance(instream, text_type): + instream = StringIO(instream) + elif getattr(instream, 'read', None) is None: + raise TypeError('Parser must be a string or character stream, not ' + '{itype}'.format(itype=instream.__class__.__name__)) + + self.instream = instream + self.charstack = [] + self.tokenstack = [] + self.eof = False + + def get_token(self): + """ + This function breaks the time string into lexical units (tokens), which + can be parsed by the parser. Lexical units are demarcated by changes in + the character set, so any continuous string of letters is considered + one unit, any continuous string of numbers is considered one unit. + + The main complication arises from the fact that dots ('.') can be used + both as separators (e.g. "Sep.20.2009") or decimal points (e.g. + "4:30:21.447"). As such, it is necessary to read the full context of + any dot-separated strings before breaking it into tokens; as such, this + function maintains a "token stack", for when the ambiguous context + demands that multiple tokens be parsed at once. + """ + if self.tokenstack: + return self.tokenstack.pop(0) + + seenletters = False + token = None + state = None + + while not self.eof: + # We only realize that we've reached the end of a token when we + # find a character that's not part of the current token - since + # that character may be part of the next token, it's stored in the + # charstack. + if self.charstack: + nextchar = self.charstack.pop(0) + else: + nextchar = self.instream.read(1) + while nextchar == '\x00': + nextchar = self.instream.read(1) + + if not nextchar: + self.eof = True + break + elif not state: + # First character of the token - determines if we're starting + # to parse a word, a number or something else. + token = nextchar + if self.isword(nextchar): + state = 'a' + elif self.isnum(nextchar): + state = '0' + elif self.isspace(nextchar): + token = ' ' + break # emit token + else: + break # emit token + elif state == 'a': + # If we've already started reading a word, we keep reading + # letters until we find something that's not part of a word. + seenletters = True + if self.isword(nextchar): + token += nextchar + elif nextchar == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0': + # If we've already started reading a number, we keep reading + # numbers until we find something that doesn't fit. + if self.isnum(nextchar): + token += nextchar + elif nextchar == '.' or (nextchar == ',' and len(token) >= 2): + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == 'a.': + # If we've seen some letters and a dot separator, continue + # parsing, and the tokens will be broken up later. + seenletters = True + if nextchar == '.' or self.isword(nextchar): + token += nextchar + elif self.isnum(nextchar) and token[-1] == '.': + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0.': + # If we've seen at least one dot separator, keep going, we'll + # break up the tokens later. + if nextchar == '.' or self.isnum(nextchar): + token += nextchar + elif self.isword(nextchar) and token[-1] == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + + if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or + token[-1] in '.,')): + l = self._split_decimal.split(token) + token = l[0] + for tok in l[1:]: + if tok: + self.tokenstack.append(tok) + + if state == '0.' and token.count('.') == 0: + token = token.replace(',', '.') + + return token + + def __iter__(self): + return self + + def __next__(self): + token = self.get_token() + if token is None: + raise StopIteration + + return token + + def next(self): + return self.__next__() # Python 2.x support + + @classmethod + def split(cls, s): + return list(cls(s)) + + @classmethod + def isword(cls, nextchar): + """ Whether or not the next character is part of a word """ + return nextchar.isalpha() + + @classmethod + def isnum(cls, nextchar): + """ Whether the next character is part of a number """ + return nextchar.isdigit() + + @classmethod + def isspace(cls, nextchar): + """ Whether the next character is whitespace """ + return nextchar.isspace() + + +class _resultbase(object): + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def _repr(self, classname): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, repr(value))) + return "%s(%s)" % (classname, ", ".join(l)) + + def __len__(self): + return (sum(getattr(self, attr) is not None + for attr in self.__slots__)) + + def __repr__(self): + return self._repr(self.__class__.__name__) + + +class parserinfo(object): + """ + Class which handles what inputs are accepted. Subclass this to customize + the language and acceptable values for each parameter. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM + and YMD. Default is ``False``. + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken + to be the year, otherwise the last number is taken to be the year. + Default is ``False``. + """ + + # m from a.m/p.m, t from ISO T separator + JUMP = [" ", ".", ",", ";", "-", "/", "'", + "at", "on", "and", "ad", "m", "t", "of", + "st", "nd", "rd", "th"] + + WEEKDAYS = [("Mon", "Monday"), + ("Tue", "Tuesday"), # TODO: "Tues" + ("Wed", "Wednesday"), + ("Thu", "Thursday"), # TODO: "Thurs" + ("Fri", "Friday"), + ("Sat", "Saturday"), + ("Sun", "Sunday")] + MONTHS = [("Jan", "January"), + ("Feb", "February"), # TODO: "Febr" + ("Mar", "March"), + ("Apr", "April"), + ("May", "May"), + ("Jun", "June"), + ("Jul", "July"), + ("Aug", "August"), + ("Sep", "Sept", "September"), + ("Oct", "October"), + ("Nov", "November"), + ("Dec", "December")] + HMS = [("h", "hour", "hours"), + ("m", "minute", "minutes"), + ("s", "second", "seconds")] + AMPM = [("am", "a"), + ("pm", "p")] + UTCZONE = ["UTC", "GMT", "Z", "z"] + PERTAIN = ["of"] + TZOFFSET = {} + # TODO: ERA = ["AD", "BC", "CE", "BCE", "Stardate", + # "Anno Domini", "Year of Our Lord"] + + def __init__(self, dayfirst=False, yearfirst=False): + self._jump = self._convert(self.JUMP) + self._weekdays = self._convert(self.WEEKDAYS) + self._months = self._convert(self.MONTHS) + self._hms = self._convert(self.HMS) + self._ampm = self._convert(self.AMPM) + self._utczone = self._convert(self.UTCZONE) + self._pertain = self._convert(self.PERTAIN) + + self.dayfirst = dayfirst + self.yearfirst = yearfirst + + self._year = time.localtime().tm_year + self._century = self._year // 100 * 100 + + def _convert(self, lst): + dct = {} + for i, v in enumerate(lst): + if isinstance(v, tuple): + for v in v: + dct[v.lower()] = i + else: + dct[v.lower()] = i + return dct + + def jump(self, name): + return name.lower() in self._jump + + def weekday(self, name): + try: + return self._weekdays[name.lower()] + except KeyError: + pass + return None + + def month(self, name): + try: + return self._months[name.lower()] + 1 + except KeyError: + pass + return None + + def hms(self, name): + try: + return self._hms[name.lower()] + except KeyError: + return None + + def ampm(self, name): + try: + return self._ampm[name.lower()] + except KeyError: + return None + + def pertain(self, name): + return name.lower() in self._pertain + + def utczone(self, name): + return name.lower() in self._utczone + + def tzoffset(self, name): + if name in self._utczone: + return 0 + + return self.TZOFFSET.get(name) + + def convertyear(self, year, century_specified=False): + """ + Converts two-digit years to year within [-50, 49] + range of self._year (current local time) + """ + + # Function contract is that the year is always positive + assert year >= 0 + + if year < 100 and not century_specified: + # assume current century to start + year += self._century + + if year >= self._year + 50: # if too far in future + year -= 100 + elif year < self._year - 50: # if too far in past + year += 100 + + return year + + def validate(self, res): + # move to info + if res.year is not None: + res.year = self.convertyear(res.year, res.century_specified) + + if ((res.tzoffset == 0 and not res.tzname) or + (res.tzname == 'Z' or res.tzname == 'z')): + res.tzname = "UTC" + res.tzoffset = 0 + elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): + res.tzoffset = 0 + return True + + +class _ymd(list): + def __init__(self, *args, **kwargs): + super(self.__class__, self).__init__(*args, **kwargs) + self.century_specified = False + self.dstridx = None + self.mstridx = None + self.ystridx = None + + @property + def has_year(self): + return self.ystridx is not None + + @property + def has_month(self): + return self.mstridx is not None + + @property + def has_day(self): + return self.dstridx is not None + + def could_be_day(self, value): + if self.has_day: + return False + elif not self.has_month: + return 1 <= value <= 31 + elif not self.has_year: + # Be permissive, assume leap year + month = self[self.mstridx] + return 1 <= value <= monthrange(2000, month)[1] + else: + month = self[self.mstridx] + year = self[self.ystridx] + return 1 <= value <= monthrange(year, month)[1] + + def append(self, val, label=None): + if hasattr(val, '__len__'): + if val.isdigit() and len(val) > 2: + self.century_specified = True + if label not in [None, 'Y']: # pragma: no cover + raise ValueError(label) + label = 'Y' + elif val > 100: + self.century_specified = True + if label not in [None, 'Y']: # pragma: no cover + raise ValueError(label) + label = 'Y' + + super(self.__class__, self).append(int(val)) + + if label == 'M': + if self.has_month: + raise ValueError('Month is already set') + self.mstridx = len(self) - 1 + elif label == 'D': + if self.has_day: + raise ValueError('Day is already set') + self.dstridx = len(self) - 1 + elif label == 'Y': + if self.has_year: + raise ValueError('Year is already set') + self.ystridx = len(self) - 1 + + def _resolve_from_stridxs(self, strids): + """ + Try to resolve the identities of year/month/day elements using + ystridx, mstridx, and dstridx, if enough of these are specified. + """ + if len(self) == 3 and len(strids) == 2: + # we can back out the remaining stridx value + missing = [x for x in range(3) if x not in strids.values()] + key = [x for x in ['y', 'm', 'd'] if x not in strids] + assert len(missing) == len(key) == 1 + key = key[0] + val = missing[0] + strids[key] = val + + assert len(self) == len(strids) # otherwise this should not be called + out = {key: self[strids[key]] for key in strids} + return (out.get('y'), out.get('m'), out.get('d')) + + def resolve_ymd(self, yearfirst, dayfirst): + len_ymd = len(self) + year, month, day = (None, None, None) + + strids = (('y', self.ystridx), + ('m', self.mstridx), + ('d', self.dstridx)) + + strids = {key: val for key, val in strids if val is not None} + if (len(self) == len(strids) > 0 or + (len(self) == 3 and len(strids) == 2)): + return self._resolve_from_stridxs(strids) + + mstridx = self.mstridx + + if len_ymd > 3: + raise ValueError("More than three YMD values") + elif len_ymd == 1 or (mstridx is not None and len_ymd == 2): + # One member, or two members with a month string + if mstridx is not None: + month = self[mstridx] + # since mstridx is 0 or 1, self[mstridx-1] always + # looks up the other element + other = self[mstridx - 1] + else: + other = self[0] + + if len_ymd > 1 or mstridx is None: + if other > 31: + year = other + else: + day = other + + elif len_ymd == 2: + # Two members with numbers + if self[0] > 31: + # 99-01 + year, month = self + elif self[1] > 31: + # 01-99 + month, year = self + elif dayfirst and self[1] <= 12: + # 13-01 + day, month = self + else: + # 01-13 + month, day = self + + elif len_ymd == 3: + # Three members + if mstridx == 0: + if self[1] > 31: + # Apr-2003-25 + month, year, day = self + else: + month, day, year = self + elif mstridx == 1: + if self[0] > 31 or (yearfirst and self[2] <= 31): + # 99-Jan-01 + year, month, day = self + else: + # 01-Jan-01 + # Give precedence to day-first, since + # two-digit years is usually hand-written. + day, month, year = self + + elif mstridx == 2: + # WTF!? + if self[1] > 31: + # 01-99-Jan + day, year, month = self + else: + # 99-01-Jan + year, day, month = self + + else: + if (self[0] > 31 or + self.ystridx == 0 or + (yearfirst and self[1] <= 12 and self[2] <= 31)): + # 99-01-01 + if dayfirst and self[2] <= 12: + year, day, month = self + else: + year, month, day = self + elif self[0] > 12 or (dayfirst and self[1] <= 12): + # 13-01-01 + day, month, year = self + else: + # 01-13-01 + month, day, year = self + + return year, month, day + + +class parser(object): + def __init__(self, info=None): + self.info = info or parserinfo() + + def parse(self, timestr, default=None, + ignoretz=False, tzinfos=None, **kwargs): + """ + Parse the date/time string into a :class:`datetime.datetime` object. + + :param timestr: + Any date/time string using the supported formats. + + :param default: + The default datetime object, if this is a datetime object and not + ``None``, elements specified in ``timestr`` replace elements in the + default object. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a + naive :class:`datetime.datetime` object is returned. + + :param tzinfos: + Additional time zone names / aliases which may be present in the + string. This argument maps time zone names (and optionally offsets + from those time zones) to time zones. This parameter can be a + dictionary with timezone aliases mapping time zone names to time + zones or a function taking two parameters (``tzname`` and + ``tzoffset``) and returning a time zone. + + The timezones to which the names are mapped can be an integer + offset from UTC in seconds or a :class:`tzinfo` object. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from dateutil.parser import parse + >>> from dateutil.tz import gettz + >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} + >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) + >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, + tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) + + This parameter is ignored if ``ignoretz`` is set. + + :param \\*\\*kwargs: + Keyword arguments as passed to ``_parse()``. + + :return: + Returns a :class:`datetime.datetime` object or, if the + ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the + first element being a :class:`datetime.datetime` object, the second + a tuple containing the fuzzy tokens. + + :raises ParserError: + Raised for invalid or unknown string format, if the provided + :class:`tzinfo` is not in a valid format, or if an invalid date + would be created. + + :raises TypeError: + Raised for non-string or character stream input. + + :raises OverflowError: + Raised if the parsed date exceeds the largest valid C integer on + your system. + """ + + if default is None: + default = datetime.datetime.now().replace(hour=0, minute=0, + second=0, microsecond=0) + + res, skipped_tokens = self._parse(timestr, **kwargs) + + if res is None: + raise ParserError("Unknown string format: %s", timestr) + + if len(res) == 0: + raise ParserError("String does not contain a date: %s", timestr) + + try: + ret = self._build_naive(res, default) + except ValueError as e: + six.raise_from(ParserError(e.args[0] + ": %s", timestr), e) + + if not ignoretz: + ret = self._build_tzaware(ret, res, tzinfos) + + if kwargs.get('fuzzy_with_tokens', False): + return ret, skipped_tokens + else: + return ret + + class _result(_resultbase): + __slots__ = ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond", + "tzname", "tzoffset", "ampm","any_unused_tokens"] + + def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, + fuzzy_with_tokens=False): + """ + Private method which performs the heavy lifting of parsing, called from + ``parse()``, which passes on its ``kwargs`` to this function. + + :param timestr: + The string to parse. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM + and YMD. If set to ``None``, this value is retrieved from the + current :class:`parserinfo` object (which itself defaults to + ``False``). + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken + to be the year, otherwise the last number is taken to be the year. + If this is set to ``None``, the value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param fuzzy: + Whether to allow fuzzy parsing, allowing for string like "Today is + January 1, 2047 at 8:21:00AM". + + :param fuzzy_with_tokens: + If ``True``, ``fuzzy`` is automatically set to True, and the parser + will return a tuple where the first element is the parsed + :class:`datetime.datetime` datetimestamp and the second element is + a tuple containing the portions of the string which were ignored: + + .. doctest:: + + >>> from dateutil.parser import parse + >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) + (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) + + """ + if fuzzy_with_tokens: + fuzzy = True + + info = self.info + + if dayfirst is None: + dayfirst = info.dayfirst + + if yearfirst is None: + yearfirst = info.yearfirst + + res = self._result() + l = _timelex.split(timestr) # Splits the timestr into tokens + + skipped_idxs = [] + + # year/month/day list + ymd = _ymd() + + len_l = len(l) + i = 0 + try: + while i < len_l: + + # Check if it's a number + value_repr = l[i] + try: + value = float(value_repr) + except ValueError: + value = None + + if value is not None: + # Numeric token + i = self._parse_numeric_token(l, i, info, ymd, res, fuzzy) + + # Check weekday + elif info.weekday(l[i]) is not None: + value = info.weekday(l[i]) + res.weekday = value + + # Check month name + elif info.month(l[i]) is not None: + value = info.month(l[i]) + ymd.append(value, 'M') + + if i + 1 < len_l: + if l[i + 1] in ('-', '/'): + # Jan-01[-99] + sep = l[i + 1] + ymd.append(l[i + 2]) + + if i + 3 < len_l and l[i + 3] == sep: + # Jan-01-99 + ymd.append(l[i + 4]) + i += 2 + + i += 2 + + elif (i + 4 < len_l and l[i + 1] == l[i + 3] == ' ' and + info.pertain(l[i + 2])): + # Jan of 01 + # In this case, 01 is clearly year + if l[i + 4].isdigit(): + # Convert it here to become unambiguous + value = int(l[i + 4]) + year = str(info.convertyear(value)) + ymd.append(year, 'Y') + else: + # Wrong guess + pass + # TODO: not hit in tests + i += 4 + + # Check am/pm + elif info.ampm(l[i]) is not None: + value = info.ampm(l[i]) + val_is_ampm = self._ampm_valid(res.hour, res.ampm, fuzzy) + + if val_is_ampm: + res.hour = self._adjust_ampm(res.hour, value) + res.ampm = value + + elif fuzzy: + skipped_idxs.append(i) + + # Check for a timezone name + elif self._could_be_tzname(res.hour, res.tzname, res.tzoffset, l[i]): + res.tzname = l[i] + res.tzoffset = info.tzoffset(res.tzname) + + # Check for something like GMT+3, or BRST+3. Notice + # that it doesn't mean "I am 3 hours after GMT", but + # "my time +3 is GMT". If found, we reverse the + # logic so that timezone parsing code will get it + # right. + if i + 1 < len_l and l[i + 1] in ('+', '-'): + l[i + 1] = ('+', '-')[l[i + 1] == '+'] + res.tzoffset = None + if info.utczone(res.tzname): + # With something like GMT+3, the timezone + # is *not* GMT. + res.tzname = None + + # Check for a numbered timezone + elif res.hour is not None and l[i] in ('+', '-'): + signal = (-1, 1)[l[i] == '+'] + len_li = len(l[i + 1]) + + # TODO: check that l[i + 1] is integer? + if len_li == 4: + # -0300 + hour_offset = int(l[i + 1][:2]) + min_offset = int(l[i + 1][2:]) + elif i + 2 < len_l and l[i + 2] == ':': + # -03:00 + hour_offset = int(l[i + 1]) + min_offset = int(l[i + 3]) # TODO: Check that l[i+3] is minute-like? + i += 2 + elif len_li <= 2: + # -[0]3 + hour_offset = int(l[i + 1][:2]) + min_offset = 0 + else: + raise ValueError(timestr) + + res.tzoffset = signal * (hour_offset * 3600 + min_offset * 60) + + # Look for a timezone name between parenthesis + if (i + 5 < len_l and + info.jump(l[i + 2]) and l[i + 3] == '(' and + l[i + 5] == ')' and + 3 <= len(l[i + 4]) and + self._could_be_tzname(res.hour, res.tzname, + None, l[i + 4])): + # -0300 (BRST) + res.tzname = l[i + 4] + i += 4 + + i += 1 + + # Check jumps + elif not (info.jump(l[i]) or fuzzy): + raise ValueError(timestr) + + else: + skipped_idxs.append(i) + i += 1 + + # Process year/month/day + year, month, day = ymd.resolve_ymd(yearfirst, dayfirst) + + res.century_specified = ymd.century_specified + res.year = year + res.month = month + res.day = day + + except (IndexError, ValueError): + return None, None + + if not info.validate(res): + return None, None + + if fuzzy_with_tokens: + skipped_tokens = self._recombine_skipped(l, skipped_idxs) + return res, tuple(skipped_tokens) + else: + return res, None + + def _parse_numeric_token(self, tokens, idx, info, ymd, res, fuzzy): + # Token is a number + value_repr = tokens[idx] + try: + value = self._to_decimal(value_repr) + except Exception as e: + six.raise_from(ValueError('Unknown numeric token'), e) + + len_li = len(value_repr) + + len_l = len(tokens) + + if (len(ymd) == 3 and len_li in (2, 4) and + res.hour is None and + (idx + 1 >= len_l or + (tokens[idx + 1] != ':' and + info.hms(tokens[idx + 1]) is None))): + # 19990101T23[59] + s = tokens[idx] + res.hour = int(s[:2]) + + if len_li == 4: + res.minute = int(s[2:]) + + elif len_li == 6 or (len_li > 6 and tokens[idx].find('.') == 6): + # YYMMDD or HHMMSS[.ss] + s = tokens[idx] + + if not ymd and '.' not in tokens[idx]: + ymd.append(s[:2]) + ymd.append(s[2:4]) + ymd.append(s[4:]) + else: + # 19990101T235959[.59] + + # TODO: Check if res attributes already set. + res.hour = int(s[:2]) + res.minute = int(s[2:4]) + res.second, res.microsecond = self._parsems(s[4:]) + + elif len_li in (8, 12, 14): + # YYYYMMDD + s = tokens[idx] + ymd.append(s[:4], 'Y') + ymd.append(s[4:6]) + ymd.append(s[6:8]) + + if len_li > 8: + res.hour = int(s[8:10]) + res.minute = int(s[10:12]) + + if len_li > 12: + res.second = int(s[12:]) + + elif self._find_hms_idx(idx, tokens, info, allow_jump=True) is not None: + # HH[ ]h or MM[ ]m or SS[.ss][ ]s + hms_idx = self._find_hms_idx(idx, tokens, info, allow_jump=True) + (idx, hms) = self._parse_hms(idx, tokens, info, hms_idx) + if hms is not None: + # TODO: checking that hour/minute/second are not + # already set? + self._assign_hms(res, value_repr, hms) + + elif idx + 2 < len_l and tokens[idx + 1] == ':': + # HH:MM[:SS[.ss]] + res.hour = int(value) + value = self._to_decimal(tokens[idx + 2]) # TODO: try/except for this? + (res.minute, res.second) = self._parse_min_sec(value) + + if idx + 4 < len_l and tokens[idx + 3] == ':': + res.second, res.microsecond = self._parsems(tokens[idx + 4]) + + idx += 2 + + idx += 2 + + elif idx + 1 < len_l and tokens[idx + 1] in ('-', '/', '.'): + sep = tokens[idx + 1] + ymd.append(value_repr) + + if idx + 2 < len_l and not info.jump(tokens[idx + 2]): + if tokens[idx + 2].isdigit(): + # 01-01[-01] + ymd.append(tokens[idx + 2]) + else: + # 01-Jan[-01] + value = info.month(tokens[idx + 2]) + + if value is not None: + ymd.append(value, 'M') + else: + raise ValueError() + + if idx + 3 < len_l and tokens[idx + 3] == sep: + # We have three members + value = info.month(tokens[idx + 4]) + + if value is not None: + ymd.append(value, 'M') + else: + ymd.append(tokens[idx + 4]) + idx += 2 + + idx += 1 + idx += 1 + + elif idx + 1 >= len_l or info.jump(tokens[idx + 1]): + if idx + 2 < len_l and info.ampm(tokens[idx + 2]) is not None: + # 12 am + hour = int(value) + res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 2])) + idx += 1 + else: + # Year, month or day + ymd.append(value) + idx += 1 + + elif info.ampm(tokens[idx + 1]) is not None and (0 <= value < 24): + # 12am + hour = int(value) + res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 1])) + idx += 1 + + elif ymd.could_be_day(value): + ymd.append(value) + + elif not fuzzy: + raise ValueError() + + return idx + + def _find_hms_idx(self, idx, tokens, info, allow_jump): + len_l = len(tokens) + + if idx+1 < len_l and info.hms(tokens[idx+1]) is not None: + # There is an "h", "m", or "s" label following this token. We take + # assign the upcoming label to the current token. + # e.g. the "12" in 12h" + hms_idx = idx + 1 + + elif (allow_jump and idx+2 < len_l and tokens[idx+1] == ' ' and + info.hms(tokens[idx+2]) is not None): + # There is a space and then an "h", "m", or "s" label. + # e.g. the "12" in "12 h" + hms_idx = idx + 2 + + elif idx > 0 and info.hms(tokens[idx-1]) is not None: + # There is a "h", "m", or "s" preceding this token. Since neither + # of the previous cases was hit, there is no label following this + # token, so we use the previous label. + # e.g. the "04" in "12h04" + hms_idx = idx-1 + + elif (1 < idx == len_l-1 and tokens[idx-1] == ' ' and + info.hms(tokens[idx-2]) is not None): + # If we are looking at the final token, we allow for a + # backward-looking check to skip over a space. + # TODO: Are we sure this is the right condition here? + hms_idx = idx - 2 + + else: + hms_idx = None + + return hms_idx + + def _assign_hms(self, res, value_repr, hms): + # See GH issue #427, fixing float rounding + value = self._to_decimal(value_repr) + + if hms == 0: + # Hour + res.hour = int(value) + if value % 1: + res.minute = int(60*(value % 1)) + + elif hms == 1: + (res.minute, res.second) = self._parse_min_sec(value) + + elif hms == 2: + (res.second, res.microsecond) = self._parsems(value_repr) + + def _could_be_tzname(self, hour, tzname, tzoffset, token): + return (hour is not None and + tzname is None and + tzoffset is None and + len(token) <= 5 and + (all(x in string.ascii_uppercase for x in token) + or token in self.info.UTCZONE)) + + def _ampm_valid(self, hour, ampm, fuzzy): + """ + For fuzzy parsing, 'a' or 'am' (both valid English words) + may erroneously trigger the AM/PM flag. Deal with that + here. + """ + val_is_ampm = True + + # If there's already an AM/PM flag, this one isn't one. + if fuzzy and ampm is not None: + val_is_ampm = False + + # If AM/PM is found and hour is not, raise a ValueError + if hour is None: + if fuzzy: + val_is_ampm = False + else: + raise ValueError('No hour specified with AM or PM flag.') + elif not 0 <= hour <= 12: + # If AM/PM is found, it's a 12 hour clock, so raise + # an error for invalid range + if fuzzy: + val_is_ampm = False + else: + raise ValueError('Invalid hour specified for 12-hour clock.') + + return val_is_ampm + + def _adjust_ampm(self, hour, ampm): + if hour < 12 and ampm == 1: + hour += 12 + elif hour == 12 and ampm == 0: + hour = 0 + return hour + + def _parse_min_sec(self, value): + # TODO: Every usage of this function sets res.second to the return + # value. Are there any cases where second will be returned as None and + # we *don't* want to set res.second = None? + minute = int(value) + second = None + + sec_remainder = value % 1 + if sec_remainder: + second = int(60 * sec_remainder) + return (minute, second) + + def _parse_hms(self, idx, tokens, info, hms_idx): + # TODO: Is this going to admit a lot of false-positives for when we + # just happen to have digits and "h", "m" or "s" characters in non-date + # text? I guess hex hashes won't have that problem, but there's plenty + # of random junk out there. + if hms_idx is None: + hms = None + new_idx = idx + elif hms_idx > idx: + hms = info.hms(tokens[hms_idx]) + new_idx = hms_idx + else: + # Looking backwards, increment one. + hms = info.hms(tokens[hms_idx]) + 1 + new_idx = idx + + return (new_idx, hms) + + # ------------------------------------------------------------------ + # Handling for individual tokens. These are kept as methods instead + # of functions for the sake of customizability via subclassing. + + def _parsems(self, value): + """Parse a I[.F] seconds value into (seconds, microseconds).""" + if "." not in value: + return int(value), 0 + else: + i, f = value.split(".") + return int(i), int(f.ljust(6, "0")[:6]) + + def _to_decimal(self, val): + try: + decimal_value = Decimal(val) + # See GH 662, edge case, infinite value should not be converted + # via `_to_decimal` + if not decimal_value.is_finite(): + raise ValueError("Converted decimal value is infinite or NaN") + except Exception as e: + msg = "Could not convert %s to decimal" % val + six.raise_from(ValueError(msg), e) + else: + return decimal_value + + # ------------------------------------------------------------------ + # Post-Parsing construction of datetime output. These are kept as + # methods instead of functions for the sake of customizability via + # subclassing. + + def _build_tzinfo(self, tzinfos, tzname, tzoffset): + if callable(tzinfos): + tzdata = tzinfos(tzname, tzoffset) + else: + tzdata = tzinfos.get(tzname) + # handle case where tzinfo is paased an options that returns None + # eg tzinfos = {'BRST' : None} + if isinstance(tzdata, datetime.tzinfo) or tzdata is None: + tzinfo = tzdata + elif isinstance(tzdata, text_type): + tzinfo = tz.tzstr(tzdata) + elif isinstance(tzdata, integer_types): + tzinfo = tz.tzoffset(tzname, tzdata) + else: + raise TypeError("Offset must be tzinfo subclass, tz string, " + "or int offset.") + return tzinfo + + def _build_tzaware(self, naive, res, tzinfos): + if (callable(tzinfos) or (tzinfos and res.tzname in tzinfos)): + tzinfo = self._build_tzinfo(tzinfos, res.tzname, res.tzoffset) + aware = naive.replace(tzinfo=tzinfo) + aware = self._assign_tzname(aware, res.tzname) + + elif res.tzname and res.tzname in time.tzname: + aware = naive.replace(tzinfo=tz.tzlocal()) + + # Handle ambiguous local datetime + aware = self._assign_tzname(aware, res.tzname) + + # This is mostly relevant for winter GMT zones parsed in the UK + if (aware.tzname() != res.tzname and + res.tzname in self.info.UTCZONE): + aware = aware.replace(tzinfo=tz.UTC) + + elif res.tzoffset == 0: + aware = naive.replace(tzinfo=tz.UTC) + + elif res.tzoffset: + aware = naive.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) + + elif not res.tzname and not res.tzoffset: + # i.e. no timezone information was found. + aware = naive + + elif res.tzname: + # tz-like string was parsed but we don't know what to do + # with it + warnings.warn("tzname {tzname} identified but not understood. " + "Pass `tzinfos` argument in order to correctly " + "return a timezone-aware datetime. In a future " + "version, this will raise an " + "exception.".format(tzname=res.tzname), + category=UnknownTimezoneWarning) + aware = naive + + return aware + + def _build_naive(self, res, default): + repl = {} + for attr in ("year", "month", "day", "hour", + "minute", "second", "microsecond"): + value = getattr(res, attr) + if value is not None: + repl[attr] = value + + if 'day' not in repl: + # If the default day exceeds the last day of the month, fall back + # to the end of the month. + cyear = default.year if res.year is None else res.year + cmonth = default.month if res.month is None else res.month + cday = default.day if res.day is None else res.day + + if cday > monthrange(cyear, cmonth)[1]: + repl['day'] = monthrange(cyear, cmonth)[1] + + naive = default.replace(**repl) + + if res.weekday is not None and not res.day: + naive = naive + relativedelta.relativedelta(weekday=res.weekday) + + return naive + + def _assign_tzname(self, dt, tzname): + if dt.tzname() != tzname: + new_dt = tz.enfold(dt, fold=1) + if new_dt.tzname() == tzname: + return new_dt + + return dt + + def _recombine_skipped(self, tokens, skipped_idxs): + """ + >>> tokens = ["foo", " ", "bar", " ", "19June2000", "baz"] + >>> skipped_idxs = [0, 1, 2, 5] + >>> _recombine_skipped(tokens, skipped_idxs) + ["foo bar", "baz"] + """ + skipped_tokens = [] + for i, idx in enumerate(sorted(skipped_idxs)): + if i > 0 and idx - 1 == skipped_idxs[i - 1]: + skipped_tokens[-1] = skipped_tokens[-1] + tokens[idx] + else: + skipped_tokens.append(tokens[idx]) + + return skipped_tokens + + +DEFAULTPARSER = parser() + + +def parse(timestr, parserinfo=None, **kwargs): + """ + + Parse a string in one of the supported formats, using the + ``parserinfo`` parameters. + + :param timestr: + A string containing a date/time stamp. + + :param parserinfo: + A :class:`parserinfo` object containing parameters for the parser. + If ``None``, the default arguments to the :class:`parserinfo` + constructor are used. + + The ``**kwargs`` parameter takes the following keyword arguments: + + :param default: + The default datetime object, if this is a datetime object and not + ``None``, elements specified in ``timestr`` replace elements in the + default object. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a naive + :class:`datetime` object is returned. + + :param tzinfos: + Additional time zone names / aliases which may be present in the + string. This argument maps time zone names (and optionally offsets + from those time zones) to time zones. This parameter can be a + dictionary with timezone aliases mapping time zone names to time + zones or a function taking two parameters (``tzname`` and + ``tzoffset``) and returning a time zone. + + The timezones to which the names are mapped can be an integer + offset from UTC in seconds or a :class:`tzinfo` object. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from dateutil.parser import parse + >>> from dateutil.tz import gettz + >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} + >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) + >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, + tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) + + This parameter is ignored if ``ignoretz`` is set. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM and + YMD. If set to ``None``, this value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken to + be the year, otherwise the last number is taken to be the year. If + this is set to ``None``, the value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param fuzzy: + Whether to allow fuzzy parsing, allowing for string like "Today is + January 1, 2047 at 8:21:00AM". + + :param fuzzy_with_tokens: + If ``True``, ``fuzzy`` is automatically set to True, and the parser + will return a tuple where the first element is the parsed + :class:`datetime.datetime` datetimestamp and the second element is + a tuple containing the portions of the string which were ignored: + + .. doctest:: + + >>> from dateutil.parser import parse + >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) + (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) + + :return: + Returns a :class:`datetime.datetime` object or, if the + ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the + first element being a :class:`datetime.datetime` object, the second + a tuple containing the fuzzy tokens. + + :raises ValueError: + Raised for invalid or unknown string format, if the provided + :class:`tzinfo` is not in a valid format, or if an invalid date + would be created. + + :raises OverflowError: + Raised if the parsed date exceeds the largest valid C integer on + your system. + """ + if parserinfo: + return parser(parserinfo).parse(timestr, **kwargs) + else: + return DEFAULTPARSER.parse(timestr, **kwargs) + + +class _tzparser(object): + + class _result(_resultbase): + + __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", + "start", "end"] + + class _attr(_resultbase): + __slots__ = ["month", "week", "weekday", + "yday", "jyday", "day", "time"] + + def __repr__(self): + return self._repr("") + + def __init__(self): + _resultbase.__init__(self) + self.start = self._attr() + self.end = self._attr() + + def parse(self, tzstr): + res = self._result() + l = [x for x in re.split(r'([,:.]|[a-zA-Z]+|[0-9]+)',tzstr) if x] + used_idxs = list() + try: + + len_l = len(l) + + i = 0 + while i < len_l: + # BRST+3[BRDT[+2]] + j = i + while j < len_l and not [x for x in l[j] + if x in "0123456789:,-+"]: + j += 1 + if j != i: + if not res.stdabbr: + offattr = "stdoffset" + res.stdabbr = "".join(l[i:j]) + else: + offattr = "dstoffset" + res.dstabbr = "".join(l[i:j]) + + for ii in range(j): + used_idxs.append(ii) + i = j + if (i < len_l and (l[i] in ('+', '-') or l[i][0] in + "0123456789")): + if l[i] in ('+', '-'): + # Yes, that's right. See the TZ variable + # documentation. + signal = (1, -1)[l[i] == '+'] + used_idxs.append(i) + i += 1 + else: + signal = -1 + len_li = len(l[i]) + if len_li == 4: + # -0300 + setattr(res, offattr, (int(l[i][:2]) * 3600 + + int(l[i][2:]) * 60) * signal) + elif i + 1 < len_l and l[i + 1] == ':': + # -03:00 + setattr(res, offattr, + (int(l[i]) * 3600 + + int(l[i + 2]) * 60) * signal) + used_idxs.append(i) + i += 2 + elif len_li <= 2: + # -[0]3 + setattr(res, offattr, + int(l[i][:2]) * 3600 * signal) + else: + return None + used_idxs.append(i) + i += 1 + if res.dstabbr: + break + else: + break + + + if i < len_l: + for j in range(i, len_l): + if l[j] == ';': + l[j] = ',' + + assert l[i] == ',' + + i += 1 + + if i >= len_l: + pass + elif (8 <= l.count(',') <= 9 and + not [y for x in l[i:] if x != ',' + for y in x if y not in "0123456789+-"]): + # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] + for x in (res.start, res.end): + x.month = int(l[i]) + used_idxs.append(i) + i += 2 + if l[i] == '-': + value = int(l[i + 1]) * -1 + used_idxs.append(i) + i += 1 + else: + value = int(l[i]) + used_idxs.append(i) + i += 2 + if value: + x.week = value + x.weekday = (int(l[i]) - 1) % 7 + else: + x.day = int(l[i]) + used_idxs.append(i) + i += 2 + x.time = int(l[i]) + used_idxs.append(i) + i += 2 + if i < len_l: + if l[i] in ('-', '+'): + signal = (-1, 1)[l[i] == "+"] + used_idxs.append(i) + i += 1 + else: + signal = 1 + used_idxs.append(i) + res.dstoffset = (res.stdoffset + int(l[i]) * signal) + + # This was a made-up format that is not in normal use + warn(('Parsed time zone "%s"' % tzstr) + + 'is in a non-standard dateutil-specific format, which ' + + 'is now deprecated; support for parsing this format ' + + 'will be removed in future versions. It is recommended ' + + 'that you switch to a standard format like the GNU ' + + 'TZ variable format.', tz.DeprecatedTzFormatWarning) + elif (l.count(',') == 2 and l[i:].count('/') <= 2 and + not [y for x in l[i:] if x not in (',', '/', 'J', 'M', + '.', '-', ':') + for y in x if y not in "0123456789"]): + for x in (res.start, res.end): + if l[i] == 'J': + # non-leap year day (1 based) + used_idxs.append(i) + i += 1 + x.jyday = int(l[i]) + elif l[i] == 'M': + # month[-.]week[-.]weekday + used_idxs.append(i) + i += 1 + x.month = int(l[i]) + used_idxs.append(i) + i += 1 + assert l[i] in ('-', '.') + used_idxs.append(i) + i += 1 + x.week = int(l[i]) + if x.week == 5: + x.week = -1 + used_idxs.append(i) + i += 1 + assert l[i] in ('-', '.') + used_idxs.append(i) + i += 1 + x.weekday = (int(l[i]) - 1) % 7 + else: + # year day (zero based) + x.yday = int(l[i]) + 1 + + used_idxs.append(i) + i += 1 + + if i < len_l and l[i] == '/': + used_idxs.append(i) + i += 1 + # start time + len_li = len(l[i]) + if len_li == 4: + # -0300 + x.time = (int(l[i][:2]) * 3600 + + int(l[i][2:]) * 60) + elif i + 1 < len_l and l[i + 1] == ':': + # -03:00 + x.time = int(l[i]) * 3600 + int(l[i + 2]) * 60 + used_idxs.append(i) + i += 2 + if i + 1 < len_l and l[i + 1] == ':': + used_idxs.append(i) + i += 2 + x.time += int(l[i]) + elif len_li <= 2: + # -[0]3 + x.time = (int(l[i][:2]) * 3600) + else: + return None + used_idxs.append(i) + i += 1 + + assert i == len_l or l[i] == ',' + + i += 1 + + assert i >= len_l + + except (IndexError, ValueError, AssertionError): + return None + + unused_idxs = set(range(len_l)).difference(used_idxs) + res.any_unused_tokens = not {l[n] for n in unused_idxs}.issubset({",",":"}) + return res + + +DEFAULTTZPARSER = _tzparser() + + +def _parsetz(tzstr): + return DEFAULTTZPARSER.parse(tzstr) + + +class ParserError(ValueError): + """Error class for representing failure to parse a datetime string.""" + def __str__(self): + try: + return self.args[0] % self.args[1:] + except (TypeError, IndexError): + return super(ParserError, self).__str__() + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, str(self)) + + +class UnknownTimezoneWarning(RuntimeWarning): + """Raised when the parser finds a timezone it cannot parse into a tzinfo""" +# vim:ts=4:sw=4:et diff --git a/lib/python3.8/site-packages/dateutil/parser/isoparser.py b/lib/python3.8/site-packages/dateutil/parser/isoparser.py new file mode 100644 index 0000000..48f86a3 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/parser/isoparser.py @@ -0,0 +1,411 @@ +# -*- coding: utf-8 -*- +""" +This module offers a parser for ISO-8601 strings + +It is intended to support all valid date, time and datetime formats per the +ISO-8601 specification. + +..versionadded:: 2.7.0 +""" +from datetime import datetime, timedelta, time, date +import calendar +from dateutil import tz + +from functools import wraps + +import re +import six + +__all__ = ["isoparse", "isoparser"] + + +def _takes_ascii(f): + @wraps(f) + def func(self, str_in, *args, **kwargs): + # If it's a stream, read the whole thing + str_in = getattr(str_in, 'read', lambda: str_in)() + + # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII + if isinstance(str_in, six.text_type): + # ASCII is the same in UTF-8 + try: + str_in = str_in.encode('ascii') + except UnicodeEncodeError as e: + msg = 'ISO-8601 strings should contain only ASCII characters' + six.raise_from(ValueError(msg), e) + + return f(self, str_in, *args, **kwargs) + + return func + + +class isoparser(object): + def __init__(self, sep=None): + """ + :param sep: + A single character that separates date and time portions. If + ``None``, the parser will accept any single character. + For strict ISO-8601 adherence, pass ``'T'``. + """ + if sep is not None: + if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'): + raise ValueError('Separator must be a single, non-numeric ' + + 'ASCII character') + + sep = sep.encode('ascii') + + self._sep = sep + + @_takes_ascii + def isoparse(self, dt_str): + """ + Parse an ISO-8601 datetime string into a :class:`datetime.datetime`. + + An ISO-8601 datetime string consists of a date portion, followed + optionally by a time portion - the date and time portions are separated + by a single character separator, which is ``T`` in the official + standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be + combined with a time portion. + + Supported date formats are: + + Common: + + - ``YYYY`` + - ``YYYY-MM`` or ``YYYYMM`` + - ``YYYY-MM-DD`` or ``YYYYMMDD`` + + Uncommon: + + - ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0) + - ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day + + The ISO week and day numbering follows the same logic as + :func:`datetime.date.isocalendar`. + + Supported time formats are: + + - ``hh`` + - ``hh:mm`` or ``hhmm`` + - ``hh:mm:ss`` or ``hhmmss`` + - ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits) + + Midnight is a special case for `hh`, as the standard supports both + 00:00 and 24:00 as a representation. The decimal separator can be + either a dot or a comma. + + + .. caution:: + + Support for fractional components other than seconds is part of the + ISO-8601 standard, but is not currently implemented in this parser. + + Supported time zone offset formats are: + + - `Z` (UTC) + - `±HH:MM` + - `±HHMM` + - `±HH` + + Offsets will be represented as :class:`dateutil.tz.tzoffset` objects, + with the exception of UTC, which will be represented as + :class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such + as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`. + + :param dt_str: + A string or stream containing only an ISO-8601 datetime string + + :return: + Returns a :class:`datetime.datetime` representing the string. + Unspecified components default to their lowest value. + + .. warning:: + + As of version 2.7.0, the strictness of the parser should not be + considered a stable part of the contract. Any valid ISO-8601 string + that parses correctly with the default settings will continue to + parse correctly in future versions, but invalid strings that + currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not + guaranteed to continue failing in future versions if they encode + a valid date. + + .. versionadded:: 2.7.0 + """ + components, pos = self._parse_isodate(dt_str) + + if len(dt_str) > pos: + if self._sep is None or dt_str[pos:pos + 1] == self._sep: + components += self._parse_isotime(dt_str[pos + 1:]) + else: + raise ValueError('String contains unknown ISO components') + + if len(components) > 3 and components[3] == 24: + components[3] = 0 + return datetime(*components) + timedelta(days=1) + + return datetime(*components) + + @_takes_ascii + def parse_isodate(self, datestr): + """ + Parse the date portion of an ISO string. + + :param datestr: + The string portion of an ISO string, without a separator + + :return: + Returns a :class:`datetime.date` object + """ + components, pos = self._parse_isodate(datestr) + if pos < len(datestr): + raise ValueError('String contains unknown ISO ' + + 'components: {}'.format(datestr)) + return date(*components) + + @_takes_ascii + def parse_isotime(self, timestr): + """ + Parse the time portion of an ISO string. + + :param timestr: + The time portion of an ISO string, without a separator + + :return: + Returns a :class:`datetime.time` object + """ + components = self._parse_isotime(timestr) + if components[0] == 24: + components[0] = 0 + return time(*components) + + @_takes_ascii + def parse_tzstr(self, tzstr, zero_as_utc=True): + """ + Parse a valid ISO time zone string. + + See :func:`isoparser.isoparse` for details on supported formats. + + :param tzstr: + A string representing an ISO time zone offset + + :param zero_as_utc: + Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones + + :return: + Returns :class:`dateutil.tz.tzoffset` for offsets and + :class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is + specified) offsets equivalent to UTC. + """ + return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc) + + # Constants + _DATE_SEP = b'-' + _TIME_SEP = b':' + _FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)') + + def _parse_isodate(self, dt_str): + try: + return self._parse_isodate_common(dt_str) + except ValueError: + return self._parse_isodate_uncommon(dt_str) + + def _parse_isodate_common(self, dt_str): + len_str = len(dt_str) + components = [1, 1, 1] + + if len_str < 4: + raise ValueError('ISO string too short') + + # Year + components[0] = int(dt_str[0:4]) + pos = 4 + if pos >= len_str: + return components, pos + + has_sep = dt_str[pos:pos + 1] == self._DATE_SEP + if has_sep: + pos += 1 + + # Month + if len_str - pos < 2: + raise ValueError('Invalid common month') + + components[1] = int(dt_str[pos:pos + 2]) + pos += 2 + + if pos >= len_str: + if has_sep: + return components, pos + else: + raise ValueError('Invalid ISO format') + + if has_sep: + if dt_str[pos:pos + 1] != self._DATE_SEP: + raise ValueError('Invalid separator in ISO string') + pos += 1 + + # Day + if len_str - pos < 2: + raise ValueError('Invalid common day') + components[2] = int(dt_str[pos:pos + 2]) + return components, pos + 2 + + def _parse_isodate_uncommon(self, dt_str): + if len(dt_str) < 4: + raise ValueError('ISO string too short') + + # All ISO formats start with the year + year = int(dt_str[0:4]) + + has_sep = dt_str[4:5] == self._DATE_SEP + + pos = 4 + has_sep # Skip '-' if it's there + if dt_str[pos:pos + 1] == b'W': + # YYYY-?Www-?D? + pos += 1 + weekno = int(dt_str[pos:pos + 2]) + pos += 2 + + dayno = 1 + if len(dt_str) > pos: + if (dt_str[pos:pos + 1] == self._DATE_SEP) != has_sep: + raise ValueError('Inconsistent use of dash separator') + + pos += has_sep + + dayno = int(dt_str[pos:pos + 1]) + pos += 1 + + base_date = self._calculate_weekdate(year, weekno, dayno) + else: + # YYYYDDD or YYYY-DDD + if len(dt_str) - pos < 3: + raise ValueError('Invalid ordinal day') + + ordinal_day = int(dt_str[pos:pos + 3]) + pos += 3 + + if ordinal_day < 1 or ordinal_day > (365 + calendar.isleap(year)): + raise ValueError('Invalid ordinal day' + + ' {} for year {}'.format(ordinal_day, year)) + + base_date = date(year, 1, 1) + timedelta(days=ordinal_day - 1) + + components = [base_date.year, base_date.month, base_date.day] + return components, pos + + def _calculate_weekdate(self, year, week, day): + """ + Calculate the day of corresponding to the ISO year-week-day calendar. + + This function is effectively the inverse of + :func:`datetime.date.isocalendar`. + + :param year: + The year in the ISO calendar + + :param week: + The week in the ISO calendar - range is [1, 53] + + :param day: + The day in the ISO calendar - range is [1 (MON), 7 (SUN)] + + :return: + Returns a :class:`datetime.date` + """ + if not 0 < week < 54: + raise ValueError('Invalid week: {}'.format(week)) + + if not 0 < day < 8: # Range is 1-7 + raise ValueError('Invalid weekday: {}'.format(day)) + + # Get week 1 for the specific year: + jan_4 = date(year, 1, 4) # Week 1 always has January 4th in it + week_1 = jan_4 - timedelta(days=jan_4.isocalendar()[2] - 1) + + # Now add the specific number of weeks and days to get what we want + week_offset = (week - 1) * 7 + (day - 1) + return week_1 + timedelta(days=week_offset) + + def _parse_isotime(self, timestr): + len_str = len(timestr) + components = [0, 0, 0, 0, None] + pos = 0 + comp = -1 + + if len(timestr) < 2: + raise ValueError('ISO time too short') + + has_sep = len_str >= 3 and timestr[2:3] == self._TIME_SEP + + while pos < len_str and comp < 5: + comp += 1 + + if timestr[pos:pos + 1] in b'-+Zz': + # Detect time zone boundary + components[-1] = self._parse_tzstr(timestr[pos:]) + pos = len_str + break + + if comp < 3: + # Hour, minute, second + components[comp] = int(timestr[pos:pos + 2]) + pos += 2 + if (has_sep and pos < len_str and + timestr[pos:pos + 1] == self._TIME_SEP): + pos += 1 + + if comp == 3: + # Fraction of a second + frac = self._FRACTION_REGEX.match(timestr[pos:]) + if not frac: + continue + + us_str = frac.group(1)[:6] # Truncate to microseconds + components[comp] = int(us_str) * 10**(6 - len(us_str)) + pos += len(frac.group()) + + if pos < len_str: + raise ValueError('Unused components in ISO string') + + if components[0] == 24: + # Standard supports 00:00 and 24:00 as representations of midnight + if any(component != 0 for component in components[1:4]): + raise ValueError('Hour may only be 24 at 24:00:00.000') + + return components + + def _parse_tzstr(self, tzstr, zero_as_utc=True): + if tzstr == b'Z' or tzstr == b'z': + return tz.UTC + + if len(tzstr) not in {3, 5, 6}: + raise ValueError('Time zone offset must be 1, 3, 5 or 6 characters') + + if tzstr[0:1] == b'-': + mult = -1 + elif tzstr[0:1] == b'+': + mult = 1 + else: + raise ValueError('Time zone offset requires sign') + + hours = int(tzstr[1:3]) + if len(tzstr) == 3: + minutes = 0 + else: + minutes = int(tzstr[(4 if tzstr[3:4] == self._TIME_SEP else 3):]) + + if zero_as_utc and hours == 0 and minutes == 0: + return tz.UTC + else: + if minutes > 59: + raise ValueError('Invalid minutes in time zone offset') + + if hours > 23: + raise ValueError('Invalid hours in time zone offset') + + return tz.tzoffset(None, mult * (hours * 60 + minutes) * 60) + + +DEFAULT_ISOPARSER = isoparser() +isoparse = DEFAULT_ISOPARSER.isoparse diff --git a/lib/python3.8/site-packages/dateutil/relativedelta.py b/lib/python3.8/site-packages/dateutil/relativedelta.py new file mode 100644 index 0000000..a9e85f7 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/relativedelta.py @@ -0,0 +1,599 @@ +# -*- coding: utf-8 -*- +import datetime +import calendar + +import operator +from math import copysign + +from six import integer_types +from warnings import warn + +from ._common import weekday + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) + +__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + + +class relativedelta(object): + """ + The relativedelta type is designed to be applied to an existing datetime and + can replace specific components of that datetime, or represents an interval + of time. + + It is based on the specification of the excellent work done by M.-A. Lemburg + in his + `mx.DateTime `_ extension. + However, notice that this type does *NOT* implement the same algorithm as + his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. + + There are two different ways to build a relativedelta instance. The + first one is passing it two date/datetime classes:: + + relativedelta(datetime1, datetime2) + + The second one is passing it any number of the following keyword arguments:: + + relativedelta(arg1=x,arg2=y,arg3=z...) + + year, month, day, hour, minute, second, microsecond: + Absolute information (argument is singular); adding or subtracting a + relativedelta with absolute information does not perform an arithmetic + operation, but rather REPLACES the corresponding value in the + original datetime with the value(s) in relativedelta. + + years, months, weeks, days, hours, minutes, seconds, microseconds: + Relative information, may be negative (argument is plural); adding + or subtracting a relativedelta with relative information performs + the corresponding arithmetic operation on the original datetime value + with the information in the relativedelta. + + weekday: + One of the weekday instances (MO, TU, etc) available in the + relativedelta module. These instances may receive a parameter N, + specifying the Nth weekday, which could be positive or negative + (like MO(+1) or MO(-2)). Not specifying it is the same as specifying + +1. You can also use an integer, where 0=MO. This argument is always + relative e.g. if the calculated date is already Monday, using MO(1) + or MO(-1) won't change the day. To effectively make it absolute, use + it in combination with the day argument (e.g. day=1, MO(1) for first + Monday of the month). + + leapdays: + Will add given days to the date found, if year is a leap + year, and the date found is post 28 of february. + + yearday, nlyearday: + Set the yearday or the non-leap year day (jump leap days). + These are converted to day/month/leapdays information. + + There are relative and absolute forms of the keyword + arguments. The plural is relative, and the singular is + absolute. For each argument in the order below, the absolute form + is applied first (by setting each attribute to that value) and + then the relative form (by adding the value to the attribute). + + The order of attributes considered when this relativedelta is + added to a datetime is: + + 1. Year + 2. Month + 3. Day + 4. Hours + 5. Minutes + 6. Seconds + 7. Microseconds + + Finally, weekday is applied, using the rule described above. + + For example + + >>> from datetime import datetime + >>> from dateutil.relativedelta import relativedelta, MO + >>> dt = datetime(2018, 4, 9, 13, 37, 0) + >>> delta = relativedelta(hours=25, day=1, weekday=MO(1)) + >>> dt + delta + datetime.datetime(2018, 4, 2, 14, 37) + + First, the day is set to 1 (the first of the month), then 25 hours + are added, to get to the 2nd day and 14th hour, finally the + weekday is applied, but since the 2nd is already a Monday there is + no effect. + + """ + + def __init__(self, dt1=None, dt2=None, + years=0, months=0, days=0, leapdays=0, weeks=0, + hours=0, minutes=0, seconds=0, microseconds=0, + year=None, month=None, day=None, weekday=None, + yearday=None, nlyearday=None, + hour=None, minute=None, second=None, microsecond=None): + + if dt1 and dt2: + # datetime is a subclass of date. So both must be date + if not (isinstance(dt1, datetime.date) and + isinstance(dt2, datetime.date)): + raise TypeError("relativedelta only diffs datetime/date") + + # We allow two dates, or two datetimes, so we coerce them to be + # of the same type + if (isinstance(dt1, datetime.datetime) != + isinstance(dt2, datetime.datetime)): + if not isinstance(dt1, datetime.datetime): + dt1 = datetime.datetime.fromordinal(dt1.toordinal()) + elif not isinstance(dt2, datetime.datetime): + dt2 = datetime.datetime.fromordinal(dt2.toordinal()) + + self.years = 0 + self.months = 0 + self.days = 0 + self.leapdays = 0 + self.hours = 0 + self.minutes = 0 + self.seconds = 0 + self.microseconds = 0 + self.year = None + self.month = None + self.day = None + self.weekday = None + self.hour = None + self.minute = None + self.second = None + self.microsecond = None + self._has_time = 0 + + # Get year / month delta between the two + months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) + self._set_months(months) + + # Remove the year/month delta so the timedelta is just well-defined + # time units (seconds, days and microseconds) + dtm = self.__radd__(dt2) + + # If we've overshot our target, make an adjustment + if dt1 < dt2: + compare = operator.gt + increment = 1 + else: + compare = operator.lt + increment = -1 + + while compare(dt1, dtm): + months += increment + self._set_months(months) + dtm = self.__radd__(dt2) + + # Get the timedelta between the "months-adjusted" date and dt1 + delta = dt1 - dtm + self.seconds = delta.seconds + delta.days * 86400 + self.microseconds = delta.microseconds + else: + # Check for non-integer values in integer-only quantities + if any(x is not None and x != int(x) for x in (years, months)): + raise ValueError("Non-integer years and months are " + "ambiguous and not currently supported.") + + # Relative information + self.years = int(years) + self.months = int(months) + self.days = days + weeks * 7 + self.leapdays = leapdays + self.hours = hours + self.minutes = minutes + self.seconds = seconds + self.microseconds = microseconds + + # Absolute information + self.year = year + self.month = month + self.day = day + self.hour = hour + self.minute = minute + self.second = second + self.microsecond = microsecond + + if any(x is not None and int(x) != x + for x in (year, month, day, hour, + minute, second, microsecond)): + # For now we'll deprecate floats - later it'll be an error. + warn("Non-integer value passed as absolute information. " + + "This is not a well-defined condition and will raise " + + "errors in future versions.", DeprecationWarning) + + if isinstance(weekday, integer_types): + self.weekday = weekdays[weekday] + else: + self.weekday = weekday + + yday = 0 + if nlyearday: + yday = nlyearday + elif yearday: + yday = yearday + if yearday > 59: + self.leapdays = -1 + if yday: + ydayidx = [31, 59, 90, 120, 151, 181, 212, + 243, 273, 304, 334, 366] + for idx, ydays in enumerate(ydayidx): + if yday <= ydays: + self.month = idx+1 + if idx == 0: + self.day = yday + else: + self.day = yday-ydayidx[idx-1] + break + else: + raise ValueError("invalid year day (%d)" % yday) + + self._fix() + + def _fix(self): + if abs(self.microseconds) > 999999: + s = _sign(self.microseconds) + div, mod = divmod(self.microseconds * s, 1000000) + self.microseconds = mod * s + self.seconds += div * s + if abs(self.seconds) > 59: + s = _sign(self.seconds) + div, mod = divmod(self.seconds * s, 60) + self.seconds = mod * s + self.minutes += div * s + if abs(self.minutes) > 59: + s = _sign(self.minutes) + div, mod = divmod(self.minutes * s, 60) + self.minutes = mod * s + self.hours += div * s + if abs(self.hours) > 23: + s = _sign(self.hours) + div, mod = divmod(self.hours * s, 24) + self.hours = mod * s + self.days += div * s + if abs(self.months) > 11: + s = _sign(self.months) + div, mod = divmod(self.months * s, 12) + self.months = mod * s + self.years += div * s + if (self.hours or self.minutes or self.seconds or self.microseconds + or self.hour is not None or self.minute is not None or + self.second is not None or self.microsecond is not None): + self._has_time = 1 + else: + self._has_time = 0 + + @property + def weeks(self): + return int(self.days / 7.0) + + @weeks.setter + def weeks(self, value): + self.days = self.days - (self.weeks * 7) + value * 7 + + def _set_months(self, months): + self.months = months + if abs(self.months) > 11: + s = _sign(self.months) + div, mod = divmod(self.months * s, 12) + self.months = mod * s + self.years = div * s + else: + self.years = 0 + + def normalized(self): + """ + Return a version of this object represented entirely using integer + values for the relative attributes. + + >>> relativedelta(days=1.5, hours=2).normalized() + relativedelta(days=+1, hours=+14) + + :return: + Returns a :class:`dateutil.relativedelta.relativedelta` object. + """ + # Cascade remainders down (rounding each to roughly nearest microsecond) + days = int(self.days) + + hours_f = round(self.hours + 24 * (self.days - days), 11) + hours = int(hours_f) + + minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) + minutes = int(minutes_f) + + seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) + seconds = int(seconds_f) + + microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) + + # Constructor carries overflow back up with call to _fix() + return self.__class__(years=self.years, months=self.months, + days=days, hours=hours, minutes=minutes, + seconds=seconds, microseconds=microseconds, + leapdays=self.leapdays, year=self.year, + month=self.month, day=self.day, + weekday=self.weekday, hour=self.hour, + minute=self.minute, second=self.second, + microsecond=self.microsecond) + + def __add__(self, other): + if isinstance(other, relativedelta): + return self.__class__(years=other.years + self.years, + months=other.months + self.months, + days=other.days + self.days, + hours=other.hours + self.hours, + minutes=other.minutes + self.minutes, + seconds=other.seconds + self.seconds, + microseconds=(other.microseconds + + self.microseconds), + leapdays=other.leapdays or self.leapdays, + year=(other.year if other.year is not None + else self.year), + month=(other.month if other.month is not None + else self.month), + day=(other.day if other.day is not None + else self.day), + weekday=(other.weekday if other.weekday is not None + else self.weekday), + hour=(other.hour if other.hour is not None + else self.hour), + minute=(other.minute if other.minute is not None + else self.minute), + second=(other.second if other.second is not None + else self.second), + microsecond=(other.microsecond if other.microsecond + is not None else + self.microsecond)) + if isinstance(other, datetime.timedelta): + return self.__class__(years=self.years, + months=self.months, + days=self.days + other.days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds + other.seconds, + microseconds=self.microseconds + other.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + if not isinstance(other, datetime.date): + return NotImplemented + elif self._has_time and not isinstance(other, datetime.datetime): + other = datetime.datetime.fromordinal(other.toordinal()) + year = (self.year or other.year)+self.years + month = self.month or other.month + if self.months: + assert 1 <= abs(self.months) <= 12 + month += self.months + if month > 12: + year += 1 + month -= 12 + elif month < 1: + year -= 1 + month += 12 + day = min(calendar.monthrange(year, month)[1], + self.day or other.day) + repl = {"year": year, "month": month, "day": day} + for attr in ["hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + repl[attr] = value + days = self.days + if self.leapdays and month > 2 and calendar.isleap(year): + days += self.leapdays + ret = (other.replace(**repl) + + datetime.timedelta(days=days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds, + microseconds=self.microseconds)) + if self.weekday: + weekday, nth = self.weekday.weekday, self.weekday.n or 1 + jumpdays = (abs(nth) - 1) * 7 + if nth > 0: + jumpdays += (7 - ret.weekday() + weekday) % 7 + else: + jumpdays += (ret.weekday() - weekday) % 7 + jumpdays *= -1 + ret += datetime.timedelta(days=jumpdays) + return ret + + def __radd__(self, other): + return self.__add__(other) + + def __rsub__(self, other): + return self.__neg__().__radd__(other) + + def __sub__(self, other): + if not isinstance(other, relativedelta): + return NotImplemented # In case the other object defines __rsub__ + return self.__class__(years=self.years - other.years, + months=self.months - other.months, + days=self.days - other.days, + hours=self.hours - other.hours, + minutes=self.minutes - other.minutes, + seconds=self.seconds - other.seconds, + microseconds=self.microseconds - other.microseconds, + leapdays=self.leapdays or other.leapdays, + year=(self.year if self.year is not None + else other.year), + month=(self.month if self.month is not None else + other.month), + day=(self.day if self.day is not None else + other.day), + weekday=(self.weekday if self.weekday is not None else + other.weekday), + hour=(self.hour if self.hour is not None else + other.hour), + minute=(self.minute if self.minute is not None else + other.minute), + second=(self.second if self.second is not None else + other.second), + microsecond=(self.microsecond if self.microsecond + is not None else + other.microsecond)) + + def __abs__(self): + return self.__class__(years=abs(self.years), + months=abs(self.months), + days=abs(self.days), + hours=abs(self.hours), + minutes=abs(self.minutes), + seconds=abs(self.seconds), + microseconds=abs(self.microseconds), + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __neg__(self): + return self.__class__(years=-self.years, + months=-self.months, + days=-self.days, + hours=-self.hours, + minutes=-self.minutes, + seconds=-self.seconds, + microseconds=-self.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __bool__(self): + return not (not self.years and + not self.months and + not self.days and + not self.hours and + not self.minutes and + not self.seconds and + not self.microseconds and + not self.leapdays and + self.year is None and + self.month is None and + self.day is None and + self.weekday is None and + self.hour is None and + self.minute is None and + self.second is None and + self.microsecond is None) + # Compatibility with Python 2.x + __nonzero__ = __bool__ + + def __mul__(self, other): + try: + f = float(other) + except TypeError: + return NotImplemented + + return self.__class__(years=int(self.years * f), + months=int(self.months * f), + days=int(self.days * f), + hours=int(self.hours * f), + minutes=int(self.minutes * f), + seconds=int(self.seconds * f), + microseconds=int(self.microseconds * f), + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + __rmul__ = __mul__ + + def __eq__(self, other): + if not isinstance(other, relativedelta): + return NotImplemented + if self.weekday or other.weekday: + if not self.weekday or not other.weekday: + return False + if self.weekday.weekday != other.weekday.weekday: + return False + n1, n2 = self.weekday.n, other.weekday.n + if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): + return False + return (self.years == other.years and + self.months == other.months and + self.days == other.days and + self.hours == other.hours and + self.minutes == other.minutes and + self.seconds == other.seconds and + self.microseconds == other.microseconds and + self.leapdays == other.leapdays and + self.year == other.year and + self.month == other.month and + self.day == other.day and + self.hour == other.hour and + self.minute == other.minute and + self.second == other.second and + self.microsecond == other.microsecond) + + def __hash__(self): + return hash(( + self.weekday, + self.years, + self.months, + self.days, + self.hours, + self.minutes, + self.seconds, + self.microseconds, + self.leapdays, + self.year, + self.month, + self.day, + self.hour, + self.minute, + self.second, + self.microsecond, + )) + + def __ne__(self, other): + return not self.__eq__(other) + + def __div__(self, other): + try: + reciprocal = 1 / float(other) + except TypeError: + return NotImplemented + + return self.__mul__(reciprocal) + + __truediv__ = __div__ + + def __repr__(self): + l = [] + for attr in ["years", "months", "days", "leapdays", + "hours", "minutes", "seconds", "microseconds"]: + value = getattr(self, attr) + if value: + l.append("{attr}={value:+g}".format(attr=attr, value=value)) + for attr in ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + l.append("{attr}={value}".format(attr=attr, value=repr(value))) + return "{classname}({attrs})".format(classname=self.__class__.__name__, + attrs=", ".join(l)) + + +def _sign(x): + return int(copysign(1, x)) + +# vim:ts=4:sw=4:et diff --git a/lib/python3.8/site-packages/dateutil/rrule.py b/lib/python3.8/site-packages/dateutil/rrule.py new file mode 100644 index 0000000..6bf0ea9 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/rrule.py @@ -0,0 +1,1735 @@ +# -*- coding: utf-8 -*- +""" +The rrule module offers a small, complete, and very fast, implementation of +the recurrence rules documented in the +`iCalendar RFC `_, +including support for caching of results. +""" +import itertools +import datetime +import calendar +import re +import sys + +try: + from math import gcd +except ImportError: + from fractions import gcd + +from six import advance_iterator, integer_types +from six.moves import _thread, range +import heapq + +from ._common import weekday as weekdaybase + +# For warning about deprecation of until and count +from warnings import warn + +__all__ = ["rrule", "rruleset", "rrulestr", + "YEARLY", "MONTHLY", "WEEKLY", "DAILY", + "HOURLY", "MINUTELY", "SECONDLY", + "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + +# Every mask is 7 days longer to handle cross-year weekly periods. +M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + + [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) +M365MASK = list(M366MASK) +M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) +MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +MDAY365MASK = list(MDAY366MASK) +M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0)) +NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +NMDAY365MASK = list(NMDAY366MASK) +M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366) +M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) +WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55 +del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] +MDAY365MASK = tuple(MDAY365MASK) +M365MASK = tuple(M365MASK) + +FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY'] + +(YEARLY, + MONTHLY, + WEEKLY, + DAILY, + HOURLY, + MINUTELY, + SECONDLY) = list(range(7)) + +# Imported on demand. +easter = None +parser = None + + +class weekday(weekdaybase): + """ + This version of weekday does not allow n = 0. + """ + def __init__(self, wkday, n=None): + if n == 0: + raise ValueError("Can't create weekday with n==0") + + super(weekday, self).__init__(wkday, n) + + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) + + +def _invalidates_cache(f): + """ + Decorator for rruleset methods which may invalidate the + cached length. + """ + def inner_func(self, *args, **kwargs): + rv = f(self, *args, **kwargs) + self._invalidate_cache() + return rv + + return inner_func + + +class rrulebase(object): + def __init__(self, cache=False): + if cache: + self._cache = [] + self._cache_lock = _thread.allocate_lock() + self._invalidate_cache() + else: + self._cache = None + self._cache_complete = False + self._len = None + + def __iter__(self): + if self._cache_complete: + return iter(self._cache) + elif self._cache is None: + return self._iter() + else: + return self._iter_cached() + + def _invalidate_cache(self): + if self._cache is not None: + self._cache = [] + self._cache_complete = False + self._cache_gen = self._iter() + + if self._cache_lock.locked(): + self._cache_lock.release() + + self._len = None + + def _iter_cached(self): + i = 0 + gen = self._cache_gen + cache = self._cache + acquire = self._cache_lock.acquire + release = self._cache_lock.release + while gen: + if i == len(cache): + acquire() + if self._cache_complete: + break + try: + for j in range(10): + cache.append(advance_iterator(gen)) + except StopIteration: + self._cache_gen = gen = None + self._cache_complete = True + break + release() + yield cache[i] + i += 1 + while i < self._len: + yield cache[i] + i += 1 + + def __getitem__(self, item): + if self._cache_complete: + return self._cache[item] + elif isinstance(item, slice): + if item.step and item.step < 0: + return list(iter(self))[item] + else: + return list(itertools.islice(self, + item.start or 0, + item.stop or sys.maxsize, + item.step or 1)) + elif item >= 0: + gen = iter(self) + try: + for i in range(item+1): + res = advance_iterator(gen) + except StopIteration: + raise IndexError + return res + else: + return list(iter(self))[item] + + def __contains__(self, item): + if self._cache_complete: + return item in self._cache + else: + for i in self: + if i == item: + return True + elif i > item: + return False + return False + + # __len__() introduces a large performance penalty. + def count(self): + """ Returns the number of recurrences in this set. It will have go + trough the whole recurrence, if this hasn't been done before. """ + if self._len is None: + for x in self: + pass + return self._len + + def before(self, dt, inc=False): + """ Returns the last recurrence before the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + last = None + if inc: + for i in gen: + if i > dt: + break + last = i + else: + for i in gen: + if i >= dt: + break + last = i + return last + + def after(self, dt, inc=False): + """ Returns the first recurrence after the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + if inc: + for i in gen: + if i >= dt: + return i + else: + for i in gen: + if i > dt: + return i + return None + + def xafter(self, dt, count=None, inc=False): + """ + Generator which yields up to `count` recurrences after the given + datetime instance, equivalent to `after`. + + :param dt: + The datetime at which to start generating recurrences. + + :param count: + The maximum number of recurrences to generate. If `None` (default), + dates are generated until the recurrence rule is exhausted. + + :param inc: + If `dt` is an instance of the rule and `inc` is `True`, it is + included in the output. + + :yields: Yields a sequence of `datetime` objects. + """ + + if self._cache_complete: + gen = self._cache + else: + gen = self + + # Select the comparison function + if inc: + comp = lambda dc, dtc: dc >= dtc + else: + comp = lambda dc, dtc: dc > dtc + + # Generate dates + n = 0 + for d in gen: + if comp(d, dt): + if count is not None: + n += 1 + if n > count: + break + + yield d + + def between(self, after, before, inc=False, count=1): + """ Returns all the occurrences of the rrule between after and before. + The inc keyword defines what happens if after and/or before are + themselves occurrences. With inc=True, they will be included in the + list, if they are found in the recurrence set. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + started = False + l = [] + if inc: + for i in gen: + if i > before: + break + elif not started: + if i >= after: + started = True + l.append(i) + else: + l.append(i) + else: + for i in gen: + if i >= before: + break + elif not started: + if i > after: + started = True + l.append(i) + else: + l.append(i) + return l + + +class rrule(rrulebase): + """ + That's the base of the rrule operation. It accepts all the keywords + defined in the RFC as its constructor parameters (except byday, + which was renamed to byweekday) and more. The constructor prototype is:: + + rrule(freq) + + Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, + or SECONDLY. + + .. note:: + Per RFC section 3.3.10, recurrence instances falling on invalid dates + and times are ignored rather than coerced: + + Recurrence rules may generate recurrence instances with an invalid + date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM + on a day where the local time is moved forward by an hour at 1:00 + AM). Such recurrence instances MUST be ignored and MUST NOT be + counted as part of the recurrence set. + + This can lead to possibly surprising behavior when, for example, the + start date occurs at the end of the month: + + >>> from dateutil.rrule import rrule, MONTHLY + >>> from datetime import datetime + >>> start_date = datetime(2014, 12, 31) + >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) + ... # doctest: +NORMALIZE_WHITESPACE + [datetime.datetime(2014, 12, 31, 0, 0), + datetime.datetime(2015, 1, 31, 0, 0), + datetime.datetime(2015, 3, 31, 0, 0), + datetime.datetime(2015, 5, 31, 0, 0)] + + Additionally, it supports the following keyword arguments: + + :param dtstart: + The recurrence start. Besides being the base for the recurrence, + missing parameters in the final recurrence instances will also be + extracted from this date. If not given, datetime.now() will be used + instead. + :param interval: + The interval between each freq iteration. For example, when using + YEARLY, an interval of 2 means once every two years, but with HOURLY, + it means once every two hours. The default interval is 1. + :param wkst: + The week start day. Must be one of the MO, TU, WE constants, or an + integer, specifying the first day of the week. This will affect + recurrences based on weekly periods. The default week start is got + from calendar.firstweekday(), and may be modified by + calendar.setfirstweekday(). + :param count: + If given, this determines how many occurrences will be generated. + + .. note:: + As of version 2.5.0, the use of the keyword ``until`` in conjunction + with ``count`` is deprecated, to make sure ``dateutil`` is fully + compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` + **must not** occur in the same call to ``rrule``. + :param until: + If given, this must be a datetime instance specifying the upper-bound + limit of the recurrence. The last recurrence in the rule is the greatest + datetime that is less than or equal to the value specified in the + ``until`` parameter. + + .. note:: + As of version 2.5.0, the use of the keyword ``until`` in conjunction + with ``count`` is deprecated, to make sure ``dateutil`` is fully + compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` + **must not** occur in the same call to ``rrule``. + :param bysetpos: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each given integer will specify an occurrence + number, corresponding to the nth occurrence of the rule inside the + frequency period. For example, a bysetpos of -1 if combined with a + MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will + result in the last work day of every month. + :param bymonth: + If given, it must be either an integer, or a sequence of integers, + meaning the months to apply the recurrence to. + :param bymonthday: + If given, it must be either an integer, or a sequence of integers, + meaning the month days to apply the recurrence to. + :param byyearday: + If given, it must be either an integer, or a sequence of integers, + meaning the year days to apply the recurrence to. + :param byeaster: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each integer will define an offset from the + Easter Sunday. Passing the offset 0 to byeaster will yield the Easter + Sunday itself. This is an extension to the RFC specification. + :param byweekno: + If given, it must be either an integer, or a sequence of integers, + meaning the week numbers to apply the recurrence to. Week numbers + have the meaning described in ISO8601, that is, the first week of + the year is that containing at least four days of the new year. + :param byweekday: + If given, it must be either an integer (0 == MO), a sequence of + integers, one of the weekday constants (MO, TU, etc), or a sequence + of these constants. When given, these variables will define the + weekdays where the recurrence will be applied. It's also possible to + use an argument n for the weekday instances, which will mean the nth + occurrence of this weekday in the period. For example, with MONTHLY, + or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the + first friday of the month where the recurrence happens. Notice that in + the RFC documentation, this is specified as BYDAY, but was renamed to + avoid the ambiguity of that keyword. + :param byhour: + If given, it must be either an integer, or a sequence of integers, + meaning the hours to apply the recurrence to. + :param byminute: + If given, it must be either an integer, or a sequence of integers, + meaning the minutes to apply the recurrence to. + :param bysecond: + If given, it must be either an integer, or a sequence of integers, + meaning the seconds to apply the recurrence to. + :param cache: + If given, it must be a boolean value specifying to enable or disable + caching of results. If you will use the same rrule instance multiple + times, enabling caching will improve the performance considerably. + """ + def __init__(self, freq, dtstart=None, + interval=1, wkst=None, count=None, until=None, bysetpos=None, + bymonth=None, bymonthday=None, byyearday=None, byeaster=None, + byweekno=None, byweekday=None, + byhour=None, byminute=None, bysecond=None, + cache=False): + super(rrule, self).__init__(cache) + global easter + if not dtstart: + if until and until.tzinfo: + dtstart = datetime.datetime.now(tz=until.tzinfo).replace(microsecond=0) + else: + dtstart = datetime.datetime.now().replace(microsecond=0) + elif not isinstance(dtstart, datetime.datetime): + dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) + else: + dtstart = dtstart.replace(microsecond=0) + self._dtstart = dtstart + self._tzinfo = dtstart.tzinfo + self._freq = freq + self._interval = interval + self._count = count + + # Cache the original byxxx rules, if they are provided, as the _byxxx + # attributes do not necessarily map to the inputs, and this can be + # a problem in generating the strings. Only store things if they've + # been supplied (the string retrieval will just use .get()) + self._original_rule = {} + + if until and not isinstance(until, datetime.datetime): + until = datetime.datetime.fromordinal(until.toordinal()) + self._until = until + + if self._dtstart and self._until: + if (self._dtstart.tzinfo is not None) != (self._until.tzinfo is not None): + # According to RFC5545 Section 3.3.10: + # https://tools.ietf.org/html/rfc5545#section-3.3.10 + # + # > If the "DTSTART" property is specified as a date with UTC + # > time or a date with local time and time zone reference, + # > then the UNTIL rule part MUST be specified as a date with + # > UTC time. + raise ValueError( + 'RRULE UNTIL values must be specified in UTC when DTSTART ' + 'is timezone-aware' + ) + + if count is not None and until: + warn("Using both 'count' and 'until' is inconsistent with RFC 5545" + " and has been deprecated in dateutil. Future versions will " + "raise an error.", DeprecationWarning) + + if wkst is None: + self._wkst = calendar.firstweekday() + elif isinstance(wkst, integer_types): + self._wkst = wkst + else: + self._wkst = wkst.weekday + + if bysetpos is None: + self._bysetpos = None + elif isinstance(bysetpos, integer_types): + if bysetpos == 0 or not (-366 <= bysetpos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + self._bysetpos = (bysetpos,) + else: + self._bysetpos = tuple(bysetpos) + for pos in self._bysetpos: + if pos == 0 or not (-366 <= pos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + + if self._bysetpos: + self._original_rule['bysetpos'] = self._bysetpos + + if (byweekno is None and byyearday is None and bymonthday is None and + byweekday is None and byeaster is None): + if freq == YEARLY: + if bymonth is None: + bymonth = dtstart.month + self._original_rule['bymonth'] = None + bymonthday = dtstart.day + self._original_rule['bymonthday'] = None + elif freq == MONTHLY: + bymonthday = dtstart.day + self._original_rule['bymonthday'] = None + elif freq == WEEKLY: + byweekday = dtstart.weekday() + self._original_rule['byweekday'] = None + + # bymonth + if bymonth is None: + self._bymonth = None + else: + if isinstance(bymonth, integer_types): + bymonth = (bymonth,) + + self._bymonth = tuple(sorted(set(bymonth))) + + if 'bymonth' not in self._original_rule: + self._original_rule['bymonth'] = self._bymonth + + # byyearday + if byyearday is None: + self._byyearday = None + else: + if isinstance(byyearday, integer_types): + byyearday = (byyearday,) + + self._byyearday = tuple(sorted(set(byyearday))) + self._original_rule['byyearday'] = self._byyearday + + # byeaster + if byeaster is not None: + if not easter: + from dateutil import easter + if isinstance(byeaster, integer_types): + self._byeaster = (byeaster,) + else: + self._byeaster = tuple(sorted(byeaster)) + + self._original_rule['byeaster'] = self._byeaster + else: + self._byeaster = None + + # bymonthday + if bymonthday is None: + self._bymonthday = () + self._bynmonthday = () + else: + if isinstance(bymonthday, integer_types): + bymonthday = (bymonthday,) + + bymonthday = set(bymonthday) # Ensure it's unique + + self._bymonthday = tuple(sorted(x for x in bymonthday if x > 0)) + self._bynmonthday = tuple(sorted(x for x in bymonthday if x < 0)) + + # Storing positive numbers first, then negative numbers + if 'bymonthday' not in self._original_rule: + self._original_rule['bymonthday'] = tuple( + itertools.chain(self._bymonthday, self._bynmonthday)) + + # byweekno + if byweekno is None: + self._byweekno = None + else: + if isinstance(byweekno, integer_types): + byweekno = (byweekno,) + + self._byweekno = tuple(sorted(set(byweekno))) + + self._original_rule['byweekno'] = self._byweekno + + # byweekday / bynweekday + if byweekday is None: + self._byweekday = None + self._bynweekday = None + else: + # If it's one of the valid non-sequence types, convert to a + # single-element sequence before the iterator that builds the + # byweekday set. + if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): + byweekday = (byweekday,) + + self._byweekday = set() + self._bynweekday = set() + for wday in byweekday: + if isinstance(wday, integer_types): + self._byweekday.add(wday) + elif not wday.n or freq > MONTHLY: + self._byweekday.add(wday.weekday) + else: + self._bynweekday.add((wday.weekday, wday.n)) + + if not self._byweekday: + self._byweekday = None + elif not self._bynweekday: + self._bynweekday = None + + if self._byweekday is not None: + self._byweekday = tuple(sorted(self._byweekday)) + orig_byweekday = [weekday(x) for x in self._byweekday] + else: + orig_byweekday = () + + if self._bynweekday is not None: + self._bynweekday = tuple(sorted(self._bynweekday)) + orig_bynweekday = [weekday(*x) for x in self._bynweekday] + else: + orig_bynweekday = () + + if 'byweekday' not in self._original_rule: + self._original_rule['byweekday'] = tuple(itertools.chain( + orig_byweekday, orig_bynweekday)) + + # byhour + if byhour is None: + if freq < HOURLY: + self._byhour = {dtstart.hour} + else: + self._byhour = None + else: + if isinstance(byhour, integer_types): + byhour = (byhour,) + + if freq == HOURLY: + self._byhour = self.__construct_byset(start=dtstart.hour, + byxxx=byhour, + base=24) + else: + self._byhour = set(byhour) + + self._byhour = tuple(sorted(self._byhour)) + self._original_rule['byhour'] = self._byhour + + # byminute + if byminute is None: + if freq < MINUTELY: + self._byminute = {dtstart.minute} + else: + self._byminute = None + else: + if isinstance(byminute, integer_types): + byminute = (byminute,) + + if freq == MINUTELY: + self._byminute = self.__construct_byset(start=dtstart.minute, + byxxx=byminute, + base=60) + else: + self._byminute = set(byminute) + + self._byminute = tuple(sorted(self._byminute)) + self._original_rule['byminute'] = self._byminute + + # bysecond + if bysecond is None: + if freq < SECONDLY: + self._bysecond = ((dtstart.second,)) + else: + self._bysecond = None + else: + if isinstance(bysecond, integer_types): + bysecond = (bysecond,) + + self._bysecond = set(bysecond) + + if freq == SECONDLY: + self._bysecond = self.__construct_byset(start=dtstart.second, + byxxx=bysecond, + base=60) + else: + self._bysecond = set(bysecond) + + self._bysecond = tuple(sorted(self._bysecond)) + self._original_rule['bysecond'] = self._bysecond + + if self._freq >= HOURLY: + self._timeset = None + else: + self._timeset = [] + for hour in self._byhour: + for minute in self._byminute: + for second in self._bysecond: + self._timeset.append( + datetime.time(hour, minute, second, + tzinfo=self._tzinfo)) + self._timeset.sort() + self._timeset = tuple(self._timeset) + + def __str__(self): + """ + Output a string that would generate this RRULE if passed to rrulestr. + This is mostly compatible with RFC5545, except for the + dateutil-specific extension BYEASTER. + """ + + output = [] + h, m, s = [None] * 3 + if self._dtstart: + output.append(self._dtstart.strftime('DTSTART:%Y%m%dT%H%M%S')) + h, m, s = self._dtstart.timetuple()[3:6] + + parts = ['FREQ=' + FREQNAMES[self._freq]] + if self._interval != 1: + parts.append('INTERVAL=' + str(self._interval)) + + if self._wkst: + parts.append('WKST=' + repr(weekday(self._wkst))[0:2]) + + if self._count is not None: + parts.append('COUNT=' + str(self._count)) + + if self._until: + parts.append(self._until.strftime('UNTIL=%Y%m%dT%H%M%S')) + + if self._original_rule.get('byweekday') is not None: + # The str() method on weekday objects doesn't generate + # RFC5545-compliant strings, so we should modify that. + original_rule = dict(self._original_rule) + wday_strings = [] + for wday in original_rule['byweekday']: + if wday.n: + wday_strings.append('{n:+d}{wday}'.format( + n=wday.n, + wday=repr(wday)[0:2])) + else: + wday_strings.append(repr(wday)) + + original_rule['byweekday'] = wday_strings + else: + original_rule = self._original_rule + + partfmt = '{name}={vals}' + for name, key in [('BYSETPOS', 'bysetpos'), + ('BYMONTH', 'bymonth'), + ('BYMONTHDAY', 'bymonthday'), + ('BYYEARDAY', 'byyearday'), + ('BYWEEKNO', 'byweekno'), + ('BYDAY', 'byweekday'), + ('BYHOUR', 'byhour'), + ('BYMINUTE', 'byminute'), + ('BYSECOND', 'bysecond'), + ('BYEASTER', 'byeaster')]: + value = original_rule.get(key) + if value: + parts.append(partfmt.format(name=name, vals=(','.join(str(v) + for v in value)))) + + output.append('RRULE:' + ';'.join(parts)) + return '\n'.join(output) + + def replace(self, **kwargs): + """Return new rrule with same attributes except for those attributes given new + values by whichever keyword arguments are specified.""" + new_kwargs = {"interval": self._interval, + "count": self._count, + "dtstart": self._dtstart, + "freq": self._freq, + "until": self._until, + "wkst": self._wkst, + "cache": False if self._cache is None else True } + new_kwargs.update(self._original_rule) + new_kwargs.update(kwargs) + return rrule(**new_kwargs) + + def _iter(self): + year, month, day, hour, minute, second, weekday, yearday, _ = \ + self._dtstart.timetuple() + + # Some local variables to speed things up a bit + freq = self._freq + interval = self._interval + wkst = self._wkst + until = self._until + bymonth = self._bymonth + byweekno = self._byweekno + byyearday = self._byyearday + byweekday = self._byweekday + byeaster = self._byeaster + bymonthday = self._bymonthday + bynmonthday = self._bynmonthday + bysetpos = self._bysetpos + byhour = self._byhour + byminute = self._byminute + bysecond = self._bysecond + + ii = _iterinfo(self) + ii.rebuild(year, month) + + getdayset = {YEARLY: ii.ydayset, + MONTHLY: ii.mdayset, + WEEKLY: ii.wdayset, + DAILY: ii.ddayset, + HOURLY: ii.ddayset, + MINUTELY: ii.ddayset, + SECONDLY: ii.ddayset}[freq] + + if freq < HOURLY: + timeset = self._timeset + else: + gettimeset = {HOURLY: ii.htimeset, + MINUTELY: ii.mtimeset, + SECONDLY: ii.stimeset}[freq] + if ((freq >= HOURLY and + self._byhour and hour not in self._byhour) or + (freq >= MINUTELY and + self._byminute and minute not in self._byminute) or + (freq >= SECONDLY and + self._bysecond and second not in self._bysecond)): + timeset = () + else: + timeset = gettimeset(hour, minute, second) + + total = 0 + count = self._count + while True: + # Get dayset with the right frequency + dayset, start, end = getdayset(year, month, day) + + # Do the "hard" work ;-) + filtered = False + for i in dayset[start:end]: + if ((bymonth and ii.mmask[i] not in bymonth) or + (byweekno and not ii.wnomask[i]) or + (byweekday and ii.wdaymask[i] not in byweekday) or + (ii.nwdaymask and not ii.nwdaymask[i]) or + (byeaster and not ii.eastermask[i]) or + ((bymonthday or bynmonthday) and + ii.mdaymask[i] not in bymonthday and + ii.nmdaymask[i] not in bynmonthday) or + (byyearday and + ((i < ii.yearlen and i+1 not in byyearday and + -ii.yearlen+i not in byyearday) or + (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and + -ii.nextyearlen+i-ii.yearlen not in byyearday)))): + dayset[i] = None + filtered = True + + # Output results + if bysetpos and timeset: + poslist = [] + for pos in bysetpos: + if pos < 0: + daypos, timepos = divmod(pos, len(timeset)) + else: + daypos, timepos = divmod(pos-1, len(timeset)) + try: + i = [x for x in dayset[start:end] + if x is not None][daypos] + time = timeset[timepos] + except IndexError: + pass + else: + date = datetime.date.fromordinal(ii.yearordinal+i) + res = datetime.datetime.combine(date, time) + if res not in poslist: + poslist.append(res) + poslist.sort() + for res in poslist: + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + if count is not None: + count -= 1 + if count < 0: + self._len = total + return + total += 1 + yield res + else: + for i in dayset[start:end]: + if i is not None: + date = datetime.date.fromordinal(ii.yearordinal + i) + for time in timeset: + res = datetime.datetime.combine(date, time) + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + if count is not None: + count -= 1 + if count < 0: + self._len = total + return + + total += 1 + yield res + + # Handle frequency and interval + fixday = False + if freq == YEARLY: + year += interval + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == MONTHLY: + month += interval + if month > 12: + div, mod = divmod(month, 12) + month = mod + year += div + if month == 0: + month = 12 + year -= 1 + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == WEEKLY: + if wkst > weekday: + day += -(weekday+1+(6-wkst))+self._interval*7 + else: + day += -(weekday-wkst)+self._interval*7 + weekday = wkst + fixday = True + elif freq == DAILY: + day += interval + fixday = True + elif freq == HOURLY: + if filtered: + # Jump to one iteration before next day + hour += ((23-hour)//interval)*interval + + if byhour: + ndays, hour = self.__mod_distance(value=hour, + byxxx=self._byhour, + base=24) + else: + ndays, hour = divmod(hour+interval, 24) + + if ndays: + day += ndays + fixday = True + + timeset = gettimeset(hour, minute, second) + elif freq == MINUTELY: + if filtered: + # Jump to one iteration before next day + minute += ((1439-(hour*60+minute))//interval)*interval + + valid = False + rep_rate = (24*60) + for j in range(rep_rate // gcd(interval, rep_rate)): + if byminute: + nhours, minute = \ + self.__mod_distance(value=minute, + byxxx=self._byminute, + base=60) + else: + nhours, minute = divmod(minute+interval, 60) + + div, hour = divmod(hour+nhours, 24) + if div: + day += div + fixday = True + filtered = False + + if not byhour or hour in byhour: + valid = True + break + + if not valid: + raise ValueError('Invalid combination of interval and ' + + 'byhour resulting in empty rule.') + + timeset = gettimeset(hour, minute, second) + elif freq == SECONDLY: + if filtered: + # Jump to one iteration before next day + second += (((86399 - (hour * 3600 + minute * 60 + second)) + // interval) * interval) + + rep_rate = (24 * 3600) + valid = False + for j in range(0, rep_rate // gcd(interval, rep_rate)): + if bysecond: + nminutes, second = \ + self.__mod_distance(value=second, + byxxx=self._bysecond, + base=60) + else: + nminutes, second = divmod(second+interval, 60) + + div, minute = divmod(minute+nminutes, 60) + if div: + hour += div + div, hour = divmod(hour, 24) + if div: + day += div + fixday = True + + if ((not byhour or hour in byhour) and + (not byminute or minute in byminute) and + (not bysecond or second in bysecond)): + valid = True + break + + if not valid: + raise ValueError('Invalid combination of interval, ' + + 'byhour and byminute resulting in empty' + + ' rule.') + + timeset = gettimeset(hour, minute, second) + + if fixday and day > 28: + daysinmonth = calendar.monthrange(year, month)[1] + if day > daysinmonth: + while day > daysinmonth: + day -= daysinmonth + month += 1 + if month == 13: + month = 1 + year += 1 + if year > datetime.MAXYEAR: + self._len = total + return + daysinmonth = calendar.monthrange(year, month)[1] + ii.rebuild(year, month) + + def __construct_byset(self, start, byxxx, base): + """ + If a `BYXXX` sequence is passed to the constructor at the same level as + `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some + specifications which cannot be reached given some starting conditions. + + This occurs whenever the interval is not coprime with the base of a + given unit and the difference between the starting position and the + ending position is not coprime with the greatest common denominator + between the interval and the base. For example, with a FREQ of hourly + starting at 17:00 and an interval of 4, the only valid values for + BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not + coprime. + + :param start: + Specifies the starting position. + :param byxxx: + An iterable containing the list of allowed values. + :param base: + The largest allowable value for the specified frequency (e.g. + 24 hours, 60 minutes). + + This does not preserve the type of the iterable, returning a set, since + the values should be unique and the order is irrelevant, this will + speed up later lookups. + + In the event of an empty set, raises a :exception:`ValueError`, as this + results in an empty rrule. + """ + + cset = set() + + # Support a single byxxx value. + if isinstance(byxxx, integer_types): + byxxx = (byxxx, ) + + for num in byxxx: + i_gcd = gcd(self._interval, base) + # Use divmod rather than % because we need to wrap negative nums. + if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: + cset.add(num) + + if len(cset) == 0: + raise ValueError("Invalid rrule byxxx generates an empty set.") + + return cset + + def __mod_distance(self, value, byxxx, base): + """ + Calculates the next value in a sequence where the `FREQ` parameter is + specified along with a `BYXXX` parameter at the same "level" + (e.g. `HOURLY` specified with `BYHOUR`). + + :param value: + The old value of the component. + :param byxxx: + The `BYXXX` set, which should have been generated by + `rrule._construct_byset`, or something else which checks that a + valid rule is present. + :param base: + The largest allowable value for the specified frequency (e.g. + 24 hours, 60 minutes). + + If a valid value is not found after `base` iterations (the maximum + number before the sequence would start to repeat), this raises a + :exception:`ValueError`, as no valid values were found. + + This returns a tuple of `divmod(n*interval, base)`, where `n` is the + smallest number of `interval` repetitions until the next specified + value in `byxxx` is found. + """ + accumulator = 0 + for ii in range(1, base + 1): + # Using divmod() over % to account for negative intervals + div, value = divmod(value + self._interval, base) + accumulator += div + if value in byxxx: + return (accumulator, value) + + +class _iterinfo(object): + __slots__ = ["rrule", "lastyear", "lastmonth", + "yearlen", "nextyearlen", "yearordinal", "yearweekday", + "mmask", "mrange", "mdaymask", "nmdaymask", + "wdaymask", "wnomask", "nwdaymask", "eastermask"] + + def __init__(self, rrule): + for attr in self.__slots__: + setattr(self, attr, None) + self.rrule = rrule + + def rebuild(self, year, month): + # Every mask is 7 days longer to handle cross-year weekly periods. + rr = self.rrule + if year != self.lastyear: + self.yearlen = 365 + calendar.isleap(year) + self.nextyearlen = 365 + calendar.isleap(year + 1) + firstyday = datetime.date(year, 1, 1) + self.yearordinal = firstyday.toordinal() + self.yearweekday = firstyday.weekday() + + wday = datetime.date(year, 1, 1).weekday() + if self.yearlen == 365: + self.mmask = M365MASK + self.mdaymask = MDAY365MASK + self.nmdaymask = NMDAY365MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M365RANGE + else: + self.mmask = M366MASK + self.mdaymask = MDAY366MASK + self.nmdaymask = NMDAY366MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M366RANGE + + if not rr._byweekno: + self.wnomask = None + else: + self.wnomask = [0]*(self.yearlen+7) + # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) + no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 + if no1wkst >= 4: + no1wkst = 0 + # Number of days in the year, plus the days we got + # from last year. + wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 + else: + # Number of days in the year, minus the days we + # left in last year. + wyearlen = self.yearlen-no1wkst + div, mod = divmod(wyearlen, 7) + numweeks = div+mod//4 + for n in rr._byweekno: + if n < 0: + n += numweeks+1 + if not (0 < n <= numweeks): + continue + if n > 1: + i = no1wkst+(n-1)*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + else: + i = no1wkst + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if 1 in rr._byweekno: + # Check week number 1 of next year as well + # TODO: Check -numweeks for next year. + i = no1wkst+numweeks*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + if i < self.yearlen: + # If week starts in next year, we + # don't care about it. + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if no1wkst: + # Check last week number of last year as + # well. If no1wkst is 0, either the year + # started on week start, or week number 1 + # got days from last year, so there are no + # days from last year's last week number in + # this year. + if -1 not in rr._byweekno: + lyearweekday = datetime.date(year-1, 1, 1).weekday() + lno1wkst = (7-lyearweekday+rr._wkst) % 7 + lyearlen = 365+calendar.isleap(year-1) + if lno1wkst >= 4: + lno1wkst = 0 + lnumweeks = 52+(lyearlen + + (lyearweekday-rr._wkst) % 7) % 7//4 + else: + lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 + else: + lnumweeks = -1 + if lnumweeks in rr._byweekno: + for i in range(no1wkst): + self.wnomask[i] = 1 + + if (rr._bynweekday and (month != self.lastmonth or + year != self.lastyear)): + ranges = [] + if rr._freq == YEARLY: + if rr._bymonth: + for month in rr._bymonth: + ranges.append(self.mrange[month-1:month+1]) + else: + ranges = [(0, self.yearlen)] + elif rr._freq == MONTHLY: + ranges = [self.mrange[month-1:month+1]] + if ranges: + # Weekly frequency won't get here, so we may not + # care about cross-year weekly periods. + self.nwdaymask = [0]*self.yearlen + for first, last in ranges: + last -= 1 + for wday, n in rr._bynweekday: + if n < 0: + i = last+(n+1)*7 + i -= (self.wdaymask[i]-wday) % 7 + else: + i = first+(n-1)*7 + i += (7-self.wdaymask[i]+wday) % 7 + if first <= i <= last: + self.nwdaymask[i] = 1 + + if rr._byeaster: + self.eastermask = [0]*(self.yearlen+7) + eyday = easter.easter(year).toordinal()-self.yearordinal + for offset in rr._byeaster: + self.eastermask[eyday+offset] = 1 + + self.lastyear = year + self.lastmonth = month + + def ydayset(self, year, month, day): + return list(range(self.yearlen)), 0, self.yearlen + + def mdayset(self, year, month, day): + dset = [None]*self.yearlen + start, end = self.mrange[month-1:month+1] + for i in range(start, end): + dset[i] = i + return dset, start, end + + def wdayset(self, year, month, day): + # We need to handle cross-year weeks here. + dset = [None]*(self.yearlen+7) + i = datetime.date(year, month, day).toordinal()-self.yearordinal + start = i + for j in range(7): + dset[i] = i + i += 1 + # if (not (0 <= i < self.yearlen) or + # self.wdaymask[i] == self.rrule._wkst): + # This will cross the year boundary, if necessary. + if self.wdaymask[i] == self.rrule._wkst: + break + return dset, start, i + + def ddayset(self, year, month, day): + dset = [None] * self.yearlen + i = datetime.date(year, month, day).toordinal() - self.yearordinal + dset[i] = i + return dset, i, i + 1 + + def htimeset(self, hour, minute, second): + tset = [] + rr = self.rrule + for minute in rr._byminute: + for second in rr._bysecond: + tset.append(datetime.time(hour, minute, second, + tzinfo=rr._tzinfo)) + tset.sort() + return tset + + def mtimeset(self, hour, minute, second): + tset = [] + rr = self.rrule + for second in rr._bysecond: + tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) + tset.sort() + return tset + + def stimeset(self, hour, minute, second): + return (datetime.time(hour, minute, second, + tzinfo=self.rrule._tzinfo),) + + +class rruleset(rrulebase): + """ The rruleset type allows more complex recurrence setups, mixing + multiple rules, dates, exclusion rules, and exclusion dates. The type + constructor takes the following keyword arguments: + + :param cache: If True, caching of results will be enabled, improving + performance of multiple queries considerably. """ + + class _genitem(object): + def __init__(self, genlist, gen): + try: + self.dt = advance_iterator(gen) + genlist.append(self) + except StopIteration: + pass + self.genlist = genlist + self.gen = gen + + def __next__(self): + try: + self.dt = advance_iterator(self.gen) + except StopIteration: + if self.genlist[0] is self: + heapq.heappop(self.genlist) + else: + self.genlist.remove(self) + heapq.heapify(self.genlist) + + next = __next__ + + def __lt__(self, other): + return self.dt < other.dt + + def __gt__(self, other): + return self.dt > other.dt + + def __eq__(self, other): + return self.dt == other.dt + + def __ne__(self, other): + return self.dt != other.dt + + def __init__(self, cache=False): + super(rruleset, self).__init__(cache) + self._rrule = [] + self._rdate = [] + self._exrule = [] + self._exdate = [] + + @_invalidates_cache + def rrule(self, rrule): + """ Include the given :py:class:`rrule` instance in the recurrence set + generation. """ + self._rrule.append(rrule) + + @_invalidates_cache + def rdate(self, rdate): + """ Include the given :py:class:`datetime` instance in the recurrence + set generation. """ + self._rdate.append(rdate) + + @_invalidates_cache + def exrule(self, exrule): + """ Include the given rrule instance in the recurrence set exclusion + list. Dates which are part of the given recurrence rules will not + be generated, even if some inclusive rrule or rdate matches them. + """ + self._exrule.append(exrule) + + @_invalidates_cache + def exdate(self, exdate): + """ Include the given datetime instance in the recurrence set + exclusion list. Dates included that way will not be generated, + even if some inclusive rrule or rdate matches them. """ + self._exdate.append(exdate) + + def _iter(self): + rlist = [] + self._rdate.sort() + self._genitem(rlist, iter(self._rdate)) + for gen in [iter(x) for x in self._rrule]: + self._genitem(rlist, gen) + exlist = [] + self._exdate.sort() + self._genitem(exlist, iter(self._exdate)) + for gen in [iter(x) for x in self._exrule]: + self._genitem(exlist, gen) + lastdt = None + total = 0 + heapq.heapify(rlist) + heapq.heapify(exlist) + while rlist: + ritem = rlist[0] + if not lastdt or lastdt != ritem.dt: + while exlist and exlist[0] < ritem: + exitem = exlist[0] + advance_iterator(exitem) + if exlist and exlist[0] is exitem: + heapq.heapreplace(exlist, exitem) + if not exlist or ritem != exlist[0]: + total += 1 + yield ritem.dt + lastdt = ritem.dt + advance_iterator(ritem) + if rlist and rlist[0] is ritem: + heapq.heapreplace(rlist, ritem) + self._len = total + + + + +class _rrulestr(object): + """ Parses a string representation of a recurrence rule or set of + recurrence rules. + + :param s: + Required, a string defining one or more recurrence rules. + + :param dtstart: + If given, used as the default recurrence start if not specified in the + rule string. + + :param cache: + If set ``True`` caching of results will be enabled, improving + performance of multiple queries considerably. + + :param unfold: + If set ``True`` indicates that a rule string is split over more + than one line and should be joined before processing. + + :param forceset: + If set ``True`` forces a :class:`dateutil.rrule.rruleset` to + be returned. + + :param compatible: + If set ``True`` forces ``unfold`` and ``forceset`` to be ``True``. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a naive + :class:`datetime.datetime` object is returned. + + :param tzids: + If given, a callable or mapping used to retrieve a + :class:`datetime.tzinfo` from a string representation. + Defaults to :func:`dateutil.tz.gettz`. + + :param tzinfos: + Additional time zone names / aliases which may be present in a string + representation. See :func:`dateutil.parser.parse` for more + information. + + :return: + Returns a :class:`dateutil.rrule.rruleset` or + :class:`dateutil.rrule.rrule` + """ + + _freq_map = {"YEARLY": YEARLY, + "MONTHLY": MONTHLY, + "WEEKLY": WEEKLY, + "DAILY": DAILY, + "HOURLY": HOURLY, + "MINUTELY": MINUTELY, + "SECONDLY": SECONDLY} + + _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, + "FR": 4, "SA": 5, "SU": 6} + + def _handle_int(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = int(value) + + def _handle_int_list(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = [int(x) for x in value.split(',')] + + _handle_INTERVAL = _handle_int + _handle_COUNT = _handle_int + _handle_BYSETPOS = _handle_int_list + _handle_BYMONTH = _handle_int_list + _handle_BYMONTHDAY = _handle_int_list + _handle_BYYEARDAY = _handle_int_list + _handle_BYEASTER = _handle_int_list + _handle_BYWEEKNO = _handle_int_list + _handle_BYHOUR = _handle_int_list + _handle_BYMINUTE = _handle_int_list + _handle_BYSECOND = _handle_int_list + + def _handle_FREQ(self, rrkwargs, name, value, **kwargs): + rrkwargs["freq"] = self._freq_map[value] + + def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): + global parser + if not parser: + from dateutil import parser + try: + rrkwargs["until"] = parser.parse(value, + ignoretz=kwargs.get("ignoretz"), + tzinfos=kwargs.get("tzinfos")) + except ValueError: + raise ValueError("invalid until date") + + def _handle_WKST(self, rrkwargs, name, value, **kwargs): + rrkwargs["wkst"] = self._weekday_map[value] + + def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwargs): + """ + Two ways to specify this: +1MO or MO(+1) + """ + l = [] + for wday in value.split(','): + if '(' in wday: + # If it's of the form TH(+1), etc. + splt = wday.split('(') + w = splt[0] + n = int(splt[1][:-1]) + elif len(wday): + # If it's of the form +1MO + for i in range(len(wday)): + if wday[i] not in '+-0123456789': + break + n = wday[:i] or None + w = wday[i:] + if n: + n = int(n) + else: + raise ValueError("Invalid (empty) BYDAY specification.") + + l.append(weekdays[self._weekday_map[w]](n)) + rrkwargs["byweekday"] = l + + _handle_BYDAY = _handle_BYWEEKDAY + + def _parse_rfc_rrule(self, line, + dtstart=None, + cache=False, + ignoretz=False, + tzinfos=None): + if line.find(':') != -1: + name, value = line.split(':') + if name != "RRULE": + raise ValueError("unknown parameter name") + else: + value = line + rrkwargs = {} + for pair in value.split(';'): + name, value = pair.split('=') + name = name.upper() + value = value.upper() + try: + getattr(self, "_handle_"+name)(rrkwargs, name, value, + ignoretz=ignoretz, + tzinfos=tzinfos) + except AttributeError: + raise ValueError("unknown parameter '%s'" % name) + except (KeyError, ValueError): + raise ValueError("invalid '%s': %s" % (name, value)) + return rrule(dtstart=dtstart, cache=cache, **rrkwargs) + + def _parse_date_value(self, date_value, parms, rule_tzids, + ignoretz, tzids, tzinfos): + global parser + if not parser: + from dateutil import parser + + datevals = [] + value_found = False + TZID = None + + for parm in parms: + if parm.startswith("TZID="): + try: + tzkey = rule_tzids[parm.split('TZID=')[-1]] + except KeyError: + continue + if tzids is None: + from . import tz + tzlookup = tz.gettz + elif callable(tzids): + tzlookup = tzids + else: + tzlookup = getattr(tzids, 'get', None) + if tzlookup is None: + msg = ('tzids must be a callable, mapping, or None, ' + 'not %s' % tzids) + raise ValueError(msg) + + TZID = tzlookup(tzkey) + continue + + # RFC 5445 3.8.2.4: The VALUE parameter is optional, but may be found + # only once. + if parm not in {"VALUE=DATE-TIME", "VALUE=DATE"}: + raise ValueError("unsupported parm: " + parm) + else: + if value_found: + msg = ("Duplicate value parameter found in: " + parm) + raise ValueError(msg) + value_found = True + + for datestr in date_value.split(','): + date = parser.parse(datestr, ignoretz=ignoretz, tzinfos=tzinfos) + if TZID is not None: + if date.tzinfo is None: + date = date.replace(tzinfo=TZID) + else: + raise ValueError('DTSTART/EXDATE specifies multiple timezone') + datevals.append(date) + + return datevals + + def _parse_rfc(self, s, + dtstart=None, + cache=False, + unfold=False, + forceset=False, + compatible=False, + ignoretz=False, + tzids=None, + tzinfos=None): + global parser + if compatible: + forceset = True + unfold = True + + TZID_NAMES = dict(map( + lambda x: (x.upper(), x), + re.findall('TZID=(?P[^:]+):', s) + )) + s = s.upper() + if not s.strip(): + raise ValueError("empty string") + if unfold: + lines = s.splitlines() + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + else: + lines = s.split() + if (not forceset and len(lines) == 1 and (s.find(':') == -1 or + s.startswith('RRULE:'))): + return self._parse_rfc_rrule(lines[0], cache=cache, + dtstart=dtstart, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + rrulevals = [] + rdatevals = [] + exrulevals = [] + exdatevals = [] + for line in lines: + if not line: + continue + if line.find(':') == -1: + name = "RRULE" + value = line + else: + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError("empty property name") + name = parms[0] + parms = parms[1:] + if name == "RRULE": + for parm in parms: + raise ValueError("unsupported RRULE parm: "+parm) + rrulevals.append(value) + elif name == "RDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError("unsupported RDATE parm: "+parm) + rdatevals.append(value) + elif name == "EXRULE": + for parm in parms: + raise ValueError("unsupported EXRULE parm: "+parm) + exrulevals.append(value) + elif name == "EXDATE": + exdatevals.extend( + self._parse_date_value(value, parms, + TZID_NAMES, ignoretz, + tzids, tzinfos) + ) + elif name == "DTSTART": + dtvals = self._parse_date_value(value, parms, TZID_NAMES, + ignoretz, tzids, tzinfos) + if len(dtvals) != 1: + raise ValueError("Multiple DTSTART values specified:" + + value) + dtstart = dtvals[0] + else: + raise ValueError("unsupported property: "+name) + if (forceset or len(rrulevals) > 1 or rdatevals + or exrulevals or exdatevals): + if not parser and (rdatevals or exdatevals): + from dateutil import parser + rset = rruleset(cache=cache) + for value in rrulevals: + rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in rdatevals: + for datestr in value.split(','): + rset.rdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exrulevals: + rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exdatevals: + rset.exdate(value) + if compatible and dtstart: + rset.rdate(dtstart) + return rset + else: + return self._parse_rfc_rrule(rrulevals[0], + dtstart=dtstart, + cache=cache, + ignoretz=ignoretz, + tzinfos=tzinfos) + + def __call__(self, s, **kwargs): + return self._parse_rfc(s, **kwargs) + + +rrulestr = _rrulestr() + +# vim:ts=4:sw=4:et diff --git a/lib/python3.8/site-packages/dateutil/tz/__init__.py b/lib/python3.8/site-packages/dateutil/tz/__init__.py new file mode 100644 index 0000000..af1352c --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/tz/__init__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from .tz import * +from .tz import __doc__ + +__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", + "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz", + "enfold", "datetime_ambiguous", "datetime_exists", + "resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"] + + +class DeprecatedTzFormatWarning(Warning): + """Warning raised when time zones are parsed from deprecated formats.""" diff --git a/lib/python3.8/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88edfc55a9ba4094c97fe6cd376527896cac3003 GIT binary patch literal 680 zcmY*W&5qMB5Vn&v4cV6M7C3N0xfZFL3tEAM&jWnpchi0xZ$azkx(G zCKw|KA%YpiFoy(gKnh2&fF<07V_3lntg96XULv>!>n{k_Jp3Gz2yVYdn>#-p9@^jm z-*;?IDKrJ8WM=!$7DHnDrYsG&WNv%e6ikxX_N9>A8#GfD_g{_G-Y&e~se7SFIzCg# ztm4-8B<8AYB#<>Q%dMz6W%XN8bxmi;@wJVA62=;GqPc10M@~h}DxsLZ8p6xnv*GS@ z-fCXB46y58G`eQ?4bw`fs&IY$N4~Lhca5JOM+5^R0bmkB;2IBg?9BbsLv*H@FdVY| zJFYTcT-G;=n~Z6mwM=_gshc{3Yxt}j(aq__CK?h-6>}ZYA*Hl#pp#x+Q2L=`a`NcV z;eAEgZ+c|E9_F@g^H#LmPPMFf&tdD}x!gWDE1hNkDECw8tdP0wb4rC0meSMqYApT8 zFYF}w=plJLmHNb|G55w?iy*}TI-E(G`0ptG E0{~UH0RR91 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..030118f74ab385104bad3a588ab7696a4de7f117 GIT binary patch literal 10723 zcmb7KTaVk;cIHi&xp+Lj#&Ls`$H>Jp#@GbJC-pLgI+jj64#l zY*L<#s(GnhG{r%JqCiogKnwfPMNy#WYajXp3iO?CL7xKjvFJn4hkoDMBt^}Pozod` zi=;O9UVH7ezV)p|eSYlNqJh7EaO&-Ue%&zslNaSb2N&0I#E;PUhHnmxq1iG`o?8QJ zXt!)Rw+GJ9X*t76t1_&%s-_WCeB*)Hs`-vz*|J)7zv?>=jn+c27&w0Ifu&mhX@9}5 zJTzNN;rUMtf6-rhX!uKk^T2K``)B-R{hfczU%_+7(BrtjiXN*$6+KpPeZoJ9>yyC> zu8;et?ih`;-$P2HVW#%&U%vjtOe?#}8^sMft@~aQB>iEKF0l23LE@#=WYQ0NQF0wvei6;r#?+Xa-RF*l%WD2oe&njKGV z#c6eCS3VtT6}wR9XKx&KpBO*9btM^&u8jJl%j0n5b$0^)^6qvJ3@*QU4LwG??_A+d zjg$W1N;0|9?nc956gEeD>2c4$H;$9G%msa&ri67ghP7zc&AK(YbZ8r!?+v1^H;6xI z9(Z`8VJU8>;(p?MmFK6}oM3aD%}F+#;24fryrk-wRdc20SgAwn_@36$rbZ+l$72WUqLF{_mmtG(H2%890&+7(mFH)`-$NjAk zYjuzq0>Om&jkZOsCzq;; z$NTZzc=2{L9{3Q{4f=RSxmR5*`L(hrdYE}JJ`*#C&LIEhy`YvFN)DU_I>blhEx zIcF4e}zt$DQ=?}@4CY4GBj3PuB%X2VJ? zKasoITf}9=TNcpsWtzVD#K|sB=l*P5UB?k$L=zY-(>Gd{Z?OA$)`CN z7nN#IWd+C2sn`2xd~@GU06J6qfpydP<5zxV?K}IGX=Q5dRMlF7DD}viRvw!V%s(}! z&J^eG8DFkUZS*~#^{c7%#0KtH9suR#`*onc?9gLNZ3EOQp_NqktJ7-Fm|EWw+$!FG z0S*g2(lxZNLixGj&g?cuM3@0tyyga9b%T+1W<=mPm>Z}t=-A!r-w#4J40bgb0q*v+ zI|bM>cPH4}jTAJiw#EcHc$k_WDjo%0!P=&~5fMVSu?w09yuT5Jf!hVL0F;V;jICW2 zV4Ja!(8Kg|q7_T)sc1-4@(}xi11k^BP-A!yFA%vk`Do6K1jlst0#BtCgy>{D zwS8|dbpY!stq%Jk0#sU!11#K6mxleW!mjc{(PAfOZ;s)IUC~3fS?lhf>}yy#gC31q zYESy3bm8vaDEL^Z2%`e1hhCD_GMG_1M&WVFTPci%|#_qHZb07tY zQyXV#ExQCKP4uG&aqM|KbrVNS=rfj_%1JPc6>HG~&oEc5v)1JKLx|MO;Bn45Nf3D4 zz!8&c_`(A=6jvy-0$&^XxfVl^loM~_&`4@c&K{nR;cWwZP;a+|y|&ZEc6%84<3Z4F zr_1g3mt${`eN$_<{iuuEP*yyMk{HV3BGWn$auld!?;xJfK>fGSZ=Ir$0@Y0i^r!x! zWh&mEBR@87aE-Fq-@^$|2n+VD2lmw5vDE1)IPuhYWIhHn_MJboo);DgG_i2lJ?kxA zo9cQ3RQeWu6JQoUg-2J^Sq!Pgq)IowucB>K)hqbWtUiHB1?mF3(Z)nVZ4f9xn(gio^ZU^0+I71?I?}w5eXd02@OQ$2lWt@k+PLQk9p{-*Ol8GeoFc#1c z0SVC8>1bSIfFX{|Z5CI;Rgm^4+cqLl`5)>7DIqoZ=vbn$o2LEuzPnud1N*P9pOPL#$bg>`z!#MH6ZXnyFUVg5) z!xR~xU_E{fpH;u^FW|El)OAvfGQ zfs8H3N0wmV=LQ|q1q z-iBwUc7BHY;2qK3sk00(ZdAX!R%QraYzM;oL8)mIBuf`|J! zbi2E19MC1Pf?V1)+`ffOl=qRJ1!}h+m!kF(vbn{n$7MV?qhV z2_4W_XX?OgEbrd{R)y|w21sW?FG$^(iz0^vgd{Ksu^2I-3kCmL%S^}vM2!GYdGcEf zhlef7o@OoLVq@(PJxlejfW%2vooLu z3Kkm#$h_?0h94&vnVxb$B%XjmO@Xmv#elg~Ajt*nOQNZ_kk4`jUN=F!cf;{;6GRxx zA`y!LwM^&}6cLI6fe=YshaL_nm$Z?&M5J&Z_B?3lWleG_&Yz3P=mV9NoJCg@FefMZ z{|;4xgiQG|9F4#oq8?PNiV%=h61KhjBk5soZUA2ly8ZsDt1MR>aO*PRU8j9S;$K0{zLEnLBFMCSiWYxEiK#EwzqL2Lw?+ z!@Ym!{NxpeIXRYtgUmZOArYaNa2pr!|E!?sn>%%Njw!0g@ z;UL9zKp9P>swP9|HxiPH{vGtM>T#y_a|}SW@BX(OfIg8_(i5O(@VI;+bwe>Lk3ftC z?6NlVdq707-TBu?j=)?s?@)?Qclw|`Fe12b=E2N9CFlrX>;~?ooiN(HfZp9AEMeCH^!+$NB+8zO-(}H(90*^bNRR*~2oCBUHXpNLe9vG)G8u5i1n|!f z%%4^SC=U1}62nY}|G?9dtr*9dz}BnMf+N@MRbE?@)tS5Mv}Dd>>8*vwUciOKaq}@> z3Lu?>A6kz=2@@8J;H%#-Kd{vAqN7k1kQ8Qv>Qgqd5@$wF)F-@4_&6ZG5b^)Uea){| z7VTwway*waTiHfqQ89T@SJ+%-^BNnXte#Ismg&jOOYDB0@Ti~S+rP#k86dJ;r~W+t z?fT2ebopHu$K0QdtLr%837X%8)dw}r>%rzTUQbr<9|O~0^jG}j_+0W={S)|H4vzUJ z{Zmo{UGY!j<<=ShEbg!R&-v%@c_KJ@?^NrQe;SH@K3z&CiZ7VRL%d%@F7fBQYQ&P% zCf@ge9|%(^r3(T!gtd6aj>u>Bq>dGa;1erQ0*f{o4p?c+_Opm*^ANKg1eOTkiT`o0$l`mS#l4k zRj5J|5HdF3Q#1C5mv#sh8Hj!8_Qrra_&k({Tyz3Sn2{B`1!3d7=AWqzIYQ*-WorPm zNLgsFR5G1`BDJyY#Q=g%XWjiMiUt8TJ;(P_dd00~`8t+uE7mW%$J1F(0HLmMH{!%E z?yS3qK$hzi*vV0LmWjDDbIR2SeB@Rj;tHSE)HO>+$=nJVyv%7 zN2VOIFep%!=^&pB?)T+gmuwcdlKXh)?#(qqZzj-SZx$a!jF~QvNKs`f^w2649X=~} z>yq~6e>^8YB05Pvl_1F`L-EN@tc}UbCEFk?INEm`W_k*>>reByd4Vr=5_K8F9sp4m z2eniE1e53F>~v|GX5L{A@d<7`MAAz*DIvav*T8jkmNHK*<)UK5z zkj$?@-NrNNs)$c$&72{1S|5M*b9Dz_9u$|Mx_P9y$IIeEA9I4zBno9SWzUtZR-d9= z5v{c#qS4H8O1<**D0a>tIog9y33qk+{q&D|0^z-8vIy|5W-hb zK&lEmK;a0satjQ>cvPE$F_4E(ExeMl!QW9`yjOpl4ByGlc+csvY-HYBV38Ols4AXa zoL2G5%G$3@YwE8!+P$UcjQx7JDCc#aC(F~?vJw3wdLNtC`Fd-AAz7K$r}&MDFp}zI z&CMx)&JY33#3RCi{CYxuE}%)cx`qX-x6o{;4|z&j*Ep`;<~ehiS+!D#8p7}_HmDca z;UhMmv5{K)GV1gIKum>@mxPs3A-FkUxvTm4gR&%;*Ezd*?Z02lim$6$$XqQP(llEv;=- zhpQTgMG;z`)S~(v4f+=Kt+aw5tdi6Y@M`G*siS5)TstkNqV;3%;qs5oa^s*~HJ4VyC zaiCh6$2Lp*t~mA)F;^_~ZzzHolQnsvY;6a_$;O;#@d+NHUm7ice6?fII3%u$fg`t~ z^`{jnBpC3s2g<@jQ=*=%5D22!1J9kF!M z4HC3=`%!8719U@oXq-MWapSKTG;T`XTj%8$Y~-~J)grM^i3_~JOX30N1zK!l_73lP zyjRu9Ki`U~z#n&^l#;H*J>*sE@1ye)#dUE4Z#aXjZ?V2;nTyr>PwHpuXX?v1xAE4~ zuG@;e@tZfv^z)C^)Q@ASO7r~CU_`(3S8Ch+{lLSBO2->A$# z43tf1dI&-gK~vJBO-ixvrC!s6x1ahw)?{vsrG;M53@G`Eh=K?n6A{Sbq2CNaFNzTK z(CH=6OQH;VS(aeF40=UWL9aT!BD@_E)t-V?5>Z<+?Vc1eHSsoRmHSFaCB>KR#DH4l zW>3jjB)E9~@lOat8 z&`;>xk$57u7oh1^KnRi%P7F0(Mh?A>pV7?w&4p)&9MkQH*~{~Xao+B06ZaEo3wkt^ zN)_M`8{&A|aDMDtKS{M^vD(!(=Tnh7`BINqy8{Xx>Bs| z?@5`i-TtrzBl{n3h}g)HX{Q@zyun*>Vg{-$_4@EYmB1V}jfo{RpyNyP{;lVZEZiC+ zkl$Q4K*>l4Zr%;m)%@lY|HwrGXLg7RU{SXKd zXB}NcUtMTIT4m1Z1YMbbJWw{F>5Cw8P&q)6rZ0Q|5Ce}MjJI6a4;BKM2k}1c$J-jx zp&0-&qknn`9N10Aw?0peRDH-{BN+f()Cd#UFnh6SC}~EjuN!frrKH|#A5@N^=z0gMZY!Pf_USVnWO9ZJb+fMz^uZB>Jo}8C|tN^!o}=mn83B}ypSr? zpB*tI%-M(m{YaAuq+Vd_;L!b6OH1>t_@U=6es4j?kO_6b^NfFp0AvE<$qOc!6y10z z0FKAr_EXGkRI?FXI zNAQDL(kcFamts{2CncC=M^FtrVdmc>ri{HqNJ^*DW$G8yI#s00uTUi)k~`!Z@-6v+ zWDL^eZ*M_4XHe)&RI}x_&LOEV>9%GDCQiAQzzU(&YdGfbN@L3a7a?2mC^b{4-he69 zaPz~#(E6$DtJhI2g4#B+7ZqFqvJ4A_4F(Qz*6+%LWvrhTCfu(v0T}xWUg%wb41~1& zFJmFS=-27$`PrBjtnK5%GN~{hQ@YMb<$BH}T0+{LRHLw{a3q1Y@L-ZRq3P=&&Ty+J zfLD(xuqyy|g-`|IkIkt6ky`2+*o{i+Rd^}%!LBaYI71+$*vtja7ueHy&g6_b>J7Am z$e%yR@$dQcxeNOi>Er&KPXltwovj4pnm-HV$zXJjBv5~rNOBt>P9~lsiTfNlB?&tr zNdd@{lLW{FBq_q4f+I-?BSlE~(Cwf36!mHYS1eWdQ`CP3lln3U0$2ysFC+d;08ii^(Jl2J9(*3Q--n5h zpv|z2BT?0c_~C+|dXDf8RJM`~(p0(AJ-;d*o!UNB< dZNq!hZ-r0sqekPue--Xj^{RfoQV;6a{{zB8bP)gm literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dd1e1ae5e02aae418cd863fa63728d7b20a18b4 GIT binary patch literal 44848 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

    *lv(SVf-Twhi5Y#cqUihHUx%7 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/tz/_common.py b/lib/python3.8/site-packages/dateutil/tz/_common.py new file mode 100644 index 0000000..e6ac118 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/tz/_common.py @@ -0,0 +1,419 @@ +from six import PY2 + +from functools import wraps + +from datetime import datetime, timedelta, tzinfo + + +ZERO = timedelta(0) + +__all__ = ['tzname_in_python2', 'enfold'] + + +def tzname_in_python2(namefunc): + """Change unicode output into bytestrings in Python 2 + + tzname() API changed in Python 3. It used to return bytes, but was changed + to unicode strings + """ + if PY2: + @wraps(namefunc) + def adjust_encoding(*args, **kwargs): + name = namefunc(*args, **kwargs) + if name is not None: + name = name.encode() + + return name + + return adjust_encoding + else: + return namefunc + + +# The following is adapted from Alexander Belopolsky's tz library +# https://github.com/abalkin/tz +if hasattr(datetime, 'fold'): + # This is the pre-python 3.6 fold situation + def enfold(dt, fold=1): + """ + Provides a unified interface for assigning the ``fold`` attribute to + datetimes both before and after the implementation of PEP-495. + + :param fold: + The value for the ``fold`` attribute in the returned datetime. This + should be either 0 or 1. + + :return: + Returns an object for which ``getattr(dt, 'fold', 0)`` returns + ``fold`` for all versions of Python. In versions prior to + Python 3.6, this is a ``_DatetimeWithFold`` object, which is a + subclass of :py:class:`datetime.datetime` with the ``fold`` + attribute added, if ``fold`` is 1. + + .. versionadded:: 2.6.0 + """ + return dt.replace(fold=fold) + +else: + class _DatetimeWithFold(datetime): + """ + This is a class designed to provide a PEP 495-compliant interface for + Python versions before 3.6. It is used only for dates in a fold, so + the ``fold`` attribute is fixed at ``1``. + + .. versionadded:: 2.6.0 + """ + __slots__ = () + + def replace(self, *args, **kwargs): + """ + Return a datetime with the same attributes, except for those + attributes given new values by whichever keyword arguments are + specified. Note that tzinfo=None can be specified to create a naive + datetime from an aware datetime with no conversion of date and time + data. + + This is reimplemented in ``_DatetimeWithFold`` because pypy3 will + return a ``datetime.datetime`` even if ``fold`` is unchanged. + """ + argnames = ( + 'year', 'month', 'day', 'hour', 'minute', 'second', + 'microsecond', 'tzinfo' + ) + + for arg, argname in zip(args, argnames): + if argname in kwargs: + raise TypeError('Duplicate argument: {}'.format(argname)) + + kwargs[argname] = arg + + for argname in argnames: + if argname not in kwargs: + kwargs[argname] = getattr(self, argname) + + dt_class = self.__class__ if kwargs.get('fold', 1) else datetime + + return dt_class(**kwargs) + + @property + def fold(self): + return 1 + + def enfold(dt, fold=1): + """ + Provides a unified interface for assigning the ``fold`` attribute to + datetimes both before and after the implementation of PEP-495. + + :param fold: + The value for the ``fold`` attribute in the returned datetime. This + should be either 0 or 1. + + :return: + Returns an object for which ``getattr(dt, 'fold', 0)`` returns + ``fold`` for all versions of Python. In versions prior to + Python 3.6, this is a ``_DatetimeWithFold`` object, which is a + subclass of :py:class:`datetime.datetime` with the ``fold`` + attribute added, if ``fold`` is 1. + + .. versionadded:: 2.6.0 + """ + if getattr(dt, 'fold', 0) == fold: + return dt + + args = dt.timetuple()[:6] + args += (dt.microsecond, dt.tzinfo) + + if fold: + return _DatetimeWithFold(*args) + else: + return datetime(*args) + + +def _validate_fromutc_inputs(f): + """ + The CPython version of ``fromutc`` checks that the input is a ``datetime`` + object and that ``self`` is attached as its ``tzinfo``. + """ + @wraps(f) + def fromutc(self, dt): + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + return f(self, dt) + + return fromutc + + +class _tzinfo(tzinfo): + """ + Base class for all ``dateutil`` ``tzinfo`` objects. + """ + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + + dt = dt.replace(tzinfo=self) + + wall_0 = enfold(dt, fold=0) + wall_1 = enfold(dt, fold=1) + + same_offset = wall_0.utcoffset() == wall_1.utcoffset() + same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None) + + return same_dt and not same_offset + + def _fold_status(self, dt_utc, dt_wall): + """ + Determine the fold status of a "wall" datetime, given a representation + of the same datetime as a (naive) UTC datetime. This is calculated based + on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all + datetimes, and that this offset is the actual number of hours separating + ``dt_utc`` and ``dt_wall``. + + :param dt_utc: + Representation of the datetime as UTC + + :param dt_wall: + Representation of the datetime as "wall time". This parameter must + either have a `fold` attribute or have a fold-naive + :class:`datetime.tzinfo` attached, otherwise the calculation may + fail. + """ + if self.is_ambiguous(dt_wall): + delta_wall = dt_wall - dt_utc + _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst())) + else: + _fold = 0 + + return _fold + + def _fold(self, dt): + return getattr(dt, 'fold', 0) + + def _fromutc(self, dt): + """ + Given a timezone-aware datetime in a given timezone, calculates a + timezone-aware datetime in a new timezone. + + Since this is the one time that we *know* we have an unambiguous + datetime object, we take this opportunity to determine whether the + datetime is ambiguous and in a "fold" state (e.g. if it's the first + occurrence, chronologically, of the ambiguous datetime). + + :param dt: + A timezone-aware :class:`datetime.datetime` object. + """ + + # Re-implement the algorithm from Python's datetime.py + dtoff = dt.utcoffset() + if dtoff is None: + raise ValueError("fromutc() requires a non-None utcoffset() " + "result") + + # The original datetime.py code assumes that `dst()` defaults to + # zero during ambiguous times. PEP 495 inverts this presumption, so + # for pre-PEP 495 versions of python, we need to tweak the algorithm. + dtdst = dt.dst() + if dtdst is None: + raise ValueError("fromutc() requires a non-None dst() result") + delta = dtoff - dtdst + + dt += delta + # Set fold=1 so we can default to being in the fold for + # ambiguous dates. + dtdst = enfold(dt, fold=1).dst() + if dtdst is None: + raise ValueError("fromutc(): dt.dst gave inconsistent " + "results; cannot convert") + return dt + dtdst + + @_validate_fromutc_inputs + def fromutc(self, dt): + """ + Given a timezone-aware datetime in a given timezone, calculates a + timezone-aware datetime in a new timezone. + + Since this is the one time that we *know* we have an unambiguous + datetime object, we take this opportunity to determine whether the + datetime is ambiguous and in a "fold" state (e.g. if it's the first + occurrence, chronologically, of the ambiguous datetime). + + :param dt: + A timezone-aware :class:`datetime.datetime` object. + """ + dt_wall = self._fromutc(dt) + + # Calculate the fold status given the two datetimes. + _fold = self._fold_status(dt, dt_wall) + + # Set the default fold value for ambiguous dates + return enfold(dt_wall, fold=_fold) + + +class tzrangebase(_tzinfo): + """ + This is an abstract base class for time zones represented by an annual + transition into and out of DST. Child classes should implement the following + methods: + + * ``__init__(self, *args, **kwargs)`` + * ``transitions(self, year)`` - this is expected to return a tuple of + datetimes representing the DST on and off transitions in standard + time. + + A fully initialized ``tzrangebase`` subclass should also provide the + following attributes: + * ``hasdst``: Boolean whether or not the zone uses DST. + * ``_dst_offset`` / ``_std_offset``: :class:`datetime.timedelta` objects + representing the respective UTC offsets. + * ``_dst_abbr`` / ``_std_abbr``: Strings representing the timezone short + abbreviations in DST and STD, respectively. + * ``_hasdst``: Whether or not the zone has DST. + + .. versionadded:: 2.6.0 + """ + def __init__(self): + raise NotImplementedError('tzrangebase is an abstract base class') + + def utcoffset(self, dt): + isdst = self._isdst(dt) + + if isdst is None: + return None + elif isdst: + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + isdst = self._isdst(dt) + + if isdst is None: + return None + elif isdst: + return self._dst_base_offset + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + if self._isdst(dt): + return self._dst_abbr + else: + return self._std_abbr + + def fromutc(self, dt): + """ Given a datetime in UTC, return local time """ + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + # Get transitions - if there are none, fixed offset + transitions = self.transitions(dt.year) + if transitions is None: + return dt + self.utcoffset(dt) + + # Get the transition times in UTC + dston, dstoff = transitions + + dston -= self._std_offset + dstoff -= self._std_offset + + utc_transitions = (dston, dstoff) + dt_utc = dt.replace(tzinfo=None) + + isdst = self._naive_isdst(dt_utc, utc_transitions) + + if isdst: + dt_wall = dt + self._dst_offset + else: + dt_wall = dt + self._std_offset + + _fold = int(not isdst and self.is_ambiguous(dt_wall)) + + return enfold(dt_wall, fold=_fold) + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + if not self.hasdst: + return False + + start, end = self.transitions(dt.year) + + dt = dt.replace(tzinfo=None) + return (end <= dt < end + self._dst_base_offset) + + def _isdst(self, dt): + if not self.hasdst: + return False + elif dt is None: + return None + + transitions = self.transitions(dt.year) + + if transitions is None: + return False + + dt = dt.replace(tzinfo=None) + + isdst = self._naive_isdst(dt, transitions) + + # Handle ambiguous dates + if not isdst and self.is_ambiguous(dt): + return not self._fold(dt) + else: + return isdst + + def _naive_isdst(self, dt, transitions): + dston, dstoff = transitions + + dt = dt.replace(tzinfo=None) + + if dston < dstoff: + isdst = dston <= dt < dstoff + else: + isdst = not dstoff <= dt < dston + + return isdst + + @property + def _dst_base_offset(self): + return self._dst_offset - self._std_offset + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(...)" % self.__class__.__name__ + + __reduce__ = object.__reduce__ diff --git a/lib/python3.8/site-packages/dateutil/tz/_factories.py b/lib/python3.8/site-packages/dateutil/tz/_factories.py new file mode 100644 index 0000000..f8a6589 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/tz/_factories.py @@ -0,0 +1,80 @@ +from datetime import timedelta +import weakref +from collections import OrderedDict + +from six.moves import _thread + + +class _TzSingleton(type): + def __init__(cls, *args, **kwargs): + cls.__instance = None + super(_TzSingleton, cls).__init__(*args, **kwargs) + + def __call__(cls): + if cls.__instance is None: + cls.__instance = super(_TzSingleton, cls).__call__() + return cls.__instance + + +class _TzFactory(type): + def instance(cls, *args, **kwargs): + """Alternate constructor that returns a fresh instance""" + return type.__call__(cls, *args, **kwargs) + + +class _TzOffsetFactory(_TzFactory): + def __init__(cls, *args, **kwargs): + cls.__instances = weakref.WeakValueDictionary() + cls.__strong_cache = OrderedDict() + cls.__strong_cache_size = 8 + + cls._cache_lock = _thread.allocate_lock() + + def __call__(cls, name, offset): + if isinstance(offset, timedelta): + key = (name, offset.total_seconds()) + else: + key = (name, offset) + + instance = cls.__instances.get(key, None) + if instance is None: + instance = cls.__instances.setdefault(key, + cls.instance(name, offset)) + + # This lock may not be necessary in Python 3. See GH issue #901 + with cls._cache_lock: + cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) + + # Remove an item if the strong cache is overpopulated + if len(cls.__strong_cache) > cls.__strong_cache_size: + cls.__strong_cache.popitem(last=False) + + return instance + + +class _TzStrFactory(_TzFactory): + def __init__(cls, *args, **kwargs): + cls.__instances = weakref.WeakValueDictionary() + cls.__strong_cache = OrderedDict() + cls.__strong_cache_size = 8 + + cls.__cache_lock = _thread.allocate_lock() + + def __call__(cls, s, posix_offset=False): + key = (s, posix_offset) + instance = cls.__instances.get(key, None) + + if instance is None: + instance = cls.__instances.setdefault(key, + cls.instance(s, posix_offset)) + + # This lock may not be necessary in Python 3. See GH issue #901 + with cls.__cache_lock: + cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) + + # Remove an item if the strong cache is overpopulated + if len(cls.__strong_cache) > cls.__strong_cache_size: + cls.__strong_cache.popitem(last=False) + + return instance + diff --git a/lib/python3.8/site-packages/dateutil/tz/tz.py b/lib/python3.8/site-packages/dateutil/tz/tz.py new file mode 100644 index 0000000..af81e88 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/tz/tz.py @@ -0,0 +1,1849 @@ +# -*- coding: utf-8 -*- +""" +This module offers timezone implementations subclassing the abstract +:py:class:`datetime.tzinfo` type. There are classes to handle tzfile format +files (usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, +etc), TZ environment string (in all known formats), given ranges (with help +from relative deltas), local machine timezone, fixed offset timezone, and UTC +timezone. +""" +import datetime +import struct +import time +import sys +import os +import bisect +import weakref +from collections import OrderedDict + +import six +from six import string_types +from six.moves import _thread +from ._common import tzname_in_python2, _tzinfo +from ._common import tzrangebase, enfold +from ._common import _validate_fromutc_inputs + +from ._factories import _TzSingleton, _TzOffsetFactory +from ._factories import _TzStrFactory +try: + from .win import tzwin, tzwinlocal +except ImportError: + tzwin = tzwinlocal = None + +# For warning about rounding tzinfo +from warnings import warn + +ZERO = datetime.timedelta(0) +EPOCH = datetime.datetime.utcfromtimestamp(0) +EPOCHORDINAL = EPOCH.toordinal() + + +@six.add_metaclass(_TzSingleton) +class tzutc(datetime.tzinfo): + """ + This is a tzinfo object that represents the UTC time zone. + + **Examples:** + + .. doctest:: + + >>> from datetime import * + >>> from dateutil.tz import * + + >>> datetime.now() + datetime.datetime(2003, 9, 27, 9, 40, 1, 521290) + + >>> datetime.now(tzutc()) + datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc()) + + >>> datetime.now(tzutc()).tzname() + 'UTC' + + .. versionchanged:: 2.7.0 + ``tzutc()`` is now a singleton, so the result of ``tzutc()`` will + always return the same object. + + .. doctest:: + + >>> from dateutil.tz import tzutc, UTC + >>> tzutc() is tzutc() + True + >>> tzutc() is UTC + True + """ + def utcoffset(self, dt): + return ZERO + + def dst(self, dt): + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return "UTC" + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + return False + + @_validate_fromutc_inputs + def fromutc(self, dt): + """ + Fast track version of fromutc() returns the original ``dt`` object for + any valid :py:class:`datetime.datetime` object. + """ + return dt + + def __eq__(self, other): + if not isinstance(other, (tzutc, tzoffset)): + return NotImplemented + + return (isinstance(other, tzutc) or + (isinstance(other, tzoffset) and other._offset == ZERO)) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +#: Convenience constant providing a :class:`tzutc()` instance +#: +#: .. versionadded:: 2.7.0 +UTC = tzutc() + + +@six.add_metaclass(_TzOffsetFactory) +class tzoffset(datetime.tzinfo): + """ + A simple class for representing a fixed offset from UTC. + + :param name: + The timezone name, to be returned when ``tzname()`` is called. + :param offset: + The time zone offset in seconds, or (since version 2.6.0, represented + as a :py:class:`datetime.timedelta` object). + """ + def __init__(self, name, offset): + self._name = name + + try: + # Allow a timedelta + offset = offset.total_seconds() + except (TypeError, AttributeError): + pass + + self._offset = datetime.timedelta(seconds=_get_supported_offset(offset)) + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._name + + @_validate_fromutc_inputs + def fromutc(self, dt): + return dt + self._offset + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + return False + + def __eq__(self, other): + if not isinstance(other, tzoffset): + return NotImplemented + + return self._offset == other._offset + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(%s, %s)" % (self.__class__.__name__, + repr(self._name), + int(self._offset.total_seconds())) + + __reduce__ = object.__reduce__ + + +class tzlocal(_tzinfo): + """ + A :class:`tzinfo` subclass built around the ``time`` timezone functions. + """ + def __init__(self): + super(tzlocal, self).__init__() + + self._std_offset = datetime.timedelta(seconds=-time.timezone) + if time.daylight: + self._dst_offset = datetime.timedelta(seconds=-time.altzone) + else: + self._dst_offset = self._std_offset + + self._dst_saved = self._dst_offset - self._std_offset + self._hasdst = bool(self._dst_saved) + self._tznames = tuple(time.tzname) + + def utcoffset(self, dt): + if dt is None and self._hasdst: + return None + + if self._isdst(dt): + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + if dt is None and self._hasdst: + return None + + if self._isdst(dt): + return self._dst_offset - self._std_offset + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._tznames[self._isdst(dt)] + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + naive_dst = self._naive_is_dst(dt) + return (not naive_dst and + (naive_dst != self._naive_is_dst(dt - self._dst_saved))) + + def _naive_is_dst(self, dt): + timestamp = _datetime_to_timestamp(dt) + return time.localtime(timestamp + time.timezone).tm_isdst + + def _isdst(self, dt, fold_naive=True): + # We can't use mktime here. It is unstable when deciding if + # the hour near to a change is DST or not. + # + # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, + # dt.minute, dt.second, dt.weekday(), 0, -1)) + # return time.localtime(timestamp).tm_isdst + # + # The code above yields the following result: + # + # >>> import tz, datetime + # >>> t = tz.tzlocal() + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # + # Here is a more stable implementation: + # + if not self._hasdst: + return False + + # Check for ambiguous times: + dstval = self._naive_is_dst(dt) + fold = getattr(dt, 'fold', None) + + if self.is_ambiguous(dt): + if fold is not None: + return not self._fold(dt) + else: + return True + + return dstval + + def __eq__(self, other): + if isinstance(other, tzlocal): + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset) + elif isinstance(other, tzutc): + return (not self._hasdst and + self._tznames[0] in {'UTC', 'GMT'} and + self._std_offset == ZERO) + elif isinstance(other, tzoffset): + return (not self._hasdst and + self._tznames[0] == other._name and + self._std_offset == other._offset) + else: + return NotImplemented + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +class _ttinfo(object): + __slots__ = ["offset", "delta", "isdst", "abbr", + "isstd", "isgmt", "dstoffset"] + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def __repr__(self): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, repr(value))) + return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) + + def __eq__(self, other): + if not isinstance(other, _ttinfo): + return NotImplemented + + return (self.offset == other.offset and + self.delta == other.delta and + self.isdst == other.isdst and + self.abbr == other.abbr and + self.isstd == other.isstd and + self.isgmt == other.isgmt and + self.dstoffset == other.dstoffset) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __getstate__(self): + state = {} + for name in self.__slots__: + state[name] = getattr(self, name, None) + return state + + def __setstate__(self, state): + for name in self.__slots__: + if name in state: + setattr(self, name, state[name]) + + +class _tzfile(object): + """ + Lightweight class for holding the relevant transition and time zone + information read from binary tzfiles. + """ + attrs = ['trans_list', 'trans_list_utc', 'trans_idx', 'ttinfo_list', + 'ttinfo_std', 'ttinfo_dst', 'ttinfo_before', 'ttinfo_first'] + + def __init__(self, **kwargs): + for attr in self.attrs: + setattr(self, attr, kwargs.get(attr, None)) + + +class tzfile(_tzinfo): + """ + This is a ``tzinfo`` subclass that allows one to use the ``tzfile(5)`` + format timezone files to extract current and historical zone information. + + :param fileobj: + This can be an opened file stream or a file name that the time zone + information can be read from. + + :param filename: + This is an optional parameter specifying the source of the time zone + information in the event that ``fileobj`` is a file object. If omitted + and ``fileobj`` is a file stream, this parameter will be set either to + ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``. + + See `Sources for Time Zone and Daylight Saving Time Data + `_ for more information. + Time zone files can be compiled from the `IANA Time Zone database files + `_ with the `zic time zone compiler + `_ + + .. note:: + + Only construct a ``tzfile`` directly if you have a specific timezone + file on disk that you want to read into a Python ``tzinfo`` object. + If you want to get a ``tzfile`` representing a specific IANA zone, + (e.g. ``'America/New_York'``), you should call + :func:`dateutil.tz.gettz` with the zone identifier. + + + **Examples:** + + Using the US Eastern time zone as an example, we can see that a ``tzfile`` + provides time zone information for the standard Daylight Saving offsets: + + .. testsetup:: tzfile + + from dateutil.tz import gettz + from datetime import datetime + + .. doctest:: tzfile + + >>> NYC = gettz('America/New_York') + >>> NYC + tzfile('/usr/share/zoneinfo/America/New_York') + + >>> print(datetime(2016, 1, 3, tzinfo=NYC)) # EST + 2016-01-03 00:00:00-05:00 + + >>> print(datetime(2016, 7, 7, tzinfo=NYC)) # EDT + 2016-07-07 00:00:00-04:00 + + + The ``tzfile`` structure contains a fully history of the time zone, + so historical dates will also have the right offsets. For example, before + the adoption of the UTC standards, New York used local solar mean time: + + .. doctest:: tzfile + + >>> print(datetime(1901, 4, 12, tzinfo=NYC)) # LMT + 1901-04-12 00:00:00-04:56 + + And during World War II, New York was on "Eastern War Time", which was a + state of permanent daylight saving time: + + .. doctest:: tzfile + + >>> print(datetime(1944, 2, 7, tzinfo=NYC)) # EWT + 1944-02-07 00:00:00-04:00 + + """ + + def __init__(self, fileobj, filename=None): + super(tzfile, self).__init__() + + file_opened_here = False + if isinstance(fileobj, string_types): + self._filename = fileobj + fileobj = open(fileobj, 'rb') + file_opened_here = True + elif filename is not None: + self._filename = filename + elif hasattr(fileobj, "name"): + self._filename = fileobj.name + else: + self._filename = repr(fileobj) + + if fileobj is not None: + if not file_opened_here: + fileobj = _nullcontext(fileobj) + + with fileobj as file_stream: + tzobj = self._read_tzfile(file_stream) + + self._set_tzdata(tzobj) + + def _set_tzdata(self, tzobj): + """ Set the time zone data of this object from a _tzfile object """ + # Copy the relevant attributes over as private attributes + for attr in _tzfile.attrs: + setattr(self, '_' + attr, getattr(tzobj, attr)) + + def _read_tzfile(self, fileobj): + out = _tzfile() + + # From tzfile(5): + # + # The time zone information files used by tzset(3) + # begin with the magic characters "TZif" to identify + # them as time zone information files, followed by + # sixteen bytes reserved for future use, followed by + # six four-byte values of type long, written in a + # ``standard'' byte order (the high-order byte + # of the value is written first). + if fileobj.read(4).decode() != "TZif": + raise ValueError("magic not found") + + fileobj.read(16) + + ( + # The number of UTC/local indicators stored in the file. + ttisgmtcnt, + + # The number of standard/wall indicators stored in the file. + ttisstdcnt, + + # The number of leap seconds for which data is + # stored in the file. + leapcnt, + + # The number of "transition times" for which data + # is stored in the file. + timecnt, + + # The number of "local time types" for which data + # is stored in the file (must not be zero). + typecnt, + + # The number of characters of "time zone + # abbreviation strings" stored in the file. + charcnt, + + ) = struct.unpack(">6l", fileobj.read(24)) + + # The above header is followed by tzh_timecnt four-byte + # values of type long, sorted in ascending order. + # These values are written in ``standard'' byte order. + # Each is used as a transition time (as returned by + # time(2)) at which the rules for computing local time + # change. + + if timecnt: + out.trans_list_utc = list(struct.unpack(">%dl" % timecnt, + fileobj.read(timecnt*4))) + else: + out.trans_list_utc = [] + + # Next come tzh_timecnt one-byte values of type unsigned + # char; each one tells which of the different types of + # ``local time'' types described in the file is associated + # with the same-indexed transition time. These values + # serve as indices into an array of ttinfo structures that + # appears next in the file. + + if timecnt: + out.trans_idx = struct.unpack(">%dB" % timecnt, + fileobj.read(timecnt)) + else: + out.trans_idx = [] + + # Each ttinfo structure is written as a four-byte value + # for tt_gmtoff of type long, in a standard byte + # order, followed by a one-byte value for tt_isdst + # and a one-byte value for tt_abbrind. In each + # structure, tt_gmtoff gives the number of + # seconds to be added to UTC, tt_isdst tells whether + # tm_isdst should be set by localtime(3), and + # tt_abbrind serves as an index into the array of + # time zone abbreviation characters that follow the + # ttinfo structure(s) in the file. + + ttinfo = [] + + for i in range(typecnt): + ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) + + abbr = fileobj.read(charcnt).decode() + + # Then there are tzh_leapcnt pairs of four-byte + # values, written in standard byte order; the + # first value of each pair gives the time (as + # returned by time(2)) at which a leap second + # occurs; the second gives the total number of + # leap seconds to be applied after the given time. + # The pairs of values are sorted in ascending order + # by time. + + # Not used, for now (but seek for correct file position) + if leapcnt: + fileobj.seek(leapcnt * 8, os.SEEK_CUR) + + # Then there are tzh_ttisstdcnt standard/wall + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as standard + # time or wall clock time, and are used when + # a time zone file is used in handling POSIX-style + # time zone environment variables. + + if ttisstdcnt: + isstd = struct.unpack(">%db" % ttisstdcnt, + fileobj.read(ttisstdcnt)) + + # Finally, there are tzh_ttisgmtcnt UTC/local + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as UTC or + # local time, and are used when a time zone file + # is used in handling POSIX-style time zone envi- + # ronment variables. + + if ttisgmtcnt: + isgmt = struct.unpack(">%db" % ttisgmtcnt, + fileobj.read(ttisgmtcnt)) + + # Build ttinfo list + out.ttinfo_list = [] + for i in range(typecnt): + gmtoff, isdst, abbrind = ttinfo[i] + gmtoff = _get_supported_offset(gmtoff) + tti = _ttinfo() + tti.offset = gmtoff + tti.dstoffset = datetime.timedelta(0) + tti.delta = datetime.timedelta(seconds=gmtoff) + tti.isdst = isdst + tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] + tti.isstd = (ttisstdcnt > i and isstd[i] != 0) + tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) + out.ttinfo_list.append(tti) + + # Replace ttinfo indexes for ttinfo objects. + out.trans_idx = [out.ttinfo_list[idx] for idx in out.trans_idx] + + # Set standard, dst, and before ttinfos. before will be + # used when a given time is before any transitions, + # and will be set to the first non-dst ttinfo, or to + # the first dst, if all of them are dst. + out.ttinfo_std = None + out.ttinfo_dst = None + out.ttinfo_before = None + if out.ttinfo_list: + if not out.trans_list_utc: + out.ttinfo_std = out.ttinfo_first = out.ttinfo_list[0] + else: + for i in range(timecnt-1, -1, -1): + tti = out.trans_idx[i] + if not out.ttinfo_std and not tti.isdst: + out.ttinfo_std = tti + elif not out.ttinfo_dst and tti.isdst: + out.ttinfo_dst = tti + + if out.ttinfo_std and out.ttinfo_dst: + break + else: + if out.ttinfo_dst and not out.ttinfo_std: + out.ttinfo_std = out.ttinfo_dst + + for tti in out.ttinfo_list: + if not tti.isdst: + out.ttinfo_before = tti + break + else: + out.ttinfo_before = out.ttinfo_list[0] + + # Now fix transition times to become relative to wall time. + # + # I'm not sure about this. In my tests, the tz source file + # is setup to wall time, and in the binary file isstd and + # isgmt are off, so it should be in wall time. OTOH, it's + # always in gmt time. Let me know if you have comments + # about this. + lastdst = None + lastoffset = None + lastdstoffset = None + lastbaseoffset = None + out.trans_list = [] + + for i, tti in enumerate(out.trans_idx): + offset = tti.offset + dstoffset = 0 + + if lastdst is not None: + if tti.isdst: + if not lastdst: + dstoffset = offset - lastoffset + + if not dstoffset and lastdstoffset: + dstoffset = lastdstoffset + + tti.dstoffset = datetime.timedelta(seconds=dstoffset) + lastdstoffset = dstoffset + + # If a time zone changes its base offset during a DST transition, + # then you need to adjust by the previous base offset to get the + # transition time in local time. Otherwise you use the current + # base offset. Ideally, I would have some mathematical proof of + # why this is true, but I haven't really thought about it enough. + baseoffset = offset - dstoffset + adjustment = baseoffset + if (lastbaseoffset is not None and baseoffset != lastbaseoffset + and tti.isdst != lastdst): + # The base DST has changed + adjustment = lastbaseoffset + + lastdst = tti.isdst + lastoffset = offset + lastbaseoffset = baseoffset + + out.trans_list.append(out.trans_list_utc[i] + adjustment) + + out.trans_idx = tuple(out.trans_idx) + out.trans_list = tuple(out.trans_list) + out.trans_list_utc = tuple(out.trans_list_utc) + + return out + + def _find_last_transition(self, dt, in_utc=False): + # If there's no list, there are no transitions to find + if not self._trans_list: + return None + + timestamp = _datetime_to_timestamp(dt) + + # Find where the timestamp fits in the transition list - if the + # timestamp is a transition time, it's part of the "after" period. + trans_list = self._trans_list_utc if in_utc else self._trans_list + idx = bisect.bisect_right(trans_list, timestamp) + + # We want to know when the previous transition was, so subtract off 1 + return idx - 1 + + def _get_ttinfo(self, idx): + # For no list or after the last transition, default to _ttinfo_std + if idx is None or (idx + 1) >= len(self._trans_list): + return self._ttinfo_std + + # If there is a list and the time is before it, return _ttinfo_before + if idx < 0: + return self._ttinfo_before + + return self._trans_idx[idx] + + def _find_ttinfo(self, dt): + idx = self._resolve_ambiguous_time(dt) + + return self._get_ttinfo(idx) + + def fromutc(self, dt): + """ + The ``tzfile`` implementation of :py:func:`datetime.tzinfo.fromutc`. + + :param dt: + A :py:class:`datetime.datetime` object. + + :raises TypeError: + Raised if ``dt`` is not a :py:class:`datetime.datetime` object. + + :raises ValueError: + Raised if this is called with a ``dt`` which does not have this + ``tzinfo`` attached. + + :return: + Returns a :py:class:`datetime.datetime` object representing the + wall time in ``self``'s time zone. + """ + # These isinstance checks are in datetime.tzinfo, so we'll preserve + # them, even if we don't care about duck typing. + if not isinstance(dt, datetime.datetime): + raise TypeError("fromutc() requires a datetime argument") + + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + # First treat UTC as wall time and get the transition we're in. + idx = self._find_last_transition(dt, in_utc=True) + tti = self._get_ttinfo(idx) + + dt_out = dt + datetime.timedelta(seconds=tti.offset) + + fold = self.is_ambiguous(dt_out, idx=idx) + + return enfold(dt_out, fold=int(fold)) + + def is_ambiguous(self, dt, idx=None): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + if idx is None: + idx = self._find_last_transition(dt) + + # Calculate the difference in offsets from current to previous + timestamp = _datetime_to_timestamp(dt) + tti = self._get_ttinfo(idx) + + if idx is None or idx <= 0: + return False + + od = self._get_ttinfo(idx - 1).offset - tti.offset + tt = self._trans_list[idx] # Transition time + + return timestamp < tt + od + + def _resolve_ambiguous_time(self, dt): + idx = self._find_last_transition(dt) + + # If we have no transitions, return the index + _fold = self._fold(dt) + if idx is None or idx == 0: + return idx + + # If it's ambiguous and we're in a fold, shift to a different index. + idx_offset = int(not _fold and self.is_ambiguous(dt, idx)) + + return idx - idx_offset + + def utcoffset(self, dt): + if dt is None: + return None + + if not self._ttinfo_std: + return ZERO + + return self._find_ttinfo(dt).delta + + def dst(self, dt): + if dt is None: + return None + + if not self._ttinfo_dst: + return ZERO + + tti = self._find_ttinfo(dt) + + if not tti.isdst: + return ZERO + + # The documentation says that utcoffset()-dst() must + # be constant for every dt. + return tti.dstoffset + + @tzname_in_python2 + def tzname(self, dt): + if not self._ttinfo_std or dt is None: + return None + return self._find_ttinfo(dt).abbr + + def __eq__(self, other): + if not isinstance(other, tzfile): + return NotImplemented + return (self._trans_list == other._trans_list and + self._trans_idx == other._trans_idx and + self._ttinfo_list == other._ttinfo_list) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) + + def __reduce__(self): + return self.__reduce_ex__(None) + + def __reduce_ex__(self, protocol): + return (self.__class__, (None, self._filename), self.__dict__) + + +class tzrange(tzrangebase): + """ + The ``tzrange`` object is a time zone specified by a set of offsets and + abbreviations, equivalent to the way the ``TZ`` variable can be specified + in POSIX-like systems, but using Python delta objects to specify DST + start, end and offsets. + + :param stdabbr: + The abbreviation for standard time (e.g. ``'EST'``). + + :param stdoffset: + An integer or :class:`datetime.timedelta` object or equivalent + specifying the base offset from UTC. + + If unspecified, +00:00 is used. + + :param dstabbr: + The abbreviation for DST / "Summer" time (e.g. ``'EDT'``). + + If specified, with no other DST information, DST is assumed to occur + and the default behavior or ``dstoffset``, ``start`` and ``end`` is + used. If unspecified and no other DST information is specified, it + is assumed that this zone has no DST. + + If this is unspecified and other DST information is *is* specified, + DST occurs in the zone but the time zone abbreviation is left + unchanged. + + :param dstoffset: + A an integer or :class:`datetime.timedelta` object or equivalent + specifying the UTC offset during DST. If unspecified and any other DST + information is specified, it is assumed to be the STD offset +1 hour. + + :param start: + A :class:`relativedelta.relativedelta` object or equivalent specifying + the time and time of year that daylight savings time starts. To + specify, for example, that DST starts at 2AM on the 2nd Sunday in + March, pass: + + ``relativedelta(hours=2, month=3, day=1, weekday=SU(+2))`` + + If unspecified and any other DST information is specified, the default + value is 2 AM on the first Sunday in April. + + :param end: + A :class:`relativedelta.relativedelta` object or equivalent + representing the time and time of year that daylight savings time + ends, with the same specification method as in ``start``. One note is + that this should point to the first time in the *standard* zone, so if + a transition occurs at 2AM in the DST zone and the clocks are set back + 1 hour to 1AM, set the ``hours`` parameter to +1. + + + **Examples:** + + .. testsetup:: tzrange + + from dateutil.tz import tzrange, tzstr + + .. doctest:: tzrange + + >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") + True + + >>> from dateutil.relativedelta import * + >>> range1 = tzrange("EST", -18000, "EDT") + >>> range2 = tzrange("EST", -18000, "EDT", -14400, + ... relativedelta(hours=+2, month=4, day=1, + ... weekday=SU(+1)), + ... relativedelta(hours=+1, month=10, day=31, + ... weekday=SU(-1))) + >>> tzstr('EST5EDT') == range1 == range2 + True + + """ + def __init__(self, stdabbr, stdoffset=None, + dstabbr=None, dstoffset=None, + start=None, end=None): + + global relativedelta + from dateutil import relativedelta + + self._std_abbr = stdabbr + self._dst_abbr = dstabbr + + try: + stdoffset = stdoffset.total_seconds() + except (TypeError, AttributeError): + pass + + try: + dstoffset = dstoffset.total_seconds() + except (TypeError, AttributeError): + pass + + if stdoffset is not None: + self._std_offset = datetime.timedelta(seconds=stdoffset) + else: + self._std_offset = ZERO + + if dstoffset is not None: + self._dst_offset = datetime.timedelta(seconds=dstoffset) + elif dstabbr and stdoffset is not None: + self._dst_offset = self._std_offset + datetime.timedelta(hours=+1) + else: + self._dst_offset = ZERO + + if dstabbr and start is None: + self._start_delta = relativedelta.relativedelta( + hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) + else: + self._start_delta = start + + if dstabbr and end is None: + self._end_delta = relativedelta.relativedelta( + hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) + else: + self._end_delta = end + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = bool(self._start_delta) + + def transitions(self, year): + """ + For a given year, get the DST on and off transition times, expressed + always on the standard time side. For zones with no transitions, this + function returns ``None``. + + :param year: + The year whose transitions you would like to query. + + :return: + Returns a :class:`tuple` of :class:`datetime.datetime` objects, + ``(dston, dstoff)`` for zones with an annual DST transition, or + ``None`` for fixed offset zones. + """ + if not self.hasdst: + return None + + base_year = datetime.datetime(year, 1, 1) + + start = base_year + self._start_delta + end = base_year + self._end_delta + + return (start, end) + + def __eq__(self, other): + if not isinstance(other, tzrange): + return NotImplemented + + return (self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr and + self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._start_delta == other._start_delta and + self._end_delta == other._end_delta) + + @property + def _dst_base_offset(self): + return self._dst_base_offset_ + + +@six.add_metaclass(_TzStrFactory) +class tzstr(tzrange): + """ + ``tzstr`` objects are time zone objects specified by a time-zone string as + it would be passed to a ``TZ`` variable on POSIX-style systems (see + the `GNU C Library: TZ Variable`_ for more details). + + There is one notable exception, which is that POSIX-style time zones use an + inverted offset format, so normally ``GMT+3`` would be parsed as an offset + 3 hours *behind* GMT. The ``tzstr`` time zone object will parse this as an + offset 3 hours *ahead* of GMT. If you would like to maintain the POSIX + behavior, pass a ``True`` value to ``posix_offset``. + + The :class:`tzrange` object provides the same functionality, but is + specified using :class:`relativedelta.relativedelta` objects. rather than + strings. + + :param s: + A time zone string in ``TZ`` variable format. This can be a + :class:`bytes` (2.x: :class:`str`), :class:`str` (2.x: + :class:`unicode`) or a stream emitting unicode characters + (e.g. :class:`StringIO`). + + :param posix_offset: + Optional. If set to ``True``, interpret strings such as ``GMT+3`` or + ``UTC+3`` as being 3 hours *behind* UTC rather than ahead, per the + POSIX standard. + + .. caution:: + + Prior to version 2.7.0, this function also supported time zones + in the format: + + * ``EST5EDT,4,0,6,7200,10,0,26,7200,3600`` + * ``EST5EDT,4,1,0,7200,10,-1,0,7200,3600`` + + This format is non-standard and has been deprecated; this function + will raise a :class:`DeprecatedTZFormatWarning` until + support is removed in a future version. + + .. _`GNU C Library: TZ Variable`: + https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + """ + def __init__(self, s, posix_offset=False): + global parser + from dateutil.parser import _parser as parser + + self._s = s + + res = parser._parsetz(s) + if res is None or res.any_unused_tokens: + raise ValueError("unknown string format") + + # Here we break the compatibility with the TZ variable handling. + # GMT-3 actually *means* the timezone -3. + if res.stdabbr in ("GMT", "UTC") and not posix_offset: + res.stdoffset *= -1 + + # We must initialize it first, since _delta() needs + # _std_offset and _dst_offset set. Use False in start/end + # to avoid building it two times. + tzrange.__init__(self, res.stdabbr, res.stdoffset, + res.dstabbr, res.dstoffset, + start=False, end=False) + + if not res.dstabbr: + self._start_delta = None + self._end_delta = None + else: + self._start_delta = self._delta(res.start) + if self._start_delta: + self._end_delta = self._delta(res.end, isend=1) + + self.hasdst = bool(self._start_delta) + + def _delta(self, x, isend=0): + from dateutil import relativedelta + kwargs = {} + if x.month is not None: + kwargs["month"] = x.month + if x.weekday is not None: + kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) + if x.week > 0: + kwargs["day"] = 1 + else: + kwargs["day"] = 31 + elif x.day: + kwargs["day"] = x.day + elif x.yday is not None: + kwargs["yearday"] = x.yday + elif x.jyday is not None: + kwargs["nlyearday"] = x.jyday + if not kwargs: + # Default is to start on first sunday of april, and end + # on last sunday of october. + if not isend: + kwargs["month"] = 4 + kwargs["day"] = 1 + kwargs["weekday"] = relativedelta.SU(+1) + else: + kwargs["month"] = 10 + kwargs["day"] = 31 + kwargs["weekday"] = relativedelta.SU(-1) + if x.time is not None: + kwargs["seconds"] = x.time + else: + # Default is 2AM. + kwargs["seconds"] = 7200 + if isend: + # Convert to standard time, to follow the documented way + # of working with the extra hour. See the documentation + # of the tzinfo class. + delta = self._dst_offset - self._std_offset + kwargs["seconds"] -= delta.seconds + delta.days * 86400 + return relativedelta.relativedelta(**kwargs) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + + +class _tzicalvtzcomp(object): + def __init__(self, tzoffsetfrom, tzoffsetto, isdst, + tzname=None, rrule=None): + self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) + self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) + self.tzoffsetdiff = self.tzoffsetto - self.tzoffsetfrom + self.isdst = isdst + self.tzname = tzname + self.rrule = rrule + + +class _tzicalvtz(_tzinfo): + def __init__(self, tzid, comps=[]): + super(_tzicalvtz, self).__init__() + + self._tzid = tzid + self._comps = comps + self._cachedate = [] + self._cachecomp = [] + self._cache_lock = _thread.allocate_lock() + + def _find_comp(self, dt): + if len(self._comps) == 1: + return self._comps[0] + + dt = dt.replace(tzinfo=None) + + try: + with self._cache_lock: + return self._cachecomp[self._cachedate.index( + (dt, self._fold(dt)))] + except ValueError: + pass + + lastcompdt = None + lastcomp = None + + for comp in self._comps: + compdt = self._find_compdt(comp, dt) + + if compdt and (not lastcompdt or lastcompdt < compdt): + lastcompdt = compdt + lastcomp = comp + + if not lastcomp: + # RFC says nothing about what to do when a given + # time is before the first onset date. We'll look for the + # first standard component, or the first component, if + # none is found. + for comp in self._comps: + if not comp.isdst: + lastcomp = comp + break + else: + lastcomp = comp[0] + + with self._cache_lock: + self._cachedate.insert(0, (dt, self._fold(dt))) + self._cachecomp.insert(0, lastcomp) + + if len(self._cachedate) > 10: + self._cachedate.pop() + self._cachecomp.pop() + + return lastcomp + + def _find_compdt(self, comp, dt): + if comp.tzoffsetdiff < ZERO and self._fold(dt): + dt -= comp.tzoffsetdiff + + compdt = comp.rrule.before(dt, inc=True) + + return compdt + + def utcoffset(self, dt): + if dt is None: + return None + + return self._find_comp(dt).tzoffsetto + + def dst(self, dt): + comp = self._find_comp(dt) + if comp.isdst: + return comp.tzoffsetdiff + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._find_comp(dt).tzname + + def __repr__(self): + return "" % repr(self._tzid) + + __reduce__ = object.__reduce__ + + +class tzical(object): + """ + This object is designed to parse an iCalendar-style ``VTIMEZONE`` structure + as set out in `RFC 5545`_ Section 4.6.5 into one or more `tzinfo` objects. + + :param `fileobj`: + A file or stream in iCalendar format, which should be UTF-8 encoded + with CRLF endings. + + .. _`RFC 5545`: https://tools.ietf.org/html/rfc5545 + """ + def __init__(self, fileobj): + global rrule + from dateutil import rrule + + if isinstance(fileobj, string_types): + self._s = fileobj + # ical should be encoded in UTF-8 with CRLF + fileobj = open(fileobj, 'r') + else: + self._s = getattr(fileobj, 'name', repr(fileobj)) + fileobj = _nullcontext(fileobj) + + self._vtz = {} + + with fileobj as fobj: + self._parse_rfc(fobj.read()) + + def keys(self): + """ + Retrieves the available time zones as a list. + """ + return list(self._vtz.keys()) + + def get(self, tzid=None): + """ + Retrieve a :py:class:`datetime.tzinfo` object by its ``tzid``. + + :param tzid: + If there is exactly one time zone available, omitting ``tzid`` + or passing :py:const:`None` value returns it. Otherwise a valid + key (which can be retrieved from :func:`keys`) is required. + + :raises ValueError: + Raised if ``tzid`` is not specified but there are either more + or fewer than 1 zone defined. + + :returns: + Returns either a :py:class:`datetime.tzinfo` object representing + the relevant time zone or :py:const:`None` if the ``tzid`` was + not found. + """ + if tzid is None: + if len(self._vtz) == 0: + raise ValueError("no timezones defined") + elif len(self._vtz) > 1: + raise ValueError("more than one timezone available") + tzid = next(iter(self._vtz)) + + return self._vtz.get(tzid) + + def _parse_offset(self, s): + s = s.strip() + if not s: + raise ValueError("empty offset") + if s[0] in ('+', '-'): + signal = (-1, +1)[s[0] == '+'] + s = s[1:] + else: + signal = +1 + if len(s) == 4: + return (int(s[:2]) * 3600 + int(s[2:]) * 60) * signal + elif len(s) == 6: + return (int(s[:2]) * 3600 + int(s[2:4]) * 60 + int(s[4:])) * signal + else: + raise ValueError("invalid offset: " + s) + + def _parse_rfc(self, s): + lines = s.splitlines() + if not lines: + raise ValueError("empty string") + + # Unfold + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + + tzid = None + comps = [] + invtz = False + comptype = None + for line in lines: + if not line: + continue + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError("empty property name") + name = parms[0].upper() + parms = parms[1:] + if invtz: + if name == "BEGIN": + if value in ("STANDARD", "DAYLIGHT"): + # Process component + pass + else: + raise ValueError("unknown component: "+value) + comptype = value + founddtstart = False + tzoffsetfrom = None + tzoffsetto = None + rrulelines = [] + tzname = None + elif name == "END": + if value == "VTIMEZONE": + if comptype: + raise ValueError("component not closed: "+comptype) + if not tzid: + raise ValueError("mandatory TZID not found") + if not comps: + raise ValueError( + "at least one component is needed") + # Process vtimezone + self._vtz[tzid] = _tzicalvtz(tzid, comps) + invtz = False + elif value == comptype: + if not founddtstart: + raise ValueError("mandatory DTSTART not found") + if tzoffsetfrom is None: + raise ValueError( + "mandatory TZOFFSETFROM not found") + if tzoffsetto is None: + raise ValueError( + "mandatory TZOFFSETFROM not found") + # Process component + rr = None + if rrulelines: + rr = rrule.rrulestr("\n".join(rrulelines), + compatible=True, + ignoretz=True, + cache=True) + comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, + (comptype == "DAYLIGHT"), + tzname, rr) + comps.append(comp) + comptype = None + else: + raise ValueError("invalid component end: "+value) + elif comptype: + if name == "DTSTART": + # DTSTART in VTIMEZONE takes a subset of valid RRULE + # values under RFC 5545. + for parm in parms: + if parm != 'VALUE=DATE-TIME': + msg = ('Unsupported DTSTART param in ' + + 'VTIMEZONE: ' + parm) + raise ValueError(msg) + rrulelines.append(line) + founddtstart = True + elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): + rrulelines.append(line) + elif name == "TZOFFSETFROM": + if parms: + raise ValueError( + "unsupported %s parm: %s " % (name, parms[0])) + tzoffsetfrom = self._parse_offset(value) + elif name == "TZOFFSETTO": + if parms: + raise ValueError( + "unsupported TZOFFSETTO parm: "+parms[0]) + tzoffsetto = self._parse_offset(value) + elif name == "TZNAME": + if parms: + raise ValueError( + "unsupported TZNAME parm: "+parms[0]) + tzname = value + elif name == "COMMENT": + pass + else: + raise ValueError("unsupported property: "+name) + else: + if name == "TZID": + if parms: + raise ValueError( + "unsupported TZID parm: "+parms[0]) + tzid = value + elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): + pass + else: + raise ValueError("unsupported property: "+name) + elif name == "BEGIN" and value == "VTIMEZONE": + tzid = None + comps = [] + invtz = True + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + + +if sys.platform != "win32": + TZFILES = ["/etc/localtime", "localtime"] + TZPATHS = ["/usr/share/zoneinfo", + "/usr/lib/zoneinfo", + "/usr/share/lib/zoneinfo", + "/etc/zoneinfo"] +else: + TZFILES = [] + TZPATHS = [] + + +def __get_gettz(): + tzlocal_classes = (tzlocal,) + if tzwinlocal is not None: + tzlocal_classes += (tzwinlocal,) + + class GettzFunc(object): + """ + Retrieve a time zone object from a string representation + + This function is intended to retrieve the :py:class:`tzinfo` subclass + that best represents the time zone that would be used if a POSIX + `TZ variable`_ were set to the same value. + + If no argument or an empty string is passed to ``gettz``, local time + is returned: + + .. code-block:: python3 + + >>> gettz() + tzfile('/etc/localtime') + + This function is also the preferred way to map IANA tz database keys + to :class:`tzfile` objects: + + .. code-block:: python3 + + >>> gettz('Pacific/Kiritimati') + tzfile('/usr/share/zoneinfo/Pacific/Kiritimati') + + On Windows, the standard is extended to include the Windows-specific + zone names provided by the operating system: + + .. code-block:: python3 + + >>> gettz('Egypt Standard Time') + tzwin('Egypt Standard Time') + + Passing a GNU ``TZ`` style string time zone specification returns a + :class:`tzstr` object: + + .. code-block:: python3 + + >>> gettz('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') + tzstr('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') + + :param name: + A time zone name (IANA, or, on Windows, Windows keys), location of + a ``tzfile(5)`` zoneinfo file or ``TZ`` variable style time zone + specifier. An empty string, no argument or ``None`` is interpreted + as local time. + + :return: + Returns an instance of one of ``dateutil``'s :py:class:`tzinfo` + subclasses. + + .. versionchanged:: 2.7.0 + + After version 2.7.0, any two calls to ``gettz`` using the same + input strings will return the same object: + + .. code-block:: python3 + + >>> tz.gettz('America/Chicago') is tz.gettz('America/Chicago') + True + + In addition to improving performance, this ensures that + `"same zone" semantics`_ are used for datetimes in the same zone. + + + .. _`TZ variable`: + https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + + .. _`"same zone" semantics`: + https://blog.ganssle.io/articles/2018/02/aware-datetime-arithmetic.html + """ + def __init__(self): + + self.__instances = weakref.WeakValueDictionary() + self.__strong_cache_size = 8 + self.__strong_cache = OrderedDict() + self._cache_lock = _thread.allocate_lock() + + def __call__(self, name=None): + with self._cache_lock: + rv = self.__instances.get(name, None) + + if rv is None: + rv = self.nocache(name=name) + if not (name is None + or isinstance(rv, tzlocal_classes) + or rv is None): + # tzlocal is slightly more complicated than the other + # time zone providers because it depends on environment + # at construction time, so don't cache that. + # + # We also cannot store weak references to None, so we + # will also not store that. + self.__instances[name] = rv + else: + # No need for strong caching, return immediately + return rv + + self.__strong_cache[name] = self.__strong_cache.pop(name, rv) + + if len(self.__strong_cache) > self.__strong_cache_size: + self.__strong_cache.popitem(last=False) + + return rv + + def set_cache_size(self, size): + with self._cache_lock: + self.__strong_cache_size = size + while len(self.__strong_cache) > size: + self.__strong_cache.popitem(last=False) + + def cache_clear(self): + with self._cache_lock: + self.__instances = weakref.WeakValueDictionary() + self.__strong_cache.clear() + + @staticmethod + def nocache(name=None): + """A non-cached version of gettz""" + tz = None + if not name: + try: + name = os.environ["TZ"] + except KeyError: + pass + if name is None or name == ":": + for filepath in TZFILES: + if not os.path.isabs(filepath): + filename = filepath + for path in TZPATHS: + filepath = os.path.join(path, filename) + if os.path.isfile(filepath): + break + else: + continue + if os.path.isfile(filepath): + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = tzlocal() + else: + try: + if name.startswith(":"): + name = name[1:] + except TypeError as e: + if isinstance(name, bytes): + new_msg = "gettz argument should be str, not bytes" + six.raise_from(TypeError(new_msg), e) + else: + raise + if os.path.isabs(name): + if os.path.isfile(name): + tz = tzfile(name) + else: + tz = None + else: + for path in TZPATHS: + filepath = os.path.join(path, name) + if not os.path.isfile(filepath): + filepath = filepath.replace(' ', '_') + if not os.path.isfile(filepath): + continue + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = None + if tzwin is not None: + try: + tz = tzwin(name) + except (WindowsError, UnicodeEncodeError): + # UnicodeEncodeError is for Python 2.7 compat + tz = None + + if not tz: + from dateutil.zoneinfo import get_zonefile_instance + tz = get_zonefile_instance().get(name) + + if not tz: + for c in name: + # name is not a tzstr unless it has at least + # one offset. For short values of "name", an + # explicit for loop seems to be the fastest way + # To determine if a string contains a digit + if c in "0123456789": + try: + tz = tzstr(name) + except ValueError: + pass + break + else: + if name in ("GMT", "UTC"): + tz = UTC + elif name in time.tzname: + tz = tzlocal() + return tz + + return GettzFunc() + + +gettz = __get_gettz() +del __get_gettz + + +def datetime_exists(dt, tz=None): + """ + Given a datetime and a time zone, determine whether or not a given datetime + would fall in a gap. + + :param dt: + A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` + is provided.) + + :param tz: + A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If + ``None`` or not provided, the datetime's own time zone will be used. + + :return: + Returns a boolean value whether or not the "wall time" exists in + ``tz``. + + .. versionadded:: 2.7.0 + """ + if tz is None: + if dt.tzinfo is None: + raise ValueError('Datetime is naive and no time zone provided.') + tz = dt.tzinfo + + dt = dt.replace(tzinfo=None) + + # This is essentially a test of whether or not the datetime can survive + # a round trip to UTC. + dt_rt = dt.replace(tzinfo=tz).astimezone(UTC).astimezone(tz) + dt_rt = dt_rt.replace(tzinfo=None) + + return dt == dt_rt + + +def datetime_ambiguous(dt, tz=None): + """ + Given a datetime and a time zone, determine whether or not a given datetime + is ambiguous (i.e if there are two times differentiated only by their DST + status). + + :param dt: + A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` + is provided.) + + :param tz: + A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If + ``None`` or not provided, the datetime's own time zone will be used. + + :return: + Returns a boolean value whether or not the "wall time" is ambiguous in + ``tz``. + + .. versionadded:: 2.6.0 + """ + if tz is None: + if dt.tzinfo is None: + raise ValueError('Datetime is naive and no time zone provided.') + + tz = dt.tzinfo + + # If a time zone defines its own "is_ambiguous" function, we'll use that. + is_ambiguous_fn = getattr(tz, 'is_ambiguous', None) + if is_ambiguous_fn is not None: + try: + return tz.is_ambiguous(dt) + except Exception: + pass + + # If it doesn't come out and tell us it's ambiguous, we'll just check if + # the fold attribute has any effect on this particular date and time. + dt = dt.replace(tzinfo=tz) + wall_0 = enfold(dt, fold=0) + wall_1 = enfold(dt, fold=1) + + same_offset = wall_0.utcoffset() == wall_1.utcoffset() + same_dst = wall_0.dst() == wall_1.dst() + + return not (same_offset and same_dst) + + +def resolve_imaginary(dt): + """ + Given a datetime that may be imaginary, return an existing datetime. + + This function assumes that an imaginary datetime represents what the + wall time would be in a zone had the offset transition not occurred, so + it will always fall forward by the transition's change in offset. + + .. doctest:: + + >>> from dateutil import tz + >>> from datetime import datetime + >>> NYC = tz.gettz('America/New_York') + >>> print(tz.resolve_imaginary(datetime(2017, 3, 12, 2, 30, tzinfo=NYC))) + 2017-03-12 03:30:00-04:00 + + >>> KIR = tz.gettz('Pacific/Kiritimati') + >>> print(tz.resolve_imaginary(datetime(1995, 1, 1, 12, 30, tzinfo=KIR))) + 1995-01-02 12:30:00+14:00 + + As a note, :func:`datetime.astimezone` is guaranteed to produce a valid, + existing datetime, so a round-trip to and from UTC is sufficient to get + an extant datetime, however, this generally "falls back" to an earlier time + rather than falling forward to the STD side (though no guarantees are made + about this behavior). + + :param dt: + A :class:`datetime.datetime` which may or may not exist. + + :return: + Returns an existing :class:`datetime.datetime`. If ``dt`` was not + imaginary, the datetime returned is guaranteed to be the same object + passed to the function. + + .. versionadded:: 2.7.0 + """ + if dt.tzinfo is not None and not datetime_exists(dt): + + curr_offset = (dt + datetime.timedelta(hours=24)).utcoffset() + old_offset = (dt - datetime.timedelta(hours=24)).utcoffset() + + dt += curr_offset - old_offset + + return dt + + +def _datetime_to_timestamp(dt): + """ + Convert a :class:`datetime.datetime` object to an epoch timestamp in + seconds since January 1, 1970, ignoring the time zone. + """ + return (dt.replace(tzinfo=None) - EPOCH).total_seconds() + + +if sys.version_info >= (3, 6): + def _get_supported_offset(second_offset): + return second_offset +else: + def _get_supported_offset(second_offset): + # For python pre-3.6, round to full-minutes if that's not the case. + # Python's datetime doesn't accept sub-minute timezones. Check + # http://python.org/sf/1447945 or https://bugs.python.org/issue5288 + # for some information. + old_offset = second_offset + calculated_offset = 60 * ((second_offset + 30) // 60) + return calculated_offset + + +try: + # Python 3.7 feature + from contextlib import nullcontext as _nullcontext +except ImportError: + class _nullcontext(object): + """ + Class for wrapping contexts so that they are passed through in a + with statement. + """ + def __init__(self, context): + self.context = context + + def __enter__(self): + return self.context + + def __exit__(*args, **kwargs): + pass + +# vim:ts=4:sw=4:et diff --git a/lib/python3.8/site-packages/dateutil/tz/win.py b/lib/python3.8/site-packages/dateutil/tz/win.py new file mode 100644 index 0000000..cde07ba --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/tz/win.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +""" +This module provides an interface to the native time zone data on Windows, +including :py:class:`datetime.tzinfo` implementations. + +Attempting to import this module on a non-Windows platform will raise an +:py:obj:`ImportError`. +""" +# This code was originally contributed by Jeffrey Harris. +import datetime +import struct + +from six.moves import winreg +from six import text_type + +try: + import ctypes + from ctypes import wintypes +except ValueError: + # ValueError is raised on non-Windows systems for some horrible reason. + raise ImportError("Running tzwin on non-Windows system") + +from ._common import tzrangebase + +__all__ = ["tzwin", "tzwinlocal", "tzres"] + +ONEWEEK = datetime.timedelta(7) + +TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" +TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" +TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + + +def _settzkeyname(): + handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + try: + winreg.OpenKey(handle, TZKEYNAMENT).Close() + TZKEYNAME = TZKEYNAMENT + except WindowsError: + TZKEYNAME = TZKEYNAME9X + handle.Close() + return TZKEYNAME + + +TZKEYNAME = _settzkeyname() + + +class tzres(object): + """ + Class for accessing ``tzres.dll``, which contains timezone name related + resources. + + .. versionadded:: 2.5.0 + """ + p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char + + def __init__(self, tzres_loc='tzres.dll'): + # Load the user32 DLL so we can load strings from tzres + user32 = ctypes.WinDLL('user32') + + # Specify the LoadStringW function + user32.LoadStringW.argtypes = (wintypes.HINSTANCE, + wintypes.UINT, + wintypes.LPWSTR, + ctypes.c_int) + + self.LoadStringW = user32.LoadStringW + self._tzres = ctypes.WinDLL(tzres_loc) + self.tzres_loc = tzres_loc + + def load_name(self, offset): + """ + Load a timezone name from a DLL offset (integer). + + >>> from dateutil.tzwin import tzres + >>> tzr = tzres() + >>> print(tzr.load_name(112)) + 'Eastern Standard Time' + + :param offset: + A positive integer value referring to a string from the tzres dll. + + .. note:: + + Offsets found in the registry are generally of the form + ``@tzres.dll,-114``. The offset in this case is 114, not -114. + + """ + resource = self.p_wchar() + lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) + nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) + return resource[:nchar] + + def name_from_string(self, tzname_str): + """ + Parse strings as returned from the Windows registry into the time zone + name as defined in the registry. + + >>> from dateutil.tzwin import tzres + >>> tzr = tzres() + >>> print(tzr.name_from_string('@tzres.dll,-251')) + 'Dateline Daylight Time' + >>> print(tzr.name_from_string('Eastern Standard Time')) + 'Eastern Standard Time' + + :param tzname_str: + A timezone name string as returned from a Windows registry key. + + :return: + Returns the localized timezone string from tzres.dll if the string + is of the form `@tzres.dll,-offset`, else returns the input string. + """ + if not tzname_str.startswith('@'): + return tzname_str + + name_splt = tzname_str.split(',-') + try: + offset = int(name_splt[1]) + except: + raise ValueError("Malformed timezone string.") + + return self.load_name(offset) + + +class tzwinbase(tzrangebase): + """tzinfo class based on win32's timezones available in the registry.""" + def __init__(self): + raise NotImplementedError('tzwinbase is an abstract base class') + + def __eq__(self, other): + # Compare on all relevant dimensions, including name. + if not isinstance(other, tzwinbase): + return NotImplemented + + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._stddayofweek == other._stddayofweek and + self._dstdayofweek == other._dstdayofweek and + self._stdweeknumber == other._stdweeknumber and + self._dstweeknumber == other._dstweeknumber and + self._stdhour == other._stdhour and + self._dsthour == other._dsthour and + self._stdminute == other._stdminute and + self._dstminute == other._dstminute and + self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr) + + @staticmethod + def list(): + """Return a list of all time zones known to the system.""" + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, TZKEYNAME) as tzkey: + result = [winreg.EnumKey(tzkey, i) + for i in range(winreg.QueryInfoKey(tzkey)[0])] + return result + + def display(self): + """ + Return the display name of the time zone. + """ + return self._display + + def transitions(self, year): + """ + For a given year, get the DST on and off transition times, expressed + always on the standard time side. For zones with no transitions, this + function returns ``None``. + + :param year: + The year whose transitions you would like to query. + + :return: + Returns a :class:`tuple` of :class:`datetime.datetime` objects, + ``(dston, dstoff)`` for zones with an annual DST transition, or + ``None`` for fixed offset zones. + """ + + if not self.hasdst: + return None + + dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, + self._dsthour, self._dstminute, + self._dstweeknumber) + + dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, + self._stdhour, self._stdminute, + self._stdweeknumber) + + # Ambiguous dates default to the STD side + dstoff -= self._dst_base_offset + + return dston, dstoff + + def _get_hasdst(self): + return self._dstmonth != 0 + + @property + def _dst_base_offset(self): + return self._dst_base_offset_ + + +class tzwin(tzwinbase): + """ + Time zone object created from the zone info in the Windows registry + + These are similar to :py:class:`dateutil.tz.tzrange` objects in that + the time zone data is provided in the format of a single offset rule + for either 0 or 2 time zone transitions per year. + + :param: name + The name of a Windows time zone key, e.g. "Eastern Standard Time". + The full list of keys can be retrieved with :func:`tzwin.list`. + """ + + def __init__(self, name): + self._name = name + + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) + with winreg.OpenKey(handle, tzkeyname) as tzkey: + keydict = valuestodict(tzkey) + + self._std_abbr = keydict["Std"] + self._dst_abbr = keydict["Dlt"] + + self._display = keydict["Display"] + + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm + tup = struct.unpack("=3l16h", keydict["TZI"]) + stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 + dstoffset = stdoffset-tup[2] # + DaylightBias * -1 + self._std_offset = datetime.timedelta(minutes=stdoffset) + self._dst_offset = datetime.timedelta(minutes=dstoffset) + + # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs + # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx + (self._stdmonth, + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[4:9] + + (self._dstmonth, + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[12:17] + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = self._get_hasdst() + + def __repr__(self): + return "tzwin(%s)" % repr(self._name) + + def __reduce__(self): + return (self.__class__, (self._name,)) + + +class tzwinlocal(tzwinbase): + """ + Class representing the local time zone information in the Windows registry + + While :class:`dateutil.tz.tzlocal` makes system calls (via the :mod:`time` + module) to retrieve time zone information, ``tzwinlocal`` retrieves the + rules directly from the Windows registry and creates an object like + :class:`dateutil.tz.tzwin`. + + Because Windows does not have an equivalent of :func:`time.tzset`, on + Windows, :class:`dateutil.tz.tzlocal` instances will always reflect the + time zone settings *at the time that the process was started*, meaning + changes to the machine's time zone settings during the run of a program + on Windows will **not** be reflected by :class:`dateutil.tz.tzlocal`. + Because ``tzwinlocal`` reads the registry directly, it is unaffected by + this issue. + """ + def __init__(self): + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: + keydict = valuestodict(tzlocalkey) + + self._std_abbr = keydict["StandardName"] + self._dst_abbr = keydict["DaylightName"] + + try: + tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, + sn=self._std_abbr) + with winreg.OpenKey(handle, tzkeyname) as tzkey: + _keydict = valuestodict(tzkey) + self._display = _keydict["Display"] + except OSError: + self._display = None + + stdoffset = -keydict["Bias"]-keydict["StandardBias"] + dstoffset = stdoffset-keydict["DaylightBias"] + + self._std_offset = datetime.timedelta(minutes=stdoffset) + self._dst_offset = datetime.timedelta(minutes=dstoffset) + + # For reasons unclear, in this particular key, the day of week has been + # moved to the END of the SYSTEMTIME structure. + tup = struct.unpack("=8h", keydict["StandardStart"]) + + (self._stdmonth, + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[1:5] + + self._stddayofweek = tup[7] + + tup = struct.unpack("=8h", keydict["DaylightStart"]) + + (self._dstmonth, + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[1:5] + + self._dstdayofweek = tup[7] + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = self._get_hasdst() + + def __repr__(self): + return "tzwinlocal()" + + def __str__(self): + # str will return the standard name, not the daylight name. + return "tzwinlocal(%s)" % repr(self._std_abbr) + + def __reduce__(self): + return (self.__class__, ()) + + +def picknthweekday(year, month, dayofweek, hour, minute, whichweek): + """ dayofweek == 0 means Sunday, whichweek 5 means last instance """ + first = datetime.datetime(year, month, 1, hour, minute) + + # This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), + # Because 7 % 7 = 0 + weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) + wd = weekdayone + ((whichweek - 1) * ONEWEEK) + if (wd.month != month): + wd -= ONEWEEK + + return wd + + +def valuestodict(key): + """Convert a registry key's values to a dictionary.""" + dout = {} + size = winreg.QueryInfoKey(key)[1] + tz_res = None + + for i in range(size): + key_name, value, dtype = winreg.EnumValue(key, i) + if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: + # If it's a DWORD (32-bit integer), it's stored as unsigned - convert + # that to a proper signed integer + if value & (1 << 31): + value = value - (1 << 32) + elif dtype == winreg.REG_SZ: + # If it's a reference to the tzres DLL, load the actual string + if value.startswith('@tzres'): + tz_res = tz_res or tzres() + value = tz_res.name_from_string(value) + + value = value.rstrip('\x00') # Remove trailing nulls + + dout[key_name] = value + + return dout diff --git a/lib/python3.8/site-packages/dateutil/tzwin.py b/lib/python3.8/site-packages/dateutil/tzwin.py new file mode 100644 index 0000000..cebc673 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/tzwin.py @@ -0,0 +1,2 @@ +# tzwin has moved to dateutil.tz.win +from .tz.win import * diff --git a/lib/python3.8/site-packages/dateutil/utils.py b/lib/python3.8/site-packages/dateutil/utils.py new file mode 100644 index 0000000..44d9c99 --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/utils.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +""" +This module offers general convenience and utility functions for dealing with +datetimes. + +.. versionadded:: 2.7.0 +""" +from __future__ import unicode_literals + +from datetime import datetime, time + + +def today(tzinfo=None): + """ + Returns a :py:class:`datetime` representing the current day at midnight + + :param tzinfo: + The time zone to attach (also used to determine the current day). + + :return: + A :py:class:`datetime.datetime` object representing the current day + at midnight. + """ + + dt = datetime.now(tzinfo) + return datetime.combine(dt.date(), time(0, tzinfo=tzinfo)) + + +def default_tzinfo(dt, tzinfo): + """ + Sets the ``tzinfo`` parameter on naive datetimes only + + This is useful for example when you are provided a datetime that may have + either an implicit or explicit time zone, such as when parsing a time zone + string. + + .. doctest:: + + >>> from dateutil.tz import tzoffset + >>> from dateutil.parser import parse + >>> from dateutil.utils import default_tzinfo + >>> dflt_tz = tzoffset("EST", -18000) + >>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz)) + 2014-01-01 12:30:00+00:00 + >>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz)) + 2014-01-01 12:30:00-05:00 + + :param dt: + The datetime on which to replace the time zone + + :param tzinfo: + The :py:class:`datetime.tzinfo` subclass instance to assign to + ``dt`` if (and only if) it is naive. + + :return: + Returns an aware :py:class:`datetime.datetime`. + """ + if dt.tzinfo is not None: + return dt + else: + return dt.replace(tzinfo=tzinfo) + + +def within_delta(dt1, dt2, delta): + """ + Useful for comparing two datetimes that may a negilible difference + to be considered equal. + """ + delta = abs(delta) + difference = dt1 - dt2 + return -delta <= difference <= delta diff --git a/lib/python3.8/site-packages/dateutil/zoneinfo/__init__.py b/lib/python3.8/site-packages/dateutil/zoneinfo/__init__.py new file mode 100644 index 0000000..34f11ad --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/zoneinfo/__init__.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +import warnings +import json + +from tarfile import TarFile +from pkgutil import get_data +from io import BytesIO + +from dateutil.tz import tzfile as _tzfile + +__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"] + +ZONEFILENAME = "dateutil-zoneinfo.tar.gz" +METADATA_FN = 'METADATA' + + +class tzfile(_tzfile): + def __reduce__(self): + return (gettz, (self._filename,)) + + +def getzoneinfofile_stream(): + try: + return BytesIO(get_data(__name__, ZONEFILENAME)) + except IOError as e: # TODO switch to FileNotFoundError? + warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) + return None + + +class ZoneInfoFile(object): + def __init__(self, zonefile_stream=None): + if zonefile_stream is not None: + with TarFile.open(fileobj=zonefile_stream) as tf: + self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name) + for zf in tf.getmembers() + if zf.isfile() and zf.name != METADATA_FN} + # deal with links: They'll point to their parent object. Less + # waste of memory + links = {zl.name: self.zones[zl.linkname] + for zl in tf.getmembers() if + zl.islnk() or zl.issym()} + self.zones.update(links) + try: + metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) + metadata_str = metadata_json.read().decode('UTF-8') + self.metadata = json.loads(metadata_str) + except KeyError: + # no metadata in tar file + self.metadata = None + else: + self.zones = {} + self.metadata = None + + def get(self, name, default=None): + """ + Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method + for retrieving zones from the zone dictionary. + + :param name: + The name of the zone to retrieve. (Generally IANA zone names) + + :param default: + The value to return in the event of a missing key. + + .. versionadded:: 2.6.0 + + """ + return self.zones.get(name, default) + + +# The current API has gettz as a module function, although in fact it taps into +# a stateful class. So as a workaround for now, without changing the API, we +# will create a new "global" class instance the first time a user requests a +# timezone. Ugly, but adheres to the api. +# +# TODO: Remove after deprecation period. +_CLASS_ZONE_INSTANCE = [] + + +def get_zonefile_instance(new_instance=False): + """ + This is a convenience function which provides a :class:`ZoneInfoFile` + instance using the data provided by the ``dateutil`` package. By default, it + caches a single instance of the ZoneInfoFile object and returns that. + + :param new_instance: + If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and + used as the cached instance for the next call. Otherwise, new instances + are created only as necessary. + + :return: + Returns a :class:`ZoneInfoFile` object. + + .. versionadded:: 2.6 + """ + if new_instance: + zif = None + else: + zif = getattr(get_zonefile_instance, '_cached_instance', None) + + if zif is None: + zif = ZoneInfoFile(getzoneinfofile_stream()) + + get_zonefile_instance._cached_instance = zif + + return zif + + +def gettz(name): + """ + This retrieves a time zone from the local zoneinfo tarball that is packaged + with dateutil. + + :param name: + An IANA-style time zone name, as found in the zoneinfo file. + + :return: + Returns a :class:`dateutil.tz.tzfile` time zone object. + + .. warning:: + It is generally inadvisable to use this function, and it is only + provided for API compatibility with earlier versions. This is *not* + equivalent to ``dateutil.tz.gettz()``, which selects an appropriate + time zone based on the inputs, favoring system zoneinfo. This is ONLY + for accessing the dateutil-specific zoneinfo (which may be out of + date compared to the system zoneinfo). + + .. deprecated:: 2.6 + If you need to use a specific zoneinfofile over the system zoneinfo, + instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call + :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. + + Use :func:`get_zonefile_instance` to retrieve an instance of the + dateutil-provided zoneinfo. + """ + warnings.warn("zoneinfo.gettz() will be removed in future versions, " + "to use the dateutil-provided zoneinfo files, instantiate a " + "ZoneInfoFile object and use ZoneInfoFile.zones.get() " + "instead. See the documentation for details.", + DeprecationWarning) + + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].zones.get(name) + + +def gettz_db_metadata(): + """ Get the zonefile metadata + + See `zonefile_metadata`_ + + :returns: + A dictionary with the database metadata + + .. deprecated:: 2.6 + See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, + query the attribute ``zoneinfo.ZoneInfoFile.metadata``. + """ + warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " + "versions, to use the dateutil-provided zoneinfo files, " + "ZoneInfoFile object and query the 'metadata' attribute " + "instead. See the documentation for details.", + DeprecationWarning) + + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].metadata diff --git a/lib/python3.8/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5367f46b983e1fe9c5e852d5782a14dea3d849d9 GIT binary patch literal 5662 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%0D!KtMVr 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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/lib/python3.8/site-packages/distlib/metadata.py b/lib/python3.8/site-packages/distlib/metadata.py new file mode 100644 index 0000000..2d61378 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/resources.py b/lib/python3.8/site-packages/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/scripts.py b/lib/python3.8/site-packages/distlib/scripts.py new file mode 100644 index 0000000..5185974 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/util.py b/lib/python3.8/site-packages/distlib/util.py new file mode 100644 index 0000000..01324ea --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/version.py b/lib/python3.8/site-packages/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/wheel.py b/lib/python3.8/site-packages/distlib/wheel.py new file mode 100644 index 0000000..bd17938 --- /dev/null +++ b/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/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt b/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/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/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER b/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt b/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/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/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA b/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA new file mode 100644 index 0000000..b34cf62 --- /dev/null +++ b/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/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD b/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD new file mode 100644 index 0000000..8eada19 --- /dev/null +++ b/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,, +../../../bin/distro-3.8,, +distro-1.4.0.dist-info/INSTALLER,, +../../../bin/distro,, +distro-1.4.0.virtualenv,, +distro-1.4.0.dist-info/__pycache__,, +../../../bin/distro3,, +distro.cpython-38.pyc,, \ No newline at end of file diff --git a/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL b/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/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/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt b/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt new file mode 100644 index 0000000..dd40239 --- /dev/null +++ b/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/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt b/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt new file mode 100644 index 0000000..0e09331 --- /dev/null +++ b/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +distro diff --git a/lib/python3.8/site-packages/distro-1.4.0.virtualenv b/lib/python3.8/site-packages/distro-1.4.0.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.8/site-packages/distro.py b/lib/python3.8/site-packages/distro.py new file mode 100644 index 0000000..3306163 --- /dev/null +++ b/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/lib/python3.8/site-packages/docutils-0.16.dist-info/COPYING.txt b/lib/python3.8/site-packages/docutils-0.16.dist-info/COPYING.txt new file mode 100644 index 0000000..bfc8937 --- /dev/null +++ b/lib/python3.8/site-packages/docutils-0.16.dist-info/COPYING.txt @@ -0,0 +1,137 @@ +================== + Copying Docutils +================== + +:Author: David Goodger +:Contact: goodger@python.org +:Date: $Date: 2015-05-08 17:56:32 +0200 (Fr, 08. Mai 2015) $ +:Web site: http://docutils.sourceforge.net/ +:Copyright: This document has been placed in the public domain. + +Most of the files included in this project have been placed in the +public domain, and therefore have no license requirements and no +restrictions on copying or usage; see the `Public Domain Dedication`_ +below. There are a few exceptions_, listed below. +Files in the Sandbox_ are not distributed with Docutils releases and +may have different license terms. + + +Public Domain Dedication +======================== + +The persons who have associated their work with this project (the +"Dedicator": David Goodger and the many contributors to the Docutils +project) hereby dedicate the entire copyright, less the exceptions_ +listed below, in the work of authorship known as "Docutils" identified +below (the "Work") to the public domain. + +The primary repository for the Work is the Internet World Wide Web +site . The Work consists of the +files within the "docutils" module of the Docutils project Subversion +repository (Internet host docutils.svn.sourceforge.net, filesystem path +/svnroot/docutils), whose Internet web interface is located at +. Files dedicated to the +public domain may be identified by the inclusion, near the beginning +of each file, of a declaration of the form:: + + Copyright: This document/module/DTD/stylesheet/file/etc. has been + placed in the public domain. + +Dedicator makes this dedication for the benefit of the public at large +and to the detriment of Dedicator's heirs and successors. Dedicator +intends this dedication to be an overt act of relinquishment in +perpetuity of all present and future rights under copyright law, +whether vested or contingent, in the Work. Dedicator understands that +such relinquishment of all rights includes the relinquishment of all +rights to enforce (by lawsuit or otherwise) those copyrights in the +Work. + +Dedicator recognizes that, once placed in the public domain, the Work +may be freely reproduced, distributed, transmitted, used, modified, +built upon, or otherwise exploited by anyone for any purpose, +commercial or non-commercial, and in any way, including by methods +that have not yet been invented or conceived. + +(This dedication is derived from the text of the `Creative Commons +Public Domain Dedication`. [#]_) + +.. [#] Creative Commons has `retired this legal tool`__ and does not + recommend that it be applied to works: This tool is based on United + States law and may not be applicable outside the US. For dedicating new + works to the public domain, Creative Commons recommend the replacement + Public Domain Dedication CC0_ (CC zero, "No Rights Reserved"). So does + the Free Software Foundation in its license-list_. + + __ http://creativecommons.org/retiredlicenses + .. _CC0: http://creativecommons.org/about/cc0 + +Exceptions +========== + +The exceptions to the `Public Domain Dedication`_ above are: + +* docutils/writers/s5_html/themes/default/iepngfix.htc: + + IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull + . Free usage permitted as long as + this notice remains intact. + +* docutils/utils/math/__init__.py, + docutils/utils/math/latex2mathml.py, + docutils/writers/xetex/__init__.py, + docutils/writers/latex2e/docutils-05-compat.sty, + docs/user/docutils-05-compat.sty.txt, + docutils/utils/error_reporting.py, + docutils/test/transforms/test_smartquotes.py: + + Copyright © Günter Milde. + Released under the terms of the `2-Clause BSD license`_ + (`local copy `__). + +* docutils/utils/smartquotes.py + + Copyright © 2011 Günter Milde, + based on `SmartyPants`_ © 2003 John Gruber + (released under a 3-Clause BSD license included in the file) + and smartypants.py © 2004, 2007 Chad Miller. + Released under the terms of the `2-Clause BSD license`_ + (`local copy `__). + + .. _SmartyPants: http://daringfireball.net/projects/smartypants/ + +* docutils/utils/math/math2html.py, + docutils/writers/html4css1/math.css + + Copyright © Alex Fernández + These files are part of eLyXer_, released under the `GNU + General Public License`_ version 3 or later. The author relicensed + them for Docutils under the terms of the `2-Clause BSD license`_ + (`local copy `__). + + .. _eLyXer: http://www.nongnu.org/elyxer/ + +* docutils/utils/roman.py, copyright by Mark Pilgrim, released under the + `Python 2.1.1 license`_ (`local copy`__). + + __ licenses/python-2-1-1.txt + +* tools/editors/emacs/rst.el, copyright by Free Software Foundation, + Inc., released under the `GNU General Public License`_ version 3 or + later (`local copy`__). + + __ licenses/gpl-3-0.txt + +The `2-Clause BSD license`_ and the Python licenses are OSI-approved_ +and GPL-compatible_. + +Plaintext versions of all the linked-to licenses are provided in the +licenses_ directory. + +.. _sandbox: http://docutils.sourceforge.net/sandbox/README.html +.. _licenses: licenses/ +.. _Python 2.1.1 license: http://www.python.org/2.1.1/license.html +.. _GNU General Public License: http://www.gnu.org/copyleft/gpl.html +.. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause +.. _OSI-approved: http://opensource.org/licenses/ +.. _license-list: +.. _GPL-compatible: http://www.gnu.org/licenses/license-list.html diff --git a/lib/python3.8/site-packages/docutils-0.16.dist-info/INSTALLER b/lib/python3.8/site-packages/docutils-0.16.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/docutils-0.16.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/docutils-0.16.dist-info/METADATA b/lib/python3.8/site-packages/docutils-0.16.dist-info/METADATA new file mode 100644 index 0000000..bac2ed6 --- /dev/null +++ b/lib/python3.8/site-packages/docutils-0.16.dist-info/METADATA @@ -0,0 +1,64 @@ +Metadata-Version: 2.1 +Name: docutils +Version: 0.16 +Summary: Docutils -- Python Documentation Utilities +Home-page: http://docutils.sourceforge.net/ +Author: David Goodger +Author-email: goodger@python.org +Maintainer: docutils-develop list +Maintainer-email: docutils-develop@lists.sourceforge.net +License: public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt) +Platform: OS-independent +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Intended Audience :: End Users/Desktop +Classifier: Intended Audience :: Other Audience +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: Public Domain +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: License :: OSI Approved :: BSD License +Classifier: License :: OSI Approved :: GNU General Public License (GPL) +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.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Documentation +Classifier: Topic :: Software Development :: Documentation +Classifier: Topic :: Text Processing +Classifier: Natural Language :: English +Classifier: Natural Language :: Afrikaans +Classifier: Natural Language :: Catalan +Classifier: Natural Language :: Chinese (Simplified) +Classifier: Natural Language :: Chinese (Traditional) +Classifier: Natural Language :: Czech +Classifier: Natural Language :: Danish +Classifier: Natural Language :: Dutch +Classifier: Natural Language :: Esperanto +Classifier: Natural Language :: Finnish +Classifier: Natural Language :: French +Classifier: Natural Language :: Galician +Classifier: Natural Language :: German +Classifier: Natural Language :: Hebrew +Classifier: Natural Language :: Italian +Classifier: Natural Language :: Japanese +Classifier: Natural Language :: Korean +Classifier: Natural Language :: Latvian +Classifier: Natural Language :: Lithuanian +Classifier: Natural Language :: Persian +Classifier: Natural Language :: Polish +Classifier: Natural Language :: Portuguese (Brazilian) +Classifier: Natural Language :: Russian +Classifier: Natural Language :: Slovak +Classifier: Natural Language :: Spanish +Classifier: Natural Language :: Swedish +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +Docutils is a modular system for processing documentation +into useful formats, such as HTML, XML, and LaTeX. For +input Docutils supports reStructuredText, an easy-to-read, +what-you-see-is-what-you-get plaintext markup syntax. + diff --git a/lib/python3.8/site-packages/docutils-0.16.dist-info/RECORD b/lib/python3.8/site-packages/docutils-0.16.dist-info/RECORD new file mode 100644 index 0000000..5b6e2f5 --- /dev/null +++ b/lib/python3.8/site-packages/docutils-0.16.dist-info/RECORD @@ -0,0 +1,332 @@ +../../../bin/__pycache__/rst2html.cpython-38.pyc,, +../../../bin/__pycache__/rst2html4.cpython-38.pyc,, +../../../bin/__pycache__/rst2html5.cpython-38.pyc,, +../../../bin/__pycache__/rst2latex.cpython-38.pyc,, +../../../bin/__pycache__/rst2man.cpython-38.pyc,, +../../../bin/__pycache__/rst2odt.cpython-38.pyc,, +../../../bin/__pycache__/rst2odt_prepstyles.cpython-38.pyc,, +../../../bin/__pycache__/rst2pseudoxml.cpython-38.pyc,, +../../../bin/__pycache__/rst2s5.cpython-38.pyc,, +../../../bin/__pycache__/rst2xetex.cpython-38.pyc,, +../../../bin/__pycache__/rst2xml.cpython-38.pyc,, +../../../bin/__pycache__/rstpep2html.cpython-38.pyc,, +../../../bin/rst2html.py,sha256=_ZSHNn9dmPKAx6L7qZ8XgfPAy3KZv5MNky6n_8V3xiI,584 +../../../bin/rst2html4.py,sha256=u5YWYGbe9xyegHW30S6gzVpAg8nTI9Xu_ZOeve5CbOo,704 +../../../bin/rst2html5.py,sha256=_r_cnR_zNKLHiLjSTXDkMBLZskLkxmrPt93InJbhkbA,1127 +../../../bin/rst2latex.py,sha256=nLGST5HE554VD4EbuhUn2_6kijGgDFcQgOMa4RrFngI,781 +../../../bin/rst2man.py,sha256=nPtkEv9P7LIoK8GJOeiA66yi1ApVM1gNOFdbOB0CIXM,589 +../../../bin/rst2odt.py,sha256=iH9HaLPbzEfJU599E2DvAW2n2py69TXfJDOIZEHRsyk,754 +../../../bin/rst2odt_prepstyles.py,sha256=B90_1J9aRI6eJlKTYYDiHGyFio8Dfmgli9vJmg9qXHs,1716 +../../../bin/rst2pseudoxml.py,sha256=9SwwDEOFNz3AqOSI4CEvhieDm_3TgTPN_3FDPz6b5ys,591 +../../../bin/rst2s5.py,sha256=zdT-5LNxruUZqMVe-Wjj1F-eXan9pLDBvxA1k38XRGw,627 +../../../bin/rst2xetex.py,sha256=SzPM2iz6wCAc8Ki3sEnhCq6318jTQziosToib4FIzEw,861 +../../../bin/rst2xml.py,sha256=MKbl4dkpIBjzh4GdITggzJpi-SMGoRaXdkbZs-yd05E,592 +../../../bin/rstpep2html.py,sha256=TlXeA4lyMxtICwwaEERXcrXTleXfwyQE5qbooZLtcSw,660 +docutils-0.16.dist-info/COPYING.txt,sha256=76DIWqmepbR4EkADGw0Cr1TXtVVMh60rK-qbpJD2Zj8,5538 +docutils-0.16.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +docutils-0.16.dist-info/METADATA,sha256=4IVnPgSLMJRQ5ZfIjKFlv0poher_Si1vM7QowzUC1dI,2749 +docutils-0.16.dist-info/RECORD,, +docutils-0.16.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 +docutils-0.16.dist-info/top_level.txt,sha256=dPq3jQoxpMOEhrZ1tQh3_-9hqhdvOjUplSdSVDAc95A,9 +docutils/__init__.py,sha256=YIX4_xeGvPh3ZINoAqP1zx76lI2RCCEw39wbeigwYWU,7759 +docutils/__pycache__/__init__.cpython-38.pyc,, +docutils/__pycache__/core.cpython-38.pyc,, +docutils/__pycache__/examples.cpython-38.pyc,, +docutils/__pycache__/frontend.cpython-38.pyc,, +docutils/__pycache__/io.cpython-38.pyc,, +docutils/__pycache__/nodes.cpython-38.pyc,, +docutils/__pycache__/statemachine.cpython-38.pyc,, +docutils/core.py,sha256=PTD5CeE4Z42n5f9UJJUxXGBK27fRGQ5kanx5aMlZ5qA,29575 +docutils/examples.py,sha256=nlPe2PYXNvz5ZAVRu7xHHiV7qML7s-eyUu4Gun7j3SY,3959 +docutils/frontend.py,sha256=dxG9PqW_-snfcbR5S2vunCsUUwH1OTauqx0RJxnMPdQ,37086 +docutils/io.py,sha256=th8Zq_UUIWY27bDIB1sLMtYhdzBWE4qo4Gf9VEwL_gk,16765 +docutils/languages/__init__.py,sha256=oPqoleNr7_rp64XNjbg4gdL8owO_gLEZc1HWHKOA26k,1555 +docutils/languages/__pycache__/__init__.cpython-38.pyc,, +docutils/languages/__pycache__/af.cpython-38.pyc,, +docutils/languages/__pycache__/ca.cpython-38.pyc,, +docutils/languages/__pycache__/cs.cpython-38.pyc,, +docutils/languages/__pycache__/da.cpython-38.pyc,, +docutils/languages/__pycache__/de.cpython-38.pyc,, +docutils/languages/__pycache__/en.cpython-38.pyc,, +docutils/languages/__pycache__/eo.cpython-38.pyc,, +docutils/languages/__pycache__/es.cpython-38.pyc,, +docutils/languages/__pycache__/fa.cpython-38.pyc,, +docutils/languages/__pycache__/fi.cpython-38.pyc,, +docutils/languages/__pycache__/fr.cpython-38.pyc,, +docutils/languages/__pycache__/gl.cpython-38.pyc,, +docutils/languages/__pycache__/he.cpython-38.pyc,, +docutils/languages/__pycache__/it.cpython-38.pyc,, +docutils/languages/__pycache__/ja.cpython-38.pyc,, +docutils/languages/__pycache__/ko.cpython-38.pyc,, +docutils/languages/__pycache__/lt.cpython-38.pyc,, +docutils/languages/__pycache__/lv.cpython-38.pyc,, +docutils/languages/__pycache__/nl.cpython-38.pyc,, +docutils/languages/__pycache__/pl.cpython-38.pyc,, +docutils/languages/__pycache__/pt_br.cpython-38.pyc,, +docutils/languages/__pycache__/ru.cpython-38.pyc,, +docutils/languages/__pycache__/sk.cpython-38.pyc,, +docutils/languages/__pycache__/sv.cpython-38.pyc,, +docutils/languages/__pycache__/zh_cn.cpython-38.pyc,, +docutils/languages/__pycache__/zh_tw.cpython-38.pyc,, +docutils/languages/af.py,sha256=6wl-XbsF8wbSiBs5IORna4Lz-WPqnnye_6qr8Cbh_1c,1824 +docutils/languages/ca.py,sha256=7_XR5q5GEXaeI4O5ianMmdnjWY_sRQD1ynuRB_HxUok,1940 +docutils/languages/cs.py,sha256=GARzldc3tDZByhqf_R-cOh1QJDOrFvSJzqewRdWRNXw,1928 +docutils/languages/da.py,sha256=88ZPB6ppJPWqNsaFQKKAC1aEZVLYw13BFR44vecp4MU,1907 +docutils/languages/de.py,sha256=AQTUIl4j3x43kQi5800-lobZHsh06VOsrxfAjS5FHGM,1722 +docutils/languages/en.py,sha256=tWVrPr6593mIzFokX_4Hw1fC6ZWC8GPdgpc72jmQq1g,1848 +docutils/languages/eo.py,sha256=uGSGcjfeHFliqm-f9amMfsPIl3trHONYPXdGR_ybm8U,1948 +docutils/languages/es.py,sha256=nk0PUeVyjFEu_8cNJA9Llsdv-W3kKx-wgOeaYGllqgw,1962 +docutils/languages/fa.py,sha256=vsf5xJxJuzcPXyz8ad3Cuf9ntBoOND0zdhsE4dwJEjI,2044 +docutils/languages/fi.py,sha256=yrE6Zhs-LdknXCpf-WX15QACQ75DroMpET95r3JD_OM,2026 +docutils/languages/fr.py,sha256=FTaOYQQHvqFzkzuhbdFQPS7dPkcpGLUPMeStu0cjFGs,1893 +docutils/languages/gl.py,sha256=6Uoq9rYigieFN0-LeSgoRmB9_ROX60Oqul7faPROMYs,2040 +docutils/languages/he.py,sha256=BfiRLxQ5Y8pivYi7GbGQ5NJ-rEgUId9mstJR6YYkeAQ,2683 +docutils/languages/it.py,sha256=Z3eh86YrmB8aT_Dl56X7W2gqpJgYK0v0QnJ07hekXlM,1808 +docutils/languages/ja.py,sha256=VJc9fRk4H_OhD8wyx3-uGUay3qdqeAIHCZEF67EsMTQ,1942 +docutils/languages/ko.py,sha256=PsZlCPQ5uQsUC2Puk2POTDmTc83cJWOxHmLrnq3-s2U,1880 +docutils/languages/lt.py,sha256=Y1204UnrqJlvM1vyteckkrqkbU02dSvrnpHCB5b23oM,1940 +docutils/languages/lv.py,sha256=tEqF4ya9h4FznB-uiUKQnNLY2XDFRatxKt2evJPhsDM,1867 +docutils/languages/nl.py,sha256=3CjsGFeJgLZEw2xhHxAc4sYDKRW6ODUZsVyibjl7DmM,1865 +docutils/languages/pl.py,sha256=ImdSmS6l4SgZ7uEaWQR5_aLNmv4K5onOInEtinPqWJk,1900 +docutils/languages/pt_br.py,sha256=cW8OceiFMPzPICT6buhnjm3tvEEw4W1PG-GFC4MxhyI,1982 +docutils/languages/ru.py,sha256=AkDQVhcW4cbvP0je-z8UJafQ-s2Lwc-eAIqXGCFZzco,2155 +docutils/languages/sk.py,sha256=v4XMBxIx5d6zQY7ehjZdtgfUy9Hz999XdH9G9d7SxEc,1860 +docutils/languages/sv.py,sha256=yIVWV9He5dbCuMpegSDiuI75tD4GXm9VkN7ra0-xgMI,2103 +docutils/languages/zh_cn.py,sha256=kF2sokHa0Qr-3X45ZeWEb0mImZRlZpiX2TM6d9_GjpY,2026 +docutils/languages/zh_tw.py,sha256=Xwrbf8wSylyMwwaNH6xYeAjMrldiBbDB_LElv67hGPQ,2771 +docutils/nodes.py,sha256=RRwVFRtRtRUzbuoYIWkMoSBXBAfQ4Dc2Xtzvht7XwAY,81241 +docutils/parsers/__init__.py,sha256=aDrATsCPGo92zucFl_n2ludoFSfxOrmdF7U8oQV0uEQ,1584 +docutils/parsers/__pycache__/__init__.cpython-38.pyc,, +docutils/parsers/__pycache__/null.cpython-38.pyc,, +docutils/parsers/null.py,sha256=LtO7n-E6lNOs4mLXZ2SiShB3C630SoJ80ugd9fh1vXI,445 +docutils/parsers/rst/__init__.py,sha256=F6PQ5IyGtYcpxOi0YHekivCrob2iLQIn5JpaqTIME50,16208 +docutils/parsers/rst/__pycache__/__init__.cpython-38.pyc,, +docutils/parsers/rst/__pycache__/roles.cpython-38.pyc,, +docutils/parsers/rst/__pycache__/states.cpython-38.pyc,, +docutils/parsers/rst/__pycache__/tableparser.cpython-38.pyc,, +docutils/parsers/rst/directives/__init__.py,sha256=dk9-IEfhp-xsEcuEkW1PthgJYdkva87rMlAVMh8eRYs,14053 +docutils/parsers/rst/directives/__pycache__/__init__.cpython-38.pyc,, +docutils/parsers/rst/directives/__pycache__/admonitions.cpython-38.pyc,, +docutils/parsers/rst/directives/__pycache__/body.cpython-38.pyc,, +docutils/parsers/rst/directives/__pycache__/html.cpython-38.pyc,, +docutils/parsers/rst/directives/__pycache__/images.cpython-38.pyc,, +docutils/parsers/rst/directives/__pycache__/misc.cpython-38.pyc,, +docutils/parsers/rst/directives/__pycache__/parts.cpython-38.pyc,, +docutils/parsers/rst/directives/__pycache__/references.cpython-38.pyc,, +docutils/parsers/rst/directives/__pycache__/tables.cpython-38.pyc,, +docutils/parsers/rst/directives/admonitions.py,sha256=w38T7YfRc0isuF5qmaw-6wOQgHx9xGHJBqu_gDqQCdI,2413 +docutils/parsers/rst/directives/body.py,sha256=qkeqiZrbSbfd8bMxfSl1M0HJ_vCfZYg63HhUmdldpE0,9191 +docutils/parsers/rst/directives/html.py,sha256=CKHg2_lAFayH2DGoVD_t9--nNKVMh7aNuWmNTef7ffI,3235 +docutils/parsers/rst/directives/images.py,sha256=PthLb5pJJvltqvTLkQSOemWEzO_ZEQbjlbKBilZ03x0,6982 +docutils/parsers/rst/directives/misc.py,sha256=MVqSu3TutboCbNFLIXgJ8EXF2R8Z8K_k2nDJ73JY1_w,23872 +docutils/parsers/rst/directives/parts.py,sha256=Mx7y6BwTP1WAD_qnL-g0bjg1_O06NCXgqeYCPfP4JbI,4251 +docutils/parsers/rst/directives/references.py,sha256=1Y1yhe_O2PqLtQUSly-ny291nrQKJgQiO4Hu7Xew9Zo,831 +docutils/parsers/rst/directives/tables.py,sha256=QjxFrNMHdH6rgyIiqBcbVqWvy8ousjy5k6ZeDKeZh8s,22815 +docutils/parsers/rst/include/README.txt,sha256=_C6pSfeGShQ0evvKKKZUtx4bP4RFG9UoUlgHoMn06DU,666 +docutils/parsers/rst/include/isoamsa.txt,sha256=CioOAjUSuL_MG2JHqVHst0ceHzF0v3kupB6stgPMD2g,10925 +docutils/parsers/rst/include/isoamsb.txt,sha256=pSD9D42IRcGBcjYXrJUBFicIA7KRtfBhCKnFlJiytC0,7242 +docutils/parsers/rst/include/isoamsc.txt,sha256=wC2J-pHkHJMokFfOg6S5_6TX1LcibltUpLMWkm-OT3U,1723 +docutils/parsers/rst/include/isoamsn.txt,sha256=LPorblUlj9fua5tpigH-lAfqPYj_yXWQiOa91CpBD7w,6721 +docutils/parsers/rst/include/isoamso.txt,sha256=3CB6lhSNhRIAY-ST8hGPRrO-6wxI2jhYnWTU1_uBXyY,3825 +docutils/parsers/rst/include/isoamsr.txt,sha256=3qVvk1ueHuE6jnHp8ypn6UWtZH5Ly2njNDj09Xeh2qU,11763 +docutils/parsers/rst/include/isobox.txt,sha256=tYnVIj92mJ5jiY8H9-S3CzBprjU8scuJZ8BO_eWEdwc,3101 +docutils/parsers/rst/include/isocyr1.txt,sha256=-V1dpOyKxXBzNBxcW7IJp1W-SIkaXd0KVm8TP58a5B8,4241 +docutils/parsers/rst/include/isocyr2.txt,sha256=3pDslLms3yuJgQTcWtu8U1FMrMQ4KgxtDT18Ci6Mvz4,1882 +docutils/parsers/rst/include/isodia.txt,sha256=-qThXeZ-WFGztOuu_koRrlvDJpSkMVB4ivU9yyE2y7Y,869 +docutils/parsers/rst/include/isogrk1.txt,sha256=xnCDDphWarsNmum9SQRvntznPx7m547rRRuQs7PdYpQ,3010 +docutils/parsers/rst/include/isogrk2.txt,sha256=zbi3-LuRB6T0jGj_yffmgm_8_mwz-6ygAYvgie32ls0,1705 +docutils/parsers/rst/include/isogrk3.txt,sha256=X8fGxnVIG1ygvvc9hpYgUHt1d8ANdD-gxn6aKWEaRf0,2880 +docutils/parsers/rst/include/isogrk4-wide.txt,sha256=rpweSoCmHEC1vL44LEeIE8Re2tm5FEAWnae6CO2oe1I,3035 +docutils/parsers/rst/include/isogrk4.txt,sha256=zptf_ntrFuMsuk0OhEjUkRwYrz0YGDuD-_6ReIHOunY,372 +docutils/parsers/rst/include/isolat1.txt,sha256=F5R0rnBefjAbqWFCkWMFpxVKWoSec8VM0KU8DRtMCYI,4397 +docutils/parsers/rst/include/isolat2.txt,sha256=YBBbW3o9HD1JHV3QVfpaFeKnRsh2vPs0dNvpTJSEoSU,8466 +docutils/parsers/rst/include/isomfrk-wide.txt,sha256=EtzR0nFzhkCmf8CKR4hLWSAgbUjHs4sYfpJEyDp8CjY,3334 +docutils/parsers/rst/include/isomfrk.txt,sha256=zZy3M5BmklzpL02dImsAuWA1jVw7nxqx3xyZLKtILfA,519 +docutils/parsers/rst/include/isomopf-wide.txt,sha256=QUhEHzhyuCM3qzrqG5luXuL28Uoqt7I7v-CfzToG8sI,1931 +docutils/parsers/rst/include/isomopf.txt,sha256=MGuLb8WfrDm7GWvdmvYHsWtrWyh6MqRRo7wnpiaia0U,639 +docutils/parsers/rst/include/isomscr-wide.txt,sha256=VHq8miDC5nKS6Rlvv9aWpS1D_naXcfZd1CsEpJ2W8-g,3231 +docutils/parsers/rst/include/isomscr.txt,sha256=WvB9Zek3TqSyIDfw5QmE_uTvXNwjBpYU0EQttckdLJo,776 +docutils/parsers/rst/include/isonum.txt,sha256=DHWd87O6CCaSz10PEGZOxLqpDLHiMZ6--0VR9o0Yt-Q,4066 +docutils/parsers/rst/include/isopub.txt,sha256=oULMcx0Ugjk6EZAMcxHZpZM_MC7kNuzecu-sMAHVZro,4613 +docutils/parsers/rst/include/isotech.txt,sha256=h6z4dEMoVtarA9E489Zru1H29c01hWWGqbfD3wgUmiM,9726 +docutils/parsers/rst/include/mmlalias.txt,sha256=YxSvNJVNsrzgIGNjtAjtx2tVXUuby5twMZxr5Mq3PJo,45428 +docutils/parsers/rst/include/mmlextra-wide.txt,sha256=KKNjVkG-xHbeCagQfQDotJxY5oF6S6Bmk60bEv49NUQ,9010 +docutils/parsers/rst/include/mmlextra.txt,sha256=Y50tQh0fLYClCc0DUVrxr2loU5u5YaUaYbFc9PEya_c,6800 +docutils/parsers/rst/include/s5defs.txt,sha256=_5JOMpDtaufiZbdxh6QKpICqLvGpB9cypHM-SEt3sKA,1036 +docutils/parsers/rst/include/xhtml1-lat1.txt,sha256=-cEYtq3oOOoLQS6n2KmsAcIs3Y5s78mToBkUXuSrSKA,6112 +docutils/parsers/rst/include/xhtml1-special.txt,sha256=dVNILahp_Jkf0bQVX-gGFcQXst3oR-FvQmAt6lDSTpE,1945 +docutils/parsers/rst/include/xhtml1-symbol.txt,sha256=K-f7hr-LRv1NKOxjZtckBmtMQOiddlnJJ-6DG-YoAzI,7028 +docutils/parsers/rst/languages/__init__.py,sha256=sOTYRqWClRSCBOO1I46Z8-WYDJPgWtqwwqt9iIKXpls,1014 +docutils/parsers/rst/languages/__pycache__/__init__.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/af.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/ca.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/cs.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/da.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/de.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/en.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/eo.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/es.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/fa.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/fi.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/fr.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/gl.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/he.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/it.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/ja.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/ko.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/lt.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/lv.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/nl.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/pl.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/pt_br.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/ru.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/sk.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/sv.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/zh_cn.cpython-38.pyc,, +docutils/parsers/rst/languages/__pycache__/zh_tw.cpython-38.pyc,, +docutils/parsers/rst/languages/af.py,sha256=CKdMjiS3nx4yNRrzeuwCoT0XeeQmHm2_O8U34BZns7s,3677 +docutils/parsers/rst/languages/ca.py,sha256=7eAACvO9Dpnqujsc3BJZQktHk1RDjmwf4LeEvkV_66o,4467 +docutils/parsers/rst/languages/cs.py,sha256=7g4NgLXvV5RP7oOqQT_TM033xW48mDQVoGGHhKSwZ8I,4857 +docutils/parsers/rst/languages/da.py,sha256=u9zvTSVuqJBQ-KKlcZmi4SMAp_kQXNS6ZsHBEiVmXjY,3765 +docutils/parsers/rst/languages/de.py,sha256=wiBjwHBDmiDIRs9gTtpI63VTyp7zqds5DWy9Kdw9Ntg,3464 +docutils/parsers/rst/languages/en.py,sha256=z_J8xJ1gBTk5MX6u_bonFGoop_e8VF6jWgq9Tzl5gNY,3317 +docutils/parsers/rst/languages/eo.py,sha256=q0025TiEuSZ_8VGZz2n86ZK4o6GVTdus1HBgdxAgz0A,3898 +docutils/parsers/rst/languages/es.py,sha256=vranS55noGU_pSC0f7uyJ12szSoxMKgRJuEK-DQfhpk,4261 +docutils/parsers/rst/languages/fa.py,sha256=XWeO9UdNGKbHWpcsAhEOgBvuLMGxjQ76I5ed7i2szPw,3430 +docutils/parsers/rst/languages/fi.py,sha256=CiWQxGOSnLA05yONUB0tqsnv4IPCbvfPYU7obKRo-kU,3661 +docutils/parsers/rst/languages/fr.py,sha256=42D2mXBLYl1Vc7KnVGi-CFQbhe_DTEIpT26_f3gWknI,3709 +docutils/parsers/rst/languages/gl.py,sha256=48NwM1CfNZOfmSYkqfhUsAww2292kZLPlt_Ty5sGzxE,3711 +docutils/parsers/rst/languages/he.py,sha256=go2_5QONLkGd4KS7ZIBur2vP04GUlN95XnOTizfwZOc,3640 +docutils/parsers/rst/languages/it.py,sha256=ihEL_NivtrckGnU6dT_kTmOrafmPUIC7-e6KMUJ_y2Q,3270 +docutils/parsers/rst/languages/ja.py,sha256=jaRnNN5sTXciz9O9_-kl7rlrScCJC12S3msQWPg5yH0,3863 +docutils/parsers/rst/languages/ko.py,sha256=4cZFij5pbqx_RgKvwg_10TMMARQ9LR_edvLqlLmZbwE,3449 +docutils/parsers/rst/languages/lt.py,sha256=RWSEyHddq14wvtuIbDxRT-JnPuRh8Gk33hOHh5BEXFI,3584 +docutils/parsers/rst/languages/lv.py,sha256=OfnTo1Si1V1E_7yNAwkyQMe6y07FsOA_F-1H2Fb6vIU,3381 +docutils/parsers/rst/languages/nl.py,sha256=2yKY36FtTEkRl-YjBOm9KtLTQR8nTIGT5ORt1qhcWQk,3708 +docutils/parsers/rst/languages/pl.py,sha256=RsEunaFFi6fiko9CZrVTyWTS7MbEuJLd0eAC5EOWWWo,3427 +docutils/parsers/rst/languages/pt_br.py,sha256=wDfQWhP_ZikrL3o9T4SjyfhRmCg8Y9uIS6FnUrTASkw,3992 +docutils/parsers/rst/languages/ru.py,sha256=abw64X77S-WFpIhbbn2v_YzzjphGyjqbMhaQjnLL1N0,3306 +docutils/parsers/rst/languages/sk.py,sha256=dhy_kVHdIVSFW9aBnNBU3YTXstouhmeOMHzZsBQ7vfU,3979 +docutils/parsers/rst/languages/sv.py,sha256=S8vtO81rSQTvAV4rzrzP7XQ1Hg894gtjjlqJ8FcPRf8,3331 +docutils/parsers/rst/languages/zh_cn.py,sha256=6FyYegjPnIFguqQhR9cBu5xxlrkRszNQHWGXEByF05M,4007 +docutils/parsers/rst/languages/zh_tw.py,sha256=PswlAgKcAMvgQB2jbp1hDCpzG63ZfxgBwlJviK8KRHM,5172 +docutils/parsers/rst/roles.py,sha256=o7thTCx0_1-pMkdYseZt5UaYf6RK646ZzhkuRFAePhQ,14944 +docutils/parsers/rst/states.py,sha256=S80k_XG5kA9PNwQh9dlI-JLVDpuRMwObIvPhNxMaQ04,132111 +docutils/parsers/rst/tableparser.py,sha256=Zbvt0mR6LJYeiMR495xe0dgqlK43HK9JjIw20PvcqdM,21001 +docutils/readers/__init__.py,sha256=5alRbkyRVbNkq8njp1egI_OnGyXkxQBwMGa9MbxAoD4,3456 +docutils/readers/__pycache__/__init__.cpython-38.pyc,, +docutils/readers/__pycache__/doctree.cpython-38.pyc,, +docutils/readers/__pycache__/pep.cpython-38.pyc,, +docutils/readers/__pycache__/standalone.cpython-38.pyc,, +docutils/readers/doctree.py,sha256=9QNTk_8x46sDkcSjzQiyFZxN-m9CBO3XA5bLar7OA0Q,1607 +docutils/readers/pep.py,sha256=V9b6SUQ_h74KK11wq5k2icEPGWQuVDG5gCzhWlJdF3Y,1555 +docutils/readers/standalone.py,sha256=6kRgqKD_REEZ_zZE5AW0rLj_rqOhisubS2ADyLjOAJQ,2340 +docutils/statemachine.py,sha256=zneRqVNxZaSKK7RGag5QrlbCSAkuphG4qlZXu7CeEXw,57663 +docutils/transforms/__init__.py,sha256=KZ2cNaA87oQNs6Yi_UK2A3V3mUZz4AbZlzaCD-2fFnY,6504 +docutils/transforms/__pycache__/__init__.cpython-38.pyc,, +docutils/transforms/__pycache__/components.cpython-38.pyc,, +docutils/transforms/__pycache__/frontmatter.cpython-38.pyc,, +docutils/transforms/__pycache__/misc.cpython-38.pyc,, +docutils/transforms/__pycache__/parts.cpython-38.pyc,, +docutils/transforms/__pycache__/peps.cpython-38.pyc,, +docutils/transforms/__pycache__/references.cpython-38.pyc,, +docutils/transforms/__pycache__/universal.cpython-38.pyc,, +docutils/transforms/__pycache__/writer_aux.cpython-38.pyc,, +docutils/transforms/components.py,sha256=F0fXyOZsf_OA0QsX-jIAsk3RLCrkEW9GRR1-l0Nx13o,1993 +docutils/transforms/frontmatter.py,sha256=ooKzVho4qdgnkDqbjLql6AauIbJ8vHglQPnv3W4BEFU,20167 +docutils/transforms/misc.py,sha256=0jDAIndz8a7C5TVWLkC44N1pVfhwZu4nu-lnk1GmzGg,4882 +docutils/transforms/parts.py,sha256=jxs_CsaBH7uyvtCrxZqHQynLj4ktKax-_4d2xVDNNFs,6997 +docutils/transforms/peps.py,sha256=NdXwjk5gvzuzWDXred5OEbpPIDn2bWxECrBkYC_gF10,11056 +docutils/transforms/references.py,sha256=3094yQhcQa84BzcX1zjKTK7UGMjhOYejvwcv_8k7WZw,36478 +docutils/transforms/universal.py,sha256=tRcngG0usTWzQESOKqJeO4VCi3KlHzoUxHBw5ZJ_ljM,11380 +docutils/transforms/writer_aux.py,sha256=4Zd8z8s4jTG2J0xSnm5hj1kiZrKN6FqvGvpJ1cb09oU,2609 +docutils/utils/__init__.py,sha256=5VaDEvT45RFBaJvB_g5zbMilxQopc3hOMUa0SI0CRoY,28767 +docutils/utils/__pycache__/__init__.cpython-38.pyc,, +docutils/utils/__pycache__/code_analyzer.cpython-38.pyc,, +docutils/utils/__pycache__/error_reporting.cpython-38.pyc,, +docutils/utils/__pycache__/punctuation_chars.cpython-38.pyc,, +docutils/utils/__pycache__/roman.cpython-38.pyc,, +docutils/utils/__pycache__/smartquotes.cpython-38.pyc,, +docutils/utils/__pycache__/urischemes.cpython-38.pyc,, +docutils/utils/code_analyzer.py,sha256=wdT6BK7wcyYs13lu24KamEmXqRYi0fZgQBJCwE39ff0,5166 +docutils/utils/error_reporting.py,sha256=R0ViAzmz8GWr3Eayu51l6m9kCivbaJLCIf4NOiSPvqk,8460 +docutils/utils/math/__init__.py,sha256=TUGMP6ytwBzbQCHrFSxSl8OcDdbLGfCCkGteBdWm6l0,1755 +docutils/utils/math/__pycache__/__init__.cpython-38.pyc,, +docutils/utils/math/__pycache__/latex2mathml.cpython-38.pyc,, +docutils/utils/math/__pycache__/math2html.cpython-38.pyc,, +docutils/utils/math/__pycache__/tex2mathml_extern.cpython-38.pyc,, +docutils/utils/math/__pycache__/tex2unichar.cpython-38.pyc,, +docutils/utils/math/__pycache__/unichar2tex.cpython-38.pyc,, +docutils/utils/math/latex2mathml.py,sha256=JO-79izteHloIWN33QIhg3v-8cbI_kWGwvfQ32tbarc,17456 +docutils/utils/math/math2html.py,sha256=ibVwl7RbG2F--iwVVDhGoEqxnKj552Y-HYm7TybzREQ,184696 +docutils/utils/math/tex2mathml_extern.py,sha256=Zx-47MMnzGnbP9YLu_Yc6KM7dcuSgzJPfKZy_i0gj5I,5656 +docutils/utils/math/tex2unichar.py,sha256=0tXV29tatGECc6zDV78yvx-6vc5npfO1GukZrzbI5ps,35109 +docutils/utils/math/unichar2tex.py,sha256=pQsCi50-vC7hbl0DsfHEK5Xn9jhHOAOtG6D0tTWGAAY,17590 +docutils/utils/punctuation_chars.py,sha256=UPAtrr1Om1cJ0l3JpNLvnuNryfR8ybXNvOJNriO7PW0,6426 +docutils/utils/roman.py,sha256=nJRHm0rTPqrKFrwJNwOM8ywKIy81DKvAlXPdnOsefIU,2688 +docutils/utils/smartquotes.py,sha256=DuVPLCPUnn1Q_TPn0PzNLRTonSPPNOTgWbo1cc1kQY4,40050 +docutils/utils/urischemes.py,sha256=_wNIoSw8D_Ch4dLGMZmCTceF4mT6jnodFK_H2HDSRLA,6272 +docutils/writers/__init__.py,sha256=ybRAHTZrV29u5zCFTbAcQvh6ZZDRgQqliRn4cPMiVzw,4593 +docutils/writers/__pycache__/__init__.cpython-38.pyc,, +docutils/writers/__pycache__/_html_base.cpython-38.pyc,, +docutils/writers/__pycache__/docutils_xml.cpython-38.pyc,, +docutils/writers/__pycache__/manpage.cpython-38.pyc,, +docutils/writers/__pycache__/null.cpython-38.pyc,, +docutils/writers/__pycache__/pseudoxml.cpython-38.pyc,, +docutils/writers/_html_base.py,sha256=h30bM3-CdDeK-lF1DM3-M1b_-4n7rAjl1N0VP_CRXpE,63552 +docutils/writers/docutils_xml.py,sha256=P8A8o8YnEZQXmHQrXF-D3vXCm29RZE185Fvd_sJWIXg,7134 +docutils/writers/html4css1/__init__.py,sha256=fFw4DkEEIZmPM8B90Gw15raeupFCQZ2dw61gMS4LV9k,33839 +docutils/writers/html4css1/__pycache__/__init__.cpython-38.pyc,, +docutils/writers/html4css1/html4css1.css,sha256=BvqQaXs-bQ6Vx7TVsdXxxLwoiQeXQ-Wn1z7ZXRXk_q8,7210 +docutils/writers/html4css1/template.txt,sha256=HDzUUyAv7gT4ewGQTqfOE2_9HOVyGu9-wCRgsmoCmjQ,114 +docutils/writers/html5_polyglot/__init__.py,sha256=c_rbVRHUFlPFl6tBKv95WoC1DPeDbqL-2vazhCCVJ3k,9612 +docutils/writers/html5_polyglot/__pycache__/__init__.cpython-38.pyc,, +docutils/writers/html5_polyglot/math.css,sha256=hGjowMetSh3oAlkm7_EA2pTtkv_Lg_TgwrBkyNs85Co,4783 +docutils/writers/html5_polyglot/minimal.css,sha256=pdv3dDbMH9X4VQS0aQO3Ufqg1h-waHnNJ0lFeBsy2Bs,7468 +docutils/writers/html5_polyglot/plain.css,sha256=pHd4urXyhNsneZq1MHvnScLIsRhEdyoU9X52L7fF3gM,6939 +docutils/writers/html5_polyglot/template.txt,sha256=HDzUUyAv7gT4ewGQTqfOE2_9HOVyGu9-wCRgsmoCmjQ,114 +docutils/writers/latex2e/__init__.py,sha256=aBoY6-pndI5_6o1Afw-RF2jHIxhKe36ECDEbO4WY3RA,130375 +docutils/writers/latex2e/__pycache__/__init__.cpython-38.pyc,, +docutils/writers/latex2e/default.tex,sha256=KQFojDUG6AFGSZFGWVsQCslQrWT5-JVB29idVWiRtUA,422 +docutils/writers/latex2e/titlepage.tex,sha256=wxPKr4rylqUamK2U0EJXQTaVQ1392ua5DtSVGDqrNsI,534 +docutils/writers/latex2e/xelatex.tex,sha256=oUEz2Ze3wpoMp0X0iVELcUGNtKVre5Ug5Ujge7OiMgU,672 +docutils/writers/manpage.py,sha256=FEM_KtyyY8PgAScTa5R7dXLKlGCJPLbsaapNoI1SORg,36148 +docutils/writers/null.py,sha256=zyIuah_o8SlqvgbOWLRG9chpeNKky0D13lOTtR1E73U,450 +docutils/writers/odf_odt/__init__.py,sha256=8mr-TC7zljTp_mUUL-tZNhCCS5lezfojN1yadSDRqjQ,133436 +docutils/writers/odf_odt/__pycache__/__init__.cpython-38.pyc,, +docutils/writers/odf_odt/__pycache__/pygmentsformatter.cpython-38.pyc,, +docutils/writers/odf_odt/pygmentsformatter.py,sha256=iBsRNxRe-v378-whp_F8CwgvuK7Ck4o_Tx4Kae8NlYw,4671 +docutils/writers/odf_odt/styles.odt,sha256=xKv9z2sd1qNxAH28X-5st5JuDZeTw6jyDOxXohsFrKY,16500 +docutils/writers/pep_html/__init__.py,sha256=gOJnTxuKLtM-81wdjIFbH5GyTFLV9m1_ZOu7Lys_MZc,3558 +docutils/writers/pep_html/__pycache__/__init__.cpython-38.pyc,, +docutils/writers/pep_html/pep.css,sha256=UbFfiHHFSWusk2rEv7AUaTCS0r6TxfMzgLtW0VURwGw,6367 +docutils/writers/pep_html/template.txt,sha256=CfyVCCoqqB3Y8hOyt7Uxf0XeyTwtFf926L_hJeaS1wU,1294 +docutils/writers/pseudoxml.py,sha256=2bRL9zMleW8jDuGaINvM52siZiJWH1-zQfEELJE2oPE,772 +docutils/writers/s5_html/__init__.py,sha256=MUczVy19slU_C6s1akdizatEvt5KPi72Bmj2f46r-IU,14688 +docutils/writers/s5_html/__pycache__/__init__.cpython-38.pyc,, +docutils/writers/s5_html/themes/README.txt,sha256=wsty9ouRFxVMrZV2EUTOmfMS_bJJpmA5CqU23fpMccM,301 +docutils/writers/s5_html/themes/big-black/__base__,sha256=WeKnChXCPkrXDs7Xr-Qnf1i-bgFjkeaKJ-ilXV0R5lM,38 +docutils/writers/s5_html/themes/big-black/framing.css,sha256=RctE4TbWO_ctWsmE1LSPdCVRMT1QFlTrNmQNKC4wC2Y,911 +docutils/writers/s5_html/themes/big-black/pretty.css,sha256=VFK99wlPllRBKK0eQ2Yk6RC_-VDMREm-ue2Mp3YMs7A,3606 +docutils/writers/s5_html/themes/big-white/framing.css,sha256=6M4vVFfoErc5LKtuol1RqnId0166VecGy6rYu9cPY9c,906 +docutils/writers/s5_html/themes/big-white/pretty.css,sha256=YO7dDIRq7dXpIdC8pEOf7QaBb9nUvajfWkkQpxt3nJs,3566 +docutils/writers/s5_html/themes/default/blank.gif,sha256=L1YbAqSTduNnms1ZdeN5Cr3_Cey636HhhYx7om4__O8,49 +docutils/writers/s5_html/themes/default/framing.css,sha256=fcGapNDqnTT2w-2HpWTHb5yf9Yq-_31DJuazk7lCSQw,1003 +docutils/writers/s5_html/themes/default/iepngfix.htc,sha256=ve7IwOG4pkjDmYItcuQrUbESmVaY6ACDhhA5YP9d73c,1190 +docutils/writers/s5_html/themes/default/opera.css,sha256=guPZOg_BINv-LjV9_IAM7ILFQ-fKALNjlP1i06e5dmA,261 +docutils/writers/s5_html/themes/default/outline.css,sha256=z3ACJiW3_gnG8XFvX602PMTYvKhbRybqCeoWl3O_pA0,648 +docutils/writers/s5_html/themes/default/pretty.css,sha256=dUbMlVTFGx3ofvXGUmhnKAADhBkHsdU0ysWpxwX-70M,4384 +docutils/writers/s5_html/themes/default/print.css,sha256=INhYRMsY7y2wd9p7tqjcDWBREXHUMO-2ApAWvITyetI,818 +docutils/writers/s5_html/themes/default/s5-core.css,sha256=MrHjKxQ7P7ZFC2FmEq2BnkRWs59YVzUS_ZOw8CHC2Jk,451 +docutils/writers/s5_html/themes/default/slides.css,sha256=VKYQ1Oe8lZ8LHxzPqJiU79J0z295nkmIbzsXL-N_dfQ,283 +docutils/writers/s5_html/themes/default/slides.js,sha256=n6_977F6UKSfpYSDu5RKhS1g7iehHcmxm1jDLD17ME4,15800 +docutils/writers/s5_html/themes/medium-black/__base__,sha256=822LJG-LrdBZY6CA7wsLFCFzsYfxbyz2mr1j6rpb1UA,41 +docutils/writers/s5_html/themes/medium-black/pretty.css,sha256=zoRP67Cmy7JzwnXqKe02GwGzt0p5z509ymlbaxXuPoI,4031 +docutils/writers/s5_html/themes/medium-white/framing.css,sha256=nstQg2Fwdm6TTRHflpYRE7Q3b2jFO5p6tyDXJhsmi0I,944 +docutils/writers/s5_html/themes/medium-white/pretty.css,sha256=SafUPS2T_uel8lPQlvouTXUrgT9QY52nxnBJDt_pmP4,3991 +docutils/writers/s5_html/themes/small-black/__base__,sha256=WmiB80z49RfMsy_7tFI042AfUgyztL5OXI3tap9EfQM,40 +docutils/writers/s5_html/themes/small-black/pretty.css,sha256=G_e83H9lIDHXtUBJRCnsnxSiAhP0zaAafQwSviioUQ8,4030 +docutils/writers/s5_html/themes/small-white/framing.css,sha256=klf55tsjjL7FuzlWi0yY_4bHJWZZhlD36VCevg45o70,941 +docutils/writers/s5_html/themes/small-white/pretty.css,sha256=yaLNE-loYn_nSCuzvGVJWHAbh90dxdO5I06Cv-d4wcM,4001 +docutils/writers/xetex/__init__.py,sha256=ROox1G2bCAOJoht_UttnqAVgFckavEXjlkpBpQj8LFc,5797 +docutils/writers/xetex/__pycache__/__init__.cpython-38.pyc,, diff --git a/lib/python3.8/site-packages/docutils-0.16.dist-info/WHEEL b/lib/python3.8/site-packages/docutils-0.16.dist-info/WHEEL new file mode 100644 index 0000000..78e6f69 --- /dev/null +++ b/lib/python3.8/site-packages/docutils-0.16.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/lib/python3.8/site-packages/docutils-0.16.dist-info/top_level.txt b/lib/python3.8/site-packages/docutils-0.16.dist-info/top_level.txt new file mode 100644 index 0000000..5492d76 --- /dev/null +++ b/lib/python3.8/site-packages/docutils-0.16.dist-info/top_level.txt @@ -0,0 +1 @@ +docutils diff --git a/lib/python3.8/site-packages/docutils/__init__.py b/lib/python3.8/site-packages/docutils/__init__.py new file mode 100644 index 0000000..5bb6504 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/__init__.py @@ -0,0 +1,233 @@ +# $Id: __init__.py 8453 2020-01-12 13:28:32Z grubert $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +This is the Docutils (Python Documentation Utilities) package. + +Package Structure +================= + +Modules: + +- __init__.py: Contains component base classes, exception classes, and + Docutils version information. + +- core.py: Contains the ``Publisher`` class and ``publish_*()`` convenience + functions. + +- frontend.py: Runtime settings (command-line interface, configuration files) + processing, for Docutils front-ends. + +- io.py: Provides a uniform API for low-level input and output. + +- nodes.py: Docutils document tree (doctree) node class library. + +- statemachine.py: A finite state machine specialized for + regular-expression-based text filters. + +Subpackages: + +- languages: Language-specific mappings of terms. + +- parsers: Syntax-specific input parser modules or packages. + +- readers: Context-specific input handlers which understand the data + source and manage a parser. + +- transforms: Modules used by readers and writers to modify DPS + doctrees. + +- utils: Contains the ``Reporter`` system warning class and miscellaneous + utilities used by readers, writers, and transforms. + + utils/urischemes.py: Contains a complete mapping of known URI addressing + scheme names to descriptions. + +- utils/math: Contains functions for conversion of mathematical notation + between different formats (LaTeX, MathML, text, ...). + +- writers: Format-specific output translators. +""" + +import sys +from collections import namedtuple + + +__docformat__ = 'reStructuredText' + +__version__ = '0.16' +"""Docutils version identifier (complies with PEP 440):: + + major.minor[.micro][releaselevel[serial]][.dev] + +For version comparison operations, use `__version_info__` (see, below) +rather than parsing the text of `__version__`. + +See 'Version Numbering' in docs/dev/policies.txt. +""" + +VersionInfo = namedtuple( + 'VersionInfo', 'major minor micro releaselevel serial release') + +__version_info__ = VersionInfo( + major=0, + minor=16, + micro=0, + releaselevel='final', # one of 'alpha', 'beta', 'candidate', 'final' + # pre-release serial number (0 for final releases and active development): + serial=0, + release=True # True for official releases and pre-releases + ) +"""Comprehensive version information tuple. See 'Version Numbering' in +docs/dev/policies.txt.""" + +__version_details__ = 'release' +"""Optional extra version details (e.g. 'snapshot 2005-05-29, r3410'). +(For development and release status see `__version_info__`.) +""" + + +class ApplicationError(Exception): pass + +class DataError(ApplicationError): pass + + +class SettingsSpec(object): + + """ + Runtime setting specification base class. + + SettingsSpec subclass objects used by `docutils.frontend.OptionParser`. + """ + + settings_spec = () + """Runtime settings specification. Override in subclasses. + + Defines runtime settings and associated command-line options, as used by + `docutils.frontend.OptionParser`. This is a tuple of: + + - Option group title (string or `None` which implies no group, just a list + of single options). + + - Description (string or `None`). + + - A sequence of option tuples. Each consists of: + + - Help text (string) + + - List of option strings (e.g. ``['-Q', '--quux']``). + + - Dictionary of keyword arguments sent to the OptionParser/OptionGroup + ``add_option`` method. + + Runtime setting names are derived implicitly from long option names + ('--a-setting' becomes ``settings.a_setting``) or explicitly from the + 'dest' keyword argument. + + Most settings will also have a 'validator' keyword & function. The + validator function validates setting values (from configuration files + and command-line option arguments) and converts them to appropriate + types. For example, the ``docutils.frontend.validate_boolean`` + function, **required by all boolean settings**, converts true values + ('1', 'on', 'yes', and 'true') to 1 and false values ('0', 'off', + 'no', 'false', and '') to 0. Validators need only be set once per + setting. See the `docutils.frontend.validate_*` functions. + + See the optparse docs for more details. + + - More triples of group title, description, options, as many times as + needed. Thus, `settings_spec` tuples can be simply concatenated. + """ + + settings_defaults = None + """A dictionary of defaults for settings not in `settings_spec` (internal + settings, intended to be inaccessible by command-line and config file). + Override in subclasses.""" + + settings_default_overrides = None + """A dictionary of auxiliary defaults, to override defaults for settings + defined in other components. Override in subclasses.""" + + relative_path_settings = () + """Settings containing filesystem paths. Override in subclasses. + Settings listed here are to be interpreted relative to the current working + directory.""" + + config_section = None + """The name of the config file section specific to this component + (lowercase, no brackets). Override in subclasses.""" + + config_section_dependencies = None + """A list of names of config file sections that are to be applied before + `config_section`, in order (from general to specific). In other words, + the settings in `config_section` are to be overlaid on top of the settings + from these sections. The "general" section is assumed implicitly. + Override in subclasses.""" + + +class TransformSpec: + + """ + Runtime transform specification base class. + + TransformSpec subclass objects used by `docutils.transforms.Transformer`. + """ + + def get_transforms(self): + """Transforms required by this class. Override in subclasses.""" + if self.default_transforms != (): + import warnings + warnings.warn('default_transforms attribute deprecated.\n' + 'Use get_transforms() method instead.', + DeprecationWarning) + return list(self.default_transforms) + return [] + + # Deprecated; for compatibility. + default_transforms = () + + unknown_reference_resolvers = () + """List of functions to try to resolve unknown references. Unknown + references have a 'refname' attribute which doesn't correspond to any + target in the document. Called when the transforms in + `docutils.tranforms.references` are unable to find a correct target. The + list should contain functions which will try to resolve unknown + references, with the following signature:: + + def reference_resolver(node): + '''Returns boolean: true if resolved, false if not.''' + + If the function is able to resolve the reference, it should also remove + the 'refname' attribute and mark the node as resolved:: + + del node['refname'] + node.resolved = 1 + + Each function must have a "priority" attribute which will affect the order + the unknown_reference_resolvers are run:: + + reference_resolver.priority = 100 + + Override in subclasses.""" + + +class Component(SettingsSpec, TransformSpec): + + """Base class for Docutils components.""" + + component_type = None + """Name of the component type ('reader', 'parser', 'writer'). Override in + subclasses.""" + + supported = () + """Names for this component. Override in subclasses.""" + + def supports(self, format): + """ + Is `format` supported by this component? + + To be used by transforms to ask the dependent component if it supports + a certain input context or output format. + """ + return format in self.supported diff --git a/lib/python3.8/site-packages/docutils/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/docutils/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..086e028883faa066adb96fe29b7b0c0b8e66cf74 GIT binary patch literal 3952 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/__pycache__/core.cpython-38.pyc b/lib/python3.8/site-packages/docutils/__pycache__/core.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..161153dee8747ac84177272cf2da70b075135264 GIT binary patch literal 21680 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/__pycache__/frontend.cpython-38.pyc b/lib/python3.8/site-packages/docutils/__pycache__/frontend.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f721056efec7b42bf20c7fa617dd985ed123a0cc GIT binary patch literal 26902 zcmchAd6ZmNTHkxG)~;UEYRPTMmhCrf%j&XKC3*MAvc|R~FN53?YRUH0EY+pDue+;N zUDdj;TFax_1IWw*Gcc1tfWet`6Cjv15E#}00$~^k%RmU^ypxl|Nl1colAPou`6CXt z^80=Fy;qCcW;iD&ty6Eg@2=nd?zi3VyE;EUUa;`@Atpp&AYX-M-|lQYgT2i8dKxA-=-c{6Kcn6cI9^Uel@9f;%T2cqNda? zJl&z5P`lMFc)C*^RnzKLJl&<9RD0B3Jh|$ax=r1Vr}wE3sD0`VJk6-5)Sc=sJl(CH zR<3#K?TpPxq=5>RxpKPY2XVHLHqvnpO9y`_ZSOI;cvx-}juQ z%IeT-mOA9+R_?!^s@#v1!|DN~Jb;vgNI8g<2h~GJc?c;bZ^ugcdb(0V>ci?0q(0(} zBG)+HA61Xx{W0$l-VdwPyj6U*c0FZTh2!nj)mlrHnvIs{;=!#Wq1|%Vbi3~PextSI zF1EFMqFrC_G@8DN2LWiCKP^O!)eq87}~-yjqK0Od9TZx>eKH2Gf?c=P$RLYN(-lyV-74eGeE> z>v*b)SwxqsoRyn$0_DE0oXT4RzGL{;dZ1cZtzGo0Yqid@U#(s6+f5=x9}MT$yt)gN zZmbDnv|E5A;EbW5NrQD&A9+xwGO4|JLAG`6sdL`d&YPsZb45EGpFe-*%-NIk^VR21 zo;ve}^CniTr9p))eB5!icBLPkkd$5WI`u0GPdW3nUQCBOnr+}hZ~nrS=Z&`pe@^E^rz@|0piq^a<;uQybZi)lIF~-K?^&r)=v|x|`W_ zwk&*`{)n@Y+i;@qxvnGMU1fvvIKgiKgRp#vm2Qlc#5ycbx6yJJWIgM$Nm;;3n;k;x za>sz%_ zK~XBWctxrxOV+t!D$HRb*;1G_{R}gWj<@O;^I;Yw3Cl4|;T~q>YnU}-3e&75%$nN5 zk)*3(3N623>01Haw;nmvSzSA{)>td8x7M(RJyp80?0L=7#o)q)YY$#rJ)|Ofd`Rdq z(6hXDEu0u!=Z|x?ICWMoZ%^W%-izmfiOnK`%>Ouk{v0mBL^ri*b)7AHBmJ_~I+(UP z_QireVp|&-+kADpnJwG4UbY^AAh3~nHS>z~A*XUZ!xVjJ3QgNgaA0(>W35vIkEg7U>|xJb_eS1gErPPXN06 zY<(xv>Rc%CAD=k`0$( zh98a_$b*!TIfvsBPl#S8qE{c>5mPn{l%2qBa@rnoArAQyxL6LMGGV9f?2R!;A3(~x zL*`+89fFJ-L8jaX8GAdZ{Q58)T$yz@VnhZi?reRz-GD%YSF(h9XXc&rE*y~SQ4Dal$J64Hg{HMb3Fq9I54p67CDu6ixd20?NN zPb4*Gu634y^9u`Rauycc)wWu1dc|T&--Y3aV`jDtchv7glAhsZ2oLYN3FL$P^ktOs ziPP}}IJT2=-ga&jGP;P=fl0_Afh0iCvxNtspM5c_U+UVMc;2!>#WSGtKuYD@YIU<+ zr<>}guY(kHQ~DW@3J1$Q`nE+5Q0b()&PtL-s^3a?K_)sGAa{ zd(3ujWK+AHw4G<#jkKc=A@9Jn4^XA&@fB>^?%3BIJ<$cN33g)&9iTvJ%i2tDS$je2 z=Pj(q3@Ftz(Ru{S?+&a-<;a9~k1u=mi-)kVRzVvA&y6Iy7{riKNyO#voL={ixbA@m z4jgn3v|GGh^L*YQ4tWQ98K12+edIiFSTZgy^44k}ICx-@ANXc62e-$>AZ`@^WgDcJ zbH!X(Xh5U!p?=i8FwHz+KFaB1W z0ff)7cVmL|qj>-N!0%6WZDn7~>*=p|8oHSM4`Fg%iP`Os4THY}I_8xG4F6xIKqj`< zib$f7u#ULe>#XY*7H`cjHJ~&y*Bp59VZcT|z{`WYJj4r`fqsOS?dV?*=#g6R3FI_D z&rS7!{uokk0=k1lA$4T%#QE#?2Cx_)xAdM4Od9051bs0zCsKAW+wzu-UMCQI0@5nf zy9*#EZNDM<9>{y(>2}cxQ=mKgcGSFWzxO1_(rUNjTB|7X-6&zCG$)TWo457*k#bYt ziB{70kKrLGnBGV0k`mf0W?lBLU9MY$9$35SPG*sk#@TmUzed(jK&GNI7fi&TK ziU~xBIxz+Fv2->eML~YGTYC%*+sNQ9stMC6dC43*bNW7%EM^1?!!&h7eLqsd)LMHj z%t8@^Tn!|>8)@4T^fbhT&M*zXCmGgz=%PQ2Dvj{y6znlfJcRS7kv1?$a%XB`GRPx% zNCr9CwU-2Sscmg!6j1jyaM#V0N^RLEAUbYjWyslNu<79WVagzu3TPuDtoZJ%FgEB; z?##iNNKXPibgwK!t?{9Sc(7n_-PWmp#(!K=oQQe+d>5A`t80C950@1r2y4sM;Qr?6 z^UkF-kjoBI?nvPcTNXQ(jZ;1x+Kpi-7LKxeFbl06`z2P*2`8f~Siu8*03KA~S)_ba z)Ls7=9^x9_vJXbHte-?Z`WP>qY5f6Q-h*Z9r~R0?c+XD!6iOtFAe+jA5fp6w z98w1+n1D;+ClgF!*R}mT^(FxsbTGpRK%pRf%>$f5nF6PL=q>vYlza#j%D>XU^4X43 z-kx-ET{o*8U2DL`w^a2h+kP31MfjHn(FC`0^aqi4Q}+_(B^J?Fu)L_gM5HGLk`jyP z7Qb=M6P|<)zhTe829b~T)i5Jw#Bkz7VpKVWX$o^MoHpcQyOH#0=a4DpD;x&97z?}l z%V>I#(+>-Y z9HoXaaCb7jBDYk<;Q9w>$)Co>0@8{2hx-_q3e~W@qq$56=9mgBe}aO4f`?)7EP=iV zh<Eya2*KL)(=;$wYM>g^;7b$s3N$Fq1jC}CwFzu^}nY)%K0Ls{HVNUi}Yr5lJT5m%uP~Kvr1vU@MD(u{(eP>0EacfET z*=DV^v|d~CN}bx$K~v5z(s)d(MrR%7R=+HK=1r2#;Nci=FnjBs$fafXSqjUd$IKj! z>pOPjsC2?VHd78WHNW0ygp6>H^!H2i2^9;rA#x8^Tq5@F{ zPZh8NV2W@G?~JAMpmt++7C*jcQ{cQ5sp=%e@gE5@LCZ9M0hdofzJ^>5M!b767JfjxwrAv=T{kWCYLeZ76$n%qHhrvv<&CuP2-t=8((?bojjT$kH005&$}olW8mlAM z&53R4)TLQGfz@tt?JR?0r@@SKdm%S~V$aIE@Q+Kguo-2p+q5`go$SFIS_M7N)xHH? zPe^gSy#|_vjljr=rG?&@{=ETS=8o_<|D(ih_P$QrW@ommt zn8JxGTM-Q?W&)>F(#t3`_m*7>?JD$x0?akoUM9f9T-5D|8dM4xTeQVDjNzmO_YlL0 z#h?Xt;hkW1yB)ag$bmkGLSg}c`bTmQW;9rprz=da^YV(M3WLXv&v-l$GOb}Qnjqa| zu6+DapTKJ+hrI^$+ppxM_dtqJo;b%tqX>6z*W=wBmW!&aLf+X8(QeGiLcB}E%$o*# zbHLgroiUo8eB@zo2mUxgPvIvU@n^D=1P*H@7Ceoio@a!VA){0%1+>@d(T z$IWajuN+4apUWq<6lhoqRvcM-ptrcgHouvX9ok1h%d?b00D&3MSlaz(AYV%g`W6p;ds?- z$w7jHBm!M2;OByDrBqpmz6S|?;^Yvd?!ecl2q}Wm0wc|elsAPZn!)pSFdo6ov@<}Z zP_CzXQ^5xg@CWYpS@IYs=*jy2GF&OzSHKDqM$=qeC{qE4hERi7g%3J4QZ*`AwW_}f z^%ZRy&+zni@#z#h%~fbQ!D!S))=dL7(1>&Z;44(CW`_vRV^xU6wPy4sSFM7#pdI3h zCKxoU?Q2RPMVUi$P99`?WayALGWlG7Oj2*63tTWy;pY?VF zo*opUCiv_G%m#vgU*vokj*Xbs>|kin1zKHi$GRtIKrKD4%pjn8(mYBJWqU_!Go3E zjYSL71f^lvc_;ADas z2#jxJ+i5)Hok>T)bJIE?zjz8i|0?pu>mcTjD!r5fhs=&I600* z|Hf7PZ{qclO5Pjs3M->(hnl>eTB~?tYZbM#GOng76KWUS4&h|DWH+qE6rBv!o+U@^ z^>(P+UU!gkyV|#8t2^jcDDQA8R5QqNH(d$Uy|1T`=Kx&@CGEZ>?S6F-T8fv{nt7Pt)J?NM)1J*FO)df%^(Ams_vauolbd_9d^$J7U+w5Qb5lIt0D zTvF~(C!~ib)w6ittFjowbCTnE^#W2ph*6jv-=I!Oju$1*oYZ?-ok7|i>cwcB->A+q zPXdQ|bxyvYkG{X8UdHO-pH?NlF@IzFO4Drq0f_9>CKK3wv-%dKd}{)`>*_W2ZRq1Cyj|*( zQsz_Y)5!7d-fs0B^8Ok1S@oUFp}q@wJ|{EqdG&V&^88(I+?$|PQ+>Dk9;t0S$@}-b z38a57Ml+Gr`F-m9)fbTO2h{88@2f9Lo&P{>qRy^&3vg^pQhreVL#C)70v1iHAC@`! z5%rJMkD}xo>c<4jeq8;8`bl~JDZYERs-H%gf2@8cdiz;<`zO)c&*AM2wKsbE`GL1D z4ZQurz}qk4?G^P)-X8VK>=|15mEQNo2NzRt0iKNh{p#y!I0AneF2KJA=iguV?pV1K zzq>w{)&=z&e44gCmtGrFKZ7;wa^0(cy4S+<`xevF7F>S+T>X~%XK>)XTm82B3gqQ` z)bFUT;=W(~uKGRP?^XX?{XXso)E}rn#C=x%k@_0$MfJz(PjJ6a{R{P{xZkh-rTR16 z52{J<)_)a_8Paz~9CK+3q1L5pn%Q?CZd6vxPMDo8tT&p5zmcV(38N|Z`S2R1gmUPW z9&)#pzIT?PXGe@FQiG2h&*Qkq?yT5f(c%RU;#X1XO1e~vN73WCvNzjmcVv*%+rgDP zbkkji2XMqD%}BtoJbgLR(+NfJ&$wCRBbc;92Vhr*k3vQ%1_0K@F&eI>vFBQ(L0%MuhvB5S zxEMOEc9;=oiqO&})H$cmv!R!83HChawLA@*M1mLwGyUKIO&T;W6Ad^b+7sMPqXSV0 z4mPWBkc4+wtsLY^B}ok)e8IT!xHWgiR12>i>V|RMGj1JTu<+0^_}sc!4n|9*CFueD zHen!GqDcULTiDWC_aJy@YsNQ?a!oLEq787tmYy_|6pbn_2NR`ItKF+I95vOM;g2Nw zVPx1O48DW)CjFL?Qka9mp3g9ai(RH40JG=M9WR!HY^g-wICNRXZ2%wqPLSXKq0;`< z(tcGLVFoC)t7~urV{2hXvY1BijDf|5#AE$lmj&Ej158B&onR`i)7}64k^L{a=t6Md zCSWAZvCs6Dwza^4_rh){NSPU zuqq!tfA-WdV>N=wjU}YO6E0orp+36<<;uZW@{X;_Fh{((T+=~D>Iq6W4dXpKH7V2E z*RL=i`@$EU%BcAOkMPz-Ad+;hidG}|>mT7HjK>A4^wtd?K84I;3dfohWOJ9{4GNDx z62o(+j{^%p8nDv?r`1R$EC#m#=i7CJN_6zK5_fLcq+c0FVl{b%k1D^z{!BD82=_zm zLN2N&IQ*WC3ud&}ViZJQ%E2zvaHqZ2Yc@>b6=NK1CAj}Y!xzOR=@3UGl}fTPfWn*u zD`7AtfaREy+*l(?jlrY6o-VfA9V|o7KU8lRM@Rt`94JB2;Cuy0^#HZIREqQW)oj*- z{xO0@miD2W`^w!3pjp(GVGwb9<=|H7Z~VDeb!93}>&-)O_+%^6;LHTK)>kihvWeG6 zoCf9>V2-e%lw_{J5LoZvwR#mM;8jfPCi^ci>W$>ycqB14CFT1mVL6yKm~2q4*GO>a zthWj^QuZ)0HLln6#E@%Hl(W~P#qj7!f>ZjT2Z_oT$0l%#zz;Z|-p-H*Rl`P~?D zJU_@qJsp_GA5JjxyZeTE^Wgf7qJpP!6V%zaf${&dF_S2p$z})^Fw)EqUofPPpY<3J zzR$O7sC{^4j4 z#Id1)aEZ>tf=2mcCT{A<2WEf_Bc&1qstYhSqUp=QLs2EI_SaX(Bdi00%%$~)*Fg=J z0`+{YiPd-2V{9A^LGK3E+66AxXmIG^DMA)77u$E-Nu-}J=ENhA`DP9Lj2Hm}WT#T# z)c^{{(w`ipD?QjeDxHd?6TgWGrG!CI8wRRXG|~qh*7&5%Zkh8!OsRK*m53D9D0r6W z-H0(lB7>aLSw{pQ5P=_9SoYM+CiM^|4G%dP+9N<2!*mn|2V`a4Xqt6bcJc)~I(&(6 z;-RQF%Db?>1mXk84bPVle$}YKo!{>?>R?rvCdnVTF{zbTw=IEA#F2ze7lg>l=P+Xm zmF6kcagCb%=aPu^=Kk}&<+31bfe8bshETd+SK(@hl&49tkRNwIJwc?=r;a(nERE>JX-Q|K+n zFDp6@r63p@Ed+|W9c=ORqpR_`^8j-bDc3o6#Nd*!9w`Gk$b=7KJoNMcM-_{5XI1+1az zX|RVS88z@*A{oQ1847yXf9#5dQvs5x!`oY$I z3(j+krN<%039NeE`S!RwgY#v8C4e{5oM6A(gV_^FG|cvpN}vSrZ5IPGBWO#9LXdF@ zpeYA;-PH9#cm^MgJ9{(SZtlKGxfxvh{UiIa&LNJN$?C%{FPKkSxCw=aLDGW-+48%$ zCTKF))X=bw_BR@PaUqn@cb_?a#(nrPH%Wu17^8=isfWi7X-NDX3#3^YkKZ6zDKB)q z7Dx%#%&}OAm)RG3Qhb@a^f9e6QFXC*C6%o{QU#sF>}DoQwa(ql2%%(Wfb|BCO28hi z7rk)3*g#^WHbd7CedW-*iDp8`1BW@4t5ohA_qi#)>i4);d}eNvN4Z6xt#wDu6dNrVQ&sQb8rK)ss)zq zj52Nm!Dv=>410p(_&O$T?$+i+*THUt%y4iB*u6!G)fs5Y7pZ z>0s%AxCK_3K(d#^l@Mc0M5hL40T}ygy?Pb~U4s@D`aB%aOeC++1A>jLV$+coP%<%S znbZ{Jbd!z7-Uj2`n{-0J#&zaOLv@xBD>`NvzR`HX9W|w@Tp(4G9F7o|fuo>&bi*&+ zqBn30$NF)}?7)2<>1IP(_8fPeqY+R&kGh^ss`wJiPDbmt3eQIH3{))+Hq+a?6zUes z6nY>G_aHcfG4)=RS{3!q$VMGb0}{Y_vm~e+944W9Q#Es^+sP{DU8$ z1ZdJ}6;4X@;>o7r$^Z|ZNw_gEhSs4+kL}vQEvIF-)@%XvTtQG{^2cr29Dc{~^ZzR@ z;;j0c8*q9N7uG2R={qYHoL9xC5YK}39eDqA5V;L!y_C51eJ5N#;CR=CyY{UXU9~=v zVkjuw_%gcH$!yYf1fKEOi^nS6gv&Ko2SPpRz@38|;N!?YvQgL=?dGwL3o6|mY1rLS zuJDbq?&u~CfY~yx-Iw9UjTPPGgYc}?REQ!p>KP#x=HJy(Zy{M-Ai&1s?;sTf z1hE4NMOAp0(lI_RxWq+pFznCt7Ua{5z<-x&Y!8ni>q1$);Gyzpf5cM03lyqJe^;zIUIh35D3cb0!APY&QG?FiCIn@(M5Ka4AmeHlM%33j=BNDlg(9 z$4&Wg)L`p#u-UAIlO!z>v00LoLN6suVRZ^=5mQ;XGhRi>a+Vb+zAly9hClYkQ5^5B z*>EHQsp;nl_9-LV5aFnC)s)p#8I8K-(-kjcIyWLzkP>P*5r2kujKgA#*VYaWRTj2f zWOaWPY0F&Qhw(sfU;5&~GtW*V3U{|X4ey2t`0B}(QMwM-b{2jQbV(2P8)!vqJD%WS zA~)c~ltMG)xV-z{j7u<0uNq~;u@XmbtRNU{!v@E@4IGal7>7*=2G&hxBRX3Exw0#{ zPa}kzB`@Z5D;T4XPcy&apyWQ396`yZDXHKS_!=DGO{}0exx@bfPVQKn;+i`W9EtpL zV=idOqVZE}qYaEm{2F{Sv?ja|`XO2FUjt3#6$<`G%3dO_8WeII7%f1r#NJU#&N?f3&_X}{k= z)KoDr2_(Mk13mhD5`FP^-EI6`x3E_yUha0Em%Dxjxu8yxM2Gg`8#uQGvL858AE!8p zZ{JT`68BZh!8`{?{`UQaD8f~63}G1_TgyeTH*tpC1{j3*2Wpw8xm2(KHbluax#mm3tMb^Z><`Wl2xc6OQ`$-OQ8hIGNHO=LL zWkY8m!}x-GzrG<4ObAy4p+@lf_u;~z4NM1|jm7bC8a#wSY!(8Q;78xJwj6K|iF}Vd z>cu}!|0RkV@4DOY6c6$ep2IvrLv3sb%k=Nz>kn{DT$UCV_ZU1lgW}&fikPGggaNRQ zgq0hYISd30kOzpEZeuAkXw6wklLZ>@ReEP`q#BGz$s<3V>PC!TemCnsd+BJW0AY4? z?F@WhadOYf*dl~!e4iB${WQElS1x@-@mz=8QO1;xqrHi4E&P{WRHW@Qrf?u5XQ zqQl$@T^3To(`NBgK<#lmu(qDO+jk;EA7zMTScFOm>Ii$83dfF%0%}NNn5Ot;kc`|W z%oE&>rk6;N@fkjmZUeGp` zvX#trECbvTIb21g2IkWa4$aF^Nha8RI4r@x$*}{`Vi46SsK~yl{$;eNe}xyt3*BOk zwD4Pe`c+)wRYj@Q2-7nEauL!oW~vj1LjOz2%5tUvHF)^$9avfYc?VV!>2m^yWxOZ= zb;E%WY{SdhMtm~Y3`JxIv4%5>s|-=+$rnU=$(N(}!ZIHuF=4DVAm-==IZElJou}_5$Y&Pd4K@r1I8jJ%o z`{^`d_UZSqC%u4hjRqyjX8QuRE=4GfG80|P;5f$!X7VVQWr)uLa+qqQ$_j;|*j_M< zw*LjWzfAD6v<1*Ja*5ae`fdT>x!O#K@jjIKVPkjz3u^WJip4S~15%fWl%$VAf?t%+7fp z521lg4J!}_|G{@;)m;$3*}mumzYGWq6_WlY_^$sODj({8IK{Ob=?TVl*8gLUhD^-D z`2fK4y9P#dbN&I~65IKc(VV~of!no~44uE1c)mhq>NZ9&a&*Am>2At_OvT^4b!qz2 z7!*R#2Xo+(IohQLN^e}ys8~IR(Icv(Eh03xtsC$XBLYRvT+H*rqI<2qegHm9JchA( zO)MUgiKhzSpf;E?;9L)XA66h6Uhpz9Rr)+Y(EMTR2^neiM>sC>nzB*LFo57-CG7bk z3&JMll##wJJnbSVN~9FYP;2<805(hLZs-=uVD~SoN%p9@=^>qMM288n3uahRZ`|Ov zxxq60>^}JHbngdGfelY7p?(E z{LY^fGiYM73X@oZ1sDdl!H&T)pt7uZZmw7w_MZL(oBj)4?#HFFGdYT*8t=az;YSA6 z8lUkLHo|D!h4+irlu#(eaUzqA zc&uDLHEBZev9=hNoMnX84fwg=z;{@FVDDj0uz9>e2*x27{7#z?(h&M1Y0PiZ4uX&l&=&K2DJUHRSlZ2lHR?d;5_@>xwh ztK&EDM`HgJem<8=FJeI<0G)PqMD}G6vyesf4z+d0Eg)h6_naD4W4PxLtuTT62qP45 zFQ}br3ina93rugf{tu|O=)ARK&0DK7Iy4Fkt-ufS8Wd!lOxb~O@xPI)vZI$I0o+k~ zn2)W!#Z+a2_4M*pb`8Euxyl$5<3csW_gIBoIL~u~8UE^U+THLARoX{E~dl=8#v);ol&65;Radf1D z_OScnk+W&orTcftq*C?(k+esbJDs&7hkBmB{$jc1b@=Wdq8@$7lr0mW#|{=^SFoAW z=rXL9JP_jeK<&@6%QNLduzcRQszC;!N<{stZ<~&tFu_2gc+tp0hgc!M;C>)66Xq!sPg#j5Uh3Vz*G=35yMuX8{L?taB)F`g=F7cB_q0ZfKS9~J> z;zpI>BG;JIBdS7ANtNFwt0RlC>?wz*=mfVIhz#4m*{%4GEsfxJ96z6pF%N^kDig2>ft zqZ_3_WSiWCdMzpj_NNro3jJqLFm@$ryHOJkVu9`AHVIYD%!RhrKZ_x20wm0tmEvR5 z=I8mIg8UKY)>{qkD4R1U(>wq~b4K<5VwSO(f6^yNCXK;eHMO`Fj>zT*kt>`!Z|XQf zFAQ_ks{TJLo{@0za02*Ng{Q*fhSkHRnJ0{BnfX_kZxj)-u`(X+G=3IUEY(P%4SUCm z#&(f7I&_2`po;IC;Lv~1>YT;3Vf6WrNY4Ta=AcB#NQ@12L~EpV2~v|hPa~D`H53>8 z3w92m7Y95bSJM`g#ZORc6AyBfEA#{E(9j^$)SowT0>0>y7S6cA^!bO8h7%EtuDF>K z6Vxj>JqO5!3B)ERkg~-)BW=xjn<#;k4^Z|p%bMeMTX}^Im@dO3EubE^UL5~%JQw)P zphzGB-$&U#HYy><7t@jU`8GPMzl=+9EX*gqO5=R0!m@`ri3U!8<_tt1!#xHRCnCa% zeT$ckPp1A)tc&zG9Hjw2HgilM8M}$7BA&Al4r_j7^4ByzgcF9)#$^!8CrT(MQA-!8 zdYS0L|IDYmc^M)MBWU?f&g=|6GU`{v4QNS57UrRGJW-8Inww_9oda`v6Rr)IOGr1y z@RJGtGduvCmP{BZ1)dQCy+y_87dO&4C)wfQr8@1m^L&6rm?jCMU-VE zD-JrqAxb!u2nH7u%ZgxY1RQ51p7kgw2IE*4w4wz@wZdpeL_iA#P&$)_XP_U^WBL-1h-eWs66NZ>Vq0lrki+nesUE~Z;(8_K z6^4dh+-p)>JomjFE(ieo0Z9?lgQp`+tQD~vW7;79Ihe5X8M+tDm{UUco9G*AUi*C) z8Wtm4d7grp)_j9BB9l|6GLfx+#HY{jayu`hyb${a!dM06?qO;V(RT24CokW{3k@B^ z$X5XJ9VYTUj*nJ`raN=WF@w)>@+u`uO8LCLQ^3(ecuE-*1?p(IRO<_P5& zb^|mAEU>4`PvV6(DICiRdc#w=Fqx^~P<>S)0D=ES zgI=ZEfZ-0&$s%>A@(_d|m#E&<=?2=#JQ46RNM1g2k7eyEj~I2kyr`MnxxPm zA~7%4>xovCu?SJkX$FE{L)47K^ejO{iO9;(m^Oh8!68u5-V;?dR~#Ew;iuSv9lT_D zq2#2=|1?RZCd%qtc@e_hYhRv3)}na-SCqB*mN)w7+u2+?htmQ^@_X`A`F+qln5&N8 zz#r1n?~@>@+0A=DMFaz04Ert!T(XEELTK=$M5Exz&n$7lgk)ajJG`OXkvOX z&MHJ5L+0M$(+yt4pdxmY1AHy=a)=i(w>-wD_wyp=mZ$mj94{Z_g-WC`#(a!ViWi<2 zC8x<4qvj|1N>#KnHs9wn5l(F*FK{-tn>Oson)5A=akcxO!6m&n9i5M5PQs;F1{w=b z7#@+ze|tbp)2aMeo@D(-fkVGh;O4=N0`cKSfnvyw0+-s20#%0_h5nqx(zulQYVzM* X*bVLa&Z)bmZlC_R^>ORf$;NEi1C~H*xIPOk_H7vT3SKvUXy-n_aIG#B!W4Ny!msD2+r8 znL9%(9#HA7m2HCpEp~wdyFi0NdMHr0=%Np8AG*Nyp(s#nUxEUCnU@ymOY_u+7K2S!d%Y%nLGEMdw#xi?$!0l$%2CG&x~Ac^P-~s8)Zf>1DOlBgNmvs zj#5<|)zMmNTdQiS;^O{L( zEw(4Cld9qxYg0~kJtLOg>1ydW6es88KUAE&duU6q9!9?4OdvnO`6Euznfy?x&Y*nC znMV1vn@78&$d{Z$$RFbTEb@n)Bgh|dkD~rQ+*_M0LZCRe*?S+=@J65L` z;;~{`*LurI4+ZyqF9`V!+q!8B&kb)`ou+*0oP5D*yNy-b_kwm%DSS#xSytnzuJHV@ z*6jI>(Chfsl5nquqSpv}!gZG1_rparnp_gLAJDk2b=^i;kEdImhTU>&uHWc5p1%@L zTo$4u@a8b{Dv$Dx_Nk693Gj&0pl^;|RCob*P(VPUMUnT zT(7&}20xIQg~g8VE?Aa_H`9g|I5p{~GAy)(Yxy1UEI6{|Iq6rqQ|g#5Tdefjt{+-w z+{#MDs@JLidcC|~mzEb;Z7&GGWEJjYVM+9o!R(q=+Np4ZPU|Kn6?S;y0eFZ;(}S#y z&U9XOcg1c6=nr!n?Jlq!ui12k{N`fWj7_k;+X!N_)#3HHQmoOK^Qx`)> z#BwimWj?=jt1BPD;HIRzID#b};S^$$cnS;ASWm_4eqx0j5~ZN2bLxyLh*QV7Gu6ne zs2z$EG_eLPtV07IaWanip$Z+Gb#l;_Stsul@SAfcoFabnZee@EncPvUMRyX~cdDu3 zciNfe-;z^mYE8X*$T{R3M(e|l4pE(nGc2mnQ%u8)%b1tl2(4v1aHWD{wItQohOoO` zS3m*L+Q%6#U1VB#jj)lSIVKl9lPs_tRPfN(`$|pe8%WhY&Kbmy}Zty3c930w3%2M8l0I2% zgN6-KiGz!tX-$~|Gk9=F3t)z8tPPs_Eaq9(7NZAG1q+rO_zS1ReDcT>Lmv7%U#qd9 zsMUtUzN3m0=yRVj3%4t3wO3FXm`D`0pc?mvBbC)-Bc;*uNQqHHdxZFNv0p6NqP@;jF(T~RkRztUH>GkvJnO}(#+YG3El zIY)Pl6>U=sO(FW)cGk&+<_wI6HeJd?uzI87#*1(Kpzq@cfx`yPH+^8rD;m)tj_Y9+Xz3)^up%Z=b~&2Q}fS0^(k?6 zPe<|}KmFTSS&S}U_wD7DOZEg7fJiOBM^pwPTLSWO*myKMEnqjA zNSn8I2@okd67_4i0}}NW@aDV4O&I*Xx~2Y5dk?UYWd(2yGSU^WAX??gSV!-BWvK9c z3oG5|w7V~EQh(I32_B3rschuHE6+1MgBS5IXkMO{8Z(2TLsJ$!tV7o7Ef}Qa!L-!Aw--((h+;9V#+qJp?&Zi5~VPs7FF$@ zp%*kmHIYKi>A6f!HBg>YHFZigwZpKsbDDC&+cTS_ee`XkZ$Nux`WbN^`X}S)JL+VvIT39VK0lHk|c7Q)Yt>0xkAN6Y6E21EfT^S zLzibDS_!&jyd@VgGsJ!Igaa4L^O>3B(nv;v%eeu#+*?!5NPb+xAjEY_4#JYm1b<9K zC9WYDSzsV(sL`|}(pSWgrwK!jjE{ljNPdVW#Yr0IaLD_>IOf*BrqN0O30-<`WSj|t zBvBt+^gNCrITR3mU1AtA<@Nxor1%DgcsX%sVR@mY>V(dv7wXn4i{dnTzM~E0euU>4 zq-QpS7rK9gRsj!4i;4+Bxnh^9rUt31zKRT~YVkOwDd>EB05ON4lb~i=`WypK6+jbj z;RckvhWHscOJ8Iw8(kT7KCKn+rt6Qx7;2L+eu`xhdz#RuoR!>k9^({GQ$jXeJcA@Q z*`B)6D&L^u-L8vx3uQmUE!7>2pfr^Rl%AnQlL>`nFC&_*ut&3rZ&TkyDe(p+Lsj-B zW$7y;Umoh9*HQ6@xETwL=pY4J=n%A!A*jWe=Ec!Qph3o}sA}SRgPsQ$MWE8a&o7aYVIO!F8WfbVlYz$prm1Q0 zXuvo%qp!lt$%#MeYvK>W%$n(FnAR1rR2Fy6(LdHUv%cXeo7re4%%c~xsr9qJPb#i( zLwWCGgpVfRi~In-NDjWpOjzva)+TXJ^|dYiw#t5qx|#bR$9~Dj@Jl|ycc$rm|9twz zPr?$uSD^21X^w#reG(pWh`nhXg|+O!UxB0k-_aD89Y!BVZYcf?#xR31{9+Ki^0g#% zW!iraX-i?s!fU_^Z9<#DLRv^(!dVDB`}6e$%LN{Q&9ui>z&f+B>NQqLipY^fJVyZR zw{Df^0aJE$XIU};mA-)$^(ZJ7+zKi|2%J|Z2g&aYKFfNsE~T_Q1TwpZCfh7vU=(X0 zxFv^3LAhjDov!Oce^GcBbMSeXW4#SPFs8~X;(bJ8;Z0j1;FOK&! z8V?zCmV|OG2G3R!ETOUXg7F^gUf5~0I)RI~`PZTn04M2RT6PmFC24)eeZS#$LyAB8 zdr3V?RK(~oYPpu^sO0RsN|!I<1l{G~;Bh{IT?f6KGc{A7wbk zIyTOyD=WDp zSuEuc{4a#e;GL15hJaK~H{g}cs3r9zN(yS}o~9dG@vh0`Q}EuR!&k5{5}EHCU?WqW zYTTbA6a6HjXb?2)8tJhG{9@Y*T6KX+*UatgjfBv%Ly@v~@= zyJwx*10{yc%)I=c1l0;~LY5cHCBf^NVKpGbi*?kBCM7nK*j(;W_*{A~zfQ%MDIvCD zuU|4Chf;jUqF@o4$L_syToWy4L@(DRb_i(enq8RYUw4yenO%Z6($dk_@H-}(r z0pZpmM{q=u<}tYFS;ze{?tq{OsHyCLwvMEz7JYk!qO>JqvDZmX@*au?sKIs|Dt6N` zK>}nPmdctW2-9L83?1ibg#3l$7@7p9Ms#HN47h$*D2b*)IF+YyoTss-gzB2Mo)@#k zFxxt_*&sR#O0$sG(Nr#4i=Orwk)R5T#zKOl01`&i!_n~im-h#Nbu?#QkN}X~Sf9%H zQ$y%E1b|i4{v+-I03@MSC=65jpTfD^{W()miw5ppR|){1Me%L`h%JyQipOI6BO|wx z_kn!0p)nm7XjT&9M$ht^%gmPmd$GEa;JpTK+$5u`|0jgg+-&jQos z#e5$~s)mg|#(jwXpfo352k!f(Lz^Pndmn|_wH%)E{)*s0=lxWBwlW6R_D|FgDAt717URg3YFY&3>{An-Lh!+86aNh|NYkNSN<0 z0?^3o3df*Air9ExkoO1=f@tuH5{#CLD+wHs-N;~mHEbJe_+_x$p06hJ8EQ}(3Q+67 zcqjO4Ukrz-(58PA>^T1Z{}YH~FBrSCpNry{?z|B!p)xc+)LPa!v+JKec`q{H(h6pBLBA-5i>cxae6+1i4+GN!-;!V zK0%GFHHJ8GIP9gxD`FKoAo|7)ThM;U0=93`IFd!vu?X2E+s}bTp>-<&==Ykm&5$;r zJptkogzw2MmI%<4NRh2Ge};jes8NGD654ciux1>|iL|{hoh{rqpaer z1v#!JwSlv&va^g0I{z6!x*U{Yn83MNa;V|-YHJhJK6RG?_J$D6p{QYzV>=n?1jOpH zcn9NIDo^qvNTWzhFht>kK@iiPgKT8v_}GYW=*gu-ASvq-B6(D>AAqKQ-XU_&;Xy&L zdI+260Gnx7cUF@oJRv5r%&veJ8G4FUv%PAfFH9ETXn;6*Lz;+rf)F#T62N*&K#B(F zuv1O6242R#1omRNRYo+!{8|CA0v)v~jvQpdBA1w3+71>Y`uB)p3Z_J}DzL8qPgsD` zdf^AEm`ax5X4>1`@DTQSi?DWgBSaR~%(cTKZ+;7J9>LQ6QrfYx@%>jg|5mDD4?C$8Js837^P>RX3rDtVZ;Uvk zPm|qTMu-~QJrH`bDx^LJ`@=FaLYNkM1!ut^&MQ#4sX`mk{v!%#V8VC=Nv~NGS; z&P*kl@Y(cDZ)7XBe2j%j3LOh#oknI;LUJQ@9;-WwR>oQiM$|* zXWyi!SxTO!q)iEF(YWviojkhCZZ*sI&;`n%e$?lQRacPPv)9?7zSl^mzljIMB*h6A z7_M&tzcbj#EMcQ^hPNxReF+H%W`>G2;5eHKa(8o?X_|8X;PBo-N@pWG*ilqr+L2iW+mtJD|8`3(u$^v%LO2RQD0E1(R z6&y<(woC$ryfz&5vIoLUc3(n@SlfU*o;jEdLu)+rvp&F>e?(IzO%L;%5mYiZJq?8y za0d?{8K0hG;5Zn<>X@b(Ph8`pCo)w25YO-u$6J$q2^pD`WBx4nygaD#;=vqO#3#uW z2aicdT#Zg%N{+c8rZEz_NTOu2#|j*58nX0m_j6~-4gC|EJIzkfqSDB~`M}ZQ9dlo5 zT4*kv_x(uvUDR$=;3{+D)p}0oiibug2!X;a7#+_~_SHs!JPs96Oevv1EDs3I8#*lU`)w+b z^!?R<*%ZWPqQj%plB(w*qQ8Nc1_Ey>67 zsL>^N1z~y|T1dj{3z$7ZYdA@?3i~B#9~FGOC7FDTsWC#i1SD>J7DJ1U%Ja3BZSji< z_lmPACV0-W#TdixN3CZsbq4gd&b;k({L|R_zz*rVR^U>ElcJY^NVJ!*48~pV z;p}%<#y&8U;UKR3WQ3HZ;an1q6dxW$%-=@EKkOkUm3<{*7B6)gOTtYy8{5)GICht| zRA|qEOavd9Mle2M#02#%Vb;5A+dae~;WKyX9}OImW1>ubuxD0BMY6A!aPK7EANG4N z1Cw$itIvAlSi-{8_pa|(%IdGyzyC5q_(PXQ=KXnW{5$ymKaWt}G&DhF<%iku)4vHc zd-PunIP*#}Qk~>8HuO&nHcsS9@9TY32s&-br)O{sI{BXfq0<`=4YC#fM}Z1QCu%sn zfUO{iJD+dkvue__w(${otY=J#C))?DuOi#~L�xI?$NzH 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 F=RXMqve^It literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/__pycache__/statemachine.cpython-38.pyc b/lib/python3.8/site-packages/docutils/__pycache__/statemachine.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe56a046878f6c258b39ef7286f9a52228c8b8e2 GIT binary patch literal 49143 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 +# Copyright: This module has been placed in the public domain. + +""" +Calling the ``publish_*`` convenience functions (or instantiating a +`Publisher` object) with component names will result in default +behavior. For custom behavior (setting component options), create +custom component objects first, and pass *them* to +``publish_*``/`Publisher`. See `The Docutils Publisher`_. + +.. _The Docutils Publisher: http://docutils.sf.net/docs/api/publisher.html +""" +from __future__ import print_function + +__docformat__ = 'reStructuredText' + +import sys +import pprint +from docutils import __version__, __version_details__, SettingsSpec +from docutils import frontend, io, utils, readers, writers +from docutils.frontend import OptionParser +from docutils.transforms import Transformer +from docutils.utils.error_reporting import ErrorOutput, ErrorString +import docutils.readers.doctree + +class Publisher(object): + + """ + A facade encapsulating the high-level logic of a Docutils system. + """ + + def __init__(self, reader=None, parser=None, writer=None, + source=None, source_class=io.FileInput, + destination=None, destination_class=io.FileOutput, + settings=None): + """ + Initial setup. If any of `reader`, `parser`, or `writer` are not + specified, the corresponding ``set_...`` method should be called with + a component name (`set_reader` sets the parser as well). + """ + + self.document = None + """The document tree (`docutils.nodes` objects).""" + + self.reader = reader + """A `docutils.readers.Reader` instance.""" + + self.parser = parser + """A `docutils.parsers.Parser` instance.""" + + self.writer = writer + """A `docutils.writers.Writer` instance.""" + + for component in 'reader', 'parser', 'writer': + assert not isinstance(getattr(self, component), str), ( + 'passed string "%s" as "%s" parameter; pass an instance, ' + 'or use the "%s_name" parameter instead (in ' + 'docutils.core.publish_* convenience functions).' + % (getattr(self, component), component, component)) + + self.source = source + """The source of input data, a `docutils.io.Input` instance.""" + + self.source_class = source_class + """The class for dynamically created source objects.""" + + self.destination = destination + """The destination for docutils output, a `docutils.io.Output` + instance.""" + + self.destination_class = destination_class + """The class for dynamically created destination objects.""" + + self.settings = settings + """An object containing Docutils settings as instance attributes. + Set by `self.process_command_line()` or `self.get_settings()`.""" + + self._stderr = ErrorOutput() + + def set_reader(self, reader_name, parser, parser_name): + """Set `self.reader` by name.""" + reader_class = readers.get_reader_class(reader_name) + self.reader = reader_class(parser, parser_name) + self.parser = self.reader.parser + + def set_writer(self, writer_name): + """Set `self.writer` by name.""" + writer_class = writers.get_writer_class(writer_name) + self.writer = writer_class() + + def set_components(self, reader_name, parser_name, writer_name): + if self.reader is None: + self.set_reader(reader_name, self.parser, parser_name) + if self.parser is None: + if self.reader.parser is None: + self.reader.set_parser(parser_name) + self.parser = self.reader.parser + if self.writer is None: + self.set_writer(writer_name) + + def setup_option_parser(self, usage=None, description=None, + settings_spec=None, config_section=None, + **defaults): + if config_section: + if not settings_spec: + settings_spec = SettingsSpec() + settings_spec.config_section = config_section + parts = config_section.split() + if len(parts) > 1 and parts[-1] == 'application': + settings_spec.config_section_dependencies = ['applications'] + #@@@ Add self.source & self.destination to components in future? + option_parser = OptionParser( + components=(self.parser, self.reader, self.writer, settings_spec), + defaults=defaults, read_config_files=True, + usage=usage, description=description) + return option_parser + + def get_settings(self, usage=None, description=None, + settings_spec=None, config_section=None, **defaults): + """ + Set and return default settings (overrides in `defaults` dict). + + Set components first (`self.set_reader` & `self.set_writer`). + Explicitly setting `self.settings` disables command line option + processing from `self.publish()`. + """ + option_parser = self.setup_option_parser( + usage, description, settings_spec, config_section, **defaults) + self.settings = option_parser.get_default_values() + return self.settings + + def process_programmatic_settings(self, settings_spec, + settings_overrides, + config_section): + if self.settings is None: + defaults = (settings_overrides or {}).copy() + # Propagate exceptions by default when used programmatically: + defaults.setdefault('traceback', True) + self.get_settings(settings_spec=settings_spec, + config_section=config_section, + **defaults) + + def process_command_line(self, argv=None, usage=None, description=None, + settings_spec=None, config_section=None, + **defaults): + """ + Pass an empty list to `argv` to avoid reading `sys.argv` (the + default). + + Set components first (`self.set_reader` & `self.set_writer`). + """ + option_parser = self.setup_option_parser( + usage, description, settings_spec, config_section, **defaults) + if argv is None: + argv = sys.argv[1:] + # converting to Unicode (Python 3 does this automatically): + if sys.version_info < (3, 0): + # TODO: make this failsafe and reversible? + argv_encoding = (frontend.locale_encoding or 'ascii') + argv = [a.decode(argv_encoding) for a in argv] + self.settings = option_parser.parse_args(argv) + + def set_io(self, source_path=None, destination_path=None): + if self.source is None: + self.set_source(source_path=source_path) + if self.destination is None: + self.set_destination(destination_path=destination_path) + + def set_source(self, source=None, source_path=None): + if source_path is None: + source_path = self.settings._source + else: + self.settings._source = source_path + # Raise IOError instead of system exit with `tracback == True` + # TODO: change io.FileInput's default behaviour and remove this hack + try: + self.source = self.source_class( + source=source, source_path=source_path, + encoding=self.settings.input_encoding) + except TypeError: + self.source = self.source_class( + source=source, source_path=source_path, + encoding=self.settings.input_encoding) + + def set_destination(self, destination=None, destination_path=None): + if destination_path is None: + destination_path = self.settings._destination + else: + self.settings._destination = destination_path + self.destination = self.destination_class( + destination=destination, destination_path=destination_path, + encoding=self.settings.output_encoding, + error_handler=self.settings.output_encoding_error_handler) + + def apply_transforms(self): + self.document.transformer.populate_from_components( + (self.source, self.reader, self.reader.parser, self.writer, + self.destination)) + self.document.transformer.apply_transforms() + + def publish(self, argv=None, usage=None, description=None, + settings_spec=None, settings_overrides=None, + config_section=None, enable_exit_status=False): + """ + Process command line options and arguments (if `self.settings` not + already set), run `self.reader` and then `self.writer`. Return + `self.writer`'s output. + """ + exit = None + try: + if self.settings is None: + self.process_command_line( + argv, usage, description, settings_spec, config_section, + **(settings_overrides or {})) + self.set_io() + self.document = self.reader.read(self.source, self.parser, + self.settings) + self.apply_transforms() + output = self.writer.write(self.document, self.destination) + self.writer.assemble_parts() + except SystemExit as error: + exit = 1 + exit_status = error.code + except Exception as error: + if not self.settings: # exception too early to report nicely + raise + if self.settings.traceback: # Propagate exceptions? + self.debugging_dumps() + raise + self.report_Exception(error) + exit = True + exit_status = 1 + self.debugging_dumps() + if (enable_exit_status and self.document + and (self.document.reporter.max_level + >= self.settings.exit_status_level)): + sys.exit(self.document.reporter.max_level + 10) + elif exit: + sys.exit(exit_status) + return output + + def debugging_dumps(self): + if not self.document: + return + if self.settings.dump_settings: + print('\n::: Runtime settings:', file=self._stderr) + print(pprint.pformat(self.settings.__dict__), file=self._stderr) + if self.settings.dump_internals: + print('\n::: Document internals:', file=self._stderr) + print(pprint.pformat(self.document.__dict__), file=self._stderr) + if self.settings.dump_transforms: + print('\n::: Transforms applied:', file=self._stderr) + print(' (priority, transform class, pending node details, ' + 'keyword args)', file=self._stderr) + print(pprint.pformat( + [(priority, '%s.%s' % (xclass.__module__, xclass.__name__), + pending and pending.details, kwargs) + for priority, xclass, pending, kwargs + in self.document.transformer.applied]), file=self._stderr) + if self.settings.dump_pseudo_xml: + print('\n::: Pseudo-XML:', file=self._stderr) + print(self.document.pformat().encode( + 'raw_unicode_escape'), file=self._stderr) + + def report_Exception(self, error): + if isinstance(error, utils.SystemMessage): + self.report_SystemMessage(error) + elif isinstance(error, UnicodeEncodeError): + self.report_UnicodeError(error) + elif isinstance(error, io.InputError): + self._stderr.write(u'Unable to open source file for reading:\n' + u' %s\n' % ErrorString(error)) + elif isinstance(error, io.OutputError): + self._stderr.write( + u'Unable to open destination file for writing:\n' + u' %s\n' % ErrorString(error)) + else: + print(u'%s' % ErrorString(error), file=self._stderr) + print(("""\ +Exiting due to error. Use "--traceback" to diagnose. +Please report errors to . +Include "--traceback" output, Docutils version (%s%s), +Python version (%s), your OS type & version, and the +command line used.""" % (__version__, + docutils.__version_details__ and + ' [%s]'%docutils.__version_details__ or '', + sys.version.split()[0])), file=self._stderr) + + def report_SystemMessage(self, error): + print('Exiting due to level-%s (%s) system message.' % ( + error.level, utils.Reporter.levels[error.level]), + file=self._stderr) + + def report_UnicodeError(self, error): + data = error.object[error.start:error.end] + self._stderr.write( + '%s\n' + '\n' + 'The specified output encoding (%s) cannot\n' + 'handle all of the output.\n' + 'Try setting "--output-encoding-error-handler" to\n' + '\n' + '* "xmlcharrefreplace" (for HTML & XML output);\n' + ' the output will contain "%s" and should be usable.\n' + '* "backslashreplace" (for other output formats);\n' + ' look for "%s" in the output.\n' + '* "replace"; look for "?" in the output.\n' + '\n' + '"--output-encoding-error-handler" is currently set to "%s".\n' + '\n' + 'Exiting due to error. Use "--traceback" to diagnose.\n' + 'If the advice above doesn\'t eliminate the error,\n' + 'please report it to .\n' + 'Include "--traceback" output, Docutils version (%s),\n' + 'Python version (%s), your OS type & version, and the\n' + 'command line used.\n' + % (ErrorString(error), + self.settings.output_encoding, + data.encode('ascii', 'xmlcharrefreplace'), + data.encode('ascii', 'backslashreplace'), + self.settings.output_encoding_error_handler, + __version__, sys.version.split()[0])) + +default_usage = '%prog [options] [ []]' +default_description = ('Reads from (default is stdin) and writes to ' + ' (default is stdout). See ' + ' for ' + 'the full reference.') + +def publish_cmdline(reader=None, reader_name='standalone', + parser=None, parser_name='restructuredtext', + writer=None, writer_name='pseudoxml', + settings=None, settings_spec=None, + settings_overrides=None, config_section=None, + enable_exit_status=True, argv=None, + usage=default_usage, description=default_description): + """ + Set up & run a `Publisher` for command-line-based file I/O (input and + output file paths taken automatically from the command line). Return the + encoded string output also. + + Parameters: see `publish_programmatically` for the remainder. + + - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``. + - `usage`: Usage string, output if there's a problem parsing the command + line. + - `description`: Program description, output for the "--help" option + (along with command-line option descriptions). + """ + pub = Publisher(reader, parser, writer, settings=settings) + pub.set_components(reader_name, parser_name, writer_name) + output = pub.publish( + argv, usage, description, settings_spec, settings_overrides, + config_section=config_section, enable_exit_status=enable_exit_status) + return output + +def publish_file(source=None, source_path=None, + destination=None, destination_path=None, + reader=None, reader_name='standalone', + parser=None, parser_name='restructuredtext', + writer=None, writer_name='pseudoxml', + settings=None, settings_spec=None, settings_overrides=None, + config_section=None, enable_exit_status=False): + """ + Set up & run a `Publisher` for programmatic use with file-like I/O. + Return the encoded string output also. + + Parameters: see `publish_programmatically`. + """ + output, pub = publish_programmatically( + source_class=io.FileInput, source=source, source_path=source_path, + destination_class=io.FileOutput, + destination=destination, destination_path=destination_path, + reader=reader, reader_name=reader_name, + parser=parser, parser_name=parser_name, + writer=writer, writer_name=writer_name, + settings=settings, settings_spec=settings_spec, + settings_overrides=settings_overrides, + config_section=config_section, + enable_exit_status=enable_exit_status) + return output + +def publish_string(source, source_path=None, destination_path=None, + reader=None, reader_name='standalone', + parser=None, parser_name='restructuredtext', + writer=None, writer_name='pseudoxml', + settings=None, settings_spec=None, + settings_overrides=None, config_section=None, + enable_exit_status=False): + """ + Set up & run a `Publisher` for programmatic use with string I/O. Return + the encoded string or Unicode string output. + + For encoded string output, be sure to set the 'output_encoding' setting to + the desired encoding. Set it to 'unicode' for unencoded Unicode string + output. Here's one way:: + + publish_string(..., settings_overrides={'output_encoding': 'unicode'}) + + Similarly for Unicode string input (`source`):: + + publish_string(..., settings_overrides={'input_encoding': 'unicode'}) + + Parameters: see `publish_programmatically`. + """ + output, pub = publish_programmatically( + source_class=io.StringInput, source=source, source_path=source_path, + destination_class=io.StringOutput, + destination=None, destination_path=destination_path, + reader=reader, reader_name=reader_name, + parser=parser, parser_name=parser_name, + writer=writer, writer_name=writer_name, + settings=settings, settings_spec=settings_spec, + settings_overrides=settings_overrides, + config_section=config_section, + enable_exit_status=enable_exit_status) + return output + +def publish_parts(source, source_path=None, source_class=io.StringInput, + destination_path=None, + reader=None, reader_name='standalone', + parser=None, parser_name='restructuredtext', + writer=None, writer_name='pseudoxml', + settings=None, settings_spec=None, + settings_overrides=None, config_section=None, + enable_exit_status=False): + """ + Set up & run a `Publisher`, and return a dictionary of document parts. + Dictionary keys are the names of parts, and values are Unicode strings; + encoding is up to the client. For programmatic use with string I/O. + + For encoded string input, be sure to set the 'input_encoding' setting to + the desired encoding. Set it to 'unicode' for unencoded Unicode string + input. Here's how:: + + publish_parts(..., settings_overrides={'input_encoding': 'unicode'}) + + Parameters: see `publish_programmatically`. + """ + output, pub = publish_programmatically( + source=source, source_path=source_path, source_class=source_class, + destination_class=io.StringOutput, + destination=None, destination_path=destination_path, + reader=reader, reader_name=reader_name, + parser=parser, parser_name=parser_name, + writer=writer, writer_name=writer_name, + settings=settings, settings_spec=settings_spec, + settings_overrides=settings_overrides, + config_section=config_section, + enable_exit_status=enable_exit_status) + return pub.writer.parts + +def publish_doctree(source, source_path=None, + source_class=io.StringInput, + reader=None, reader_name='standalone', + parser=None, parser_name='restructuredtext', + settings=None, settings_spec=None, + settings_overrides=None, config_section=None, + enable_exit_status=False): + """ + Set up & run a `Publisher` for programmatic use with string I/O. + Return the document tree. + + For encoded string input, be sure to set the 'input_encoding' setting to + the desired encoding. Set it to 'unicode' for unencoded Unicode string + input. Here's one way:: + + publish_doctree(..., settings_overrides={'input_encoding': 'unicode'}) + + Parameters: see `publish_programmatically`. + """ + pub = Publisher(reader=reader, parser=parser, writer=None, + settings=settings, + source_class=source_class, + destination_class=io.NullOutput) + pub.set_components(reader_name, parser_name, 'null') + pub.process_programmatic_settings( + settings_spec, settings_overrides, config_section) + pub.set_source(source, source_path) + pub.set_destination(None, None) + output = pub.publish(enable_exit_status=enable_exit_status) + return pub.document + +def publish_from_doctree(document, destination_path=None, + writer=None, writer_name='pseudoxml', + settings=None, settings_spec=None, + settings_overrides=None, config_section=None, + enable_exit_status=False): + """ + Set up & run a `Publisher` to render from an existing document + tree data structure, for programmatic use with string I/O. Return + the encoded string output. + + Note that document.settings is overridden; if you want to use the settings + of the original `document`, pass settings=document.settings. + + Also, new document.transformer and document.reporter objects are + generated. + + For encoded string output, be sure to set the 'output_encoding' setting to + the desired encoding. Set it to 'unicode' for unencoded Unicode string + output. Here's one way:: + + publish_from_doctree( + ..., settings_overrides={'output_encoding': 'unicode'}) + + Parameters: `document` is a `docutils.nodes.document` object, an existing + document tree. + + Other parameters: see `publish_programmatically`. + """ + reader = docutils.readers.doctree.Reader(parser_name='null') + pub = Publisher(reader, None, writer, + source=io.DocTreeInput(document), + destination_class=io.StringOutput, settings=settings) + if not writer and writer_name: + pub.set_writer(writer_name) + pub.process_programmatic_settings( + settings_spec, settings_overrides, config_section) + pub.set_destination(None, destination_path) + return pub.publish(enable_exit_status=enable_exit_status) + +def publish_cmdline_to_binary(reader=None, reader_name='standalone', + parser=None, parser_name='restructuredtext', + writer=None, writer_name='pseudoxml', + settings=None, settings_spec=None, + settings_overrides=None, config_section=None, + enable_exit_status=True, argv=None, + usage=default_usage, description=default_description, + destination=None, destination_class=io.BinaryFileOutput + ): + """ + Set up & run a `Publisher` for command-line-based file I/O (input and + output file paths taken automatically from the command line). Return the + encoded string output also. + + This is just like publish_cmdline, except that it uses + io.BinaryFileOutput instead of io.FileOutput. + + Parameters: see `publish_programmatically` for the remainder. + + - `argv`: Command-line argument list to use instead of ``sys.argv[1:]``. + - `usage`: Usage string, output if there's a problem parsing the command + line. + - `description`: Program description, output for the "--help" option + (along with command-line option descriptions). + """ + pub = Publisher(reader, parser, writer, settings=settings, + destination_class=destination_class) + pub.set_components(reader_name, parser_name, writer_name) + output = pub.publish( + argv, usage, description, settings_spec, settings_overrides, + config_section=config_section, enable_exit_status=enable_exit_status) + return output + +def publish_programmatically(source_class, source, source_path, + destination_class, destination, destination_path, + reader, reader_name, + parser, parser_name, + writer, writer_name, + settings, settings_spec, + settings_overrides, config_section, + enable_exit_status): + """ + Set up & run a `Publisher` for custom programmatic use. Return the + encoded string output and the Publisher object. + + Applications should not need to call this function directly. If it does + seem to be necessary to call this function directly, please write to the + Docutils-develop mailing list + . + + Parameters: + + * `source_class` **required**: The class for dynamically created source + objects. Typically `io.FileInput` or `io.StringInput`. + + * `source`: Type depends on `source_class`: + + - If `source_class` is `io.FileInput`: Either a file-like object + (must have 'read' and 'close' methods), or ``None`` + (`source_path` is opened). If neither `source` nor + `source_path` are supplied, `sys.stdin` is used. + + - If `source_class` is `io.StringInput` **required**: The input + string, either an encoded 8-bit string (set the + 'input_encoding' setting to the correct encoding) or a Unicode + string (set the 'input_encoding' setting to 'unicode'). + + * `source_path`: Type depends on `source_class`: + + - `io.FileInput`: Path to the input file, opened if no `source` + supplied. + + - `io.StringInput`: Optional. Path to the file or object that produced + `source`. Only used for diagnostic output. + + * `destination_class` **required**: The class for dynamically created + destination objects. Typically `io.FileOutput` or `io.StringOutput`. + + * `destination`: Type depends on `destination_class`: + + - `io.FileOutput`: Either a file-like object (must have 'write' and + 'close' methods), or ``None`` (`destination_path` is opened). If + neither `destination` nor `destination_path` are supplied, + `sys.stdout` is used. + + - `io.StringOutput`: Not used; pass ``None``. + + * `destination_path`: Type depends on `destination_class`: + + - `io.FileOutput`: Path to the output file. Opened if no `destination` + supplied. + + - `io.StringOutput`: Path to the file or object which will receive the + output; optional. Used for determining relative paths (stylesheets, + source links, etc.). + + * `reader`: A `docutils.readers.Reader` object. + + * `reader_name`: Name or alias of the Reader class to be instantiated if + no `reader` supplied. + + * `parser`: A `docutils.parsers.Parser` object. + + * `parser_name`: Name or alias of the Parser class to be instantiated if + no `parser` supplied. + + * `writer`: A `docutils.writers.Writer` object. + + * `writer_name`: Name or alias of the Writer class to be instantiated if + no `writer` supplied. + + * `settings`: A runtime settings (`docutils.frontend.Values`) object, for + dotted-attribute access to runtime settings. It's the end result of the + `SettingsSpec`, config file, and option processing. If `settings` is + passed, it's assumed to be complete and no further setting/config/option + processing is done. + + * `settings_spec`: A `docutils.SettingsSpec` subclass or object. Provides + extra application-specific settings definitions independently of + components. In other words, the application becomes a component, and + its settings data is processed along with that of the other components. + Used only if no `settings` specified. + + * `settings_overrides`: A dictionary containing application-specific + settings defaults that override the defaults of other components. + Used only if no `settings` specified. + + * `config_section`: A string, the name of the configuration file section + for this application. Overrides the ``config_section`` attribute + defined by `settings_spec`. Used only if no `settings` specified. + + * `enable_exit_status`: Boolean; enable exit status at end of processing? + """ + pub = Publisher(reader, parser, writer, settings=settings, + source_class=source_class, + destination_class=destination_class) + pub.set_components(reader_name, parser_name, writer_name) + pub.process_programmatic_settings( + settings_spec, settings_overrides, config_section) + pub.set_source(source, source_path) + pub.set_destination(destination, destination_path) + output = pub.publish(enable_exit_status=enable_exit_status) + return output, pub diff --git a/lib/python3.8/site-packages/docutils/examples.py b/lib/python3.8/site-packages/docutils/examples.py new file mode 100644 index 0000000..395dbbf --- /dev/null +++ b/lib/python3.8/site-packages/docutils/examples.py @@ -0,0 +1,97 @@ +# $Id: examples.py 7320 2012-01-19 22:33:02Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +This module contains practical examples of Docutils client code. + +Importing this module from client code is not recommended; its contents are +subject to change in future Docutils releases. Instead, it is recommended +that you copy and paste the parts you need into your own code, modifying as +necessary. +""" + +from docutils import core, io + + +def html_parts(input_string, source_path=None, destination_path=None, + input_encoding='unicode', doctitle=True, + initial_header_level=1): + """ + Given an input string, returns a dictionary of HTML document parts. + + Dictionary keys are the names of parts, and values are Unicode strings; + encoding is up to the client. + + Parameters: + + - `input_string`: A multi-line text string; required. + - `source_path`: Path to the source file or object. Optional, but useful + for diagnostic output (system messages). + - `destination_path`: Path to the file or object which will receive the + output; optional. Used for determining relative paths (stylesheets, + source links, etc.). + - `input_encoding`: The encoding of `input_string`. If it is an encoded + 8-bit string, provide the correct encoding. If it is a Unicode string, + use "unicode", the default. + - `doctitle`: Disable the promotion of a lone top-level section title to + document title (and subsequent section title to document subtitle + promotion); enabled by default. + - `initial_header_level`: The initial level for header elements (e.g. 1 + for "

    "). + """ + overrides = {'input_encoding': input_encoding, + 'doctitle_xform': doctitle, + 'initial_header_level': initial_header_level} + parts = core.publish_parts( + source=input_string, source_path=source_path, + destination_path=destination_path, + writer_name='html', settings_overrides=overrides) + return parts + +def html_body(input_string, source_path=None, destination_path=None, + input_encoding='unicode', output_encoding='unicode', + doctitle=True, initial_header_level=1): + """ + Given an input string, returns an HTML fragment as a string. + + The return value is the contents of the element. + + Parameters (see `html_parts()` for the remainder): + + - `output_encoding`: The desired encoding of the output. If a Unicode + string is desired, use the default value of "unicode" . + """ + parts = html_parts( + input_string=input_string, source_path=source_path, + destination_path=destination_path, + input_encoding=input_encoding, doctitle=doctitle, + initial_header_level=initial_header_level) + fragment = parts['html_body'] + if output_encoding != 'unicode': + fragment = fragment.encode(output_encoding) + return fragment + +def internals(input_string, source_path=None, destination_path=None, + input_encoding='unicode', settings_overrides=None): + """ + Return the document tree and publisher, for exploring Docutils internals. + + Parameters: see `html_parts()`. + """ + if settings_overrides: + overrides = settings_overrides.copy() + else: + overrides = {} + overrides['input_encoding'] = input_encoding + output, pub = core.publish_programmatically( + source_class=io.StringInput, source=input_string, + source_path=source_path, + destination_class=io.NullOutput, destination=None, + destination_path=destination_path, + reader=None, reader_name='standalone', + parser=None, parser_name='restructuredtext', + writer=None, writer_name='null', + settings=None, settings_spec=None, settings_overrides=overrides, + config_section=None, enable_exit_status=None) + return pub.writer.document, pub diff --git a/lib/python3.8/site-packages/docutils/frontend.py b/lib/python3.8/site-packages/docutils/frontend.py new file mode 100644 index 0000000..ff571cc --- /dev/null +++ b/lib/python3.8/site-packages/docutils/frontend.py @@ -0,0 +1,863 @@ +# $Id: frontend.py 8439 2019-12-13 17:02:41Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Command-line and common processing for Docutils front-end tools. + +Exports the following classes: + +* `OptionParser`: Standard Docutils command-line processing. +* `Option`: Customized version of `optparse.Option`; validation support. +* `Values`: Runtime settings; objects are simple structs + (``object.attribute``). Supports cumulative list settings (attributes). +* `ConfigParser`: Standard Docutils config file processing. + +Also exports the following functions: + +* Option callbacks: `store_multiple`, `read_config_file`. +* Setting validators: `validate_encoding`, + `validate_encoding_error_handler`, + `validate_encoding_and_error_handler`, + `validate_boolean`, `validate_ternary`, `validate_threshold`, + `validate_colon_separated_string_list`, + `validate_comma_separated_string_list`, + `validate_dependency_file`. +* `make_paths_absolute`. +* SettingSpec manipulation: `filter_settings_spec`. +""" + +__docformat__ = 'reStructuredText' + +import os +import os.path +import sys +import warnings +import codecs +import optparse +from optparse import SUPPRESS_HELP +if sys.version_info >= (3, 0): + from configparser import RawConfigParser + from os import getcwd +else: + from ConfigParser import RawConfigParser + from os import getcwdu as getcwd + +import docutils +import docutils.utils +import docutils.nodes +from docutils.utils.error_reporting import (locale_encoding, SafeString, + ErrorOutput, ErrorString) + +if sys.version_info >= (3, 0): + unicode = str # noqa + + +def store_multiple(option, opt, value, parser, *args, **kwargs): + """ + Store multiple values in `parser.values`. (Option callback.) + + Store `None` for each attribute named in `args`, and store the value for + each key (attribute name) in `kwargs`. + """ + for attribute in args: + setattr(parser.values, attribute, None) + for key, value in kwargs.items(): + setattr(parser.values, key, value) + +def read_config_file(option, opt, value, parser): + """ + Read a configuration file during option processing. (Option callback.) + """ + try: + new_settings = parser.get_config_file_settings(value) + except ValueError as error: + parser.error(error) + parser.values.update(new_settings, parser) + +def validate_encoding(setting, value, option_parser, + config_parser=None, config_section=None): + try: + codecs.lookup(value) + except LookupError: + raise LookupError('setting "%s": unknown encoding: "%s"' + % (setting, value)) + return value + +def validate_encoding_error_handler(setting, value, option_parser, + config_parser=None, config_section=None): + try: + codecs.lookup_error(value) + except LookupError: + raise LookupError( + 'unknown encoding error handler: "%s" (choices: ' + '"strict", "ignore", "replace", "backslashreplace", ' + '"xmlcharrefreplace", and possibly others; see documentation for ' + 'the Python ``codecs`` module)' % value) + return value + +def validate_encoding_and_error_handler( + setting, value, option_parser, config_parser=None, config_section=None): + """ + Side-effect: if an error handler is included in the value, it is inserted + into the appropriate place as if it was a separate setting/option. + """ + if ':' in value: + encoding, handler = value.split(':') + validate_encoding_error_handler( + setting + '_error_handler', handler, option_parser, + config_parser, config_section) + if config_parser: + config_parser.set(config_section, setting + '_error_handler', + handler) + else: + setattr(option_parser.values, setting + '_error_handler', handler) + else: + encoding = value + validate_encoding(setting, encoding, option_parser, + config_parser, config_section) + return encoding + +def validate_boolean(setting, value, option_parser, + config_parser=None, config_section=None): + """Check/normalize boolean settings: + True: '1', 'on', 'yes', 'true' + False: '0', 'off', 'no','false', '' + """ + if isinstance(value, bool): + return value + try: + return option_parser.booleans[value.strip().lower()] + except KeyError: + raise LookupError('unknown boolean value: "%s"' % value) + +def validate_ternary(setting, value, option_parser, + config_parser=None, config_section=None): + """Check/normalize three-value settings: + True: '1', 'on', 'yes', 'true' + False: '0', 'off', 'no','false', '' + any other value: returned as-is. + """ + if isinstance(value, bool) or value is None: + return value + try: + return option_parser.booleans[value.strip().lower()] + except KeyError: + return value + +def validate_nonnegative_int(setting, value, option_parser, + config_parser=None, config_section=None): + value = int(value) + if value < 0: + raise ValueError('negative value; must be positive or zero') + return value + +def validate_threshold(setting, value, option_parser, + config_parser=None, config_section=None): + try: + return int(value) + except ValueError: + try: + return option_parser.thresholds[value.lower()] + except (KeyError, AttributeError): + raise LookupError('unknown threshold: %r.' % value) + +def validate_colon_separated_string_list( + setting, value, option_parser, config_parser=None, config_section=None): + if not isinstance(value, list): + value = value.split(':') + else: + last = value.pop() + value.extend(last.split(':')) + return value + +def validate_comma_separated_list(setting, value, option_parser, + config_parser=None, config_section=None): + """Check/normalize list arguments (split at "," and strip whitespace). + """ + # `value` is already a ``list`` when given as command line option + # and "action" is "append" and ``unicode`` or ``str`` else. + if not isinstance(value, list): + value = [value] + # this function is called for every option added to `value` + # -> split the last item and append the result: + last = value.pop() + items = [i.strip(u' \t\n') for i in last.split(u',') if i.strip(u' \t\n')] + value.extend(items) + return value + +def validate_url_trailing_slash( + setting, value, option_parser, config_parser=None, config_section=None): + if not value: + return './' + elif value.endswith('/'): + return value + else: + return value + '/' + +def validate_dependency_file(setting, value, option_parser, + config_parser=None, config_section=None): + try: + return docutils.utils.DependencyList(value) + except IOError: + return docutils.utils.DependencyList(None) + +def validate_strip_class(setting, value, option_parser, + config_parser=None, config_section=None): + # value is a comma separated string list: + value = validate_comma_separated_list(setting, value, option_parser, + config_parser, config_section) + # validate list elements: + for cls in value: + normalized = docutils.nodes.make_id(cls) + if cls != normalized: + raise ValueError('Invalid class value %r (perhaps %r?)' + % (cls, normalized)) + return value + +def validate_smartquotes_locales(setting, value, option_parser, + config_parser=None, config_section=None): + """Check/normalize a comma separated list of smart quote definitions. + + Return a list of (language-tag, quotes) string tuples.""" + + # value is a comma separated string list: + value = validate_comma_separated_list(setting, value, option_parser, + config_parser, config_section) + # validate list elements + lc_quotes = [] + for item in value: + try: + lang, quotes = item.split(':', 1) + except AttributeError: + # this function is called for every option added to `value` + # -> ignore if already a tuple: + lc_quotes.append(item) + continue + except ValueError: + raise ValueError(u'Invalid value "%s".' + ' Format is ":".' + % item.encode('ascii', 'backslashreplace')) + # parse colon separated string list: + quotes = quotes.strip() + multichar_quotes = quotes.split(':') + if len(multichar_quotes) == 4: + quotes = multichar_quotes + elif len(quotes) != 4: + raise ValueError('Invalid value "%s". Please specify 4 quotes\n' + ' (primary open/close; secondary open/close).' + % item.encode('ascii', 'backslashreplace')) + lc_quotes.append((lang, quotes)) + return lc_quotes + +def make_paths_absolute(pathdict, keys, base_path=None): + """ + Interpret filesystem path settings relative to the `base_path` given. + + Paths are values in `pathdict` whose keys are in `keys`. Get `keys` from + `OptionParser.relative_path_settings`. + """ + if base_path is None: + base_path = getcwd() # type(base_path) == unicode + # to allow combining non-ASCII cwd with unicode values in `pathdict` + for key in keys: + if key in pathdict: + value = pathdict[key] + if isinstance(value, list): + value = [make_one_path_absolute(base_path, path) + for path in value] + elif value: + value = make_one_path_absolute(base_path, value) + pathdict[key] = value + +def make_one_path_absolute(base_path, path): + return os.path.abspath(os.path.join(base_path, path)) + +def filter_settings_spec(settings_spec, *exclude, **replace): + """Return a copy of `settings_spec` excluding/replacing some settings. + + `settings_spec` is a tuple of configuration settings with a structure + described for docutils.SettingsSpec.settings_spec. + + Optional positional arguments are names of to-be-excluded settings. + Keyword arguments are option specification replacements. + (See the html4strict writer for an example.) + """ + settings = list(settings_spec) + # every third item is a sequence of option tuples + for i in range(2, len(settings), 3): + newopts = [] + for opt_spec in settings[i]: + # opt_spec is ("", [

    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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/images.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/images.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bcb54eea431de5bdaa21f52b826eca6ec8060a5c GIT binary patch literal 4976 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 EH*uu;@c;k- literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/misc.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/misc.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24676085cd7614138078887866c74fc75bafa5b1 GIT binary patch literal 14453 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 vlL^emk_sq;K@9;Lx>ZOw9_g+l0@glt( zIzjTcZN~mZ%*Dq6a~H4rGYDrf<5p~Oo3{#k)QVdpCw43b-YMLX7kj4d7XB!R1Jm}< zZpUql{f=>;2VXNDh~TSM9D;B25PWF(4e%Sh1HNPU4){&J1%Au$oBYya*4>^);e%X? zOy^$+6&+VH;#D>oiBd=7RBF`=<83J(YdOjEL<)W=zSQ4AbJn#Rx2(8OO}j|T{v_=S z)wLSetU{x`77Hfi>pe1BeDQI?+{LSi2nJ)Y*oIMB+>RaI;?CDBcDWmS+>3n?4BL1^ z;eu{(|L;!R;Q?=B&L$6Wpp7QDUzHmAtMsoHV_}5nFg+?nR2@gza;O(B`UfJ?-ye%| z74=0aWU2*^@-os-D%e6Pp*{qg>pU&UHcCWk$&DN>(^A29qh1s}n8>{BM;fAEn0zZr zqnl$q7;A8xJWZGs0uFRtw`x=E&TBJ_amKaoC{ju zJ&mfd&Z|-xF*!^i%d{v?q0&7KK?RN@Apw3ehk|}%S!F^gD0Iu{`zrN}G%1W4JUTk1 zQ|M}(XX`W2!Oj(-bH8j->@*g#XM}ZIO$!nl7e11wjZ;>o$l$5yJsR(i^YQITImQaXZ$B9bQQSV69vz+j>}0f0nW6JS z?Hlh)wJ(+4KaXtcM#79woA!FgcOh8?Ak5mb0?VQttWj)r$6jEjmyPY4;r_q zvb2zIpto_e0-^VUedwTcFk_#mSX;9p8(QiEZJSn0J45#?TYXToxyNC-p?`&)S%0Ax z8wN8=x94GP4L61z&`sEs)@{itQEuf6!Ie22Gcd$`NpJqGC>R=&yIzQw(7teIc?+;`a?X?=Nq zg$I4ixx-rQBXf@VTW9PuyY`c}@$S{W!-jjj{cC2kWN)?8x0b{V?(ebrRqmWw7OOq< zU9G+O56;*usQucz!)AUNuC$m1(CS(poLLyP=0Bv?x0ZSYDIrNA9#X9NJGD;QO-l*HA<=1W6tM>a=?Y>2^*g2Sfa)>mzenVZ4*5MJ2 z($lD{baW)5i2|}b$@PHHg_21{0N$gDpRRyG^&|yF!{jb~f)#K9OMMd&Ldmx=BHtvk zLv!3R9T5b_ZJ9n%)kJ2Z`+l>DjMpL=r5QF8ac7k3Y>=3IRZW;9`7xo)1mz(xhH@|V zRnEmxDv_d6RuV&y+ytw_AX_x4(-%5fA%7Dnp*4U+#ha_XB!j>>0CrRo(9^V$a;C7T z#x+XC8+nPe6p2PnX*_C{RpT1n8h?pq=ueMCfi=cZO$*z`muc_C5fh+aLQ5NO(a|^y zE*%rt#$KvOe7t)+0T?DFKsqh*sYvKdaWF{LqO}Xxh$J74i#*G9qM@wNjlTqJNqA(? zBo2>|ohJ*OeJ*qgKxn+ln8VCX$4FT&>V}P@L~$$$1e#!FmpC*hG!oE;a?pzEXaM&q zDx>l}+U+KhcZl2~LKw9mxK*&GB`4)=G}HkI1GH>Cw{6dIo_ls+h4?z)LV}#K1mBQ zBsf1w5Fkk+JJ82qSG=?EVOk_>*T;LuIm*(yBSF2>LIH1uLGJhx%0VgmDcwgBRI$c6 zF4BJ7F+ra!1U4IsZ=%K`lRu~Z&aGowWFq4(!ccVuB(R;(u>;?+7C+l^{^Pl3PKMzZ zp7o97C+NO-BM}aM?$D!`+qir9%lk>dT_nEO_>XauDkr1qwR;m?A=mOOQgpeh$_U*@ zg35OfRq8S%n>3J!{IL|r`IiXb$uYh!U_Ip{rJKR}9vV~&O(nFb5)PfY3rzA15&`Fj z!Mt5t3xw*UHa@csx}izxMG#RK$41G6$w*TCND?Y<5V=Z(VpZ;gbZz-lYQG}*jLH9m z!DVHm@Y%Aa8_UD@Ow_dHFKGEMiTsMl9gwC4mo6N=GbytHE{=jHQhYwa{gBJw(7f0B z^FxgO5wF?;fj@2Af)^Klq_LO$NXEO1S6u_S=*Jgtmd115Bas6Crq@=nPuIm2;za{9 z*gJg5Hxw$yH)Jc+TXx1!M^KH2_Plk*<__u+)m?Y)f%!VW0kFluRZg%K$ zDRn|%v;_KdXEa*`c3fl?E~JQ~CM15Lkh~5703890h6}40k3REW<khKSvQ(obLDW-kT1B){n z56DL(>U^1L8Sj0H0ZnT!n3wth-X`zjO@q$#FG{MDBsR62uCfbkXklu6d3C+*t^b`- zrtZbN>yhQfw}*?bq|i61Y(P{}1{#-2+W1vkHo-@W+VL?hRdi`_9LL^9`N6NX{cwAG Gd-J~wq2e$A literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/references.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/references.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..835132a4ac9f44cfda6daa11be49a6b4bd21c1e3 GIT binary patch literal 994 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/admonitions.py b/lib/python3.8/site-packages/docutils/parsers/rst/directives/admonitions.py new file mode 100644 index 0000000..c572f5f --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/directives/admonitions.py @@ -0,0 +1,99 @@ +# $Id: admonitions.py 7681 2013-07-12 07:52:27Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Admonition directives. +""" + +__docformat__ = 'reStructuredText' + + +from docutils.parsers.rst import Directive +from docutils.parsers.rst import states, directives +from docutils.parsers.rst.roles import set_classes +from docutils import nodes + + +class BaseAdmonition(Directive): + + final_argument_whitespace = True + option_spec = {'class': directives.class_option, + 'name': directives.unchanged} + has_content = True + + node_class = None + """Subclasses must set this to the appropriate admonition node class.""" + + def run(self): + set_classes(self.options) + self.assert_has_content() + text = '\n'.join(self.content) + admonition_node = self.node_class(text, **self.options) + self.add_name(admonition_node) + if self.node_class is nodes.admonition: + title_text = self.arguments[0] + textnodes, messages = self.state.inline_text(title_text, + self.lineno) + title = nodes.title(title_text, '', *textnodes) + title.source, title.line = ( + self.state_machine.get_source_and_line(self.lineno)) + admonition_node += title + admonition_node += messages + if not 'classes' in self.options: + admonition_node['classes'] += ['admonition-' + + nodes.make_id(title_text)] + self.state.nested_parse(self.content, self.content_offset, + admonition_node) + return [admonition_node] + + +class Admonition(BaseAdmonition): + + required_arguments = 1 + node_class = nodes.admonition + + +class Attention(BaseAdmonition): + + node_class = nodes.attention + + +class Caution(BaseAdmonition): + + node_class = nodes.caution + + +class Danger(BaseAdmonition): + + node_class = nodes.danger + + +class Error(BaseAdmonition): + + node_class = nodes.error + + +class Hint(BaseAdmonition): + + node_class = nodes.hint + + +class Important(BaseAdmonition): + + node_class = nodes.important + + +class Note(BaseAdmonition): + + node_class = nodes.note + + +class Tip(BaseAdmonition): + + node_class = nodes.tip + + +class Warning(BaseAdmonition): + + node_class = nodes.warning diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/body.py b/lib/python3.8/site-packages/docutils/parsers/rst/directives/body.py new file mode 100644 index 0000000..27c7146 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/directives/body.py @@ -0,0 +1,288 @@ +# $Id: body.py 8347 2019-08-26 12:12:02Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Directives for additional body elements. + +See `docutils.parsers.rst.directives` for API details. +""" + +__docformat__ = 'reStructuredText' + + +from docutils import nodes +from docutils.parsers.rst import Directive +from docutils.parsers.rst import directives +from docutils.parsers.rst.roles import set_classes +from docutils.utils.code_analyzer import Lexer, LexerError, NumberLines + + +class BasePseudoSection(Directive): + + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + option_spec = {'class': directives.class_option, + 'name': directives.unchanged} + has_content = True + + node_class = None + """Node class to be used (must be set in subclasses).""" + + def run(self): + if not (self.state_machine.match_titles + or isinstance(self.state_machine.node, nodes.sidebar)): + raise self.error('The "%s" directive may not be used within ' + 'topics or body elements.' % self.name) + self.assert_has_content() + title_text = self.arguments[0] + textnodes, messages = self.state.inline_text(title_text, self.lineno) + titles = [nodes.title(title_text, '', *textnodes)] + # Sidebar uses this code. + if 'subtitle' in self.options: + textnodes, more_messages = self.state.inline_text( + self.options['subtitle'], self.lineno) + titles.append(nodes.subtitle(self.options['subtitle'], '', + *textnodes)) + messages.extend(more_messages) + text = '\n'.join(self.content) + node = self.node_class(text, *(titles + messages)) + node['classes'] += self.options.get('class', []) + self.add_name(node) + if text: + self.state.nested_parse(self.content, self.content_offset, node) + return [node] + + +class Topic(BasePseudoSection): + + node_class = nodes.topic + + +class Sidebar(BasePseudoSection): + + node_class = nodes.sidebar + + option_spec = BasePseudoSection.option_spec.copy() + option_spec['subtitle'] = directives.unchanged_required + + def run(self): + if isinstance(self.state_machine.node, nodes.sidebar): + raise self.error('The "%s" directive may not be used within a ' + 'sidebar element.' % self.name) + return BasePseudoSection.run(self) + + +class LineBlock(Directive): + + option_spec = {'class': directives.class_option, + 'name': directives.unchanged} + has_content = True + + def run(self): + self.assert_has_content() + block = nodes.line_block(classes=self.options.get('class', [])) + self.add_name(block) + node_list = [block] + for line_text in self.content: + text_nodes, messages = self.state.inline_text( + line_text.strip(), self.lineno + self.content_offset) + line = nodes.line(line_text, '', *text_nodes) + if line_text.strip(): + line.indent = len(line_text) - len(line_text.lstrip()) + block += line + node_list.extend(messages) + self.content_offset += 1 + self.state.nest_line_block_lines(block) + return node_list + + +class ParsedLiteral(Directive): + + option_spec = {'class': directives.class_option, + 'name': directives.unchanged} + has_content = True + + def run(self): + set_classes(self.options) + self.assert_has_content() + text = '\n'.join(self.content) + text_nodes, messages = self.state.inline_text(text, self.lineno) + node = nodes.literal_block(text, '', *text_nodes, **self.options) + node.line = self.content_offset + 1 + self.add_name(node) + return [node] + messages + + +class CodeBlock(Directive): + """Parse and mark up content of a code block. + + Configuration setting: syntax_highlight + Highlight Code content with Pygments? + Possible values: ('long', 'short', 'none') + + """ + optional_arguments = 1 + option_spec = {'class': directives.class_option, + 'name': directives.unchanged, + 'number-lines': directives.unchanged # integer or None + } + has_content = True + + def run(self): + self.assert_has_content() + if self.arguments: + language = self.arguments[0] + else: + language = '' + set_classes(self.options) + classes = ['code'] + if language: + classes.append(language) + if 'classes' in self.options: + classes.extend(self.options['classes']) + + # set up lexical analyzer + try: + tokens = Lexer(u'\n'.join(self.content), language, + self.state.document.settings.syntax_highlight) + except LexerError as error: + raise self.warning(error) + + if 'number-lines' in self.options: + # optional argument `startline`, defaults to 1 + try: + startline = int(self.options['number-lines'] or 1) + except ValueError: + raise self.error(':number-lines: with non-integer start value') + endline = startline + len(self.content) + # add linenumber filter: + tokens = NumberLines(tokens, startline, endline) + + node = nodes.literal_block('\n'.join(self.content), classes=classes) + self.add_name(node) + # if called from "include", set the source + if 'source' in self.options: + node.attributes['source'] = self.options['source'] + # analyze content and add nodes for every token + for classes, value in tokens: + if classes: + node += nodes.inline(value, value, classes=classes) + else: + # insert as Text to decrease the verbosity of the output + node += nodes.Text(value) + + return [node] + + +class MathBlock(Directive): + + option_spec = {'class': directives.class_option, + 'name': directives.unchanged} + ## TODO: Add Sphinx' ``mathbase.py`` option 'nowrap'? + # 'nowrap': directives.flag, + has_content = True + + def run(self): + set_classes(self.options) + self.assert_has_content() + # join lines, separate blocks + content = '\n'.join(self.content).split('\n\n') + _nodes = [] + for block in content: + if not block: + continue + node = nodes.math_block(self.block_text, block, **self.options) + node.line = self.content_offset + 1 + self.add_name(node) + _nodes.append(node) + return _nodes + + +class Rubric(Directive): + + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + option_spec = {'class': directives.class_option, + 'name': directives.unchanged} + + def run(self): + set_classes(self.options) + rubric_text = self.arguments[0] + textnodes, messages = self.state.inline_text(rubric_text, self.lineno) + rubric = nodes.rubric(rubric_text, '', *textnodes, **self.options) + self.add_name(rubric) + return [rubric] + messages + + +class BlockQuote(Directive): + + has_content = True + classes = [] + + def run(self): + self.assert_has_content() + elements = self.state.block_quote(self.content, self.content_offset) + for element in elements: + if isinstance(element, nodes.block_quote): + element['classes'] += self.classes + return elements + + +class Epigraph(BlockQuote): + + classes = ['epigraph'] + + +class Highlights(BlockQuote): + + classes = ['highlights'] + + +class PullQuote(BlockQuote): + + classes = ['pull-quote'] + + +class Compound(Directive): + + option_spec = {'class': directives.class_option, + 'name': directives.unchanged} + has_content = True + + def run(self): + self.assert_has_content() + text = '\n'.join(self.content) + node = nodes.compound(text) + node['classes'] += self.options.get('class', []) + self.add_name(node) + self.state.nested_parse(self.content, self.content_offset, node) + return [node] + + +class Container(Directive): + + optional_arguments = 1 + final_argument_whitespace = True + option_spec = {'name': directives.unchanged} + has_content = True + + def run(self): + self.assert_has_content() + text = '\n'.join(self.content) + try: + if self.arguments: + classes = directives.class_option(self.arguments[0]) + else: + classes = [] + except ValueError: + raise self.error( + 'Invalid class attribute value for "%s" directive: "%s".' + % (self.name, self.arguments[0])) + node = nodes.container(text) + node['classes'].extend(classes) + self.add_name(node) + self.state.nested_parse(self.content, self.content_offset, node) + return [node] diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/html.py b/lib/python3.8/site-packages/docutils/parsers/rst/directives/html.py new file mode 100644 index 0000000..5a5e8db --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/directives/html.py @@ -0,0 +1,88 @@ +# $Id: html.py 8347 2019-08-26 12:12:02Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Directives for typically HTML-specific constructs. +""" + +__docformat__ = 'reStructuredText' + +import sys +from docutils import nodes, utils +from docutils.parsers.rst import Directive +from docutils.parsers.rst import states +from docutils.transforms import components + + +class MetaBody(states.SpecializedBody): + + class meta(nodes.Special, nodes.PreBibliographic, nodes.Element): + """HTML-specific "meta" element.""" + pass + + def field_marker(self, match, context, next_state): + """Meta element.""" + node, blank_finish = self.parsemeta(match) + self.parent += node + return [], next_state, [] + + def parsemeta(self, match): + name = self.parse_field_marker(match) + name = utils.unescape(utils.escape2null(name)) + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end()) + node = self.meta() + pending = nodes.pending(components.Filter, + {'component': 'writer', + 'format': 'html', + 'nodes': [node]}) + node['content'] = utils.unescape(utils.escape2null( + ' '.join(indented))) + if not indented: + line = self.state_machine.line + msg = self.reporter.info( + 'No content for meta tag "%s".' % name, + nodes.literal_block(line, line)) + return msg, blank_finish + tokens = name.split() + try: + attname, val = utils.extract_name_value(tokens[0])[0] + node[attname.lower()] = val + except utils.NameValueError: + node['name'] = tokens[0] + for token in tokens[1:]: + try: + attname, val = utils.extract_name_value(token)[0] + node[attname.lower()] = val + except utils.NameValueError as detail: + line = self.state_machine.line + msg = self.reporter.error( + 'Error parsing meta tag attribute "%s": %s.' + % (token, detail), nodes.literal_block(line, line)) + return msg, blank_finish + self.document.note_pending(pending) + return pending, blank_finish + + +class Meta(Directive): + + has_content = True + + SMkwargs = {'state_classes': (MetaBody,)} + + def run(self): + self.assert_has_content() + node = nodes.Element() + new_line_offset, blank_finish = self.state.nested_list_parse( + self.content, self.content_offset, node, + initial_state='MetaBody', blank_finish=True, + state_machine_kwargs=self.SMkwargs) + if (new_line_offset - self.content_offset) != len(self.content): + # incomplete parse of block? + error = self.state_machine.reporter.error( + 'Invalid meta directive.', + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + node += error + return node.children diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/images.py b/lib/python3.8/site-packages/docutils/parsers/rst/directives/images.py new file mode 100644 index 0000000..ad9b0c0 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/directives/images.py @@ -0,0 +1,171 @@ +# $Id: images.py 8370 2019-08-27 12:10:39Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Directives for figures and simple images. +""" + +__docformat__ = 'reStructuredText' + + +import sys + +from docutils import nodes, utils +from docutils.parsers.rst import Directive +from docutils.parsers.rst import directives, states +from docutils.nodes import fully_normalize_name, whitespace_normalize_name +from docutils.parsers.rst.roles import set_classes + +try: # check for the Python Imaging Library + import PIL.Image +except ImportError: + try: # sometimes PIL modules are put in PYTHONPATH's root + import Image + class PIL(object): pass # dummy wrapper + PIL.Image = Image + except ImportError: + PIL = None + +if sys.version_info >= (3, 0): + from urllib.request import url2pathname +else: + from urllib import url2pathname + + +class Image(Directive): + + align_h_values = ('left', 'center', 'right') + align_v_values = ('top', 'middle', 'bottom') + align_values = align_v_values + align_h_values + + def align(argument): + # This is not callable as self.align. We cannot make it a + # staticmethod because we're saving an unbound method in + # option_spec below. + return directives.choice(argument, Image.align_values) + + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + option_spec = {'alt': directives.unchanged, + 'height': directives.length_or_unitless, + 'width': directives.length_or_percentage_or_unitless, + 'scale': directives.percentage, + 'align': align, + 'name': directives.unchanged, + 'target': directives.unchanged_required, + 'class': directives.class_option} + + def run(self): + if 'align' in self.options: + if isinstance(self.state, states.SubstitutionDef): + # Check for align_v_values. + if self.options['align'] not in self.align_v_values: + raise self.error( + 'Error in "%s" directive: "%s" is not a valid value ' + 'for the "align" option within a substitution ' + 'definition. Valid values for "align" are: "%s".' + % (self.name, self.options['align'], + '", "'.join(self.align_v_values))) + elif self.options['align'] not in self.align_h_values: + raise self.error( + 'Error in "%s" directive: "%s" is not a valid value for ' + 'the "align" option. Valid values for "align" are: "%s".' + % (self.name, self.options['align'], + '", "'.join(self.align_h_values))) + messages = [] + reference = directives.uri(self.arguments[0]) + self.options['uri'] = reference + reference_node = None + if 'target' in self.options: + block = states.escape2null( + self.options['target']).splitlines() + block = [line for line in block] + target_type, data = self.state.parse_target( + block, self.block_text, self.lineno) + if target_type == 'refuri': + reference_node = nodes.reference(refuri=data) + elif target_type == 'refname': + reference_node = nodes.reference( + refname=fully_normalize_name(data), + name=whitespace_normalize_name(data)) + reference_node.indirect_reference_name = data + self.state.document.note_refname(reference_node) + else: # malformed target + messages.append(data) # data is a system message + del self.options['target'] + set_classes(self.options) + image_node = nodes.image(self.block_text, **self.options) + self.add_name(image_node) + if reference_node: + reference_node += image_node + return messages + [reference_node] + else: + return messages + [image_node] + + +class Figure(Image): + + def align(argument): + return directives.choice(argument, Figure.align_h_values) + + def figwidth_value(argument): + if argument.lower() == 'image': + return 'image' + else: + return directives.length_or_percentage_or_unitless(argument, 'px') + + option_spec = Image.option_spec.copy() + option_spec['figwidth'] = figwidth_value + option_spec['figclass'] = directives.class_option + option_spec['align'] = align + has_content = True + + def run(self): + figwidth = self.options.pop('figwidth', None) + figclasses = self.options.pop('figclass', None) + align = self.options.pop('align', None) + (image_node,) = Image.run(self) + if isinstance(image_node, nodes.system_message): + return [image_node] + figure_node = nodes.figure('', image_node) + if figwidth == 'image': + if PIL and self.state.document.settings.file_insertion_enabled: + imagepath = url2pathname(image_node['uri']) + try: + img = PIL.Image.open( + imagepath.encode(sys.getfilesystemencoding())) + except (IOError, UnicodeEncodeError): + pass # TODO: warn? + else: + self.state.document.settings.record_dependencies.add( + imagepath.replace('\\', '/')) + figure_node['width'] = '%dpx' % img.size[0] + del img + elif figwidth is not None: + figure_node['width'] = figwidth + if figclasses: + figure_node['classes'] += figclasses + if align: + figure_node['align'] = align + if self.content: + node = nodes.Element() # anonymous container for parsing + self.state.nested_parse(self.content, self.content_offset, node) + first_node = node[0] + if isinstance(first_node, nodes.paragraph): + caption = nodes.caption(first_node.rawsource, '', + *first_node.children) + caption.source = first_node.source + caption.line = first_node.line + figure_node += caption + elif not (isinstance(first_node, nodes.comment) + and len(first_node) == 0): + error = self.state_machine.reporter.error( + 'Figure caption must be a paragraph or empty comment.', + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + return [figure_node, error] + if len(node) > 1: + figure_node += nodes.legend('', *node[1:]) + return [figure_node] diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/misc.py b/lib/python3.8/site-packages/docutils/parsers/rst/directives/misc.py new file mode 100644 index 0000000..0f949d9 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/directives/misc.py @@ -0,0 +1,556 @@ +# $Id: misc.py 8370 2019-08-27 12:10:39Z milde $ +# Authors: David Goodger ; Dethe Elza +# Copyright: This module has been placed in the public domain. + +"""Miscellaneous directives.""" + +__docformat__ = 'reStructuredText' + +import sys +import os.path +import re +import time +from docutils import io, nodes, statemachine, utils +from docutils.utils.error_reporting import SafeString, ErrorString +from docutils.utils.error_reporting import locale_encoding +from docutils.parsers.rst import Directive, convert_directive_function +from docutils.parsers.rst import directives, roles, states +from docutils.parsers.rst.directives.body import CodeBlock, NumberLines +from docutils.parsers.rst.roles import set_classes +from docutils.transforms import misc + +class Include(Directive): + + """ + Include content read from a separate source file. + + Content may be parsed by the parser, or included as a literal + block. The encoding of the included file can be specified. Only + a part of the given file argument may be included by specifying + start and end line or text to match before and/or after the text + to be used. + """ + + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + option_spec = {'literal': directives.flag, + 'code': directives.unchanged, + 'encoding': directives.encoding, + 'tab-width': int, + 'start-line': int, + 'end-line': int, + 'start-after': directives.unchanged_required, + 'end-before': directives.unchanged_required, + # ignored except for 'literal' or 'code': + 'number-lines': directives.unchanged, # integer or None + 'class': directives.class_option, + 'name': directives.unchanged} + + standard_include_path = os.path.join(os.path.dirname(states.__file__), + 'include') + + def run(self): + """Include a file as part of the content of this reST file.""" + if not self.state.document.settings.file_insertion_enabled: + raise self.warning('"%s" directive disabled.' % self.name) + source = self.state_machine.input_lines.source( + self.lineno - self.state_machine.input_offset - 1) + source_dir = os.path.dirname(os.path.abspath(source)) + path = directives.path(self.arguments[0]) + if path.startswith('<') and path.endswith('>'): + path = os.path.join(self.standard_include_path, path[1:-1]) + path = os.path.normpath(os.path.join(source_dir, path)) + path = utils.relative_path(None, path) + path = nodes.reprunicode(path) + encoding = self.options.get( + 'encoding', self.state.document.settings.input_encoding) + e_handler=self.state.document.settings.input_encoding_error_handler + tab_width = self.options.get( + 'tab-width', self.state.document.settings.tab_width) + try: + self.state.document.settings.record_dependencies.add(path) + include_file = io.FileInput(source_path=path, + encoding=encoding, + error_handler=e_handler) + except UnicodeEncodeError as error: + raise self.severe(u'Problems with "%s" directive path:\n' + 'Cannot encode input file path "%s" ' + '(wrong locale?).' % + (self.name, SafeString(path))) + except IOError as error: + raise self.severe(u'Problems with "%s" directive path:\n%s.' % + (self.name, ErrorString(error))) + startline = self.options.get('start-line', None) + endline = self.options.get('end-line', None) + try: + if startline or (endline is not None): + lines = include_file.readlines() + rawtext = ''.join(lines[startline:endline]) + else: + rawtext = include_file.read() + except UnicodeError as error: + raise self.severe(u'Problem with "%s" directive:\n%s' % + (self.name, ErrorString(error))) + # start-after/end-before: no restrictions on newlines in match-text, + # and no restrictions on matching inside lines vs. line boundaries + after_text = self.options.get('start-after', None) + if after_text: + # skip content in rawtext before *and incl.* a matching text + after_index = rawtext.find(after_text) + if after_index < 0: + raise self.severe('Problem with "start-after" option of "%s" ' + 'directive:\nText not found.' % self.name) + rawtext = rawtext[after_index + len(after_text):] + before_text = self.options.get('end-before', None) + if before_text: + # skip content in rawtext after *and incl.* a matching text + before_index = rawtext.find(before_text) + if before_index < 0: + raise self.severe('Problem with "end-before" option of "%s" ' + 'directive:\nText not found.' % self.name) + rawtext = rawtext[:before_index] + + include_lines = statemachine.string2lines(rawtext, tab_width, + convert_whitespace=True) + if 'literal' in self.options: + # Don't convert tabs to spaces, if `tab_width` is positive. + if tab_width >= 0: + text = rawtext.expandtabs(tab_width) + else: + text = rawtext + literal_block = nodes.literal_block(rawtext, source=path, + classes=self.options.get('class', [])) + literal_block.line = 1 + self.add_name(literal_block) + if 'number-lines' in self.options: + try: + startline = int(self.options['number-lines'] or 1) + except ValueError: + raise self.error(':number-lines: with non-integer ' + 'start value') + endline = startline + len(include_lines) + if text.endswith('\n'): + text = text[:-1] + tokens = NumberLines([([], text)], startline, endline) + for classes, value in tokens: + if classes: + literal_block += nodes.inline(value, value, + classes=classes) + else: + literal_block += nodes.Text(value) + else: + literal_block += nodes.Text(text) + return [literal_block] + if 'code' in self.options: + self.options['source'] = path + # Don't convert tabs to spaces, if `tab_width` is negative: + if tab_width < 0: + include_lines = rawtext.splitlines() + codeblock = CodeBlock(self.name, + [self.options.pop('code')], # arguments + self.options, + include_lines, # content + self.lineno, + self.content_offset, + self.block_text, + self.state, + self.state_machine) + return codeblock.run() + self.state_machine.insert_input(include_lines, path) + return [] + + +class Raw(Directive): + + """ + Pass through content unchanged + + Content is included in output based on type argument + + Content may be included inline (content section of directive) or + imported from a file or url. + """ + + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + option_spec = {'file': directives.path, + 'url': directives.uri, + 'encoding': directives.encoding} + has_content = True + + def run(self): + if (not self.state.document.settings.raw_enabled + or (not self.state.document.settings.file_insertion_enabled + and ('file' in self.options + or 'url' in self.options))): + raise self.warning('"%s" directive disabled.' % self.name) + attributes = {'format': ' '.join(self.arguments[0].lower().split())} + encoding = self.options.get( + 'encoding', self.state.document.settings.input_encoding) + e_handler=self.state.document.settings.input_encoding_error_handler + if self.content: + if 'file' in self.options or 'url' in self.options: + raise self.error( + '"%s" directive may not both specify an external file ' + 'and have content.' % self.name) + text = '\n'.join(self.content) + elif 'file' in self.options: + if 'url' in self.options: + raise self.error( + 'The "file" and "url" options may not be simultaneously ' + 'specified for the "%s" directive.' % self.name) + source_dir = os.path.dirname( + os.path.abspath(self.state.document.current_source)) + path = os.path.normpath(os.path.join(source_dir, + self.options['file'])) + path = utils.relative_path(None, path) + try: + raw_file = io.FileInput(source_path=path, + encoding=encoding, + error_handler=e_handler) + # TODO: currently, raw input files are recorded as + # dependencies even if not used for the chosen output format. + self.state.document.settings.record_dependencies.add(path) + except IOError as error: + raise self.severe(u'Problems with "%s" directive path:\n%s.' + % (self.name, ErrorString(error))) + try: + text = raw_file.read() + except UnicodeError as error: + raise self.severe(u'Problem with "%s" directive:\n%s' + % (self.name, ErrorString(error))) + attributes['source'] = path + elif 'url' in self.options: + source = self.options['url'] + # Do not import urllib2 at the top of the module because + # it may fail due to broken SSL dependencies, and it takes + # about 0.15 seconds to load. + if sys.version_info >= (3, 0): + from urllib.request import urlopen + from urllib.error import URLError + else: + from urllib2 import urlopen, URLError + try: + raw_text = urlopen(source).read() + except (URLError, IOError, OSError) as error: + raise self.severe(u'Problems with "%s" directive URL "%s":\n%s.' + % (self.name, self.options['url'], ErrorString(error))) + raw_file = io.StringInput(source=raw_text, source_path=source, + encoding=encoding, + error_handler=e_handler) + try: + text = raw_file.read() + except UnicodeError as error: + raise self.severe(u'Problem with "%s" directive:\n%s' + % (self.name, ErrorString(error))) + attributes['source'] = source + else: + # This will always fail because there is no content. + self.assert_has_content() + raw_node = nodes.raw('', text, **attributes) + (raw_node.source, + raw_node.line) = self.state_machine.get_source_and_line(self.lineno) + return [raw_node] + + +class Replace(Directive): + + has_content = True + + def run(self): + if not isinstance(self.state, states.SubstitutionDef): + raise self.error( + 'Invalid context: the "%s" directive can only be used within ' + 'a substitution definition.' % self.name) + self.assert_has_content() + text = '\n'.join(self.content) + element = nodes.Element(text) + self.state.nested_parse(self.content, self.content_offset, + element) + # element might contain [paragraph] + system_message(s) + node = None + messages = [] + for elem in element: + if not node and isinstance(elem, nodes.paragraph): + node = elem + elif isinstance(elem, nodes.system_message): + elem['backrefs'] = [] + messages.append(elem) + else: + return [ + self.state_machine.reporter.error( + 'Error in "%s" directive: may contain a single paragraph ' + 'only.' % (self.name), line=self.lineno) ] + if node: + return messages + node.children + return messages + +class Unicode(Directive): + + r""" + Convert Unicode character codes (numbers) to characters. Codes may be + decimal numbers, hexadecimal numbers (prefixed by ``0x``, ``x``, ``\x``, + ``U+``, ``u``, or ``\u``; e.g. ``U+262E``), or XML-style numeric character + entities (e.g. ``☮``). Text following ".." is a comment and is + ignored. Spaces are ignored, and any other text remains as-is. + """ + + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + option_spec = {'trim': directives.flag, + 'ltrim': directives.flag, + 'rtrim': directives.flag} + + comment_pattern = re.compile(r'( |\n|^)\.\. ') + + def run(self): + if not isinstance(self.state, states.SubstitutionDef): + raise self.error( + 'Invalid context: the "%s" directive can only be used within ' + 'a substitution definition.' % self.name) + substitution_definition = self.state_machine.node + if 'trim' in self.options: + substitution_definition.attributes['ltrim'] = 1 + substitution_definition.attributes['rtrim'] = 1 + if 'ltrim' in self.options: + substitution_definition.attributes['ltrim'] = 1 + if 'rtrim' in self.options: + substitution_definition.attributes['rtrim'] = 1 + codes = self.comment_pattern.split(self.arguments[0])[0].split() + element = nodes.Element() + for code in codes: + try: + decoded = directives.unicode_code(code) + except ValueError as error: + raise self.error(u'Invalid character code: %s\n%s' + % (code, ErrorString(error))) + element += nodes.Text(decoded) + return element.children + + +class Class(Directive): + + """ + Set a "class" attribute on the directive content or the next element. + When applied to the next element, a "pending" element is inserted, and a + transform does the work later. + """ + + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + has_content = True + + def run(self): + try: + class_value = directives.class_option(self.arguments[0]) + except ValueError: + raise self.error( + 'Invalid class attribute value for "%s" directive: "%s".' + % (self.name, self.arguments[0])) + node_list = [] + if self.content: + container = nodes.Element() + self.state.nested_parse(self.content, self.content_offset, + container) + for node in container: + node['classes'].extend(class_value) + node_list.extend(container.children) + else: + pending = nodes.pending( + misc.ClassAttribute, + {'class': class_value, 'directive': self.name}, + self.block_text) + self.state_machine.document.note_pending(pending) + node_list.append(pending) + return node_list + + +class Role(Directive): + + has_content = True + + argument_pattern = re.compile(r'(%s)\s*(\(\s*(%s)\s*\)\s*)?$' + % ((states.Inliner.simplename,) * 2)) + + def run(self): + """Dynamically create and register a custom interpreted text role.""" + if self.content_offset > self.lineno or not self.content: + raise self.error('"%s" directive requires arguments on the first ' + 'line.' % self.name) + args = self.content[0] + match = self.argument_pattern.match(args) + if not match: + raise self.error('"%s" directive arguments not valid role names: ' + '"%s".' % (self.name, args)) + new_role_name = match.group(1) + base_role_name = match.group(3) + messages = [] + if base_role_name: + base_role, messages = roles.role( + base_role_name, self.state_machine.language, self.lineno, + self.state.reporter) + if base_role is None: + error = self.state.reporter.error( + 'Unknown interpreted text role "%s".' % base_role_name, + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + return messages + [error] + else: + base_role = roles.generic_custom_role + assert not hasattr(base_role, 'arguments'), ( + 'Supplemental directive arguments for "%s" directive not ' + 'supported (specified by "%r" role).' % (self.name, base_role)) + try: + converted_role = convert_directive_function(base_role) + (arguments, options, content, content_offset) = ( + self.state.parse_directive_block( + self.content[1:], self.content_offset, converted_role, + option_presets={})) + except states.MarkupError as detail: + error = self.state_machine.reporter.error( + 'Error in "%s" directive:\n%s.' % (self.name, detail), + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + return messages + [error] + if 'class' not in options: + try: + options['class'] = directives.class_option(new_role_name) + except ValueError as detail: + error = self.state_machine.reporter.error( + u'Invalid argument for "%s" directive:\n%s.' + % (self.name, SafeString(detail)), nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + return messages + [error] + role = roles.CustomRole(new_role_name, base_role, options, content) + roles.register_local_role(new_role_name, role) + return messages + + +class DefaultRole(Directive): + + """Set the default interpreted text role.""" + + optional_arguments = 1 + final_argument_whitespace = False + + def run(self): + if not self.arguments: + if '' in roles._roles: + # restore the "default" default role + del roles._roles[''] + return [] + role_name = self.arguments[0] + role, messages = roles.role(role_name, self.state_machine.language, + self.lineno, self.state.reporter) + if role is None: + error = self.state.reporter.error( + 'Unknown interpreted text role "%s".' % role_name, + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + return messages + [error] + roles._roles[''] = role + return messages + + +class Title(Directive): + + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + + def run(self): + self.state_machine.document['title'] = self.arguments[0] + return [] + + +class Date(Directive): + + has_content = True + + def run(self): + if not isinstance(self.state, states.SubstitutionDef): + raise self.error( + 'Invalid context: the "%s" directive can only be used within ' + 'a substitution definition.' % self.name) + format_str = '\n'.join(self.content) or '%Y-%m-%d' + if sys.version_info< (3, 0): + try: + format_str = format_str.encode(locale_encoding or 'utf-8') + except UnicodeEncodeError: + raise self.warning(u'Cannot encode date format string ' + u'with locale encoding "%s".' % locale_encoding) + # @@@ + # Use timestamp from the `SOURCE_DATE_EPOCH`_ environment variable? + # Pro: Docutils-generated documentation + # can easily be part of `reproducible software builds`__ + # + # __ https://reproducible-builds.org/ + # + # Con: Changes the specs, hard to predict behaviour, + # + # See also the discussion about \date \time \year in TeX + # http://tug.org/pipermail/tex-k/2016-May/002704.html + # source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH') + # if (source_date_epoch): + # text = time.strftime(format_str, + # time.gmtime(int(source_date_epoch))) + # else: + text = time.strftime(format_str) + if sys.version_info< (3, 0): + # `text` is a byte string that may contain non-ASCII characters: + try: + text = text.decode(locale_encoding or 'utf-8') + except UnicodeDecodeError: + text = text.decode(locale_encoding or 'utf-8', 'replace') + raise self.warning(u'Error decoding "%s"' + u'with locale encoding "%s".' % (text, locale_encoding)) + return [nodes.Text(text)] + + +class TestDirective(Directive): + + """This directive is useful only for testing purposes.""" + + optional_arguments = 1 + final_argument_whitespace = True + option_spec = {'option': directives.unchanged_required} + has_content = True + + def run(self): + if self.content: + text = '\n'.join(self.content) + info = self.state_machine.reporter.info( + 'Directive processed. Type="%s", arguments=%r, options=%r, ' + 'content:' % (self.name, self.arguments, self.options), + nodes.literal_block(text, text), line=self.lineno) + else: + info = self.state_machine.reporter.info( + 'Directive processed. Type="%s", arguments=%r, options=%r, ' + 'content: None' % (self.name, self.arguments, self.options), + line=self.lineno) + return [info] + +# Old-style, functional definition: +# +# def directive_test_function(name, arguments, options, content, lineno, +# content_offset, block_text, state, state_machine): +# """This directive is useful only for testing purposes.""" +# if content: +# text = '\n'.join(content) +# info = state_machine.reporter.info( +# 'Directive processed. Type="%s", arguments=%r, options=%r, ' +# 'content:' % (name, arguments, options), +# nodes.literal_block(text, text), line=lineno) +# else: +# info = state_machine.reporter.info( +# 'Directive processed. Type="%s", arguments=%r, options=%r, ' +# 'content: None' % (name, arguments, options), line=lineno) +# return [info] +# +# directive_test_function.arguments = (0, 1, 1) +# directive_test_function.options = {'option': directives.unchanged_required} +# directive_test_function.content = 1 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/parts.py b/lib/python3.8/site-packages/docutils/parsers/rst/directives/parts.py new file mode 100644 index 0000000..1cb0e47 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/directives/parts.py @@ -0,0 +1,126 @@ +# $Id: parts.py 7308 2012-01-06 12:08:43Z milde $ +# Authors: David Goodger ; Dmitry Jemerov +# Copyright: This module has been placed in the public domain. + +""" +Directives for document parts. +""" + +__docformat__ = 'reStructuredText' + +from docutils import nodes, languages +from docutils.transforms import parts +from docutils.parsers.rst import Directive +from docutils.parsers.rst import directives + + +class Contents(Directive): + + """ + Table of contents. + + The table of contents is generated in two passes: initial parse and + transform. During the initial parse, a 'pending' element is generated + which acts as a placeholder, storing the TOC title and any options + internally. At a later stage in the processing, the 'pending' element is + replaced by a 'topic' element, a title and the table of contents proper. + """ + + backlinks_values = ('top', 'entry', 'none') + + def backlinks(arg): + value = directives.choice(arg, Contents.backlinks_values) + if value == 'none': + return None + else: + return value + + optional_arguments = 1 + final_argument_whitespace = True + option_spec = {'depth': directives.nonnegative_int, + 'local': directives.flag, + 'backlinks': backlinks, + 'class': directives.class_option} + + def run(self): + if not (self.state_machine.match_titles + or isinstance(self.state_machine.node, nodes.sidebar)): + raise self.error('The "%s" directive may not be used within ' + 'topics or body elements.' % self.name) + document = self.state_machine.document + language = languages.get_language(document.settings.language_code, + document.reporter) + if self.arguments: + title_text = self.arguments[0] + text_nodes, messages = self.state.inline_text(title_text, + self.lineno) + title = nodes.title(title_text, '', *text_nodes) + else: + messages = [] + if 'local' in self.options: + title = None + else: + title = nodes.title('', language.labels['contents']) + topic = nodes.topic(classes=['contents']) + topic['classes'] += self.options.get('class', []) + # the latex2e writer needs source and line for a warning: + topic.source, topic.line = self.state_machine.get_source_and_line() + topic.line -= 1 + if 'local' in self.options: + topic['classes'].append('local') + if title: + name = title.astext() + topic += title + else: + name = language.labels['contents'] + name = nodes.fully_normalize_name(name) + if not document.has_name(name): + topic['names'].append(name) + document.note_implicit_target(topic) + pending = nodes.pending(parts.Contents, rawsource=self.block_text) + pending.details.update(self.options) + document.note_pending(pending) + topic += pending + return [topic] + messages + + +class Sectnum(Directive): + + """Automatic section numbering.""" + + option_spec = {'depth': int, + 'start': int, + 'prefix': directives.unchanged_required, + 'suffix': directives.unchanged_required} + + def run(self): + pending = nodes.pending(parts.SectNum) + pending.details.update(self.options) + self.state_machine.document.note_pending(pending) + return [pending] + + +class Header(Directive): + + """Contents of document header.""" + + has_content = True + + def run(self): + self.assert_has_content() + header = self.state_machine.document.get_decoration().get_header() + self.state.nested_parse(self.content, self.content_offset, header) + return [] + + +class Footer(Directive): + + """Contents of document footer.""" + + has_content = True + + def run(self): + self.assert_has_content() + footer = self.state_machine.document.get_decoration().get_footer() + self.state.nested_parse(self.content, self.content_offset, footer) + return [] diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/references.py b/lib/python3.8/site-packages/docutils/parsers/rst/directives/references.py new file mode 100644 index 0000000..96921f9 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/directives/references.py @@ -0,0 +1,29 @@ +# $Id: references.py 7062 2011-06-30 22:14:29Z milde $ +# Authors: David Goodger ; Dmitry Jemerov +# Copyright: This module has been placed in the public domain. + +""" +Directives for references and targets. +""" + +__docformat__ = 'reStructuredText' + +from docutils import nodes +from docutils.transforms import references +from docutils.parsers.rst import Directive +from docutils.parsers.rst import directives + + +class TargetNotes(Directive): + + """Target footnote generation.""" + + option_spec = {'class': directives.class_option, + 'name': directives.unchanged} + + def run(self): + pending = nodes.pending(references.TargetNotes) + self.add_name(pending) + pending.details.update(self.options) + self.state_machine.document.note_pending(pending) + return [pending] diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/directives/tables.py b/lib/python3.8/site-packages/docutils/parsers/rst/directives/tables.py new file mode 100644 index 0000000..3c9c3f3 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/directives/tables.py @@ -0,0 +1,513 @@ +# $Id: tables.py 8377 2019-08-27 19:49:45Z milde $ +# Authors: David Goodger ; David Priest +# Copyright: This module has been placed in the public domain. + +""" +Directives for table elements. +""" + +__docformat__ = 'reStructuredText' + + +import sys +import os.path +import csv + +from docutils import io, nodes, statemachine, utils +from docutils.utils.error_reporting import SafeString +from docutils.utils import SystemMessagePropagation +from docutils.parsers.rst import Directive +from docutils.parsers.rst import directives + + +def align(argument): + return directives.choice(argument, ('left', 'center', 'right')) + + +class Table(Directive): + + """ + Generic table base class. + """ + + optional_arguments = 1 + final_argument_whitespace = True + option_spec = {'class': directives.class_option, + 'name': directives.unchanged, + 'align': align, + 'width': directives.length_or_percentage_or_unitless, + 'widths': directives.value_or(('auto', 'grid'), + directives.positive_int_list)} + has_content = True + + def make_title(self): + if self.arguments: + title_text = self.arguments[0] + text_nodes, messages = self.state.inline_text(title_text, + self.lineno) + title = nodes.title(title_text, '', *text_nodes) + (title.source, + title.line) = self.state_machine.get_source_and_line(self.lineno) + else: + title = None + messages = [] + return title, messages + + def process_header_option(self): + source = self.state_machine.get_source(self.lineno - 1) + table_head = [] + max_header_cols = 0 + if 'header' in self.options: # separate table header in option + rows, max_header_cols = self.parse_csv_data_into_rows( + self.options['header'].split('\n'), self.HeaderDialect(), + source) + table_head.extend(rows) + return table_head, max_header_cols + + def check_table_dimensions(self, rows, header_rows, stub_columns): + if len(rows) < header_rows: + error = self.state_machine.reporter.error( + '%s header row(s) specified but only %s row(s) of data ' + 'supplied ("%s" directive).' + % (header_rows, len(rows), self.name), nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + if len(rows) == header_rows > 0: + error = self.state_machine.reporter.error( + 'Insufficient data supplied (%s row(s)); no data remaining ' + 'for table body, required by "%s" directive.' + % (len(rows), self.name), nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + for row in rows: + if len(row) < stub_columns: + error = self.state_machine.reporter.error( + '%s stub column(s) specified but only %s columns(s) of ' + 'data supplied ("%s" directive).' % + (stub_columns, len(row), self.name), nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + if len(row) == stub_columns > 0: + error = self.state_machine.reporter.error( + 'Insufficient data supplied (%s columns(s)); no data remaining ' + 'for table body, required by "%s" directive.' + % (len(row), self.name), nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + + def set_table_width(self, table_node): + if 'width' in self.options: + table_node['width'] = self.options.get('width') + + @property + def widths(self): + return self.options.get('widths', '') + + def get_column_widths(self, max_cols): + if isinstance(self.widths, list): + if len(self.widths) != max_cols: + error = self.state_machine.reporter.error( + '"%s" widths do not match the number of columns in table ' + '(%s).' % (self.name, max_cols), nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + col_widths = self.widths + elif max_cols: + col_widths = [100 // max_cols] * max_cols + else: + error = self.state_machine.reporter.error( + 'No table data detected in CSV file.', nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + return col_widths + + def extend_short_rows_with_empty_cells(self, columns, parts): + for part in parts: + for row in part: + if len(row) < columns: + row.extend([(0, 0, 0, [])] * (columns - len(row))) + + +class RSTTable(Table): + + def run(self): + if not self.content: + warning = self.state_machine.reporter.warning( + 'Content block expected for the "%s" directive; none found.' + % self.name, nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + return [warning] + title, messages = self.make_title() + node = nodes.Element() # anonymous container for parsing + self.state.nested_parse(self.content, self.content_offset, node) + if len(node) != 1 or not isinstance(node[0], nodes.table): + error = self.state_machine.reporter.error( + 'Error parsing content block for the "%s" directive: exactly ' + 'one table expected.' % self.name, nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + return [error] + table_node = node[0] + table_node['classes'] += self.options.get('class', []) + self.set_table_width(table_node) + if 'align' in self.options: + table_node['align'] = self.options.get('align') + tgroup = table_node[0] + if isinstance(self.widths, list): + colspecs = [child for child in tgroup.children + if child.tagname == 'colspec'] + for colspec, col_width in zip(colspecs, self.widths): + colspec['colwidth'] = col_width + # @@@ the colwidths argument for is not part of the + # XML Exchange Table spec (https://www.oasis-open.org/specs/tm9901.htm) + # and hence violates the docutils.dtd. + if self.widths == 'auto': + table_node['classes'] += ['colwidths-auto'] + elif self.widths: # "grid" or list of integers + table_node['classes'] += ['colwidths-given'] + self.add_name(table_node) + if title: + table_node.insert(0, title) + return [table_node] + messages + + +class CSVTable(Table): + + option_spec = {'header-rows': directives.nonnegative_int, + 'stub-columns': directives.nonnegative_int, + 'header': directives.unchanged, + 'width': directives.length_or_percentage_or_unitless, + 'widths': directives.value_or(('auto', ), + directives.positive_int_list), + 'file': directives.path, + 'url': directives.uri, + 'encoding': directives.encoding, + 'class': directives.class_option, + 'name': directives.unchanged, + 'align': align, + # field delimiter char + 'delim': directives.single_char_or_whitespace_or_unicode, + # treat whitespace after delimiter as significant + 'keepspace': directives.flag, + # text field quote/unquote char: + 'quote': directives.single_char_or_unicode, + # char used to escape delim & quote as-needed: + 'escape': directives.single_char_or_unicode,} + + class DocutilsDialect(csv.Dialect): + + """CSV dialect for `csv_table` directive.""" + + delimiter = ',' + quotechar = '"' + doublequote = True + skipinitialspace = True + strict = True + lineterminator = '\n' + quoting = csv.QUOTE_MINIMAL + + def __init__(self, options): + if 'delim' in options: + self.delimiter = CSVTable.encode_for_csv(options['delim']) + if 'keepspace' in options: + self.skipinitialspace = False + if 'quote' in options: + self.quotechar = CSVTable.encode_for_csv(options['quote']) + if 'escape' in options: + self.doublequote = False + self.escapechar = CSVTable.encode_for_csv(options['escape']) + csv.Dialect.__init__(self) + + + class HeaderDialect(csv.Dialect): + + """CSV dialect to use for the "header" option data.""" + + delimiter = ',' + quotechar = '"' + escapechar = '\\' + doublequote = False + skipinitialspace = True + strict = True + lineterminator = '\n' + quoting = csv.QUOTE_MINIMAL + + def check_requirements(self): + pass + + def run(self): + try: + if (not self.state.document.settings.file_insertion_enabled + and ('file' in self.options + or 'url' in self.options)): + warning = self.state_machine.reporter.warning( + 'File and URL access deactivated; ignoring "%s" ' + 'directive.' % self.name, nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + return [warning] + self.check_requirements() + title, messages = self.make_title() + csv_data, source = self.get_csv_data() + table_head, max_header_cols = self.process_header_option() + rows, max_cols = self.parse_csv_data_into_rows( + csv_data, self.DocutilsDialect(self.options), source) + max_cols = max(max_cols, max_header_cols) + header_rows = self.options.get('header-rows', 0) + stub_columns = self.options.get('stub-columns', 0) + self.check_table_dimensions(rows, header_rows, stub_columns) + table_head.extend(rows[:header_rows]) + table_body = rows[header_rows:] + col_widths = self.get_column_widths(max_cols) + self.extend_short_rows_with_empty_cells(max_cols, + (table_head, table_body)) + except SystemMessagePropagation as detail: + return [detail.args[0]] + except csv.Error as detail: + message = str(detail) + if sys.version_info < (3, 0) and '1-character string' in message: + message += '\nwith Python 2.x this must be an ASCII character.' + error = self.state_machine.reporter.error( + 'Error with CSV data in "%s" directive:\n%s' + % (self.name, message), nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + return [error] + table = (col_widths, table_head, table_body) + table_node = self.state.build_table(table, self.content_offset, + stub_columns, widths=self.widths) + table_node['classes'] += self.options.get('class', []) + if 'align' in self.options: + table_node['align'] = self.options.get('align') + self.set_table_width(table_node) + self.add_name(table_node) + if title: + table_node.insert(0, title) + return [table_node] + messages + + def get_csv_data(self): + """ + Get CSV data from the directive content, from an external + file, or from a URL reference. + """ + encoding = self.options.get( + 'encoding', self.state.document.settings.input_encoding) + error_handler = self.state.document.settings.input_encoding_error_handler + if self.content: + # CSV data is from directive content. + if 'file' in self.options or 'url' in self.options: + error = self.state_machine.reporter.error( + '"%s" directive may not both specify an external file and' + ' have content.' % self.name, nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + source = self.content.source(0) + csv_data = self.content + elif 'file' in self.options: + # CSV data is from an external file. + if 'url' in self.options: + error = self.state_machine.reporter.error( + 'The "file" and "url" options may not be simultaneously' + ' specified for the "%s" directive.' % self.name, + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + raise SystemMessagePropagation(error) + source_dir = os.path.dirname( + os.path.abspath(self.state.document.current_source)) + source = os.path.normpath(os.path.join(source_dir, + self.options['file'])) + source = utils.relative_path(None, source) + try: + self.state.document.settings.record_dependencies.add(source) + csv_file = io.FileInput(source_path=source, + encoding=encoding, + error_handler=error_handler) + csv_data = csv_file.read().splitlines() + except IOError as error: + severe = self.state_machine.reporter.severe( + u'Problems with "%s" directive path:\n%s.' + % (self.name, SafeString(error)), + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + raise SystemMessagePropagation(severe) + elif 'url' in self.options: + # CSV data is from a URL. + # Do not import urllib2 at the top of the module because + # it may fail due to broken SSL dependencies, and it takes + # about 0.15 seconds to load. + if sys.version_info >= (3, 0): + from urllib.request import urlopen + from urllib.error import URLError + else: + from urllib2 import urlopen, URLError + + source = self.options['url'] + try: + csv_text = urlopen(source).read() + except (URLError, IOError, OSError, ValueError) as error: + severe = self.state_machine.reporter.severe( + 'Problems with "%s" directive URL "%s":\n%s.' + % (self.name, self.options['url'], SafeString(error)), + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + raise SystemMessagePropagation(severe) + csv_file = io.StringInput( + source=csv_text, source_path=source, encoding=encoding, + error_handler=(self.state.document.settings.\ + input_encoding_error_handler)) + csv_data = csv_file.read().splitlines() + else: + error = self.state_machine.reporter.warning( + 'The "%s" directive requires content; none supplied.' + % self.name, nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + return csv_data, source + + if sys.version_info < (3, 0): + # 2.x csv module doesn't do Unicode + def decode_from_csv(s): + return s.decode('utf-8') + def encode_for_csv(s): + return s.encode('utf-8') + else: + def decode_from_csv(s): + return s + def encode_for_csv(s): + return s + decode_from_csv = staticmethod(decode_from_csv) + encode_for_csv = staticmethod(encode_for_csv) + + def parse_csv_data_into_rows(self, csv_data, dialect, source): + # csv.py doesn't do Unicode; encode temporarily as UTF-8 + csv_reader = csv.reader([self.encode_for_csv(line + '\n') + for line in csv_data], + dialect=dialect) + rows = [] + max_cols = 0 + for row in csv_reader: + row_data = [] + for cell in row: + # decode UTF-8 back to Unicode + cell_text = self.decode_from_csv(cell) + cell_data = (0, 0, 0, statemachine.StringList( + cell_text.splitlines(), source=source)) + row_data.append(cell_data) + rows.append(row_data) + max_cols = max(max_cols, len(row)) + return rows, max_cols + + +class ListTable(Table): + + """ + Implement tables whose data is encoded as a uniform two-level bullet list. + For further ideas, see + http://docutils.sf.net/docs/dev/rst/alternatives.html#list-driven-tables + """ + + option_spec = {'header-rows': directives.nonnegative_int, + 'stub-columns': directives.nonnegative_int, + 'width': directives.length_or_percentage_or_unitless, + 'widths': directives.value_or(('auto', ), + directives.positive_int_list), + 'class': directives.class_option, + 'name': directives.unchanged, + 'align': align} + + def run(self): + if not self.content: + error = self.state_machine.reporter.error( + 'The "%s" directive is empty; content required.' % self.name, + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + return [error] + title, messages = self.make_title() + node = nodes.Element() # anonymous container for parsing + self.state.nested_parse(self.content, self.content_offset, node) + try: + num_cols, col_widths = self.check_list_content(node) + table_data = [[item.children for item in row_list[0]] + for row_list in node[0]] + header_rows = self.options.get('header-rows', 0) + stub_columns = self.options.get('stub-columns', 0) + self.check_table_dimensions(table_data, header_rows, stub_columns) + except SystemMessagePropagation as detail: + return [detail.args[0]] + table_node = self.build_table_from_list(table_data, col_widths, + header_rows, stub_columns) + if 'align' in self.options: + table_node['align'] = self.options.get('align') + table_node['classes'] += self.options.get('class', []) + self.set_table_width(table_node) + self.add_name(table_node) + if title: + table_node.insert(0, title) + return [table_node] + messages + + def check_list_content(self, node): + if len(node) != 1 or not isinstance(node[0], nodes.bullet_list): + error = self.state_machine.reporter.error( + 'Error parsing content block for the "%s" directive: ' + 'exactly one bullet list expected.' % self.name, + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + raise SystemMessagePropagation(error) + list_node = node[0] + num_cols = 0 + # Check for a uniform two-level bullet list: + for item_index in range(len(list_node)): + item = list_node[item_index] + if len(item) != 1 or not isinstance(item[0], nodes.bullet_list): + error = self.state_machine.reporter.error( + 'Error parsing content block for the "%s" directive: ' + 'two-level bullet list expected, but row %s does not ' + 'contain a second-level bullet list.' + % (self.name, item_index + 1), nodes.literal_block( + self.block_text, self.block_text), line=self.lineno) + raise SystemMessagePropagation(error) + elif item_index: + if len(item[0]) != num_cols: + error = self.state_machine.reporter.error( + 'Error parsing content block for the "%s" directive: ' + 'uniform two-level bullet list expected, but row %s ' + 'does not contain the same number of items as row 1 ' + '(%s vs %s).' + % (self.name, item_index + 1, len(item[0]), num_cols), + nodes.literal_block(self.block_text, self.block_text), + line=self.lineno) + raise SystemMessagePropagation(error) + else: + num_cols = len(item[0]) + col_widths = self.get_column_widths(num_cols) + return num_cols, col_widths + + def build_table_from_list(self, table_data, col_widths, header_rows, stub_columns): + table = nodes.table() + if self.widths == 'auto': + table['classes'] += ['colwidths-auto'] + elif self.widths: # "grid" or list of integers + table['classes'] += ['colwidths-given'] + tgroup = nodes.tgroup(cols=len(col_widths)) + table += tgroup + for col_width in col_widths: + colspec = nodes.colspec() + if col_width is not None: + colspec.attributes['colwidth'] = col_width + if stub_columns: + colspec.attributes['stub'] = 1 + stub_columns -= 1 + tgroup += colspec + rows = [] + for row in table_data: + row_node = nodes.row() + for cell in row: + entry = nodes.entry() + entry += cell + row_node += entry + rows.append(row_node) + if header_rows: + thead = nodes.thead() + thead.extend(rows[:header_rows]) + tgroup += thead + tbody = nodes.tbody() + tbody.extend(rows[header_rows:]) + tgroup += tbody + return table diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/README.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/README.txt new file mode 100644 index 0000000..cd03135 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/README.txt @@ -0,0 +1,17 @@ +============================================ + ``docutils/parsers/rst/include`` Directory +============================================ + +This directory contains standard data files intended for inclusion in +reStructuredText documents. To access these files, use the "include" +directive with the special syntax for standard "include" data files, +angle brackets around the file name:: + + .. include:: + +See the documentation for the `"include" directive`__ and +`reStructuredText Standard Substitution Definition Sets`__ for +details. + +__ http://docutils.sf.net/docs/ref/rst/directives.html#include +__ http://docutils.sf.net/docs/ref/rst/substitutions.html diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsa.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsa.txt new file mode 100644 index 0000000..e6f4518 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsa.txt @@ -0,0 +1,162 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |angzarr| unicode:: U+0237C .. RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +.. |cirmid| unicode:: U+02AEF .. VERTICAL LINE WITH CIRCLE ABOVE +.. |cudarrl| unicode:: U+02938 .. RIGHT-SIDE ARC CLOCKWISE ARROW +.. |cudarrr| unicode:: U+02935 .. ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +.. |cularr| unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW +.. |cularrp| unicode:: U+0293D .. TOP ARC ANTICLOCKWISE ARROW WITH PLUS +.. |curarr| unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW +.. |curarrm| unicode:: U+0293C .. TOP ARC CLOCKWISE ARROW WITH MINUS +.. |Darr| unicode:: U+021A1 .. DOWNWARDS TWO HEADED ARROW +.. |dArr| unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW +.. |darr2| unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS +.. |ddarr| unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS +.. |DDotrahd| unicode:: U+02911 .. RIGHTWARDS ARROW WITH DOTTED STEM +.. |dfisht| unicode:: U+0297F .. DOWN FISH TAIL +.. |dHar| unicode:: U+02965 .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +.. |dharl| unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS +.. |dharr| unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS +.. |dlarr| unicode:: U+02199 .. SOUTH WEST ARROW +.. |drarr| unicode:: U+02198 .. SOUTH EAST ARROW +.. |duarr| unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +.. |duhar| unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +.. |dzigrarr| unicode:: U+027FF .. LONG RIGHTWARDS SQUIGGLE ARROW +.. |erarr| unicode:: U+02971 .. EQUALS SIGN ABOVE RIGHTWARDS ARROW +.. |hArr| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW +.. |harr| unicode:: U+02194 .. LEFT RIGHT ARROW +.. |harrcir| unicode:: U+02948 .. LEFT RIGHT ARROW THROUGH SMALL CIRCLE +.. |harrw| unicode:: U+021AD .. LEFT RIGHT WAVE ARROW +.. |hoarr| unicode:: U+021FF .. LEFT RIGHT OPEN-HEADED ARROW +.. |imof| unicode:: U+022B7 .. IMAGE OF +.. |lAarr| unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW +.. |Larr| unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW +.. |larr2| unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS +.. |larrbfs| unicode:: U+0291F .. LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +.. |larrfs| unicode:: U+0291D .. LEFTWARDS ARROW TO BLACK DIAMOND +.. |larrhk| unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK +.. |larrlp| unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP +.. |larrpl| unicode:: U+02939 .. LEFT-SIDE ARC ANTICLOCKWISE ARROW +.. |larrsim| unicode:: U+02973 .. LEFTWARDS ARROW ABOVE TILDE OPERATOR +.. |larrtl| unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL +.. |lAtail| unicode:: U+0291B .. LEFTWARDS DOUBLE ARROW-TAIL +.. |latail| unicode:: U+02919 .. LEFTWARDS ARROW-TAIL +.. |lBarr| unicode:: U+0290E .. LEFTWARDS TRIPLE DASH ARROW +.. |lbarr| unicode:: U+0290C .. LEFTWARDS DOUBLE DASH ARROW +.. |ldca| unicode:: U+02936 .. ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +.. |ldrdhar| unicode:: U+02967 .. LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +.. |ldrushar| unicode:: U+0294B .. LEFT BARB DOWN RIGHT BARB UP HARPOON +.. |ldsh| unicode:: U+021B2 .. DOWNWARDS ARROW WITH TIP LEFTWARDS +.. |lfisht| unicode:: U+0297C .. LEFT FISH TAIL +.. |lHar| unicode:: U+02962 .. LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +.. |lhard| unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS +.. |lharu| unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS +.. |lharul| unicode:: U+0296A .. LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +.. |llarr| unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS +.. |llhard| unicode:: U+0296B .. LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +.. |loarr| unicode:: U+021FD .. LEFTWARDS OPEN-HEADED ARROW +.. |lrarr| unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW +.. |lrarr2| unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW +.. |lrhar| unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +.. |lrhar2| unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +.. |lrhard| unicode:: U+0296D .. RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +.. |lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS +.. |lurdshar| unicode:: U+0294A .. LEFT BARB UP RIGHT BARB DOWN HARPOON +.. |luruhar| unicode:: U+02966 .. LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +.. |Map| unicode:: U+02905 .. RIGHTWARDS TWO-HEADED ARROW FROM BAR +.. |map| unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR +.. |midcir| unicode:: U+02AF0 .. VERTICAL LINE WITH CIRCLE BELOW +.. |mumap| unicode:: U+022B8 .. MULTIMAP +.. |nearhk| unicode:: U+02924 .. NORTH EAST ARROW WITH HOOK +.. |neArr| unicode:: U+021D7 .. NORTH EAST DOUBLE ARROW +.. |nearr| unicode:: U+02197 .. NORTH EAST ARROW +.. |nesear| unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW +.. |nhArr| unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE +.. |nharr| unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE +.. |nlArr| unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE +.. |nlarr| unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE +.. |nrArr| unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE +.. |nrarr| unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE +.. |nrarrc| unicode:: U+02933 U+00338 .. WAVE ARROW POINTING DIRECTLY RIGHT with slash +.. |nrarrw| unicode:: U+0219D U+00338 .. RIGHTWARDS WAVE ARROW with slash +.. |nvHarr| unicode:: U+02904 .. LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +.. |nvlArr| unicode:: U+02902 .. LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +.. |nvrArr| unicode:: U+02903 .. RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +.. |nwarhk| unicode:: U+02923 .. NORTH WEST ARROW WITH HOOK +.. |nwArr| unicode:: U+021D6 .. NORTH WEST DOUBLE ARROW +.. |nwarr| unicode:: U+02196 .. NORTH WEST ARROW +.. |nwnear| unicode:: U+02927 .. NORTH WEST ARROW AND NORTH EAST ARROW +.. |olarr| unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW +.. |orarr| unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW +.. |origof| unicode:: U+022B6 .. ORIGINAL OF +.. |rAarr| unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW +.. |Rarr| unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW +.. |rarr2| unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS +.. |rarrap| unicode:: U+02975 .. RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +.. |rarrbfs| unicode:: U+02920 .. RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +.. |rarrc| unicode:: U+02933 .. WAVE ARROW POINTING DIRECTLY RIGHT +.. |rarrfs| unicode:: U+0291E .. RIGHTWARDS ARROW TO BLACK DIAMOND +.. |rarrhk| unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK +.. |rarrlp| unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP +.. |rarrpl| unicode:: U+02945 .. RIGHTWARDS ARROW WITH PLUS BELOW +.. |rarrsim| unicode:: U+02974 .. RIGHTWARDS ARROW ABOVE TILDE OPERATOR +.. |Rarrtl| unicode:: U+02916 .. RIGHTWARDS TWO-HEADED ARROW WITH TAIL +.. |rarrtl| unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL +.. |rarrw| unicode:: U+0219D .. RIGHTWARDS WAVE ARROW +.. |rAtail| unicode:: U+0291C .. RIGHTWARDS DOUBLE ARROW-TAIL +.. |ratail| unicode:: U+0291A .. RIGHTWARDS ARROW-TAIL +.. |RBarr| unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +.. |rBarr| unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW +.. |rbarr| unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW +.. |rdca| unicode:: U+02937 .. ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +.. |rdldhar| unicode:: U+02969 .. RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +.. |rdsh| unicode:: U+021B3 .. DOWNWARDS ARROW WITH TIP RIGHTWARDS +.. |rfisht| unicode:: U+0297D .. RIGHT FISH TAIL +.. |rHar| unicode:: U+02964 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +.. |rhard| unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS +.. |rharu| unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS +.. |rharul| unicode:: U+0296C .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +.. |rlarr| unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW +.. |rlarr2| unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW +.. |rlhar| unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +.. |rlhar2| unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +.. |roarr| unicode:: U+021FE .. RIGHTWARDS OPEN-HEADED ARROW +.. |rrarr| unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS +.. |rsh| unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS +.. |ruluhar| unicode:: U+02968 .. RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +.. |searhk| unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK +.. |seArr| unicode:: U+021D8 .. SOUTH EAST DOUBLE ARROW +.. |searr| unicode:: U+02198 .. SOUTH EAST ARROW +.. |seswar| unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW +.. |simrarr| unicode:: U+02972 .. TILDE OPERATOR ABOVE RIGHTWARDS ARROW +.. |slarr| unicode:: U+02190 .. LEFTWARDS ARROW +.. |srarr| unicode:: U+02192 .. RIGHTWARDS ARROW +.. |swarhk| unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK +.. |swArr| unicode:: U+021D9 .. SOUTH WEST DOUBLE ARROW +.. |swarr| unicode:: U+02199 .. SOUTH WEST ARROW +.. |swnwar| unicode:: U+0292A .. SOUTH WEST ARROW AND NORTH WEST ARROW +.. |Uarr| unicode:: U+0219F .. UPWARDS TWO HEADED ARROW +.. |uArr| unicode:: U+021D1 .. UPWARDS DOUBLE ARROW +.. |uarr2| unicode:: U+021C8 .. UPWARDS PAIRED ARROWS +.. |Uarrocir| unicode:: U+02949 .. UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +.. |udarr| unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +.. |udhar| unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +.. |ufisht| unicode:: U+0297E .. UP FISH TAIL +.. |uHar| unicode:: U+02963 .. UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +.. |uharl| unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS +.. |uharr| unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS +.. |uuarr| unicode:: U+021C8 .. UPWARDS PAIRED ARROWS +.. |vArr| unicode:: U+021D5 .. UP DOWN DOUBLE ARROW +.. |varr| unicode:: U+02195 .. UP DOWN ARROW +.. |xhArr| unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW +.. |xharr| unicode:: U+027F7 .. LONG LEFT RIGHT ARROW +.. |xlArr| unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW +.. |xlarr| unicode:: U+027F5 .. LONG LEFTWARDS ARROW +.. |xmap| unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR +.. |xrArr| unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW +.. |xrarr| unicode:: U+027F6 .. LONG RIGHTWARDS ARROW +.. |zigrarr| unicode:: U+021DD .. RIGHTWARDS SQUIGGLE ARROW diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsb.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsb.txt new file mode 100644 index 0000000..05e68d9 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsb.txt @@ -0,0 +1,126 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |ac| unicode:: U+0223E .. INVERTED LAZY S +.. |acE| unicode:: U+0223E U+00333 .. INVERTED LAZY S with double underline +.. |amalg| unicode:: U+02A3F .. AMALGAMATION OR COPRODUCT +.. |barvee| unicode:: U+022BD .. NOR +.. |Barwed| unicode:: U+02306 .. PERSPECTIVE +.. |barwed| unicode:: U+02305 .. PROJECTIVE +.. |bsolb| unicode:: U+029C5 .. SQUARED FALLING DIAGONAL SLASH +.. |Cap| unicode:: U+022D2 .. DOUBLE INTERSECTION +.. |capand| unicode:: U+02A44 .. INTERSECTION WITH LOGICAL AND +.. |capbrcup| unicode:: U+02A49 .. INTERSECTION ABOVE BAR ABOVE UNION +.. |capcap| unicode:: U+02A4B .. INTERSECTION BESIDE AND JOINED WITH INTERSECTION +.. |capcup| unicode:: U+02A47 .. INTERSECTION ABOVE UNION +.. |capdot| unicode:: U+02A40 .. INTERSECTION WITH DOT +.. |caps| unicode:: U+02229 U+0FE00 .. INTERSECTION with serifs +.. |ccaps| unicode:: U+02A4D .. CLOSED INTERSECTION WITH SERIFS +.. |ccups| unicode:: U+02A4C .. CLOSED UNION WITH SERIFS +.. |ccupssm| unicode:: U+02A50 .. CLOSED UNION WITH SERIFS AND SMASH PRODUCT +.. |coprod| unicode:: U+02210 .. N-ARY COPRODUCT +.. |Cup| unicode:: U+022D3 .. DOUBLE UNION +.. |cupbrcap| unicode:: U+02A48 .. UNION ABOVE BAR ABOVE INTERSECTION +.. |cupcap| unicode:: U+02A46 .. UNION ABOVE INTERSECTION +.. |cupcup| unicode:: U+02A4A .. UNION BESIDE AND JOINED WITH UNION +.. |cupdot| unicode:: U+0228D .. MULTISET MULTIPLICATION +.. |cupor| unicode:: U+02A45 .. UNION WITH LOGICAL OR +.. |cups| unicode:: U+0222A U+0FE00 .. UNION with serifs +.. |cuvee| unicode:: U+022CE .. CURLY LOGICAL OR +.. |cuwed| unicode:: U+022CF .. CURLY LOGICAL AND +.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER +.. |dagger| unicode:: U+02020 .. DAGGER +.. |diam| unicode:: U+022C4 .. DIAMOND OPERATOR +.. |divonx| unicode:: U+022C7 .. DIVISION TIMES +.. |eplus| unicode:: U+02A71 .. EQUALS SIGN ABOVE PLUS SIGN +.. |hercon| unicode:: U+022B9 .. HERMITIAN CONJUGATE MATRIX +.. |intcal| unicode:: U+022BA .. INTERCALATE +.. |iprod| unicode:: U+02A3C .. INTERIOR PRODUCT +.. |loplus| unicode:: U+02A2D .. PLUS SIGN IN LEFT HALF CIRCLE +.. |lotimes| unicode:: U+02A34 .. MULTIPLICATION SIGN IN LEFT HALF CIRCLE +.. |lthree| unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT +.. |ltimes| unicode:: U+022C9 .. LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +.. |midast| unicode:: U+0002A .. ASTERISK +.. |minusb| unicode:: U+0229F .. SQUARED MINUS +.. |minusd| unicode:: U+02238 .. DOT MINUS +.. |minusdu| unicode:: U+02A2A .. MINUS SIGN WITH DOT BELOW +.. |ncap| unicode:: U+02A43 .. INTERSECTION WITH OVERBAR +.. |ncup| unicode:: U+02A42 .. UNION WITH OVERBAR +.. |oast| unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR +.. |ocir| unicode:: U+0229A .. CIRCLED RING OPERATOR +.. |odash| unicode:: U+0229D .. CIRCLED DASH +.. |odiv| unicode:: U+02A38 .. CIRCLED DIVISION SIGN +.. |odot| unicode:: U+02299 .. CIRCLED DOT OPERATOR +.. |odsold| unicode:: U+029BC .. CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +.. |ofcir| unicode:: U+029BF .. CIRCLED BULLET +.. |ogt| unicode:: U+029C1 .. CIRCLED GREATER-THAN +.. |ohbar| unicode:: U+029B5 .. CIRCLE WITH HORIZONTAL BAR +.. |olcir| unicode:: U+029BE .. CIRCLED WHITE BULLET +.. |olt| unicode:: U+029C0 .. CIRCLED LESS-THAN +.. |omid| unicode:: U+029B6 .. CIRCLED VERTICAL BAR +.. |ominus| unicode:: U+02296 .. CIRCLED MINUS +.. |opar| unicode:: U+029B7 .. CIRCLED PARALLEL +.. |operp| unicode:: U+029B9 .. CIRCLED PERPENDICULAR +.. |oplus| unicode:: U+02295 .. CIRCLED PLUS +.. |osol| unicode:: U+02298 .. CIRCLED DIVISION SLASH +.. |Otimes| unicode:: U+02A37 .. MULTIPLICATION SIGN IN DOUBLE CIRCLE +.. |otimes| unicode:: U+02297 .. CIRCLED TIMES +.. |otimesas| unicode:: U+02A36 .. CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +.. |ovbar| unicode:: U+0233D .. APL FUNCTIONAL SYMBOL CIRCLE STILE +.. |plusacir| unicode:: U+02A23 .. PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +.. |plusb| unicode:: U+0229E .. SQUARED PLUS +.. |pluscir| unicode:: U+02A22 .. PLUS SIGN WITH SMALL CIRCLE ABOVE +.. |plusdo| unicode:: U+02214 .. DOT PLUS +.. |plusdu| unicode:: U+02A25 .. PLUS SIGN WITH DOT BELOW +.. |pluse| unicode:: U+02A72 .. PLUS SIGN ABOVE EQUALS SIGN +.. |plussim| unicode:: U+02A26 .. PLUS SIGN WITH TILDE BELOW +.. |plustwo| unicode:: U+02A27 .. PLUS SIGN WITH SUBSCRIPT TWO +.. |prod| unicode:: U+0220F .. N-ARY PRODUCT +.. |race| unicode:: U+029DA .. LEFT DOUBLE WIGGLY FENCE +.. |roplus| unicode:: U+02A2E .. PLUS SIGN IN RIGHT HALF CIRCLE +.. |rotimes| unicode:: U+02A35 .. MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +.. |rthree| unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT +.. |rtimes| unicode:: U+022CA .. RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +.. |sdot| unicode:: U+022C5 .. DOT OPERATOR +.. |sdotb| unicode:: U+022A1 .. SQUARED DOT OPERATOR +.. |setmn| unicode:: U+02216 .. SET MINUS +.. |simplus| unicode:: U+02A24 .. PLUS SIGN WITH TILDE ABOVE +.. |smashp| unicode:: U+02A33 .. SMASH PRODUCT +.. |solb| unicode:: U+029C4 .. SQUARED RISING DIAGONAL SLASH +.. |sqcap| unicode:: U+02293 .. SQUARE CAP +.. |sqcaps| unicode:: U+02293 U+0FE00 .. SQUARE CAP with serifs +.. |sqcup| unicode:: U+02294 .. SQUARE CUP +.. |sqcups| unicode:: U+02294 U+0FE00 .. SQUARE CUP with serifs +.. |ssetmn| unicode:: U+02216 .. SET MINUS +.. |sstarf| unicode:: U+022C6 .. STAR OPERATOR +.. |subdot| unicode:: U+02ABD .. SUBSET WITH DOT +.. |sum| unicode:: U+02211 .. N-ARY SUMMATION +.. |supdot| unicode:: U+02ABE .. SUPERSET WITH DOT +.. |timesb| unicode:: U+022A0 .. SQUARED TIMES +.. |timesbar| unicode:: U+02A31 .. MULTIPLICATION SIGN WITH UNDERBAR +.. |timesd| unicode:: U+02A30 .. MULTIPLICATION SIGN WITH DOT ABOVE +.. |top| unicode:: U+022A4 .. DOWN TACK +.. |tridot| unicode:: U+025EC .. WHITE UP-POINTING TRIANGLE WITH DOT +.. |triminus| unicode:: U+02A3A .. MINUS SIGN IN TRIANGLE +.. |triplus| unicode:: U+02A39 .. PLUS SIGN IN TRIANGLE +.. |trisb| unicode:: U+029CD .. TRIANGLE WITH SERIFS AT BOTTOM +.. |tritime| unicode:: U+02A3B .. MULTIPLICATION SIGN IN TRIANGLE +.. |uplus| unicode:: U+0228E .. MULTISET UNION +.. |veebar| unicode:: U+022BB .. XOR +.. |wedbar| unicode:: U+02A5F .. LOGICAL AND WITH UNDERBAR +.. |wreath| unicode:: U+02240 .. WREATH PRODUCT +.. |xcap| unicode:: U+022C2 .. N-ARY INTERSECTION +.. |xcirc| unicode:: U+025EF .. LARGE CIRCLE +.. |xcup| unicode:: U+022C3 .. N-ARY UNION +.. |xdtri| unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE +.. |xodot| unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR +.. |xoplus| unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR +.. |xotime| unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR +.. |xsqcup| unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR +.. |xuplus| unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS +.. |xutri| unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE +.. |xvee| unicode:: U+022C1 .. N-ARY LOGICAL OR +.. |xwedge| unicode:: U+022C0 .. N-ARY LOGICAL AND diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsc.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsc.txt new file mode 100644 index 0000000..343504d --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsc.txt @@ -0,0 +1,29 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |dlcorn| unicode:: U+0231E .. BOTTOM LEFT CORNER +.. |drcorn| unicode:: U+0231F .. BOTTOM RIGHT CORNER +.. |gtlPar| unicode:: U+02995 .. DOUBLE LEFT ARC GREATER-THAN BRACKET +.. |langd| unicode:: U+02991 .. LEFT ANGLE BRACKET WITH DOT +.. |lbrke| unicode:: U+0298B .. LEFT SQUARE BRACKET WITH UNDERBAR +.. |lbrksld| unicode:: U+0298F .. LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +.. |lbrkslu| unicode:: U+0298D .. LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +.. |lceil| unicode:: U+02308 .. LEFT CEILING +.. |lfloor| unicode:: U+0230A .. LEFT FLOOR +.. |lmoust| unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +.. |lpargt| unicode:: U+029A0 .. SPHERICAL ANGLE OPENING LEFT +.. |lparlt| unicode:: U+02993 .. LEFT ARC LESS-THAN BRACKET +.. |ltrPar| unicode:: U+02996 .. DOUBLE RIGHT ARC LESS-THAN BRACKET +.. |rangd| unicode:: U+02992 .. RIGHT ANGLE BRACKET WITH DOT +.. |rbrke| unicode:: U+0298C .. RIGHT SQUARE BRACKET WITH UNDERBAR +.. |rbrksld| unicode:: U+0298E .. RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +.. |rbrkslu| unicode:: U+02990 .. RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +.. |rceil| unicode:: U+02309 .. RIGHT CEILING +.. |rfloor| unicode:: U+0230B .. RIGHT FLOOR +.. |rmoust| unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +.. |rpargt| unicode:: U+02994 .. RIGHT ARC GREATER-THAN BRACKET +.. |ulcorn| unicode:: U+0231C .. TOP LEFT CORNER +.. |urcorn| unicode:: U+0231D .. TOP RIGHT CORNER diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsn.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsn.txt new file mode 100644 index 0000000..5ff1729 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsn.txt @@ -0,0 +1,96 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |gnap| unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE +.. |gnE| unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO +.. |gne| unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +.. |gnsim| unicode:: U+022E7 .. GREATER-THAN BUT NOT EQUIVALENT TO +.. |gvnE| unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke +.. |lnap| unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE +.. |lnE| unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO +.. |lne| unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO +.. |lnsim| unicode:: U+022E6 .. LESS-THAN BUT NOT EQUIVALENT TO +.. |lvnE| unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke +.. |nap| unicode:: U+02249 .. NOT ALMOST EQUAL TO +.. |napE| unicode:: U+02A70 U+00338 .. APPROXIMATELY EQUAL OR EQUAL TO with slash +.. |napid| unicode:: U+0224B U+00338 .. TRIPLE TILDE with slash +.. |ncong| unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +.. |ncongdot| unicode:: U+02A6D U+00338 .. CONGRUENT WITH DOT ABOVE with slash +.. |nequiv| unicode:: U+02262 .. NOT IDENTICAL TO +.. |ngE| unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash +.. |nge| unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO +.. |nges| unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash +.. |nGg| unicode:: U+022D9 U+00338 .. VERY MUCH GREATER-THAN with slash +.. |ngsim| unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO +.. |nGt| unicode:: U+0226B U+020D2 .. MUCH GREATER THAN with vertical line +.. |ngt| unicode:: U+0226F .. NOT GREATER-THAN +.. |nGtv| unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash +.. |nlE| unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash +.. |nle| unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO +.. |nles| unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash +.. |nLl| unicode:: U+022D8 U+00338 .. VERY MUCH LESS-THAN with slash +.. |nlsim| unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO +.. |nLt| unicode:: U+0226A U+020D2 .. MUCH LESS THAN with vertical line +.. |nlt| unicode:: U+0226E .. NOT LESS-THAN +.. |nltri| unicode:: U+022EA .. NOT NORMAL SUBGROUP OF +.. |nltrie| unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO +.. |nLtv| unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash +.. |nmid| unicode:: U+02224 .. DOES NOT DIVIDE +.. |npar| unicode:: U+02226 .. NOT PARALLEL TO +.. |npr| unicode:: U+02280 .. DOES NOT PRECEDE +.. |nprcue| unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL +.. |npre| unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash +.. |nrtri| unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP +.. |nrtrie| unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +.. |nsc| unicode:: U+02281 .. DOES NOT SUCCEED +.. |nsccue| unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL +.. |nsce| unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash +.. |nsim| unicode:: U+02241 .. NOT TILDE +.. |nsime| unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO +.. |nsmid| unicode:: U+02224 .. DOES NOT DIVIDE +.. |nspar| unicode:: U+02226 .. NOT PARALLEL TO +.. |nsqsube| unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO +.. |nsqsupe| unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO +.. |nsub| unicode:: U+02284 .. NOT A SUBSET OF +.. |nsubE| unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash +.. |nsube| unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO +.. |nsup| unicode:: U+02285 .. NOT A SUPERSET OF +.. |nsupE| unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash +.. |nsupe| unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO +.. |ntgl| unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN +.. |ntlg| unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN +.. |nvap| unicode:: U+0224D U+020D2 .. EQUIVALENT TO with vertical line +.. |nVDash| unicode:: U+022AF .. NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +.. |nVdash| unicode:: U+022AE .. DOES NOT FORCE +.. |nvDash| unicode:: U+022AD .. NOT TRUE +.. |nvdash| unicode:: U+022AC .. DOES NOT PROVE +.. |nvge| unicode:: U+02265 U+020D2 .. GREATER-THAN OR EQUAL TO with vertical line +.. |nvgt| unicode:: U+0003E U+020D2 .. GREATER-THAN SIGN with vertical line +.. |nvle| unicode:: U+02264 U+020D2 .. LESS-THAN OR EQUAL TO with vertical line +.. |nvlt| unicode:: U+0003C U+020D2 .. LESS-THAN SIGN with vertical line +.. |nvltrie| unicode:: U+022B4 U+020D2 .. NORMAL SUBGROUP OF OR EQUAL TO with vertical line +.. |nvrtrie| unicode:: U+022B5 U+020D2 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO with vertical line +.. |nvsim| unicode:: U+0223C U+020D2 .. TILDE OPERATOR with vertical line +.. |parsim| unicode:: U+02AF3 .. PARALLEL WITH TILDE OPERATOR +.. |prnap| unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO +.. |prnE| unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO +.. |prnsim| unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO +.. |rnmid| unicode:: U+02AEE .. DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +.. |scnap| unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO +.. |scnE| unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO +.. |scnsim| unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO +.. |simne| unicode:: U+02246 .. APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +.. |solbar| unicode:: U+0233F .. APL FUNCTIONAL SYMBOL SLASH BAR +.. |subnE| unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO +.. |subne| unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO +.. |supnE| unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO +.. |supne| unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO +.. |vnsub| unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line +.. |vnsup| unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line +.. |vsubnE| unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members +.. |vsubne| unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members +.. |vsupnE| unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members +.. |vsupne| unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamso.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamso.txt new file mode 100644 index 0000000..65cc17e --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamso.txt @@ -0,0 +1,62 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |ang| unicode:: U+02220 .. ANGLE +.. |ange| unicode:: U+029A4 .. ANGLE WITH UNDERBAR +.. |angmsd| unicode:: U+02221 .. MEASURED ANGLE +.. |angmsdaa| unicode:: U+029A8 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +.. |angmsdab| unicode:: U+029A9 .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +.. |angmsdac| unicode:: U+029AA .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +.. |angmsdad| unicode:: U+029AB .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +.. |angmsdae| unicode:: U+029AC .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +.. |angmsdaf| unicode:: U+029AD .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +.. |angmsdag| unicode:: U+029AE .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +.. |angmsdah| unicode:: U+029AF .. MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +.. |angrtvb| unicode:: U+022BE .. RIGHT ANGLE WITH ARC +.. |angrtvbd| unicode:: U+0299D .. MEASURED RIGHT ANGLE WITH DOT +.. |bbrk| unicode:: U+023B5 .. BOTTOM SQUARE BRACKET +.. |bbrktbrk| unicode:: U+023B6 .. BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +.. |bemptyv| unicode:: U+029B0 .. REVERSED EMPTY SET +.. |beth| unicode:: U+02136 .. BET SYMBOL +.. |boxbox| unicode:: U+029C9 .. TWO JOINED SQUARES +.. |bprime| unicode:: U+02035 .. REVERSED PRIME +.. |bsemi| unicode:: U+0204F .. REVERSED SEMICOLON +.. |cemptyv| unicode:: U+029B2 .. EMPTY SET WITH SMALL CIRCLE ABOVE +.. |cirE| unicode:: U+029C3 .. CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +.. |cirscir| unicode:: U+029C2 .. CIRCLE WITH SMALL CIRCLE TO THE RIGHT +.. |comp| unicode:: U+02201 .. COMPLEMENT +.. |daleth| unicode:: U+02138 .. DALET SYMBOL +.. |demptyv| unicode:: U+029B1 .. EMPTY SET WITH OVERBAR +.. |ell| unicode:: U+02113 .. SCRIPT SMALL L +.. |empty| unicode:: U+02205 .. EMPTY SET +.. |emptyv| unicode:: U+02205 .. EMPTY SET +.. |gimel| unicode:: U+02137 .. GIMEL SYMBOL +.. |iiota| unicode:: U+02129 .. TURNED GREEK SMALL LETTER IOTA +.. |image| unicode:: U+02111 .. BLACK-LETTER CAPITAL I +.. |imath| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I +.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I +.. |jmath| unicode:: U+0006A .. LATIN SMALL LETTER J +.. |jnodot| unicode:: U+0006A .. LATIN SMALL LETTER J +.. |laemptyv| unicode:: U+029B4 .. EMPTY SET WITH LEFT ARROW ABOVE +.. |lltri| unicode:: U+025FA .. LOWER LEFT TRIANGLE +.. |lrtri| unicode:: U+022BF .. RIGHT TRIANGLE +.. |mho| unicode:: U+02127 .. INVERTED OHM SIGN +.. |nang| unicode:: U+02220 U+020D2 .. ANGLE with vertical line +.. |nexist| unicode:: U+02204 .. THERE DOES NOT EXIST +.. |oS| unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S +.. |planck| unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI +.. |plankv| unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI +.. |raemptyv| unicode:: U+029B3 .. EMPTY SET WITH RIGHT ARROW ABOVE +.. |range| unicode:: U+029A5 .. REVERSED ANGLE WITH UNDERBAR +.. |real| unicode:: U+0211C .. BLACK-LETTER CAPITAL R +.. |sbsol| unicode:: U+0FE68 .. SMALL REVERSE SOLIDUS +.. |tbrk| unicode:: U+023B4 .. TOP SQUARE BRACKET +.. |trpezium| unicode:: U+0FFFD .. REPLACEMENT CHARACTER +.. |ultri| unicode:: U+025F8 .. UPPER LEFT TRIANGLE +.. |urtri| unicode:: U+025F9 .. UPPER RIGHT TRIANGLE +.. |vprime| unicode:: U+02032 .. PRIME +.. |vzigzag| unicode:: U+0299A .. VERTICAL ZIGZAG LINE +.. |weierp| unicode:: U+02118 .. SCRIPT CAPITAL P diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsr.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsr.txt new file mode 100644 index 0000000..a3d03da --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsr.txt @@ -0,0 +1,191 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |apE| unicode:: U+02A70 .. APPROXIMATELY EQUAL OR EQUAL TO +.. |ape| unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO +.. |apid| unicode:: U+0224B .. TRIPLE TILDE +.. |asymp| unicode:: U+02248 .. ALMOST EQUAL TO +.. |Barv| unicode:: U+02AE7 .. SHORT DOWN TACK WITH OVERBAR +.. |bcong| unicode:: U+0224C .. ALL EQUAL TO +.. |bepsi| unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL +.. |bowtie| unicode:: U+022C8 .. BOWTIE +.. |bsim| unicode:: U+0223D .. REVERSED TILDE +.. |bsime| unicode:: U+022CD .. REVERSED TILDE EQUALS +.. |bsolhsub| unicode:: U+0005C U+02282 .. REVERSE SOLIDUS, SUBSET OF +.. |bump| unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO +.. |bumpE| unicode:: U+02AAE .. EQUALS SIGN WITH BUMPY ABOVE +.. |bumpe| unicode:: U+0224F .. DIFFERENCE BETWEEN +.. |cire| unicode:: U+02257 .. RING EQUAL TO +.. |Colon| unicode:: U+02237 .. PROPORTION +.. |Colone| unicode:: U+02A74 .. DOUBLE COLON EQUAL +.. |colone| unicode:: U+02254 .. COLON EQUALS +.. |congdot| unicode:: U+02A6D .. CONGRUENT WITH DOT ABOVE +.. |csub| unicode:: U+02ACF .. CLOSED SUBSET +.. |csube| unicode:: U+02AD1 .. CLOSED SUBSET OR EQUAL TO +.. |csup| unicode:: U+02AD0 .. CLOSED SUPERSET +.. |csupe| unicode:: U+02AD2 .. CLOSED SUPERSET OR EQUAL TO +.. |cuepr| unicode:: U+022DE .. EQUAL TO OR PRECEDES +.. |cuesc| unicode:: U+022DF .. EQUAL TO OR SUCCEEDS +.. |cupre| unicode:: U+0227C .. PRECEDES OR EQUAL TO +.. |Dashv| unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE +.. |dashv| unicode:: U+022A3 .. LEFT TACK +.. |easter| unicode:: U+02A6E .. EQUALS WITH ASTERISK +.. |ecir| unicode:: U+02256 .. RING IN EQUAL TO +.. |ecolon| unicode:: U+02255 .. EQUALS COLON +.. |eDDot| unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +.. |eDot| unicode:: U+02251 .. GEOMETRICALLY EQUAL TO +.. |efDot| unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF +.. |eg| unicode:: U+02A9A .. DOUBLE-LINE EQUAL TO OR GREATER-THAN +.. |egs| unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN +.. |egsdot| unicode:: U+02A98 .. SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +.. |el| unicode:: U+02A99 .. DOUBLE-LINE EQUAL TO OR LESS-THAN +.. |els| unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN +.. |elsdot| unicode:: U+02A97 .. SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +.. |equest| unicode:: U+0225F .. QUESTIONED EQUAL TO +.. |equivDD| unicode:: U+02A78 .. EQUIVALENT WITH FOUR DOTS ABOVE +.. |erDot| unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO +.. |esdot| unicode:: U+02250 .. APPROACHES THE LIMIT +.. |Esim| unicode:: U+02A73 .. EQUALS SIGN ABOVE TILDE OPERATOR +.. |esim| unicode:: U+02242 .. MINUS TILDE +.. |fork| unicode:: U+022D4 .. PITCHFORK +.. |forkv| unicode:: U+02AD9 .. ELEMENT OF OPENING DOWNWARDS +.. |frown| unicode:: U+02322 .. FROWN +.. |gap| unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE +.. |gE| unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO +.. |gEl| unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +.. |gel| unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN +.. |ges| unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO +.. |gescc| unicode:: U+02AA9 .. GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +.. |gesdot| unicode:: U+02A80 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +.. |gesdoto| unicode:: U+02A82 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +.. |gesdotol| unicode:: U+02A84 .. GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +.. |gesl| unicode:: U+022DB U+0FE00 .. GREATER-THAN slanted EQUAL TO OR LESS-THAN +.. |gesles| unicode:: U+02A94 .. GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +.. |Gg| unicode:: U+022D9 .. VERY MUCH GREATER-THAN +.. |gl| unicode:: U+02277 .. GREATER-THAN OR LESS-THAN +.. |gla| unicode:: U+02AA5 .. GREATER-THAN BESIDE LESS-THAN +.. |glE| unicode:: U+02A92 .. GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +.. |glj| unicode:: U+02AA4 .. GREATER-THAN OVERLAPPING LESS-THAN +.. |gsdot| unicode:: U+022D7 .. GREATER-THAN WITH DOT +.. |gsim| unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO +.. |gsime| unicode:: U+02A8E .. GREATER-THAN ABOVE SIMILAR OR EQUAL +.. |gsiml| unicode:: U+02A90 .. GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +.. |Gt| unicode:: U+0226B .. MUCH GREATER-THAN +.. |gtcc| unicode:: U+02AA7 .. GREATER-THAN CLOSED BY CURVE +.. |gtcir| unicode:: U+02A7A .. GREATER-THAN WITH CIRCLE INSIDE +.. |gtdot| unicode:: U+022D7 .. GREATER-THAN WITH DOT +.. |gtquest| unicode:: U+02A7C .. GREATER-THAN WITH QUESTION MARK ABOVE +.. |gtrarr| unicode:: U+02978 .. GREATER-THAN ABOVE RIGHTWARDS ARROW +.. |homtht| unicode:: U+0223B .. HOMOTHETIC +.. |lap| unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE +.. |lat| unicode:: U+02AAB .. LARGER THAN +.. |late| unicode:: U+02AAD .. LARGER THAN OR EQUAL TO +.. |lates| unicode:: U+02AAD U+0FE00 .. LARGER THAN OR slanted EQUAL +.. |ldot| unicode:: U+022D6 .. LESS-THAN WITH DOT +.. |lE| unicode:: U+02266 .. LESS-THAN OVER EQUAL TO +.. |lEg| unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +.. |leg| unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN +.. |les| unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO +.. |lescc| unicode:: U+02AA8 .. LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +.. |lesdot| unicode:: U+02A7F .. LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +.. |lesdoto| unicode:: U+02A81 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +.. |lesdotor| unicode:: U+02A83 .. LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +.. |lesg| unicode:: U+022DA U+0FE00 .. LESS-THAN slanted EQUAL TO OR GREATER-THAN +.. |lesges| unicode:: U+02A93 .. LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +.. |lg| unicode:: U+02276 .. LESS-THAN OR GREATER-THAN +.. |lgE| unicode:: U+02A91 .. LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +.. |Ll| unicode:: U+022D8 .. VERY MUCH LESS-THAN +.. |lsim| unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO +.. |lsime| unicode:: U+02A8D .. LESS-THAN ABOVE SIMILAR OR EQUAL +.. |lsimg| unicode:: U+02A8F .. LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +.. |Lt| unicode:: U+0226A .. MUCH LESS-THAN +.. |ltcc| unicode:: U+02AA6 .. LESS-THAN CLOSED BY CURVE +.. |ltcir| unicode:: U+02A79 .. LESS-THAN WITH CIRCLE INSIDE +.. |ltdot| unicode:: U+022D6 .. LESS-THAN WITH DOT +.. |ltlarr| unicode:: U+02976 .. LESS-THAN ABOVE LEFTWARDS ARROW +.. |ltquest| unicode:: U+02A7B .. LESS-THAN WITH QUESTION MARK ABOVE +.. |ltrie| unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO +.. |mcomma| unicode:: U+02A29 .. MINUS SIGN WITH COMMA ABOVE +.. |mDDot| unicode:: U+0223A .. GEOMETRIC PROPORTION +.. |mid| unicode:: U+02223 .. DIVIDES +.. |mlcp| unicode:: U+02ADB .. TRANSVERSAL INTERSECTION +.. |models| unicode:: U+022A7 .. MODELS +.. |mstpos| unicode:: U+0223E .. INVERTED LAZY S +.. |Pr| unicode:: U+02ABB .. DOUBLE PRECEDES +.. |pr| unicode:: U+0227A .. PRECEDES +.. |prap| unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO +.. |prcue| unicode:: U+0227C .. PRECEDES OR EQUAL TO +.. |prE| unicode:: U+02AB3 .. PRECEDES ABOVE EQUALS SIGN +.. |pre| unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +.. |prsim| unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO +.. |prurel| unicode:: U+022B0 .. PRECEDES UNDER RELATION +.. |ratio| unicode:: U+02236 .. RATIO +.. |rtrie| unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +.. |rtriltri| unicode:: U+029CE .. RIGHT TRIANGLE ABOVE LEFT TRIANGLE +.. |samalg| unicode:: U+02210 .. N-ARY COPRODUCT +.. |Sc| unicode:: U+02ABC .. DOUBLE SUCCEEDS +.. |sc| unicode:: U+0227B .. SUCCEEDS +.. |scap| unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO +.. |sccue| unicode:: U+0227D .. SUCCEEDS OR EQUAL TO +.. |scE| unicode:: U+02AB4 .. SUCCEEDS ABOVE EQUALS SIGN +.. |sce| unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +.. |scsim| unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO +.. |sdote| unicode:: U+02A66 .. EQUALS SIGN WITH DOT BELOW +.. |sfrown| unicode:: U+02322 .. FROWN +.. |simg| unicode:: U+02A9E .. SIMILAR OR GREATER-THAN +.. |simgE| unicode:: U+02AA0 .. SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +.. |siml| unicode:: U+02A9D .. SIMILAR OR LESS-THAN +.. |simlE| unicode:: U+02A9F .. SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +.. |smid| unicode:: U+02223 .. DIVIDES +.. |smile| unicode:: U+02323 .. SMILE +.. |smt| unicode:: U+02AAA .. SMALLER THAN +.. |smte| unicode:: U+02AAC .. SMALLER THAN OR EQUAL TO +.. |smtes| unicode:: U+02AAC U+0FE00 .. SMALLER THAN OR slanted EQUAL +.. |spar| unicode:: U+02225 .. PARALLEL TO +.. |sqsub| unicode:: U+0228F .. SQUARE IMAGE OF +.. |sqsube| unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO +.. |sqsup| unicode:: U+02290 .. SQUARE ORIGINAL OF +.. |sqsupe| unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO +.. |ssmile| unicode:: U+02323 .. SMILE +.. |Sub| unicode:: U+022D0 .. DOUBLE SUBSET +.. |subE| unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN +.. |subedot| unicode:: U+02AC3 .. SUBSET OF OR EQUAL TO WITH DOT ABOVE +.. |submult| unicode:: U+02AC1 .. SUBSET WITH MULTIPLICATION SIGN BELOW +.. |subplus| unicode:: U+02ABF .. SUBSET WITH PLUS SIGN BELOW +.. |subrarr| unicode:: U+02979 .. SUBSET ABOVE RIGHTWARDS ARROW +.. |subsim| unicode:: U+02AC7 .. SUBSET OF ABOVE TILDE OPERATOR +.. |subsub| unicode:: U+02AD5 .. SUBSET ABOVE SUBSET +.. |subsup| unicode:: U+02AD3 .. SUBSET ABOVE SUPERSET +.. |Sup| unicode:: U+022D1 .. DOUBLE SUPERSET +.. |supdsub| unicode:: U+02AD8 .. SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +.. |supE| unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN +.. |supedot| unicode:: U+02AC4 .. SUPERSET OF OR EQUAL TO WITH DOT ABOVE +.. |suphsol| unicode:: U+02283 U+0002F .. SUPERSET OF, SOLIDUS +.. |suphsub| unicode:: U+02AD7 .. SUPERSET BESIDE SUBSET +.. |suplarr| unicode:: U+0297B .. SUPERSET ABOVE LEFTWARDS ARROW +.. |supmult| unicode:: U+02AC2 .. SUPERSET WITH MULTIPLICATION SIGN BELOW +.. |supplus| unicode:: U+02AC0 .. SUPERSET WITH PLUS SIGN BELOW +.. |supsim| unicode:: U+02AC8 .. SUPERSET OF ABOVE TILDE OPERATOR +.. |supsub| unicode:: U+02AD4 .. SUPERSET ABOVE SUBSET +.. |supsup| unicode:: U+02AD6 .. SUPERSET ABOVE SUPERSET +.. |thkap| unicode:: U+02248 .. ALMOST EQUAL TO +.. |thksim| unicode:: U+0223C .. TILDE OPERATOR +.. |topfork| unicode:: U+02ADA .. PITCHFORK WITH TEE TOP +.. |trie| unicode:: U+0225C .. DELTA EQUAL TO +.. |twixt| unicode:: U+0226C .. BETWEEN +.. |Vbar| unicode:: U+02AEB .. DOUBLE UP TACK +.. |vBar| unicode:: U+02AE8 .. SHORT UP TACK WITH UNDERBAR +.. |vBarv| unicode:: U+02AE9 .. SHORT UP TACK ABOVE SHORT DOWN TACK +.. |VDash| unicode:: U+022AB .. DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +.. |Vdash| unicode:: U+022A9 .. FORCES +.. |vDash| unicode:: U+022A8 .. TRUE +.. |vdash| unicode:: U+022A2 .. RIGHT TACK +.. |Vdashl| unicode:: U+02AE6 .. LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +.. |veebar| unicode:: U+022BB .. XOR +.. |vltri| unicode:: U+022B2 .. NORMAL SUBGROUP OF +.. |vprop| unicode:: U+0221D .. PROPORTIONAL TO +.. |vrtri| unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP +.. |Vvdash| unicode:: U+022AA .. TRIPLE VERTICAL BAR RIGHT TURNSTILE diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isobox.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isobox.txt new file mode 100644 index 0000000..2304f87 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isobox.txt @@ -0,0 +1,46 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |boxDL| unicode:: U+02557 .. BOX DRAWINGS DOUBLE DOWN AND LEFT +.. |boxDl| unicode:: U+02556 .. BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +.. |boxdL| unicode:: U+02555 .. BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +.. |boxdl| unicode:: U+02510 .. BOX DRAWINGS LIGHT DOWN AND LEFT +.. |boxDR| unicode:: U+02554 .. BOX DRAWINGS DOUBLE DOWN AND RIGHT +.. |boxDr| unicode:: U+02553 .. BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +.. |boxdR| unicode:: U+02552 .. BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +.. |boxdr| unicode:: U+0250C .. BOX DRAWINGS LIGHT DOWN AND RIGHT +.. |boxH| unicode:: U+02550 .. BOX DRAWINGS DOUBLE HORIZONTAL +.. |boxh| unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL +.. |boxHD| unicode:: U+02566 .. BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +.. |boxHd| unicode:: U+02564 .. BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +.. |boxhD| unicode:: U+02565 .. BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +.. |boxhd| unicode:: U+0252C .. BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +.. |boxHU| unicode:: U+02569 .. BOX DRAWINGS DOUBLE UP AND HORIZONTAL +.. |boxHu| unicode:: U+02567 .. BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +.. |boxhU| unicode:: U+02568 .. BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +.. |boxhu| unicode:: U+02534 .. BOX DRAWINGS LIGHT UP AND HORIZONTAL +.. |boxUL| unicode:: U+0255D .. BOX DRAWINGS DOUBLE UP AND LEFT +.. |boxUl| unicode:: U+0255C .. BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +.. |boxuL| unicode:: U+0255B .. BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +.. |boxul| unicode:: U+02518 .. BOX DRAWINGS LIGHT UP AND LEFT +.. |boxUR| unicode:: U+0255A .. BOX DRAWINGS DOUBLE UP AND RIGHT +.. |boxUr| unicode:: U+02559 .. BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +.. |boxuR| unicode:: U+02558 .. BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +.. |boxur| unicode:: U+02514 .. BOX DRAWINGS LIGHT UP AND RIGHT +.. |boxV| unicode:: U+02551 .. BOX DRAWINGS DOUBLE VERTICAL +.. |boxv| unicode:: U+02502 .. BOX DRAWINGS LIGHT VERTICAL +.. |boxVH| unicode:: U+0256C .. BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +.. |boxVh| unicode:: U+0256B .. BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +.. |boxvH| unicode:: U+0256A .. BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +.. |boxvh| unicode:: U+0253C .. BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +.. |boxVL| unicode:: U+02563 .. BOX DRAWINGS DOUBLE VERTICAL AND LEFT +.. |boxVl| unicode:: U+02562 .. BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +.. |boxvL| unicode:: U+02561 .. BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +.. |boxvl| unicode:: U+02524 .. BOX DRAWINGS LIGHT VERTICAL AND LEFT +.. |boxVR| unicode:: U+02560 .. BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +.. |boxVr| unicode:: U+0255F .. BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +.. |boxvR| unicode:: U+0255E .. BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +.. |boxvr| unicode:: U+0251C .. BOX DRAWINGS LIGHT VERTICAL AND RIGHT diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr1.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr1.txt new file mode 100644 index 0000000..afee744 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr1.txt @@ -0,0 +1,73 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Acy| unicode:: U+00410 .. CYRILLIC CAPITAL LETTER A +.. |acy| unicode:: U+00430 .. CYRILLIC SMALL LETTER A +.. |Bcy| unicode:: U+00411 .. CYRILLIC CAPITAL LETTER BE +.. |bcy| unicode:: U+00431 .. CYRILLIC SMALL LETTER BE +.. |CHcy| unicode:: U+00427 .. CYRILLIC CAPITAL LETTER CHE +.. |chcy| unicode:: U+00447 .. CYRILLIC SMALL LETTER CHE +.. |Dcy| unicode:: U+00414 .. CYRILLIC CAPITAL LETTER DE +.. |dcy| unicode:: U+00434 .. CYRILLIC SMALL LETTER DE +.. |Ecy| unicode:: U+0042D .. CYRILLIC CAPITAL LETTER E +.. |ecy| unicode:: U+0044D .. CYRILLIC SMALL LETTER E +.. |Fcy| unicode:: U+00424 .. CYRILLIC CAPITAL LETTER EF +.. |fcy| unicode:: U+00444 .. CYRILLIC SMALL LETTER EF +.. |Gcy| unicode:: U+00413 .. CYRILLIC CAPITAL LETTER GHE +.. |gcy| unicode:: U+00433 .. CYRILLIC SMALL LETTER GHE +.. |HARDcy| unicode:: U+0042A .. CYRILLIC CAPITAL LETTER HARD SIGN +.. |hardcy| unicode:: U+0044A .. CYRILLIC SMALL LETTER HARD SIGN +.. |Icy| unicode:: U+00418 .. CYRILLIC CAPITAL LETTER I +.. |icy| unicode:: U+00438 .. CYRILLIC SMALL LETTER I +.. |IEcy| unicode:: U+00415 .. CYRILLIC CAPITAL LETTER IE +.. |iecy| unicode:: U+00435 .. CYRILLIC SMALL LETTER IE +.. |IOcy| unicode:: U+00401 .. CYRILLIC CAPITAL LETTER IO +.. |iocy| unicode:: U+00451 .. CYRILLIC SMALL LETTER IO +.. |Jcy| unicode:: U+00419 .. CYRILLIC CAPITAL LETTER SHORT I +.. |jcy| unicode:: U+00439 .. CYRILLIC SMALL LETTER SHORT I +.. |Kcy| unicode:: U+0041A .. CYRILLIC CAPITAL LETTER KA +.. |kcy| unicode:: U+0043A .. CYRILLIC SMALL LETTER KA +.. |KHcy| unicode:: U+00425 .. CYRILLIC CAPITAL LETTER HA +.. |khcy| unicode:: U+00445 .. CYRILLIC SMALL LETTER HA +.. |Lcy| unicode:: U+0041B .. CYRILLIC CAPITAL LETTER EL +.. |lcy| unicode:: U+0043B .. CYRILLIC SMALL LETTER EL +.. |Mcy| unicode:: U+0041C .. CYRILLIC CAPITAL LETTER EM +.. |mcy| unicode:: U+0043C .. CYRILLIC SMALL LETTER EM +.. |Ncy| unicode:: U+0041D .. CYRILLIC CAPITAL LETTER EN +.. |ncy| unicode:: U+0043D .. CYRILLIC SMALL LETTER EN +.. |numero| unicode:: U+02116 .. NUMERO SIGN +.. |Ocy| unicode:: U+0041E .. CYRILLIC CAPITAL LETTER O +.. |ocy| unicode:: U+0043E .. CYRILLIC SMALL LETTER O +.. |Pcy| unicode:: U+0041F .. CYRILLIC CAPITAL LETTER PE +.. |pcy| unicode:: U+0043F .. CYRILLIC SMALL LETTER PE +.. |Rcy| unicode:: U+00420 .. CYRILLIC CAPITAL LETTER ER +.. |rcy| unicode:: U+00440 .. CYRILLIC SMALL LETTER ER +.. |Scy| unicode:: U+00421 .. CYRILLIC CAPITAL LETTER ES +.. |scy| unicode:: U+00441 .. CYRILLIC SMALL LETTER ES +.. |SHCHcy| unicode:: U+00429 .. CYRILLIC CAPITAL LETTER SHCHA +.. |shchcy| unicode:: U+00449 .. CYRILLIC SMALL LETTER SHCHA +.. |SHcy| unicode:: U+00428 .. CYRILLIC CAPITAL LETTER SHA +.. |shcy| unicode:: U+00448 .. CYRILLIC SMALL LETTER SHA +.. |SOFTcy| unicode:: U+0042C .. CYRILLIC CAPITAL LETTER SOFT SIGN +.. |softcy| unicode:: U+0044C .. CYRILLIC SMALL LETTER SOFT SIGN +.. |Tcy| unicode:: U+00422 .. CYRILLIC CAPITAL LETTER TE +.. |tcy| unicode:: U+00442 .. CYRILLIC SMALL LETTER TE +.. |TScy| unicode:: U+00426 .. CYRILLIC CAPITAL LETTER TSE +.. |tscy| unicode:: U+00446 .. CYRILLIC SMALL LETTER TSE +.. |Ucy| unicode:: U+00423 .. CYRILLIC CAPITAL LETTER U +.. |ucy| unicode:: U+00443 .. CYRILLIC SMALL LETTER U +.. |Vcy| unicode:: U+00412 .. CYRILLIC CAPITAL LETTER VE +.. |vcy| unicode:: U+00432 .. CYRILLIC SMALL LETTER VE +.. |YAcy| unicode:: U+0042F .. CYRILLIC CAPITAL LETTER YA +.. |yacy| unicode:: U+0044F .. CYRILLIC SMALL LETTER YA +.. |Ycy| unicode:: U+0042B .. CYRILLIC CAPITAL LETTER YERU +.. |ycy| unicode:: U+0044B .. CYRILLIC SMALL LETTER YERU +.. |YUcy| unicode:: U+0042E .. CYRILLIC CAPITAL LETTER YU +.. |yucy| unicode:: U+0044E .. CYRILLIC SMALL LETTER YU +.. |Zcy| unicode:: U+00417 .. CYRILLIC CAPITAL LETTER ZE +.. |zcy| unicode:: U+00437 .. CYRILLIC SMALL LETTER ZE +.. |ZHcy| unicode:: U+00416 .. CYRILLIC CAPITAL LETTER ZHE +.. |zhcy| unicode:: U+00436 .. CYRILLIC SMALL LETTER ZHE diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr2.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr2.txt new file mode 100644 index 0000000..fe09c01 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr2.txt @@ -0,0 +1,32 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |DJcy| unicode:: U+00402 .. CYRILLIC CAPITAL LETTER DJE +.. |djcy| unicode:: U+00452 .. CYRILLIC SMALL LETTER DJE +.. |DScy| unicode:: U+00405 .. CYRILLIC CAPITAL LETTER DZE +.. |dscy| unicode:: U+00455 .. CYRILLIC SMALL LETTER DZE +.. |DZcy| unicode:: U+0040F .. CYRILLIC CAPITAL LETTER DZHE +.. |dzcy| unicode:: U+0045F .. CYRILLIC SMALL LETTER DZHE +.. |GJcy| unicode:: U+00403 .. CYRILLIC CAPITAL LETTER GJE +.. |gjcy| unicode:: U+00453 .. CYRILLIC SMALL LETTER GJE +.. |Iukcy| unicode:: U+00406 .. CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +.. |iukcy| unicode:: U+00456 .. CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +.. |Jsercy| unicode:: U+00408 .. CYRILLIC CAPITAL LETTER JE +.. |jsercy| unicode:: U+00458 .. CYRILLIC SMALL LETTER JE +.. |Jukcy| unicode:: U+00404 .. CYRILLIC CAPITAL LETTER UKRAINIAN IE +.. |jukcy| unicode:: U+00454 .. CYRILLIC SMALL LETTER UKRAINIAN IE +.. |KJcy| unicode:: U+0040C .. CYRILLIC CAPITAL LETTER KJE +.. |kjcy| unicode:: U+0045C .. CYRILLIC SMALL LETTER KJE +.. |LJcy| unicode:: U+00409 .. CYRILLIC CAPITAL LETTER LJE +.. |ljcy| unicode:: U+00459 .. CYRILLIC SMALL LETTER LJE +.. |NJcy| unicode:: U+0040A .. CYRILLIC CAPITAL LETTER NJE +.. |njcy| unicode:: U+0045A .. CYRILLIC SMALL LETTER NJE +.. |TSHcy| unicode:: U+0040B .. CYRILLIC CAPITAL LETTER TSHE +.. |tshcy| unicode:: U+0045B .. CYRILLIC SMALL LETTER TSHE +.. |Ubrcy| unicode:: U+0040E .. CYRILLIC CAPITAL LETTER SHORT U +.. |ubrcy| unicode:: U+0045E .. CYRILLIC SMALL LETTER SHORT U +.. |YIcy| unicode:: U+00407 .. CYRILLIC CAPITAL LETTER YI +.. |yicy| unicode:: U+00457 .. CYRILLIC SMALL LETTER YI diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isodia.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isodia.txt new file mode 100644 index 0000000..ede6d99 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isodia.txt @@ -0,0 +1,20 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |acute| unicode:: U+000B4 .. ACUTE ACCENT +.. |breve| unicode:: U+002D8 .. BREVE +.. |caron| unicode:: U+002C7 .. CARON +.. |cedil| unicode:: U+000B8 .. CEDILLA +.. |circ| unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT +.. |dblac| unicode:: U+002DD .. DOUBLE ACUTE ACCENT +.. |die| unicode:: U+000A8 .. DIAERESIS +.. |dot| unicode:: U+002D9 .. DOT ABOVE +.. |grave| unicode:: U+00060 .. GRAVE ACCENT +.. |macr| unicode:: U+000AF .. MACRON +.. |ogon| unicode:: U+002DB .. OGONEK +.. |ring| unicode:: U+002DA .. RING ABOVE +.. |tilde| unicode:: U+002DC .. SMALL TILDE +.. |uml| unicode:: U+000A8 .. DIAERESIS diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk1.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk1.txt new file mode 100644 index 0000000..434368a --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk1.txt @@ -0,0 +1,55 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Agr| unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA +.. |agr| unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA +.. |Bgr| unicode:: U+00392 .. GREEK CAPITAL LETTER BETA +.. |bgr| unicode:: U+003B2 .. GREEK SMALL LETTER BETA +.. |Dgr| unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA +.. |dgr| unicode:: U+003B4 .. GREEK SMALL LETTER DELTA +.. |EEgr| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA +.. |eegr| unicode:: U+003B7 .. GREEK SMALL LETTER ETA +.. |Egr| unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON +.. |egr| unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON +.. |Ggr| unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA +.. |ggr| unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA +.. |Igr| unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA +.. |igr| unicode:: U+003B9 .. GREEK SMALL LETTER IOTA +.. |Kgr| unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA +.. |kgr| unicode:: U+003BA .. GREEK SMALL LETTER KAPPA +.. |KHgr| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI +.. |khgr| unicode:: U+003C7 .. GREEK SMALL LETTER CHI +.. |Lgr| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA +.. |lgr| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA +.. |Mgr| unicode:: U+0039C .. GREEK CAPITAL LETTER MU +.. |mgr| unicode:: U+003BC .. GREEK SMALL LETTER MU +.. |Ngr| unicode:: U+0039D .. GREEK CAPITAL LETTER NU +.. |ngr| unicode:: U+003BD .. GREEK SMALL LETTER NU +.. |Ogr| unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON +.. |ogr| unicode:: U+003BF .. GREEK SMALL LETTER OMICRON +.. |OHgr| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA +.. |ohgr| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA +.. |Pgr| unicode:: U+003A0 .. GREEK CAPITAL LETTER PI +.. |pgr| unicode:: U+003C0 .. GREEK SMALL LETTER PI +.. |PHgr| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI +.. |phgr| unicode:: U+003C6 .. GREEK SMALL LETTER PHI +.. |PSgr| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI +.. |psgr| unicode:: U+003C8 .. GREEK SMALL LETTER PSI +.. |Rgr| unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO +.. |rgr| unicode:: U+003C1 .. GREEK SMALL LETTER RHO +.. |sfgr| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA +.. |Sgr| unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA +.. |sgr| unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA +.. |Tgr| unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU +.. |tgr| unicode:: U+003C4 .. GREEK SMALL LETTER TAU +.. |THgr| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA +.. |thgr| unicode:: U+003B8 .. GREEK SMALL LETTER THETA +.. |Ugr| unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON +.. |ugr| unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON +.. |Xgr| unicode:: U+0039E .. GREEK CAPITAL LETTER XI +.. |xgr| unicode:: U+003BE .. GREEK SMALL LETTER XI +.. |Zgr| unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA +.. |zgr| unicode:: U+003B6 .. GREEK SMALL LETTER ZETA diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk2.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk2.txt new file mode 100644 index 0000000..fa59f96 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk2.txt @@ -0,0 +1,26 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Aacgr| unicode:: U+00386 .. GREEK CAPITAL LETTER ALPHA WITH TONOS +.. |aacgr| unicode:: U+003AC .. GREEK SMALL LETTER ALPHA WITH TONOS +.. |Eacgr| unicode:: U+00388 .. GREEK CAPITAL LETTER EPSILON WITH TONOS +.. |eacgr| unicode:: U+003AD .. GREEK SMALL LETTER EPSILON WITH TONOS +.. |EEacgr| unicode:: U+00389 .. GREEK CAPITAL LETTER ETA WITH TONOS +.. |eeacgr| unicode:: U+003AE .. GREEK SMALL LETTER ETA WITH TONOS +.. |Iacgr| unicode:: U+0038A .. GREEK CAPITAL LETTER IOTA WITH TONOS +.. |iacgr| unicode:: U+003AF .. GREEK SMALL LETTER IOTA WITH TONOS +.. |idiagr| unicode:: U+00390 .. GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +.. |Idigr| unicode:: U+003AA .. GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +.. |idigr| unicode:: U+003CA .. GREEK SMALL LETTER IOTA WITH DIALYTIKA +.. |Oacgr| unicode:: U+0038C .. GREEK CAPITAL LETTER OMICRON WITH TONOS +.. |oacgr| unicode:: U+003CC .. GREEK SMALL LETTER OMICRON WITH TONOS +.. |OHacgr| unicode:: U+0038F .. GREEK CAPITAL LETTER OMEGA WITH TONOS +.. |ohacgr| unicode:: U+003CE .. GREEK SMALL LETTER OMEGA WITH TONOS +.. |Uacgr| unicode:: U+0038E .. GREEK CAPITAL LETTER UPSILON WITH TONOS +.. |uacgr| unicode:: U+003CD .. GREEK SMALL LETTER UPSILON WITH TONOS +.. |udiagr| unicode:: U+003B0 .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +.. |Udigr| unicode:: U+003AB .. GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +.. |udigr| unicode:: U+003CB .. GREEK SMALL LETTER UPSILON WITH DIALYTIKA diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk3.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk3.txt new file mode 100644 index 0000000..efacd98 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk3.txt @@ -0,0 +1,52 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |alpha| unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA +.. |beta| unicode:: U+003B2 .. GREEK SMALL LETTER BETA +.. |chi| unicode:: U+003C7 .. GREEK SMALL LETTER CHI +.. |Delta| unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA +.. |delta| unicode:: U+003B4 .. GREEK SMALL LETTER DELTA +.. |epsi| unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL +.. |epsis| unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL +.. |epsiv| unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON +.. |eta| unicode:: U+003B7 .. GREEK SMALL LETTER ETA +.. |Gamma| unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA +.. |gamma| unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA +.. |Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA +.. |gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA +.. |iota| unicode:: U+003B9 .. GREEK SMALL LETTER IOTA +.. |kappa| unicode:: U+003BA .. GREEK SMALL LETTER KAPPA +.. |kappav| unicode:: U+003F0 .. GREEK KAPPA SYMBOL +.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA +.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA +.. |mu| unicode:: U+003BC .. GREEK SMALL LETTER MU +.. |nu| unicode:: U+003BD .. GREEK SMALL LETTER NU +.. |Omega| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA +.. |omega| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA +.. |Phi| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI +.. |phi| unicode:: U+003D5 .. GREEK PHI SYMBOL +.. |phis| unicode:: U+003D5 .. GREEK PHI SYMBOL +.. |phiv| unicode:: U+003C6 .. GREEK SMALL LETTER PHI +.. |Pi| unicode:: U+003A0 .. GREEK CAPITAL LETTER PI +.. |pi| unicode:: U+003C0 .. GREEK SMALL LETTER PI +.. |piv| unicode:: U+003D6 .. GREEK PI SYMBOL +.. |Psi| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI +.. |psi| unicode:: U+003C8 .. GREEK SMALL LETTER PSI +.. |rho| unicode:: U+003C1 .. GREEK SMALL LETTER RHO +.. |rhov| unicode:: U+003F1 .. GREEK RHO SYMBOL +.. |Sigma| unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA +.. |sigma| unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA +.. |sigmav| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA +.. |tau| unicode:: U+003C4 .. GREEK SMALL LETTER TAU +.. |Theta| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA +.. |theta| unicode:: U+003B8 .. GREEK SMALL LETTER THETA +.. |thetas| unicode:: U+003B8 .. GREEK SMALL LETTER THETA +.. |thetav| unicode:: U+003D1 .. GREEK THETA SYMBOL +.. |Upsi| unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL +.. |upsi| unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON +.. |Xi| unicode:: U+0039E .. GREEK CAPITAL LETTER XI +.. |xi| unicode:: U+003BE .. GREEK SMALL LETTER XI +.. |zeta| unicode:: U+003B6 .. GREEK SMALL LETTER ZETA diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt new file mode 100644 index 0000000..39a6307 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt @@ -0,0 +1,49 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |b.alpha| unicode:: U+1D6C2 .. MATHEMATICAL BOLD SMALL ALPHA +.. |b.beta| unicode:: U+1D6C3 .. MATHEMATICAL BOLD SMALL BETA +.. |b.chi| unicode:: U+1D6D8 .. MATHEMATICAL BOLD SMALL CHI +.. |b.Delta| unicode:: U+1D6AB .. MATHEMATICAL BOLD CAPITAL DELTA +.. |b.delta| unicode:: U+1D6C5 .. MATHEMATICAL BOLD SMALL DELTA +.. |b.epsi| unicode:: U+1D6C6 .. MATHEMATICAL BOLD SMALL EPSILON +.. |b.epsiv| unicode:: U+1D6DC .. MATHEMATICAL BOLD EPSILON SYMBOL +.. |b.eta| unicode:: U+1D6C8 .. MATHEMATICAL BOLD SMALL ETA +.. |b.Gamma| unicode:: U+1D6AA .. MATHEMATICAL BOLD CAPITAL GAMMA +.. |b.gamma| unicode:: U+1D6C4 .. MATHEMATICAL BOLD SMALL GAMMA +.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA +.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA +.. |b.iota| unicode:: U+1D6CA .. MATHEMATICAL BOLD SMALL IOTA +.. |b.kappa| unicode:: U+1D6CB .. MATHEMATICAL BOLD SMALL KAPPA +.. |b.kappav| unicode:: U+1D6DE .. MATHEMATICAL BOLD KAPPA SYMBOL +.. |b.Lambda| unicode:: U+1D6B2 .. MATHEMATICAL BOLD CAPITAL LAMDA +.. |b.lambda| unicode:: U+1D6CC .. MATHEMATICAL BOLD SMALL LAMDA +.. |b.mu| unicode:: U+1D6CD .. MATHEMATICAL BOLD SMALL MU +.. |b.nu| unicode:: U+1D6CE .. MATHEMATICAL BOLD SMALL NU +.. |b.Omega| unicode:: U+1D6C0 .. MATHEMATICAL BOLD CAPITAL OMEGA +.. |b.omega| unicode:: U+1D6DA .. MATHEMATICAL BOLD SMALL OMEGA +.. |b.Phi| unicode:: U+1D6BD .. MATHEMATICAL BOLD CAPITAL PHI +.. |b.phi| unicode:: U+1D6D7 .. MATHEMATICAL BOLD SMALL PHI +.. |b.phiv| unicode:: U+1D6DF .. MATHEMATICAL BOLD PHI SYMBOL +.. |b.Pi| unicode:: U+1D6B7 .. MATHEMATICAL BOLD CAPITAL PI +.. |b.pi| unicode:: U+1D6D1 .. MATHEMATICAL BOLD SMALL PI +.. |b.piv| unicode:: U+1D6E1 .. MATHEMATICAL BOLD PI SYMBOL +.. |b.Psi| unicode:: U+1D6BF .. MATHEMATICAL BOLD CAPITAL PSI +.. |b.psi| unicode:: U+1D6D9 .. MATHEMATICAL BOLD SMALL PSI +.. |b.rho| unicode:: U+1D6D2 .. MATHEMATICAL BOLD SMALL RHO +.. |b.rhov| unicode:: U+1D6E0 .. MATHEMATICAL BOLD RHO SYMBOL +.. |b.Sigma| unicode:: U+1D6BA .. MATHEMATICAL BOLD CAPITAL SIGMA +.. |b.sigma| unicode:: U+1D6D4 .. MATHEMATICAL BOLD SMALL SIGMA +.. |b.sigmav| unicode:: U+1D6D3 .. MATHEMATICAL BOLD SMALL FINAL SIGMA +.. |b.tau| unicode:: U+1D6D5 .. MATHEMATICAL BOLD SMALL TAU +.. |b.Theta| unicode:: U+1D6AF .. MATHEMATICAL BOLD CAPITAL THETA +.. |b.thetas| unicode:: U+1D6C9 .. MATHEMATICAL BOLD SMALL THETA +.. |b.thetav| unicode:: U+1D6DD .. MATHEMATICAL BOLD THETA SYMBOL +.. |b.Upsi| unicode:: U+1D6BC .. MATHEMATICAL BOLD CAPITAL UPSILON +.. |b.upsi| unicode:: U+1D6D6 .. MATHEMATICAL BOLD SMALL UPSILON +.. |b.Xi| unicode:: U+1D6B5 .. MATHEMATICAL BOLD CAPITAL XI +.. |b.xi| unicode:: U+1D6CF .. MATHEMATICAL BOLD SMALL XI +.. |b.zeta| unicode:: U+1D6C7 .. MATHEMATICAL BOLD SMALL ZETA diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4.txt new file mode 100644 index 0000000..5b9f410 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4.txt @@ -0,0 +1,8 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |b.Gammad| unicode:: U+003DC .. GREEK LETTER DIGAMMA +.. |b.gammad| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isolat1.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isolat1.txt new file mode 100644 index 0000000..3e9ad9d --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isolat1.txt @@ -0,0 +1,68 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE +.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE +.. |Acirc| unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX +.. |acirc| unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX +.. |AElig| unicode:: U+000C6 .. LATIN CAPITAL LETTER AE +.. |aelig| unicode:: U+000E6 .. LATIN SMALL LETTER AE +.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE +.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE +.. |Aring| unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE +.. |aring| unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE +.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE +.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE +.. |Auml| unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS +.. |auml| unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS +.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA +.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA +.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE +.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE +.. |Ecirc| unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX +.. |ecirc| unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX +.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE +.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE +.. |ETH| unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH +.. |eth| unicode:: U+000F0 .. LATIN SMALL LETTER ETH +.. |Euml| unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS +.. |euml| unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS +.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE +.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE +.. |Icirc| unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX +.. |icirc| unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX +.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE +.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE +.. |Iuml| unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS +.. |iuml| unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS +.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE +.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE +.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE +.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE +.. |Ocirc| unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX +.. |ocirc| unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX +.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE +.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE +.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE +.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE +.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE +.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE +.. |Ouml| unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS +.. |ouml| unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS +.. |szlig| unicode:: U+000DF .. LATIN SMALL LETTER SHARP S +.. |THORN| unicode:: U+000DE .. LATIN CAPITAL LETTER THORN +.. |thorn| unicode:: U+000FE .. LATIN SMALL LETTER THORN +.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE +.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE +.. |Ucirc| unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX +.. |ucirc| unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX +.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE +.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE +.. |Uuml| unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS +.. |uuml| unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS +.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE +.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE +.. |yuml| unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isolat2.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isolat2.txt new file mode 100644 index 0000000..20de845 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isolat2.txt @@ -0,0 +1,128 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Abreve| unicode:: U+00102 .. LATIN CAPITAL LETTER A WITH BREVE +.. |abreve| unicode:: U+00103 .. LATIN SMALL LETTER A WITH BREVE +.. |Amacr| unicode:: U+00100 .. LATIN CAPITAL LETTER A WITH MACRON +.. |amacr| unicode:: U+00101 .. LATIN SMALL LETTER A WITH MACRON +.. |Aogon| unicode:: U+00104 .. LATIN CAPITAL LETTER A WITH OGONEK +.. |aogon| unicode:: U+00105 .. LATIN SMALL LETTER A WITH OGONEK +.. |Cacute| unicode:: U+00106 .. LATIN CAPITAL LETTER C WITH ACUTE +.. |cacute| unicode:: U+00107 .. LATIN SMALL LETTER C WITH ACUTE +.. |Ccaron| unicode:: U+0010C .. LATIN CAPITAL LETTER C WITH CARON +.. |ccaron| unicode:: U+0010D .. LATIN SMALL LETTER C WITH CARON +.. |Ccirc| unicode:: U+00108 .. LATIN CAPITAL LETTER C WITH CIRCUMFLEX +.. |ccirc| unicode:: U+00109 .. LATIN SMALL LETTER C WITH CIRCUMFLEX +.. |Cdot| unicode:: U+0010A .. LATIN CAPITAL LETTER C WITH DOT ABOVE +.. |cdot| unicode:: U+0010B .. LATIN SMALL LETTER C WITH DOT ABOVE +.. |Dcaron| unicode:: U+0010E .. LATIN CAPITAL LETTER D WITH CARON +.. |dcaron| unicode:: U+0010F .. LATIN SMALL LETTER D WITH CARON +.. |Dstrok| unicode:: U+00110 .. LATIN CAPITAL LETTER D WITH STROKE +.. |dstrok| unicode:: U+00111 .. LATIN SMALL LETTER D WITH STROKE +.. |Ecaron| unicode:: U+0011A .. LATIN CAPITAL LETTER E WITH CARON +.. |ecaron| unicode:: U+0011B .. LATIN SMALL LETTER E WITH CARON +.. |Edot| unicode:: U+00116 .. LATIN CAPITAL LETTER E WITH DOT ABOVE +.. |edot| unicode:: U+00117 .. LATIN SMALL LETTER E WITH DOT ABOVE +.. |Emacr| unicode:: U+00112 .. LATIN CAPITAL LETTER E WITH MACRON +.. |emacr| unicode:: U+00113 .. LATIN SMALL LETTER E WITH MACRON +.. |ENG| unicode:: U+0014A .. LATIN CAPITAL LETTER ENG +.. |eng| unicode:: U+0014B .. LATIN SMALL LETTER ENG +.. |Eogon| unicode:: U+00118 .. LATIN CAPITAL LETTER E WITH OGONEK +.. |eogon| unicode:: U+00119 .. LATIN SMALL LETTER E WITH OGONEK +.. |gacute| unicode:: U+001F5 .. LATIN SMALL LETTER G WITH ACUTE +.. |Gbreve| unicode:: U+0011E .. LATIN CAPITAL LETTER G WITH BREVE +.. |gbreve| unicode:: U+0011F .. LATIN SMALL LETTER G WITH BREVE +.. |Gcedil| unicode:: U+00122 .. LATIN CAPITAL LETTER G WITH CEDILLA +.. |gcedil| unicode:: U+00123 .. LATIN SMALL LETTER G WITH CEDILLA +.. |Gcirc| unicode:: U+0011C .. LATIN CAPITAL LETTER G WITH CIRCUMFLEX +.. |gcirc| unicode:: U+0011D .. LATIN SMALL LETTER G WITH CIRCUMFLEX +.. |Gdot| unicode:: U+00120 .. LATIN CAPITAL LETTER G WITH DOT ABOVE +.. |gdot| unicode:: U+00121 .. LATIN SMALL LETTER G WITH DOT ABOVE +.. |Hcirc| unicode:: U+00124 .. LATIN CAPITAL LETTER H WITH CIRCUMFLEX +.. |hcirc| unicode:: U+00125 .. LATIN SMALL LETTER H WITH CIRCUMFLEX +.. |Hstrok| unicode:: U+00126 .. LATIN CAPITAL LETTER H WITH STROKE +.. |hstrok| unicode:: U+00127 .. LATIN SMALL LETTER H WITH STROKE +.. |Idot| unicode:: U+00130 .. LATIN CAPITAL LETTER I WITH DOT ABOVE +.. |IJlig| unicode:: U+00132 .. LATIN CAPITAL LIGATURE IJ +.. |ijlig| unicode:: U+00133 .. LATIN SMALL LIGATURE IJ +.. |Imacr| unicode:: U+0012A .. LATIN CAPITAL LETTER I WITH MACRON +.. |imacr| unicode:: U+0012B .. LATIN SMALL LETTER I WITH MACRON +.. |inodot| unicode:: U+00131 .. LATIN SMALL LETTER DOTLESS I +.. |Iogon| unicode:: U+0012E .. LATIN CAPITAL LETTER I WITH OGONEK +.. |iogon| unicode:: U+0012F .. LATIN SMALL LETTER I WITH OGONEK +.. |Itilde| unicode:: U+00128 .. LATIN CAPITAL LETTER I WITH TILDE +.. |itilde| unicode:: U+00129 .. LATIN SMALL LETTER I WITH TILDE +.. |Jcirc| unicode:: U+00134 .. LATIN CAPITAL LETTER J WITH CIRCUMFLEX +.. |jcirc| unicode:: U+00135 .. LATIN SMALL LETTER J WITH CIRCUMFLEX +.. |Kcedil| unicode:: U+00136 .. LATIN CAPITAL LETTER K WITH CEDILLA +.. |kcedil| unicode:: U+00137 .. LATIN SMALL LETTER K WITH CEDILLA +.. |kgreen| unicode:: U+00138 .. LATIN SMALL LETTER KRA +.. |Lacute| unicode:: U+00139 .. LATIN CAPITAL LETTER L WITH ACUTE +.. |lacute| unicode:: U+0013A .. LATIN SMALL LETTER L WITH ACUTE +.. |Lcaron| unicode:: U+0013D .. LATIN CAPITAL LETTER L WITH CARON +.. |lcaron| unicode:: U+0013E .. LATIN SMALL LETTER L WITH CARON +.. |Lcedil| unicode:: U+0013B .. LATIN CAPITAL LETTER L WITH CEDILLA +.. |lcedil| unicode:: U+0013C .. LATIN SMALL LETTER L WITH CEDILLA +.. |Lmidot| unicode:: U+0013F .. LATIN CAPITAL LETTER L WITH MIDDLE DOT +.. |lmidot| unicode:: U+00140 .. LATIN SMALL LETTER L WITH MIDDLE DOT +.. |Lstrok| unicode:: U+00141 .. LATIN CAPITAL LETTER L WITH STROKE +.. |lstrok| unicode:: U+00142 .. LATIN SMALL LETTER L WITH STROKE +.. |Nacute| unicode:: U+00143 .. LATIN CAPITAL LETTER N WITH ACUTE +.. |nacute| unicode:: U+00144 .. LATIN SMALL LETTER N WITH ACUTE +.. |napos| unicode:: U+00149 .. LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +.. |Ncaron| unicode:: U+00147 .. LATIN CAPITAL LETTER N WITH CARON +.. |ncaron| unicode:: U+00148 .. LATIN SMALL LETTER N WITH CARON +.. |Ncedil| unicode:: U+00145 .. LATIN CAPITAL LETTER N WITH CEDILLA +.. |ncedil| unicode:: U+00146 .. LATIN SMALL LETTER N WITH CEDILLA +.. |Odblac| unicode:: U+00150 .. LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +.. |odblac| unicode:: U+00151 .. LATIN SMALL LETTER O WITH DOUBLE ACUTE +.. |OElig| unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE +.. |oelig| unicode:: U+00153 .. LATIN SMALL LIGATURE OE +.. |Omacr| unicode:: U+0014C .. LATIN CAPITAL LETTER O WITH MACRON +.. |omacr| unicode:: U+0014D .. LATIN SMALL LETTER O WITH MACRON +.. |Racute| unicode:: U+00154 .. LATIN CAPITAL LETTER R WITH ACUTE +.. |racute| unicode:: U+00155 .. LATIN SMALL LETTER R WITH ACUTE +.. |Rcaron| unicode:: U+00158 .. LATIN CAPITAL LETTER R WITH CARON +.. |rcaron| unicode:: U+00159 .. LATIN SMALL LETTER R WITH CARON +.. |Rcedil| unicode:: U+00156 .. LATIN CAPITAL LETTER R WITH CEDILLA +.. |rcedil| unicode:: U+00157 .. LATIN SMALL LETTER R WITH CEDILLA +.. |Sacute| unicode:: U+0015A .. LATIN CAPITAL LETTER S WITH ACUTE +.. |sacute| unicode:: U+0015B .. LATIN SMALL LETTER S WITH ACUTE +.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON +.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON +.. |Scedil| unicode:: U+0015E .. LATIN CAPITAL LETTER S WITH CEDILLA +.. |scedil| unicode:: U+0015F .. LATIN SMALL LETTER S WITH CEDILLA +.. |Scirc| unicode:: U+0015C .. LATIN CAPITAL LETTER S WITH CIRCUMFLEX +.. |scirc| unicode:: U+0015D .. LATIN SMALL LETTER S WITH CIRCUMFLEX +.. |Tcaron| unicode:: U+00164 .. LATIN CAPITAL LETTER T WITH CARON +.. |tcaron| unicode:: U+00165 .. LATIN SMALL LETTER T WITH CARON +.. |Tcedil| unicode:: U+00162 .. LATIN CAPITAL LETTER T WITH CEDILLA +.. |tcedil| unicode:: U+00163 .. LATIN SMALL LETTER T WITH CEDILLA +.. |Tstrok| unicode:: U+00166 .. LATIN CAPITAL LETTER T WITH STROKE +.. |tstrok| unicode:: U+00167 .. LATIN SMALL LETTER T WITH STROKE +.. |Ubreve| unicode:: U+0016C .. LATIN CAPITAL LETTER U WITH BREVE +.. |ubreve| unicode:: U+0016D .. LATIN SMALL LETTER U WITH BREVE +.. |Udblac| unicode:: U+00170 .. LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +.. |udblac| unicode:: U+00171 .. LATIN SMALL LETTER U WITH DOUBLE ACUTE +.. |Umacr| unicode:: U+0016A .. LATIN CAPITAL LETTER U WITH MACRON +.. |umacr| unicode:: U+0016B .. LATIN SMALL LETTER U WITH MACRON +.. |Uogon| unicode:: U+00172 .. LATIN CAPITAL LETTER U WITH OGONEK +.. |uogon| unicode:: U+00173 .. LATIN SMALL LETTER U WITH OGONEK +.. |Uring| unicode:: U+0016E .. LATIN CAPITAL LETTER U WITH RING ABOVE +.. |uring| unicode:: U+0016F .. LATIN SMALL LETTER U WITH RING ABOVE +.. |Utilde| unicode:: U+00168 .. LATIN CAPITAL LETTER U WITH TILDE +.. |utilde| unicode:: U+00169 .. LATIN SMALL LETTER U WITH TILDE +.. |Wcirc| unicode:: U+00174 .. LATIN CAPITAL LETTER W WITH CIRCUMFLEX +.. |wcirc| unicode:: U+00175 .. LATIN SMALL LETTER W WITH CIRCUMFLEX +.. |Ycirc| unicode:: U+00176 .. LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +.. |ycirc| unicode:: U+00177 .. LATIN SMALL LETTER Y WITH CIRCUMFLEX +.. |Yuml| unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS +.. |Zacute| unicode:: U+00179 .. LATIN CAPITAL LETTER Z WITH ACUTE +.. |zacute| unicode:: U+0017A .. LATIN SMALL LETTER Z WITH ACUTE +.. |Zcaron| unicode:: U+0017D .. LATIN CAPITAL LETTER Z WITH CARON +.. |zcaron| unicode:: U+0017E .. LATIN SMALL LETTER Z WITH CARON +.. |Zdot| unicode:: U+0017B .. LATIN CAPITAL LETTER Z WITH DOT ABOVE +.. |zdot| unicode:: U+0017C .. LATIN SMALL LETTER Z WITH DOT ABOVE diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt new file mode 100644 index 0000000..75bba25 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt @@ -0,0 +1,58 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Afr| unicode:: U+1D504 .. MATHEMATICAL FRAKTUR CAPITAL A +.. |afr| unicode:: U+1D51E .. MATHEMATICAL FRAKTUR SMALL A +.. |Bfr| unicode:: U+1D505 .. MATHEMATICAL FRAKTUR CAPITAL B +.. |bfr| unicode:: U+1D51F .. MATHEMATICAL FRAKTUR SMALL B +.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C +.. |cfr| unicode:: U+1D520 .. MATHEMATICAL FRAKTUR SMALL C +.. |Dfr| unicode:: U+1D507 .. MATHEMATICAL FRAKTUR CAPITAL D +.. |dfr| unicode:: U+1D521 .. MATHEMATICAL FRAKTUR SMALL D +.. |Efr| unicode:: U+1D508 .. MATHEMATICAL FRAKTUR CAPITAL E +.. |efr| unicode:: U+1D522 .. MATHEMATICAL FRAKTUR SMALL E +.. |Ffr| unicode:: U+1D509 .. MATHEMATICAL FRAKTUR CAPITAL F +.. |ffr| unicode:: U+1D523 .. MATHEMATICAL FRAKTUR SMALL F +.. |Gfr| unicode:: U+1D50A .. MATHEMATICAL FRAKTUR CAPITAL G +.. |gfr| unicode:: U+1D524 .. MATHEMATICAL FRAKTUR SMALL G +.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H +.. |hfr| unicode:: U+1D525 .. MATHEMATICAL FRAKTUR SMALL H +.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I +.. |ifr| unicode:: U+1D526 .. MATHEMATICAL FRAKTUR SMALL I +.. |Jfr| unicode:: U+1D50D .. MATHEMATICAL FRAKTUR CAPITAL J +.. |jfr| unicode:: U+1D527 .. MATHEMATICAL FRAKTUR SMALL J +.. |Kfr| unicode:: U+1D50E .. MATHEMATICAL FRAKTUR CAPITAL K +.. |kfr| unicode:: U+1D528 .. MATHEMATICAL FRAKTUR SMALL K +.. |Lfr| unicode:: U+1D50F .. MATHEMATICAL FRAKTUR CAPITAL L +.. |lfr| unicode:: U+1D529 .. MATHEMATICAL FRAKTUR SMALL L +.. |Mfr| unicode:: U+1D510 .. MATHEMATICAL FRAKTUR CAPITAL M +.. |mfr| unicode:: U+1D52A .. MATHEMATICAL FRAKTUR SMALL M +.. |Nfr| unicode:: U+1D511 .. MATHEMATICAL FRAKTUR CAPITAL N +.. |nfr| unicode:: U+1D52B .. MATHEMATICAL FRAKTUR SMALL N +.. |Ofr| unicode:: U+1D512 .. MATHEMATICAL FRAKTUR CAPITAL O +.. |ofr| unicode:: U+1D52C .. MATHEMATICAL FRAKTUR SMALL O +.. |Pfr| unicode:: U+1D513 .. MATHEMATICAL FRAKTUR CAPITAL P +.. |pfr| unicode:: U+1D52D .. MATHEMATICAL FRAKTUR SMALL P +.. |Qfr| unicode:: U+1D514 .. MATHEMATICAL FRAKTUR CAPITAL Q +.. |qfr| unicode:: U+1D52E .. MATHEMATICAL FRAKTUR SMALL Q +.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R +.. |rfr| unicode:: U+1D52F .. MATHEMATICAL FRAKTUR SMALL R +.. |Sfr| unicode:: U+1D516 .. MATHEMATICAL FRAKTUR CAPITAL S +.. |sfr| unicode:: U+1D530 .. MATHEMATICAL FRAKTUR SMALL S +.. |Tfr| unicode:: U+1D517 .. MATHEMATICAL FRAKTUR CAPITAL T +.. |tfr| unicode:: U+1D531 .. MATHEMATICAL FRAKTUR SMALL T +.. |Ufr| unicode:: U+1D518 .. MATHEMATICAL FRAKTUR CAPITAL U +.. |ufr| unicode:: U+1D532 .. MATHEMATICAL FRAKTUR SMALL U +.. |Vfr| unicode:: U+1D519 .. MATHEMATICAL FRAKTUR CAPITAL V +.. |vfr| unicode:: U+1D533 .. MATHEMATICAL FRAKTUR SMALL V +.. |Wfr| unicode:: U+1D51A .. MATHEMATICAL FRAKTUR CAPITAL W +.. |wfr| unicode:: U+1D534 .. MATHEMATICAL FRAKTUR SMALL W +.. |Xfr| unicode:: U+1D51B .. MATHEMATICAL FRAKTUR CAPITAL X +.. |xfr| unicode:: U+1D535 .. MATHEMATICAL FRAKTUR SMALL X +.. |Yfr| unicode:: U+1D51C .. MATHEMATICAL FRAKTUR CAPITAL Y +.. |yfr| unicode:: U+1D536 .. MATHEMATICAL FRAKTUR SMALL Y +.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z +.. |zfr| unicode:: U+1D537 .. MATHEMATICAL FRAKTUR SMALL Z diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk.txt new file mode 100644 index 0000000..868b687 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk.txt @@ -0,0 +1,11 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Cfr| unicode:: U+0212D .. BLACK-LETTER CAPITAL C +.. |Hfr| unicode:: U+0210C .. BLACK-LETTER CAPITAL H +.. |Ifr| unicode:: U+02111 .. BLACK-LETTER CAPITAL I +.. |Rfr| unicode:: U+0211C .. BLACK-LETTER CAPITAL R +.. |Zfr| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf-wide.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf-wide.txt new file mode 100644 index 0000000..a91ea43 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf-wide.txt @@ -0,0 +1,32 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Aopf| unicode:: U+1D538 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL A +.. |Bopf| unicode:: U+1D539 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL B +.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C +.. |Dopf| unicode:: U+1D53B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL D +.. |Eopf| unicode:: U+1D53C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL E +.. |Fopf| unicode:: U+1D53D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL F +.. |Gopf| unicode:: U+1D53E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL G +.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H +.. |Iopf| unicode:: U+1D540 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL I +.. |Jopf| unicode:: U+1D541 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL J +.. |Kopf| unicode:: U+1D542 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL K +.. |Lopf| unicode:: U+1D543 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL L +.. |Mopf| unicode:: U+1D544 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL M +.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N +.. |Oopf| unicode:: U+1D546 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL O +.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P +.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q +.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R +.. |Sopf| unicode:: U+1D54A .. MATHEMATICAL DOUBLE-STRUCK CAPITAL S +.. |Topf| unicode:: U+1D54B .. MATHEMATICAL DOUBLE-STRUCK CAPITAL T +.. |Uopf| unicode:: U+1D54C .. MATHEMATICAL DOUBLE-STRUCK CAPITAL U +.. |Vopf| unicode:: U+1D54D .. MATHEMATICAL DOUBLE-STRUCK CAPITAL V +.. |Wopf| unicode:: U+1D54E .. MATHEMATICAL DOUBLE-STRUCK CAPITAL W +.. |Xopf| unicode:: U+1D54F .. MATHEMATICAL DOUBLE-STRUCK CAPITAL X +.. |Yopf| unicode:: U+1D550 .. MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf.txt new file mode 100644 index 0000000..4350db6 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf.txt @@ -0,0 +1,13 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Copf| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C +.. |Hopf| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H +.. |Nopf| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N +.. |Popf| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P +.. |Qopf| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q +.. |Ropf| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R +.. |Zopf| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr-wide.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr-wide.txt new file mode 100644 index 0000000..34b278b --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr-wide.txt @@ -0,0 +1,58 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Ascr| unicode:: U+1D49C .. MATHEMATICAL SCRIPT CAPITAL A +.. |ascr| unicode:: U+1D4B6 .. MATHEMATICAL SCRIPT SMALL A +.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B +.. |bscr| unicode:: U+1D4B7 .. MATHEMATICAL SCRIPT SMALL B +.. |Cscr| unicode:: U+1D49E .. MATHEMATICAL SCRIPT CAPITAL C +.. |cscr| unicode:: U+1D4B8 .. MATHEMATICAL SCRIPT SMALL C +.. |Dscr| unicode:: U+1D49F .. MATHEMATICAL SCRIPT CAPITAL D +.. |dscr| unicode:: U+1D4B9 .. MATHEMATICAL SCRIPT SMALL D +.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E +.. |escr| unicode:: U+0212F .. SCRIPT SMALL E +.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F +.. |fscr| unicode:: U+1D4BB .. MATHEMATICAL SCRIPT SMALL F +.. |Gscr| unicode:: U+1D4A2 .. MATHEMATICAL SCRIPT CAPITAL G +.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G +.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H +.. |hscr| unicode:: U+1D4BD .. MATHEMATICAL SCRIPT SMALL H +.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I +.. |iscr| unicode:: U+1D4BE .. MATHEMATICAL SCRIPT SMALL I +.. |Jscr| unicode:: U+1D4A5 .. MATHEMATICAL SCRIPT CAPITAL J +.. |jscr| unicode:: U+1D4BF .. MATHEMATICAL SCRIPT SMALL J +.. |Kscr| unicode:: U+1D4A6 .. MATHEMATICAL SCRIPT CAPITAL K +.. |kscr| unicode:: U+1D4C0 .. MATHEMATICAL SCRIPT SMALL K +.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L +.. |lscr| unicode:: U+1D4C1 .. MATHEMATICAL SCRIPT SMALL L +.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M +.. |mscr| unicode:: U+1D4C2 .. MATHEMATICAL SCRIPT SMALL M +.. |Nscr| unicode:: U+1D4A9 .. MATHEMATICAL SCRIPT CAPITAL N +.. |nscr| unicode:: U+1D4C3 .. MATHEMATICAL SCRIPT SMALL N +.. |Oscr| unicode:: U+1D4AA .. MATHEMATICAL SCRIPT CAPITAL O +.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O +.. |Pscr| unicode:: U+1D4AB .. MATHEMATICAL SCRIPT CAPITAL P +.. |pscr| unicode:: U+1D4C5 .. MATHEMATICAL SCRIPT SMALL P +.. |Qscr| unicode:: U+1D4AC .. MATHEMATICAL SCRIPT CAPITAL Q +.. |qscr| unicode:: U+1D4C6 .. MATHEMATICAL SCRIPT SMALL Q +.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R +.. |rscr| unicode:: U+1D4C7 .. MATHEMATICAL SCRIPT SMALL R +.. |Sscr| unicode:: U+1D4AE .. MATHEMATICAL SCRIPT CAPITAL S +.. |sscr| unicode:: U+1D4C8 .. MATHEMATICAL SCRIPT SMALL S +.. |Tscr| unicode:: U+1D4AF .. MATHEMATICAL SCRIPT CAPITAL T +.. |tscr| unicode:: U+1D4C9 .. MATHEMATICAL SCRIPT SMALL T +.. |Uscr| unicode:: U+1D4B0 .. MATHEMATICAL SCRIPT CAPITAL U +.. |uscr| unicode:: U+1D4CA .. MATHEMATICAL SCRIPT SMALL U +.. |Vscr| unicode:: U+1D4B1 .. MATHEMATICAL SCRIPT CAPITAL V +.. |vscr| unicode:: U+1D4CB .. MATHEMATICAL SCRIPT SMALL V +.. |Wscr| unicode:: U+1D4B2 .. MATHEMATICAL SCRIPT CAPITAL W +.. |wscr| unicode:: U+1D4CC .. MATHEMATICAL SCRIPT SMALL W +.. |Xscr| unicode:: U+1D4B3 .. MATHEMATICAL SCRIPT CAPITAL X +.. |xscr| unicode:: U+1D4CD .. MATHEMATICAL SCRIPT SMALL X +.. |Yscr| unicode:: U+1D4B4 .. MATHEMATICAL SCRIPT CAPITAL Y +.. |yscr| unicode:: U+1D4CE .. MATHEMATICAL SCRIPT SMALL Y +.. |Zscr| unicode:: U+1D4B5 .. MATHEMATICAL SCRIPT CAPITAL Z +.. |zscr| unicode:: U+1D4CF .. MATHEMATICAL SCRIPT SMALL Z diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr.txt new file mode 100644 index 0000000..a77890e --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr.txt @@ -0,0 +1,17 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Bscr| unicode:: U+0212C .. SCRIPT CAPITAL B +.. |Escr| unicode:: U+02130 .. SCRIPT CAPITAL E +.. |escr| unicode:: U+0212F .. SCRIPT SMALL E +.. |Fscr| unicode:: U+02131 .. SCRIPT CAPITAL F +.. |gscr| unicode:: U+0210A .. SCRIPT SMALL G +.. |Hscr| unicode:: U+0210B .. SCRIPT CAPITAL H +.. |Iscr| unicode:: U+02110 .. SCRIPT CAPITAL I +.. |Lscr| unicode:: U+02112 .. SCRIPT CAPITAL L +.. |Mscr| unicode:: U+02133 .. SCRIPT CAPITAL M +.. |oscr| unicode:: U+02134 .. SCRIPT SMALL O +.. |Rscr| unicode:: U+0211B .. SCRIPT CAPITAL R diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isonum.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isonum.txt new file mode 100644 index 0000000..35793b3 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isonum.txt @@ -0,0 +1,82 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |amp| unicode:: U+00026 .. AMPERSAND +.. |apos| unicode:: U+00027 .. APOSTROPHE +.. |ast| unicode:: U+0002A .. ASTERISK +.. |brvbar| unicode:: U+000A6 .. BROKEN BAR +.. |bsol| unicode:: U+0005C .. REVERSE SOLIDUS +.. |cent| unicode:: U+000A2 .. CENT SIGN +.. |colon| unicode:: U+0003A .. COLON +.. |comma| unicode:: U+0002C .. COMMA +.. |commat| unicode:: U+00040 .. COMMERCIAL AT +.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN +.. |curren| unicode:: U+000A4 .. CURRENCY SIGN +.. |darr| unicode:: U+02193 .. DOWNWARDS ARROW +.. |deg| unicode:: U+000B0 .. DEGREE SIGN +.. |divide| unicode:: U+000F7 .. DIVISION SIGN +.. |dollar| unicode:: U+00024 .. DOLLAR SIGN +.. |equals| unicode:: U+0003D .. EQUALS SIGN +.. |excl| unicode:: U+00021 .. EXCLAMATION MARK +.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF +.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER +.. |frac18| unicode:: U+0215B .. VULGAR FRACTION ONE EIGHTH +.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS +.. |frac38| unicode:: U+0215C .. VULGAR FRACTION THREE EIGHTHS +.. |frac58| unicode:: U+0215D .. VULGAR FRACTION FIVE EIGHTHS +.. |frac78| unicode:: U+0215E .. VULGAR FRACTION SEVEN EIGHTHS +.. |gt| unicode:: U+0003E .. GREATER-THAN SIGN +.. |half| unicode:: U+000BD .. VULGAR FRACTION ONE HALF +.. |horbar| unicode:: U+02015 .. HORIZONTAL BAR +.. |hyphen| unicode:: U+02010 .. HYPHEN +.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARK +.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK +.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +.. |larr| unicode:: U+02190 .. LEFTWARDS ARROW +.. |lcub| unicode:: U+0007B .. LEFT CURLY BRACKET +.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK +.. |lowbar| unicode:: U+0005F .. LOW LINE +.. |lpar| unicode:: U+00028 .. LEFT PARENTHESIS +.. |lsqb| unicode:: U+0005B .. LEFT SQUARE BRACKET +.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK +.. |lt| unicode:: U+0003C .. LESS-THAN SIGN +.. |micro| unicode:: U+000B5 .. MICRO SIGN +.. |middot| unicode:: U+000B7 .. MIDDLE DOT +.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACE +.. |not| unicode:: U+000AC .. NOT SIGN +.. |num| unicode:: U+00023 .. NUMBER SIGN +.. |ohm| unicode:: U+02126 .. OHM SIGN +.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATOR +.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR +.. |para| unicode:: U+000B6 .. PILCROW SIGN +.. |percnt| unicode:: U+00025 .. PERCENT SIGN +.. |period| unicode:: U+0002E .. FULL STOP +.. |plus| unicode:: U+0002B .. PLUS SIGN +.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN +.. |pound| unicode:: U+000A3 .. POUND SIGN +.. |quest| unicode:: U+0003F .. QUESTION MARK +.. |quot| unicode:: U+00022 .. QUOTATION MARK +.. |raquo| unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROW +.. |rcub| unicode:: U+0007D .. RIGHT CURLY BRACKET +.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK +.. |reg| unicode:: U+000AE .. REGISTERED SIGN +.. |rpar| unicode:: U+00029 .. RIGHT PARENTHESIS +.. |rsqb| unicode:: U+0005D .. RIGHT SQUARE BRACKET +.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK +.. |sect| unicode:: U+000A7 .. SECTION SIGN +.. |semi| unicode:: U+0003B .. SEMICOLON +.. |shy| unicode:: U+000AD .. SOFT HYPHEN +.. |sol| unicode:: U+0002F .. SOLIDUS +.. |sung| unicode:: U+0266A .. EIGHTH NOTE +.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONE +.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWO +.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREE +.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGN +.. |trade| unicode:: U+02122 .. TRADE MARK SIGN +.. |uarr| unicode:: U+02191 .. UPWARDS ARROW +.. |verbar| unicode:: U+0007C .. VERTICAL LINE +.. |yen| unicode:: U+000A5 .. YEN SIGN diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isopub.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isopub.txt new file mode 100644 index 0000000..bc5b6d4 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isopub.txt @@ -0,0 +1,90 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |blank| unicode:: U+02423 .. OPEN BOX +.. |blk12| unicode:: U+02592 .. MEDIUM SHADE +.. |blk14| unicode:: U+02591 .. LIGHT SHADE +.. |blk34| unicode:: U+02593 .. DARK SHADE +.. |block| unicode:: U+02588 .. FULL BLOCK +.. |bull| unicode:: U+02022 .. BULLET +.. |caret| unicode:: U+02041 .. CARET INSERTION POINT +.. |check| unicode:: U+02713 .. CHECK MARK +.. |cir| unicode:: U+025CB .. WHITE CIRCLE +.. |clubs| unicode:: U+02663 .. BLACK CLUB SUIT +.. |copysr| unicode:: U+02117 .. SOUND RECORDING COPYRIGHT +.. |cross| unicode:: U+02717 .. BALLOT X +.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER +.. |dagger| unicode:: U+02020 .. DAGGER +.. |dash| unicode:: U+02010 .. HYPHEN +.. |diams| unicode:: U+02666 .. BLACK DIAMOND SUIT +.. |dlcrop| unicode:: U+0230D .. BOTTOM LEFT CROP +.. |drcrop| unicode:: U+0230C .. BOTTOM RIGHT CROP +.. |dtri| unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE +.. |dtrif| unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE +.. |emsp| unicode:: U+02003 .. EM SPACE +.. |emsp13| unicode:: U+02004 .. THREE-PER-EM SPACE +.. |emsp14| unicode:: U+02005 .. FOUR-PER-EM SPACE +.. |ensp| unicode:: U+02002 .. EN SPACE +.. |female| unicode:: U+02640 .. FEMALE SIGN +.. |ffilig| unicode:: U+0FB03 .. LATIN SMALL LIGATURE FFI +.. |fflig| unicode:: U+0FB00 .. LATIN SMALL LIGATURE FF +.. |ffllig| unicode:: U+0FB04 .. LATIN SMALL LIGATURE FFL +.. |filig| unicode:: U+0FB01 .. LATIN SMALL LIGATURE FI +.. |flat| unicode:: U+0266D .. MUSIC FLAT SIGN +.. |fllig| unicode:: U+0FB02 .. LATIN SMALL LIGATURE FL +.. |frac13| unicode:: U+02153 .. VULGAR FRACTION ONE THIRD +.. |frac15| unicode:: U+02155 .. VULGAR FRACTION ONE FIFTH +.. |frac16| unicode:: U+02159 .. VULGAR FRACTION ONE SIXTH +.. |frac23| unicode:: U+02154 .. VULGAR FRACTION TWO THIRDS +.. |frac25| unicode:: U+02156 .. VULGAR FRACTION TWO FIFTHS +.. |frac35| unicode:: U+02157 .. VULGAR FRACTION THREE FIFTHS +.. |frac45| unicode:: U+02158 .. VULGAR FRACTION FOUR FIFTHS +.. |frac56| unicode:: U+0215A .. VULGAR FRACTION FIVE SIXTHS +.. |hairsp| unicode:: U+0200A .. HAIR SPACE +.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT +.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS +.. |hybull| unicode:: U+02043 .. HYPHEN BULLET +.. |incare| unicode:: U+02105 .. CARE OF +.. |ldquor| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK +.. |lhblk| unicode:: U+02584 .. LOWER HALF BLOCK +.. |loz| unicode:: U+025CA .. LOZENGE +.. |lozf| unicode:: U+029EB .. BLACK LOZENGE +.. |lsquor| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK +.. |ltri| unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE +.. |ltrif| unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE +.. |male| unicode:: U+02642 .. MALE SIGN +.. |malt| unicode:: U+02720 .. MALTESE CROSS +.. |marker| unicode:: U+025AE .. BLACK VERTICAL RECTANGLE +.. |mdash| unicode:: U+02014 .. EM DASH +.. |mldr| unicode:: U+02026 .. HORIZONTAL ELLIPSIS +.. |natur| unicode:: U+0266E .. MUSIC NATURAL SIGN +.. |ndash| unicode:: U+02013 .. EN DASH +.. |nldr| unicode:: U+02025 .. TWO DOT LEADER +.. |numsp| unicode:: U+02007 .. FIGURE SPACE +.. |phone| unicode:: U+0260E .. BLACK TELEPHONE +.. |puncsp| unicode:: U+02008 .. PUNCTUATION SPACE +.. |rdquor| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK +.. |rect| unicode:: U+025AD .. WHITE RECTANGLE +.. |rsquor| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK +.. |rtri| unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE +.. |rtrif| unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE +.. |rx| unicode:: U+0211E .. PRESCRIPTION TAKE +.. |sext| unicode:: U+02736 .. SIX POINTED BLACK STAR +.. |sharp| unicode:: U+0266F .. MUSIC SHARP SIGN +.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT +.. |squ| unicode:: U+025A1 .. WHITE SQUARE +.. |squf| unicode:: U+025AA .. BLACK SMALL SQUARE +.. |star| unicode:: U+02606 .. WHITE STAR +.. |starf| unicode:: U+02605 .. BLACK STAR +.. |target| unicode:: U+02316 .. POSITION INDICATOR +.. |telrec| unicode:: U+02315 .. TELEPHONE RECORDER +.. |thinsp| unicode:: U+02009 .. THIN SPACE +.. |uhblk| unicode:: U+02580 .. UPPER HALF BLOCK +.. |ulcrop| unicode:: U+0230F .. TOP LEFT CROP +.. |urcrop| unicode:: U+0230E .. TOP RIGHT CROP +.. |utri| unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE +.. |utrif| unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE +.. |vellip| unicode:: U+022EE .. VERTICAL ELLIPSIS diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/isotech.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/isotech.txt new file mode 100644 index 0000000..01f7e34 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/isotech.txt @@ -0,0 +1,168 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |acd| unicode:: U+0223F .. SINE WAVE +.. |aleph| unicode:: U+02135 .. ALEF SYMBOL +.. |And| unicode:: U+02A53 .. DOUBLE LOGICAL AND +.. |and| unicode:: U+02227 .. LOGICAL AND +.. |andand| unicode:: U+02A55 .. TWO INTERSECTING LOGICAL AND +.. |andd| unicode:: U+02A5C .. LOGICAL AND WITH HORIZONTAL DASH +.. |andslope| unicode:: U+02A58 .. SLOPING LARGE AND +.. |andv| unicode:: U+02A5A .. LOGICAL AND WITH MIDDLE STEM +.. |ang90| unicode:: U+0221F .. RIGHT ANGLE +.. |angrt| unicode:: U+0221F .. RIGHT ANGLE +.. |angsph| unicode:: U+02222 .. SPHERICAL ANGLE +.. |angst| unicode:: U+0212B .. ANGSTROM SIGN +.. |ap| unicode:: U+02248 .. ALMOST EQUAL TO +.. |apacir| unicode:: U+02A6F .. ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +.. |awconint| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL +.. |awint| unicode:: U+02A11 .. ANTICLOCKWISE INTEGRATION +.. |becaus| unicode:: U+02235 .. BECAUSE +.. |bernou| unicode:: U+0212C .. SCRIPT CAPITAL B +.. |bne| unicode:: U+0003D U+020E5 .. EQUALS SIGN with reverse slash +.. |bnequiv| unicode:: U+02261 U+020E5 .. IDENTICAL TO with reverse slash +.. |bNot| unicode:: U+02AED .. REVERSED DOUBLE STROKE NOT SIGN +.. |bnot| unicode:: U+02310 .. REVERSED NOT SIGN +.. |bottom| unicode:: U+022A5 .. UP TACK +.. |cap| unicode:: U+02229 .. INTERSECTION +.. |Cconint| unicode:: U+02230 .. VOLUME INTEGRAL +.. |cirfnint| unicode:: U+02A10 .. CIRCULATION FUNCTION +.. |compfn| unicode:: U+02218 .. RING OPERATOR +.. |cong| unicode:: U+02245 .. APPROXIMATELY EQUAL TO +.. |Conint| unicode:: U+0222F .. SURFACE INTEGRAL +.. |conint| unicode:: U+0222E .. CONTOUR INTEGRAL +.. |ctdot| unicode:: U+022EF .. MIDLINE HORIZONTAL ELLIPSIS +.. |cup| unicode:: U+0222A .. UNION +.. |cwconint| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL +.. |cwint| unicode:: U+02231 .. CLOCKWISE INTEGRAL +.. |cylcty| unicode:: U+0232D .. CYLINDRICITY +.. |disin| unicode:: U+022F2 .. ELEMENT OF WITH LONG HORIZONTAL STROKE +.. |Dot| unicode:: U+000A8 .. DIAERESIS +.. |DotDot| unicode:: U+020DC .. COMBINING FOUR DOTS ABOVE +.. |dsol| unicode:: U+029F6 .. SOLIDUS WITH OVERBAR +.. |dtdot| unicode:: U+022F1 .. DOWN RIGHT DIAGONAL ELLIPSIS +.. |dwangle| unicode:: U+029A6 .. OBLIQUE ANGLE OPENING UP +.. |elinters| unicode:: U+0FFFD .. REPLACEMENT CHARACTER +.. |epar| unicode:: U+022D5 .. EQUAL AND PARALLEL TO +.. |eparsl| unicode:: U+029E3 .. EQUALS SIGN AND SLANTED PARALLEL +.. |equiv| unicode:: U+02261 .. IDENTICAL TO +.. |eqvparsl| unicode:: U+029E5 .. IDENTICAL TO AND SLANTED PARALLEL +.. |exist| unicode:: U+02203 .. THERE EXISTS +.. |fltns| unicode:: U+025B1 .. WHITE PARALLELOGRAM +.. |fnof| unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK +.. |forall| unicode:: U+02200 .. FOR ALL +.. |fpartint| unicode:: U+02A0D .. FINITE PART INTEGRAL +.. |ge| unicode:: U+02265 .. GREATER-THAN OR EQUAL TO +.. |hamilt| unicode:: U+0210B .. SCRIPT CAPITAL H +.. |iff| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW +.. |iinfin| unicode:: U+029DC .. INCOMPLETE INFINITY +.. |imped| unicode:: U+001B5 .. LATIN CAPITAL LETTER Z WITH STROKE +.. |infin| unicode:: U+0221E .. INFINITY +.. |infintie| unicode:: U+029DD .. TIE OVER INFINITY +.. |Int| unicode:: U+0222C .. DOUBLE INTEGRAL +.. |int| unicode:: U+0222B .. INTEGRAL +.. |intlarhk| unicode:: U+02A17 .. INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +.. |isin| unicode:: U+02208 .. ELEMENT OF +.. |isindot| unicode:: U+022F5 .. ELEMENT OF WITH DOT ABOVE +.. |isinE| unicode:: U+022F9 .. ELEMENT OF WITH TWO HORIZONTAL STROKES +.. |isins| unicode:: U+022F4 .. SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +.. |isinsv| unicode:: U+022F3 .. ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +.. |isinv| unicode:: U+02208 .. ELEMENT OF +.. |lagran| unicode:: U+02112 .. SCRIPT CAPITAL L +.. |Lang| unicode:: U+0300A .. LEFT DOUBLE ANGLE BRACKET +.. |lang| unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET +.. |lArr| unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW +.. |lbbrk| unicode:: U+03014 .. LEFT TORTOISE SHELL BRACKET +.. |le| unicode:: U+02264 .. LESS-THAN OR EQUAL TO +.. |loang| unicode:: U+03018 .. LEFT WHITE TORTOISE SHELL BRACKET +.. |lobrk| unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET +.. |lopar| unicode:: U+02985 .. LEFT WHITE PARENTHESIS +.. |lowast| unicode:: U+02217 .. ASTERISK OPERATOR +.. |minus| unicode:: U+02212 .. MINUS SIGN +.. |mnplus| unicode:: U+02213 .. MINUS-OR-PLUS SIGN +.. |nabla| unicode:: U+02207 .. NABLA +.. |ne| unicode:: U+02260 .. NOT EQUAL TO +.. |nedot| unicode:: U+02250 U+00338 .. APPROACHES THE LIMIT with slash +.. |nhpar| unicode:: U+02AF2 .. PARALLEL WITH HORIZONTAL STROKE +.. |ni| unicode:: U+0220B .. CONTAINS AS MEMBER +.. |nis| unicode:: U+022FC .. SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +.. |nisd| unicode:: U+022FA .. CONTAINS WITH LONG HORIZONTAL STROKE +.. |niv| unicode:: U+0220B .. CONTAINS AS MEMBER +.. |Not| unicode:: U+02AEC .. DOUBLE STROKE NOT SIGN +.. |notin| unicode:: U+02209 .. NOT AN ELEMENT OF +.. |notindot| unicode:: U+022F5 U+00338 .. ELEMENT OF WITH DOT ABOVE with slash +.. |notinE| unicode:: U+022F9 U+00338 .. ELEMENT OF WITH TWO HORIZONTAL STROKES with slash +.. |notinva| unicode:: U+02209 .. NOT AN ELEMENT OF +.. |notinvb| unicode:: U+022F7 .. SMALL ELEMENT OF WITH OVERBAR +.. |notinvc| unicode:: U+022F6 .. ELEMENT OF WITH OVERBAR +.. |notni| unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER +.. |notniva| unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER +.. |notnivb| unicode:: U+022FE .. SMALL CONTAINS WITH OVERBAR +.. |notnivc| unicode:: U+022FD .. CONTAINS WITH OVERBAR +.. |nparsl| unicode:: U+02AFD U+020E5 .. DOUBLE SOLIDUS OPERATOR with reverse slash +.. |npart| unicode:: U+02202 U+00338 .. PARTIAL DIFFERENTIAL with slash +.. |npolint| unicode:: U+02A14 .. LINE INTEGRATION NOT INCLUDING THE POLE +.. |nvinfin| unicode:: U+029DE .. INFINITY NEGATED WITH VERTICAL BAR +.. |olcross| unicode:: U+029BB .. CIRCLE WITH SUPERIMPOSED X +.. |Or| unicode:: U+02A54 .. DOUBLE LOGICAL OR +.. |or| unicode:: U+02228 .. LOGICAL OR +.. |ord| unicode:: U+02A5D .. LOGICAL OR WITH HORIZONTAL DASH +.. |order| unicode:: U+02134 .. SCRIPT SMALL O +.. |oror| unicode:: U+02A56 .. TWO INTERSECTING LOGICAL OR +.. |orslope| unicode:: U+02A57 .. SLOPING LARGE OR +.. |orv| unicode:: U+02A5B .. LOGICAL OR WITH MIDDLE STEM +.. |par| unicode:: U+02225 .. PARALLEL TO +.. |parsl| unicode:: U+02AFD .. DOUBLE SOLIDUS OPERATOR +.. |part| unicode:: U+02202 .. PARTIAL DIFFERENTIAL +.. |permil| unicode:: U+02030 .. PER MILLE SIGN +.. |perp| unicode:: U+022A5 .. UP TACK +.. |pertenk| unicode:: U+02031 .. PER TEN THOUSAND SIGN +.. |phmmat| unicode:: U+02133 .. SCRIPT CAPITAL M +.. |pointint| unicode:: U+02A15 .. INTEGRAL AROUND A POINT OPERATOR +.. |Prime| unicode:: U+02033 .. DOUBLE PRIME +.. |prime| unicode:: U+02032 .. PRIME +.. |profalar| unicode:: U+0232E .. ALL AROUND-PROFILE +.. |profline| unicode:: U+02312 .. ARC +.. |profsurf| unicode:: U+02313 .. SEGMENT +.. |prop| unicode:: U+0221D .. PROPORTIONAL TO +.. |qint| unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR +.. |qprime| unicode:: U+02057 .. QUADRUPLE PRIME +.. |quatint| unicode:: U+02A16 .. QUATERNION INTEGRAL OPERATOR +.. |radic| unicode:: U+0221A .. SQUARE ROOT +.. |Rang| unicode:: U+0300B .. RIGHT DOUBLE ANGLE BRACKET +.. |rang| unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET +.. |rArr| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW +.. |rbbrk| unicode:: U+03015 .. RIGHT TORTOISE SHELL BRACKET +.. |roang| unicode:: U+03019 .. RIGHT WHITE TORTOISE SHELL BRACKET +.. |robrk| unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET +.. |ropar| unicode:: U+02986 .. RIGHT WHITE PARENTHESIS +.. |rppolint| unicode:: U+02A12 .. LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +.. |scpolint| unicode:: U+02A13 .. LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +.. |sim| unicode:: U+0223C .. TILDE OPERATOR +.. |simdot| unicode:: U+02A6A .. TILDE OPERATOR WITH DOT ABOVE +.. |sime| unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO +.. |smeparsl| unicode:: U+029E4 .. EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +.. |square| unicode:: U+025A1 .. WHITE SQUARE +.. |squarf| unicode:: U+025AA .. BLACK SMALL SQUARE +.. |strns| unicode:: U+000AF .. MACRON +.. |sub| unicode:: U+02282 .. SUBSET OF +.. |sube| unicode:: U+02286 .. SUBSET OF OR EQUAL TO +.. |sup| unicode:: U+02283 .. SUPERSET OF +.. |supe| unicode:: U+02287 .. SUPERSET OF OR EQUAL TO +.. |tdot| unicode:: U+020DB .. COMBINING THREE DOTS ABOVE +.. |there4| unicode:: U+02234 .. THEREFORE +.. |tint| unicode:: U+0222D .. TRIPLE INTEGRAL +.. |top| unicode:: U+022A4 .. DOWN TACK +.. |topbot| unicode:: U+02336 .. APL FUNCTIONAL SYMBOL I-BEAM +.. |topcir| unicode:: U+02AF1 .. DOWN TACK WITH CIRCLE BELOW +.. |tprime| unicode:: U+02034 .. TRIPLE PRIME +.. |utdot| unicode:: U+022F0 .. UP RIGHT DIAGONAL ELLIPSIS +.. |uwangle| unicode:: U+029A7 .. OBLIQUE ANGLE OPENING DOWN +.. |vangrt| unicode:: U+0299C .. RIGHT ANGLE VARIANT WITH SQUARE +.. |veeeq| unicode:: U+0225A .. EQUIANGULAR TO +.. |Verbar| unicode:: U+02016 .. DOUBLE VERTICAL LINE +.. |wedgeq| unicode:: U+02259 .. ESTIMATES +.. |xnis| unicode:: U+022FB .. CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlalias.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlalias.txt new file mode 100644 index 0000000..cabc54a --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlalias.txt @@ -0,0 +1,554 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |angle| unicode:: U+02220 .. ANGLE +.. |ApplyFunction| unicode:: U+02061 .. FUNCTION APPLICATION +.. |approx| unicode:: U+02248 .. ALMOST EQUAL TO +.. |approxeq| unicode:: U+0224A .. ALMOST EQUAL OR EQUAL TO +.. |Assign| unicode:: U+02254 .. COLON EQUALS +.. |backcong| unicode:: U+0224C .. ALL EQUAL TO +.. |backepsilon| unicode:: U+003F6 .. GREEK REVERSED LUNATE EPSILON SYMBOL +.. |backprime| unicode:: U+02035 .. REVERSED PRIME +.. |backsim| unicode:: U+0223D .. REVERSED TILDE +.. |backsimeq| unicode:: U+022CD .. REVERSED TILDE EQUALS +.. |Backslash| unicode:: U+02216 .. SET MINUS +.. |barwedge| unicode:: U+02305 .. PROJECTIVE +.. |Because| unicode:: U+02235 .. BECAUSE +.. |because| unicode:: U+02235 .. BECAUSE +.. |Bernoullis| unicode:: U+0212C .. SCRIPT CAPITAL B +.. |between| unicode:: U+0226C .. BETWEEN +.. |bigcap| unicode:: U+022C2 .. N-ARY INTERSECTION +.. |bigcirc| unicode:: U+025EF .. LARGE CIRCLE +.. |bigcup| unicode:: U+022C3 .. N-ARY UNION +.. |bigodot| unicode:: U+02A00 .. N-ARY CIRCLED DOT OPERATOR +.. |bigoplus| unicode:: U+02A01 .. N-ARY CIRCLED PLUS OPERATOR +.. |bigotimes| unicode:: U+02A02 .. N-ARY CIRCLED TIMES OPERATOR +.. |bigsqcup| unicode:: U+02A06 .. N-ARY SQUARE UNION OPERATOR +.. |bigstar| unicode:: U+02605 .. BLACK STAR +.. |bigtriangledown| unicode:: U+025BD .. WHITE DOWN-POINTING TRIANGLE +.. |bigtriangleup| unicode:: U+025B3 .. WHITE UP-POINTING TRIANGLE +.. |biguplus| unicode:: U+02A04 .. N-ARY UNION OPERATOR WITH PLUS +.. |bigvee| unicode:: U+022C1 .. N-ARY LOGICAL OR +.. |bigwedge| unicode:: U+022C0 .. N-ARY LOGICAL AND +.. |bkarow| unicode:: U+0290D .. RIGHTWARDS DOUBLE DASH ARROW +.. |blacklozenge| unicode:: U+029EB .. BLACK LOZENGE +.. |blacksquare| unicode:: U+025AA .. BLACK SMALL SQUARE +.. |blacktriangle| unicode:: U+025B4 .. BLACK UP-POINTING SMALL TRIANGLE +.. |blacktriangledown| unicode:: U+025BE .. BLACK DOWN-POINTING SMALL TRIANGLE +.. |blacktriangleleft| unicode:: U+025C2 .. BLACK LEFT-POINTING SMALL TRIANGLE +.. |blacktriangleright| unicode:: U+025B8 .. BLACK RIGHT-POINTING SMALL TRIANGLE +.. |bot| unicode:: U+022A5 .. UP TACK +.. |boxminus| unicode:: U+0229F .. SQUARED MINUS +.. |boxplus| unicode:: U+0229E .. SQUARED PLUS +.. |boxtimes| unicode:: U+022A0 .. SQUARED TIMES +.. |Breve| unicode:: U+002D8 .. BREVE +.. |bullet| unicode:: U+02022 .. BULLET +.. |Bumpeq| unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO +.. |bumpeq| unicode:: U+0224F .. DIFFERENCE BETWEEN +.. |CapitalDifferentialD| unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D +.. |Cayleys| unicode:: U+0212D .. BLACK-LETTER CAPITAL C +.. |Cedilla| unicode:: U+000B8 .. CEDILLA +.. |CenterDot| unicode:: U+000B7 .. MIDDLE DOT +.. |centerdot| unicode:: U+000B7 .. MIDDLE DOT +.. |checkmark| unicode:: U+02713 .. CHECK MARK +.. |circeq| unicode:: U+02257 .. RING EQUAL TO +.. |circlearrowleft| unicode:: U+021BA .. ANTICLOCKWISE OPEN CIRCLE ARROW +.. |circlearrowright| unicode:: U+021BB .. CLOCKWISE OPEN CIRCLE ARROW +.. |circledast| unicode:: U+0229B .. CIRCLED ASTERISK OPERATOR +.. |circledcirc| unicode:: U+0229A .. CIRCLED RING OPERATOR +.. |circleddash| unicode:: U+0229D .. CIRCLED DASH +.. |CircleDot| unicode:: U+02299 .. CIRCLED DOT OPERATOR +.. |circledR| unicode:: U+000AE .. REGISTERED SIGN +.. |circledS| unicode:: U+024C8 .. CIRCLED LATIN CAPITAL LETTER S +.. |CircleMinus| unicode:: U+02296 .. CIRCLED MINUS +.. |CirclePlus| unicode:: U+02295 .. CIRCLED PLUS +.. |CircleTimes| unicode:: U+02297 .. CIRCLED TIMES +.. |ClockwiseContourIntegral| unicode:: U+02232 .. CLOCKWISE CONTOUR INTEGRAL +.. |CloseCurlyDoubleQuote| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK +.. |CloseCurlyQuote| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK +.. |clubsuit| unicode:: U+02663 .. BLACK CLUB SUIT +.. |coloneq| unicode:: U+02254 .. COLON EQUALS +.. |complement| unicode:: U+02201 .. COMPLEMENT +.. |complexes| unicode:: U+02102 .. DOUBLE-STRUCK CAPITAL C +.. |Congruent| unicode:: U+02261 .. IDENTICAL TO +.. |ContourIntegral| unicode:: U+0222E .. CONTOUR INTEGRAL +.. |Coproduct| unicode:: U+02210 .. N-ARY COPRODUCT +.. |CounterClockwiseContourIntegral| unicode:: U+02233 .. ANTICLOCKWISE CONTOUR INTEGRAL +.. |CupCap| unicode:: U+0224D .. EQUIVALENT TO +.. |curlyeqprec| unicode:: U+022DE .. EQUAL TO OR PRECEDES +.. |curlyeqsucc| unicode:: U+022DF .. EQUAL TO OR SUCCEEDS +.. |curlyvee| unicode:: U+022CE .. CURLY LOGICAL OR +.. |curlywedge| unicode:: U+022CF .. CURLY LOGICAL AND +.. |curvearrowleft| unicode:: U+021B6 .. ANTICLOCKWISE TOP SEMICIRCLE ARROW +.. |curvearrowright| unicode:: U+021B7 .. CLOCKWISE TOP SEMICIRCLE ARROW +.. |dbkarow| unicode:: U+0290F .. RIGHTWARDS TRIPLE DASH ARROW +.. |ddagger| unicode:: U+02021 .. DOUBLE DAGGER +.. |ddotseq| unicode:: U+02A77 .. EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +.. |Del| unicode:: U+02207 .. NABLA +.. |DiacriticalAcute| unicode:: U+000B4 .. ACUTE ACCENT +.. |DiacriticalDot| unicode:: U+002D9 .. DOT ABOVE +.. |DiacriticalDoubleAcute| unicode:: U+002DD .. DOUBLE ACUTE ACCENT +.. |DiacriticalGrave| unicode:: U+00060 .. GRAVE ACCENT +.. |DiacriticalTilde| unicode:: U+002DC .. SMALL TILDE +.. |Diamond| unicode:: U+022C4 .. DIAMOND OPERATOR +.. |diamond| unicode:: U+022C4 .. DIAMOND OPERATOR +.. |diamondsuit| unicode:: U+02666 .. BLACK DIAMOND SUIT +.. |DifferentialD| unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D +.. |digamma| unicode:: U+003DD .. GREEK SMALL LETTER DIGAMMA +.. |div| unicode:: U+000F7 .. DIVISION SIGN +.. |divideontimes| unicode:: U+022C7 .. DIVISION TIMES +.. |doteq| unicode:: U+02250 .. APPROACHES THE LIMIT +.. |doteqdot| unicode:: U+02251 .. GEOMETRICALLY EQUAL TO +.. |DotEqual| unicode:: U+02250 .. APPROACHES THE LIMIT +.. |dotminus| unicode:: U+02238 .. DOT MINUS +.. |dotplus| unicode:: U+02214 .. DOT PLUS +.. |dotsquare| unicode:: U+022A1 .. SQUARED DOT OPERATOR +.. |doublebarwedge| unicode:: U+02306 .. PERSPECTIVE +.. |DoubleContourIntegral| unicode:: U+0222F .. SURFACE INTEGRAL +.. |DoubleDot| unicode:: U+000A8 .. DIAERESIS +.. |DoubleDownArrow| unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW +.. |DoubleLeftArrow| unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW +.. |DoubleLeftRightArrow| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW +.. |DoubleLeftTee| unicode:: U+02AE4 .. VERTICAL BAR DOUBLE LEFT TURNSTILE +.. |DoubleLongLeftArrow| unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW +.. |DoubleLongLeftRightArrow| unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW +.. |DoubleLongRightArrow| unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW +.. |DoubleRightArrow| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW +.. |DoubleRightTee| unicode:: U+022A8 .. TRUE +.. |DoubleUpArrow| unicode:: U+021D1 .. UPWARDS DOUBLE ARROW +.. |DoubleUpDownArrow| unicode:: U+021D5 .. UP DOWN DOUBLE ARROW +.. |DoubleVerticalBar| unicode:: U+02225 .. PARALLEL TO +.. |DownArrow| unicode:: U+02193 .. DOWNWARDS ARROW +.. |Downarrow| unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW +.. |downarrow| unicode:: U+02193 .. DOWNWARDS ARROW +.. |DownArrowUpArrow| unicode:: U+021F5 .. DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +.. |downdownarrows| unicode:: U+021CA .. DOWNWARDS PAIRED ARROWS +.. |downharpoonleft| unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS +.. |downharpoonright| unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS +.. |DownLeftVector| unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS +.. |DownRightVector| unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS +.. |DownTee| unicode:: U+022A4 .. DOWN TACK +.. |DownTeeArrow| unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR +.. |drbkarow| unicode:: U+02910 .. RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +.. |Element| unicode:: U+02208 .. ELEMENT OF +.. |emptyset| unicode:: U+02205 .. EMPTY SET +.. |eqcirc| unicode:: U+02256 .. RING IN EQUAL TO +.. |eqcolon| unicode:: U+02255 .. EQUALS COLON +.. |eqsim| unicode:: U+02242 .. MINUS TILDE +.. |eqslantgtr| unicode:: U+02A96 .. SLANTED EQUAL TO OR GREATER-THAN +.. |eqslantless| unicode:: U+02A95 .. SLANTED EQUAL TO OR LESS-THAN +.. |EqualTilde| unicode:: U+02242 .. MINUS TILDE +.. |Equilibrium| unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +.. |Exists| unicode:: U+02203 .. THERE EXISTS +.. |expectation| unicode:: U+02130 .. SCRIPT CAPITAL E +.. |ExponentialE| unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E +.. |exponentiale| unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E +.. |fallingdotseq| unicode:: U+02252 .. APPROXIMATELY EQUAL TO OR THE IMAGE OF +.. |ForAll| unicode:: U+02200 .. FOR ALL +.. |Fouriertrf| unicode:: U+02131 .. SCRIPT CAPITAL F +.. |geq| unicode:: U+02265 .. GREATER-THAN OR EQUAL TO +.. |geqq| unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO +.. |geqslant| unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO +.. |gg| unicode:: U+0226B .. MUCH GREATER-THAN +.. |ggg| unicode:: U+022D9 .. VERY MUCH GREATER-THAN +.. |gnapprox| unicode:: U+02A8A .. GREATER-THAN AND NOT APPROXIMATE +.. |gneq| unicode:: U+02A88 .. GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +.. |gneqq| unicode:: U+02269 .. GREATER-THAN BUT NOT EQUAL TO +.. |GreaterEqual| unicode:: U+02265 .. GREATER-THAN OR EQUAL TO +.. |GreaterEqualLess| unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN +.. |GreaterFullEqual| unicode:: U+02267 .. GREATER-THAN OVER EQUAL TO +.. |GreaterLess| unicode:: U+02277 .. GREATER-THAN OR LESS-THAN +.. |GreaterSlantEqual| unicode:: U+02A7E .. GREATER-THAN OR SLANTED EQUAL TO +.. |GreaterTilde| unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO +.. |gtrapprox| unicode:: U+02A86 .. GREATER-THAN OR APPROXIMATE +.. |gtrdot| unicode:: U+022D7 .. GREATER-THAN WITH DOT +.. |gtreqless| unicode:: U+022DB .. GREATER-THAN EQUAL TO OR LESS-THAN +.. |gtreqqless| unicode:: U+02A8C .. GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +.. |gtrless| unicode:: U+02277 .. GREATER-THAN OR LESS-THAN +.. |gtrsim| unicode:: U+02273 .. GREATER-THAN OR EQUIVALENT TO +.. |gvertneqq| unicode:: U+02269 U+0FE00 .. GREATER-THAN BUT NOT EQUAL TO - with vertical stroke +.. |Hacek| unicode:: U+002C7 .. CARON +.. |hbar| unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI +.. |heartsuit| unicode:: U+02665 .. BLACK HEART SUIT +.. |HilbertSpace| unicode:: U+0210B .. SCRIPT CAPITAL H +.. |hksearow| unicode:: U+02925 .. SOUTH EAST ARROW WITH HOOK +.. |hkswarow| unicode:: U+02926 .. SOUTH WEST ARROW WITH HOOK +.. |hookleftarrow| unicode:: U+021A9 .. LEFTWARDS ARROW WITH HOOK +.. |hookrightarrow| unicode:: U+021AA .. RIGHTWARDS ARROW WITH HOOK +.. |hslash| unicode:: U+0210F .. PLANCK CONSTANT OVER TWO PI +.. |HumpDownHump| unicode:: U+0224E .. GEOMETRICALLY EQUIVALENT TO +.. |HumpEqual| unicode:: U+0224F .. DIFFERENCE BETWEEN +.. |iiiint| unicode:: U+02A0C .. QUADRUPLE INTEGRAL OPERATOR +.. |iiint| unicode:: U+0222D .. TRIPLE INTEGRAL +.. |Im| unicode:: U+02111 .. BLACK-LETTER CAPITAL I +.. |ImaginaryI| unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I +.. |imagline| unicode:: U+02110 .. SCRIPT CAPITAL I +.. |imagpart| unicode:: U+02111 .. BLACK-LETTER CAPITAL I +.. |Implies| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW +.. |in| unicode:: U+02208 .. ELEMENT OF +.. |integers| unicode:: U+02124 .. DOUBLE-STRUCK CAPITAL Z +.. |Integral| unicode:: U+0222B .. INTEGRAL +.. |intercal| unicode:: U+022BA .. INTERCALATE +.. |Intersection| unicode:: U+022C2 .. N-ARY INTERSECTION +.. |intprod| unicode:: U+02A3C .. INTERIOR PRODUCT +.. |InvisibleComma| unicode:: U+02063 .. INVISIBLE SEPARATOR +.. |InvisibleTimes| unicode:: U+02062 .. INVISIBLE TIMES +.. |langle| unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET +.. |Laplacetrf| unicode:: U+02112 .. SCRIPT CAPITAL L +.. |lbrace| unicode:: U+0007B .. LEFT CURLY BRACKET +.. |lbrack| unicode:: U+0005B .. LEFT SQUARE BRACKET +.. |LeftAngleBracket| unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET +.. |LeftArrow| unicode:: U+02190 .. LEFTWARDS ARROW +.. |Leftarrow| unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW +.. |leftarrow| unicode:: U+02190 .. LEFTWARDS ARROW +.. |LeftArrowBar| unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR +.. |LeftArrowRightArrow| unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW +.. |leftarrowtail| unicode:: U+021A2 .. LEFTWARDS ARROW WITH TAIL +.. |LeftCeiling| unicode:: U+02308 .. LEFT CEILING +.. |LeftDoubleBracket| unicode:: U+0301A .. LEFT WHITE SQUARE BRACKET +.. |LeftDownVector| unicode:: U+021C3 .. DOWNWARDS HARPOON WITH BARB LEFTWARDS +.. |LeftFloor| unicode:: U+0230A .. LEFT FLOOR +.. |leftharpoondown| unicode:: U+021BD .. LEFTWARDS HARPOON WITH BARB DOWNWARDS +.. |leftharpoonup| unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS +.. |leftleftarrows| unicode:: U+021C7 .. LEFTWARDS PAIRED ARROWS +.. |LeftRightArrow| unicode:: U+02194 .. LEFT RIGHT ARROW +.. |Leftrightarrow| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW +.. |leftrightarrow| unicode:: U+02194 .. LEFT RIGHT ARROW +.. |leftrightarrows| unicode:: U+021C6 .. LEFTWARDS ARROW OVER RIGHTWARDS ARROW +.. |leftrightharpoons| unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +.. |leftrightsquigarrow| unicode:: U+021AD .. LEFT RIGHT WAVE ARROW +.. |LeftTee| unicode:: U+022A3 .. LEFT TACK +.. |LeftTeeArrow| unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR +.. |leftthreetimes| unicode:: U+022CB .. LEFT SEMIDIRECT PRODUCT +.. |LeftTriangle| unicode:: U+022B2 .. NORMAL SUBGROUP OF +.. |LeftTriangleEqual| unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO +.. |LeftUpVector| unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS +.. |LeftVector| unicode:: U+021BC .. LEFTWARDS HARPOON WITH BARB UPWARDS +.. |leq| unicode:: U+02264 .. LESS-THAN OR EQUAL TO +.. |leqq| unicode:: U+02266 .. LESS-THAN OVER EQUAL TO +.. |leqslant| unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO +.. |lessapprox| unicode:: U+02A85 .. LESS-THAN OR APPROXIMATE +.. |lessdot| unicode:: U+022D6 .. LESS-THAN WITH DOT +.. |lesseqgtr| unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN +.. |lesseqqgtr| unicode:: U+02A8B .. LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +.. |LessEqualGreater| unicode:: U+022DA .. LESS-THAN EQUAL TO OR GREATER-THAN +.. |LessFullEqual| unicode:: U+02266 .. LESS-THAN OVER EQUAL TO +.. |LessGreater| unicode:: U+02276 .. LESS-THAN OR GREATER-THAN +.. |lessgtr| unicode:: U+02276 .. LESS-THAN OR GREATER-THAN +.. |lesssim| unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO +.. |LessSlantEqual| unicode:: U+02A7D .. LESS-THAN OR SLANTED EQUAL TO +.. |LessTilde| unicode:: U+02272 .. LESS-THAN OR EQUIVALENT TO +.. |ll| unicode:: U+0226A .. MUCH LESS-THAN +.. |llcorner| unicode:: U+0231E .. BOTTOM LEFT CORNER +.. |Lleftarrow| unicode:: U+021DA .. LEFTWARDS TRIPLE ARROW +.. |lmoustache| unicode:: U+023B0 .. UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +.. |lnapprox| unicode:: U+02A89 .. LESS-THAN AND NOT APPROXIMATE +.. |lneq| unicode:: U+02A87 .. LESS-THAN AND SINGLE-LINE NOT EQUAL TO +.. |lneqq| unicode:: U+02268 .. LESS-THAN BUT NOT EQUAL TO +.. |LongLeftArrow| unicode:: U+027F5 .. LONG LEFTWARDS ARROW +.. |Longleftarrow| unicode:: U+027F8 .. LONG LEFTWARDS DOUBLE ARROW +.. |longleftarrow| unicode:: U+027F5 .. LONG LEFTWARDS ARROW +.. |LongLeftRightArrow| unicode:: U+027F7 .. LONG LEFT RIGHT ARROW +.. |Longleftrightarrow| unicode:: U+027FA .. LONG LEFT RIGHT DOUBLE ARROW +.. |longleftrightarrow| unicode:: U+027F7 .. LONG LEFT RIGHT ARROW +.. |longmapsto| unicode:: U+027FC .. LONG RIGHTWARDS ARROW FROM BAR +.. |LongRightArrow| unicode:: U+027F6 .. LONG RIGHTWARDS ARROW +.. |Longrightarrow| unicode:: U+027F9 .. LONG RIGHTWARDS DOUBLE ARROW +.. |longrightarrow| unicode:: U+027F6 .. LONG RIGHTWARDS ARROW +.. |looparrowleft| unicode:: U+021AB .. LEFTWARDS ARROW WITH LOOP +.. |looparrowright| unicode:: U+021AC .. RIGHTWARDS ARROW WITH LOOP +.. |LowerLeftArrow| unicode:: U+02199 .. SOUTH WEST ARROW +.. |LowerRightArrow| unicode:: U+02198 .. SOUTH EAST ARROW +.. |lozenge| unicode:: U+025CA .. LOZENGE +.. |lrcorner| unicode:: U+0231F .. BOTTOM RIGHT CORNER +.. |Lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS +.. |lvertneqq| unicode:: U+02268 U+0FE00 .. LESS-THAN BUT NOT EQUAL TO - with vertical stroke +.. |maltese| unicode:: U+02720 .. MALTESE CROSS +.. |mapsto| unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR +.. |measuredangle| unicode:: U+02221 .. MEASURED ANGLE +.. |Mellintrf| unicode:: U+02133 .. SCRIPT CAPITAL M +.. |MinusPlus| unicode:: U+02213 .. MINUS-OR-PLUS SIGN +.. |mp| unicode:: U+02213 .. MINUS-OR-PLUS SIGN +.. |multimap| unicode:: U+022B8 .. MULTIMAP +.. |napprox| unicode:: U+02249 .. NOT ALMOST EQUAL TO +.. |natural| unicode:: U+0266E .. MUSIC NATURAL SIGN +.. |naturals| unicode:: U+02115 .. DOUBLE-STRUCK CAPITAL N +.. |nearrow| unicode:: U+02197 .. NORTH EAST ARROW +.. |NegativeMediumSpace| unicode:: U+0200B .. ZERO WIDTH SPACE +.. |NegativeThickSpace| unicode:: U+0200B .. ZERO WIDTH SPACE +.. |NegativeThinSpace| unicode:: U+0200B .. ZERO WIDTH SPACE +.. |NegativeVeryThinSpace| unicode:: U+0200B .. ZERO WIDTH SPACE +.. |NestedGreaterGreater| unicode:: U+0226B .. MUCH GREATER-THAN +.. |NestedLessLess| unicode:: U+0226A .. MUCH LESS-THAN +.. |nexists| unicode:: U+02204 .. THERE DOES NOT EXIST +.. |ngeq| unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO +.. |ngeqq| unicode:: U+02267 U+00338 .. GREATER-THAN OVER EQUAL TO with slash +.. |ngeqslant| unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash +.. |ngtr| unicode:: U+0226F .. NOT GREATER-THAN +.. |nLeftarrow| unicode:: U+021CD .. LEFTWARDS DOUBLE ARROW WITH STROKE +.. |nleftarrow| unicode:: U+0219A .. LEFTWARDS ARROW WITH STROKE +.. |nLeftrightarrow| unicode:: U+021CE .. LEFT RIGHT DOUBLE ARROW WITH STROKE +.. |nleftrightarrow| unicode:: U+021AE .. LEFT RIGHT ARROW WITH STROKE +.. |nleq| unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO +.. |nleqq| unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash +.. |nleqslant| unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash +.. |nless| unicode:: U+0226E .. NOT LESS-THAN +.. |NonBreakingSpace| unicode:: U+000A0 .. NO-BREAK SPACE +.. |NotCongruent| unicode:: U+02262 .. NOT IDENTICAL TO +.. |NotDoubleVerticalBar| unicode:: U+02226 .. NOT PARALLEL TO +.. |NotElement| unicode:: U+02209 .. NOT AN ELEMENT OF +.. |NotEqual| unicode:: U+02260 .. NOT EQUAL TO +.. |NotEqualTilde| unicode:: U+02242 U+00338 .. MINUS TILDE with slash +.. |NotExists| unicode:: U+02204 .. THERE DOES NOT EXIST +.. |NotGreater| unicode:: U+0226F .. NOT GREATER-THAN +.. |NotGreaterEqual| unicode:: U+02271 .. NEITHER GREATER-THAN NOR EQUAL TO +.. |NotGreaterFullEqual| unicode:: U+02266 U+00338 .. LESS-THAN OVER EQUAL TO with slash +.. |NotGreaterGreater| unicode:: U+0226B U+00338 .. MUCH GREATER THAN with slash +.. |NotGreaterLess| unicode:: U+02279 .. NEITHER GREATER-THAN NOR LESS-THAN +.. |NotGreaterSlantEqual| unicode:: U+02A7E U+00338 .. GREATER-THAN OR SLANTED EQUAL TO with slash +.. |NotGreaterTilde| unicode:: U+02275 .. NEITHER GREATER-THAN NOR EQUIVALENT TO +.. |NotHumpDownHump| unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash +.. |NotLeftTriangle| unicode:: U+022EA .. NOT NORMAL SUBGROUP OF +.. |NotLeftTriangleEqual| unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO +.. |NotLess| unicode:: U+0226E .. NOT LESS-THAN +.. |NotLessEqual| unicode:: U+02270 .. NEITHER LESS-THAN NOR EQUAL TO +.. |NotLessGreater| unicode:: U+02278 .. NEITHER LESS-THAN NOR GREATER-THAN +.. |NotLessLess| unicode:: U+0226A U+00338 .. MUCH LESS THAN with slash +.. |NotLessSlantEqual| unicode:: U+02A7D U+00338 .. LESS-THAN OR SLANTED EQUAL TO with slash +.. |NotLessTilde| unicode:: U+02274 .. NEITHER LESS-THAN NOR EQUIVALENT TO +.. |NotPrecedes| unicode:: U+02280 .. DOES NOT PRECEDE +.. |NotPrecedesEqual| unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash +.. |NotPrecedesSlantEqual| unicode:: U+022E0 .. DOES NOT PRECEDE OR EQUAL +.. |NotReverseElement| unicode:: U+0220C .. DOES NOT CONTAIN AS MEMBER +.. |NotRightTriangle| unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP +.. |NotRightTriangleEqual| unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +.. |NotSquareSubsetEqual| unicode:: U+022E2 .. NOT SQUARE IMAGE OF OR EQUAL TO +.. |NotSquareSupersetEqual| unicode:: U+022E3 .. NOT SQUARE ORIGINAL OF OR EQUAL TO +.. |NotSubset| unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line +.. |NotSubsetEqual| unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO +.. |NotSucceeds| unicode:: U+02281 .. DOES NOT SUCCEED +.. |NotSucceedsEqual| unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash +.. |NotSucceedsSlantEqual| unicode:: U+022E1 .. DOES NOT SUCCEED OR EQUAL +.. |NotSuperset| unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line +.. |NotSupersetEqual| unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO +.. |NotTilde| unicode:: U+02241 .. NOT TILDE +.. |NotTildeEqual| unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO +.. |NotTildeFullEqual| unicode:: U+02247 .. NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +.. |NotTildeTilde| unicode:: U+02249 .. NOT ALMOST EQUAL TO +.. |NotVerticalBar| unicode:: U+02224 .. DOES NOT DIVIDE +.. |nparallel| unicode:: U+02226 .. NOT PARALLEL TO +.. |nprec| unicode:: U+02280 .. DOES NOT PRECEDE +.. |npreceq| unicode:: U+02AAF U+00338 .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN with slash +.. |nRightarrow| unicode:: U+021CF .. RIGHTWARDS DOUBLE ARROW WITH STROKE +.. |nrightarrow| unicode:: U+0219B .. RIGHTWARDS ARROW WITH STROKE +.. |nshortmid| unicode:: U+02224 .. DOES NOT DIVIDE +.. |nshortparallel| unicode:: U+02226 .. NOT PARALLEL TO +.. |nsimeq| unicode:: U+02244 .. NOT ASYMPTOTICALLY EQUAL TO +.. |nsubset| unicode:: U+02282 U+020D2 .. SUBSET OF with vertical line +.. |nsubseteq| unicode:: U+02288 .. NEITHER A SUBSET OF NOR EQUAL TO +.. |nsubseteqq| unicode:: U+02AC5 U+00338 .. SUBSET OF ABOVE EQUALS SIGN with slash +.. |nsucc| unicode:: U+02281 .. DOES NOT SUCCEED +.. |nsucceq| unicode:: U+02AB0 U+00338 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN with slash +.. |nsupset| unicode:: U+02283 U+020D2 .. SUPERSET OF with vertical line +.. |nsupseteq| unicode:: U+02289 .. NEITHER A SUPERSET OF NOR EQUAL TO +.. |nsupseteqq| unicode:: U+02AC6 U+00338 .. SUPERSET OF ABOVE EQUALS SIGN with slash +.. |ntriangleleft| unicode:: U+022EA .. NOT NORMAL SUBGROUP OF +.. |ntrianglelefteq| unicode:: U+022EC .. NOT NORMAL SUBGROUP OF OR EQUAL TO +.. |ntriangleright| unicode:: U+022EB .. DOES NOT CONTAIN AS NORMAL SUBGROUP +.. |ntrianglerighteq| unicode:: U+022ED .. DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +.. |nwarrow| unicode:: U+02196 .. NORTH WEST ARROW +.. |oint| unicode:: U+0222E .. CONTOUR INTEGRAL +.. |OpenCurlyDoubleQuote| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK +.. |OpenCurlyQuote| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK +.. |orderof| unicode:: U+02134 .. SCRIPT SMALL O +.. |parallel| unicode:: U+02225 .. PARALLEL TO +.. |PartialD| unicode:: U+02202 .. PARTIAL DIFFERENTIAL +.. |pitchfork| unicode:: U+022D4 .. PITCHFORK +.. |PlusMinus| unicode:: U+000B1 .. PLUS-MINUS SIGN +.. |pm| unicode:: U+000B1 .. PLUS-MINUS SIGN +.. |Poincareplane| unicode:: U+0210C .. BLACK-LETTER CAPITAL H +.. |prec| unicode:: U+0227A .. PRECEDES +.. |precapprox| unicode:: U+02AB7 .. PRECEDES ABOVE ALMOST EQUAL TO +.. |preccurlyeq| unicode:: U+0227C .. PRECEDES OR EQUAL TO +.. |Precedes| unicode:: U+0227A .. PRECEDES +.. |PrecedesEqual| unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +.. |PrecedesSlantEqual| unicode:: U+0227C .. PRECEDES OR EQUAL TO +.. |PrecedesTilde| unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO +.. |preceq| unicode:: U+02AAF .. PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +.. |precnapprox| unicode:: U+02AB9 .. PRECEDES ABOVE NOT ALMOST EQUAL TO +.. |precneqq| unicode:: U+02AB5 .. PRECEDES ABOVE NOT EQUAL TO +.. |precnsim| unicode:: U+022E8 .. PRECEDES BUT NOT EQUIVALENT TO +.. |precsim| unicode:: U+0227E .. PRECEDES OR EQUIVALENT TO +.. |primes| unicode:: U+02119 .. DOUBLE-STRUCK CAPITAL P +.. |Proportion| unicode:: U+02237 .. PROPORTION +.. |Proportional| unicode:: U+0221D .. PROPORTIONAL TO +.. |propto| unicode:: U+0221D .. PROPORTIONAL TO +.. |quaternions| unicode:: U+0210D .. DOUBLE-STRUCK CAPITAL H +.. |questeq| unicode:: U+0225F .. QUESTIONED EQUAL TO +.. |rangle| unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET +.. |rationals| unicode:: U+0211A .. DOUBLE-STRUCK CAPITAL Q +.. |rbrace| unicode:: U+0007D .. RIGHT CURLY BRACKET +.. |rbrack| unicode:: U+0005D .. RIGHT SQUARE BRACKET +.. |Re| unicode:: U+0211C .. BLACK-LETTER CAPITAL R +.. |realine| unicode:: U+0211B .. SCRIPT CAPITAL R +.. |realpart| unicode:: U+0211C .. BLACK-LETTER CAPITAL R +.. |reals| unicode:: U+0211D .. DOUBLE-STRUCK CAPITAL R +.. |ReverseElement| unicode:: U+0220B .. CONTAINS AS MEMBER +.. |ReverseEquilibrium| unicode:: U+021CB .. LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +.. |ReverseUpEquilibrium| unicode:: U+0296F .. DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +.. |RightAngleBracket| unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET +.. |RightArrow| unicode:: U+02192 .. RIGHTWARDS ARROW +.. |Rightarrow| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW +.. |rightarrow| unicode:: U+02192 .. RIGHTWARDS ARROW +.. |RightArrowBar| unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR +.. |RightArrowLeftArrow| unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW +.. |rightarrowtail| unicode:: U+021A3 .. RIGHTWARDS ARROW WITH TAIL +.. |RightCeiling| unicode:: U+02309 .. RIGHT CEILING +.. |RightDoubleBracket| unicode:: U+0301B .. RIGHT WHITE SQUARE BRACKET +.. |RightDownVector| unicode:: U+021C2 .. DOWNWARDS HARPOON WITH BARB RIGHTWARDS +.. |RightFloor| unicode:: U+0230B .. RIGHT FLOOR +.. |rightharpoondown| unicode:: U+021C1 .. RIGHTWARDS HARPOON WITH BARB DOWNWARDS +.. |rightharpoonup| unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS +.. |rightleftarrows| unicode:: U+021C4 .. RIGHTWARDS ARROW OVER LEFTWARDS ARROW +.. |rightleftharpoons| unicode:: U+021CC .. RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +.. |rightrightarrows| unicode:: U+021C9 .. RIGHTWARDS PAIRED ARROWS +.. |rightsquigarrow| unicode:: U+0219D .. RIGHTWARDS WAVE ARROW +.. |RightTee| unicode:: U+022A2 .. RIGHT TACK +.. |RightTeeArrow| unicode:: U+021A6 .. RIGHTWARDS ARROW FROM BAR +.. |rightthreetimes| unicode:: U+022CC .. RIGHT SEMIDIRECT PRODUCT +.. |RightTriangle| unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP +.. |RightTriangleEqual| unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +.. |RightUpVector| unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS +.. |RightVector| unicode:: U+021C0 .. RIGHTWARDS HARPOON WITH BARB UPWARDS +.. |risingdotseq| unicode:: U+02253 .. IMAGE OF OR APPROXIMATELY EQUAL TO +.. |rmoustache| unicode:: U+023B1 .. UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +.. |Rrightarrow| unicode:: U+021DB .. RIGHTWARDS TRIPLE ARROW +.. |Rsh| unicode:: U+021B1 .. UPWARDS ARROW WITH TIP RIGHTWARDS +.. |searrow| unicode:: U+02198 .. SOUTH EAST ARROW +.. |setminus| unicode:: U+02216 .. SET MINUS +.. |ShortDownArrow| unicode:: U+02193 .. DOWNWARDS ARROW +.. |ShortLeftArrow| unicode:: U+02190 .. LEFTWARDS ARROW +.. |shortmid| unicode:: U+02223 .. DIVIDES +.. |shortparallel| unicode:: U+02225 .. PARALLEL TO +.. |ShortRightArrow| unicode:: U+02192 .. RIGHTWARDS ARROW +.. |ShortUpArrow| unicode:: U+02191 .. UPWARDS ARROW +.. |simeq| unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO +.. |SmallCircle| unicode:: U+02218 .. RING OPERATOR +.. |smallsetminus| unicode:: U+02216 .. SET MINUS +.. |spadesuit| unicode:: U+02660 .. BLACK SPADE SUIT +.. |Sqrt| unicode:: U+0221A .. SQUARE ROOT +.. |sqsubset| unicode:: U+0228F .. SQUARE IMAGE OF +.. |sqsubseteq| unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO +.. |sqsupset| unicode:: U+02290 .. SQUARE ORIGINAL OF +.. |sqsupseteq| unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO +.. |Square| unicode:: U+025A1 .. WHITE SQUARE +.. |SquareIntersection| unicode:: U+02293 .. SQUARE CAP +.. |SquareSubset| unicode:: U+0228F .. SQUARE IMAGE OF +.. |SquareSubsetEqual| unicode:: U+02291 .. SQUARE IMAGE OF OR EQUAL TO +.. |SquareSuperset| unicode:: U+02290 .. SQUARE ORIGINAL OF +.. |SquareSupersetEqual| unicode:: U+02292 .. SQUARE ORIGINAL OF OR EQUAL TO +.. |SquareUnion| unicode:: U+02294 .. SQUARE CUP +.. |Star| unicode:: U+022C6 .. STAR OPERATOR +.. |straightepsilon| unicode:: U+003F5 .. GREEK LUNATE EPSILON SYMBOL +.. |straightphi| unicode:: U+003D5 .. GREEK PHI SYMBOL +.. |Subset| unicode:: U+022D0 .. DOUBLE SUBSET +.. |subset| unicode:: U+02282 .. SUBSET OF +.. |subseteq| unicode:: U+02286 .. SUBSET OF OR EQUAL TO +.. |subseteqq| unicode:: U+02AC5 .. SUBSET OF ABOVE EQUALS SIGN +.. |SubsetEqual| unicode:: U+02286 .. SUBSET OF OR EQUAL TO +.. |subsetneq| unicode:: U+0228A .. SUBSET OF WITH NOT EQUAL TO +.. |subsetneqq| unicode:: U+02ACB .. SUBSET OF ABOVE NOT EQUAL TO +.. |succ| unicode:: U+0227B .. SUCCEEDS +.. |succapprox| unicode:: U+02AB8 .. SUCCEEDS ABOVE ALMOST EQUAL TO +.. |succcurlyeq| unicode:: U+0227D .. SUCCEEDS OR EQUAL TO +.. |Succeeds| unicode:: U+0227B .. SUCCEEDS +.. |SucceedsEqual| unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +.. |SucceedsSlantEqual| unicode:: U+0227D .. SUCCEEDS OR EQUAL TO +.. |SucceedsTilde| unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO +.. |succeq| unicode:: U+02AB0 .. SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +.. |succnapprox| unicode:: U+02ABA .. SUCCEEDS ABOVE NOT ALMOST EQUAL TO +.. |succneqq| unicode:: U+02AB6 .. SUCCEEDS ABOVE NOT EQUAL TO +.. |succnsim| unicode:: U+022E9 .. SUCCEEDS BUT NOT EQUIVALENT TO +.. |succsim| unicode:: U+0227F .. SUCCEEDS OR EQUIVALENT TO +.. |SuchThat| unicode:: U+0220B .. CONTAINS AS MEMBER +.. |Sum| unicode:: U+02211 .. N-ARY SUMMATION +.. |Superset| unicode:: U+02283 .. SUPERSET OF +.. |SupersetEqual| unicode:: U+02287 .. SUPERSET OF OR EQUAL TO +.. |Supset| unicode:: U+022D1 .. DOUBLE SUPERSET +.. |supset| unicode:: U+02283 .. SUPERSET OF +.. |supseteq| unicode:: U+02287 .. SUPERSET OF OR EQUAL TO +.. |supseteqq| unicode:: U+02AC6 .. SUPERSET OF ABOVE EQUALS SIGN +.. |supsetneq| unicode:: U+0228B .. SUPERSET OF WITH NOT EQUAL TO +.. |supsetneqq| unicode:: U+02ACC .. SUPERSET OF ABOVE NOT EQUAL TO +.. |swarrow| unicode:: U+02199 .. SOUTH WEST ARROW +.. |Therefore| unicode:: U+02234 .. THEREFORE +.. |therefore| unicode:: U+02234 .. THEREFORE +.. |thickapprox| unicode:: U+02248 .. ALMOST EQUAL TO +.. |thicksim| unicode:: U+0223C .. TILDE OPERATOR +.. |ThinSpace| unicode:: U+02009 .. THIN SPACE +.. |Tilde| unicode:: U+0223C .. TILDE OPERATOR +.. |TildeEqual| unicode:: U+02243 .. ASYMPTOTICALLY EQUAL TO +.. |TildeFullEqual| unicode:: U+02245 .. APPROXIMATELY EQUAL TO +.. |TildeTilde| unicode:: U+02248 .. ALMOST EQUAL TO +.. |toea| unicode:: U+02928 .. NORTH EAST ARROW AND SOUTH EAST ARROW +.. |tosa| unicode:: U+02929 .. SOUTH EAST ARROW AND SOUTH WEST ARROW +.. |triangle| unicode:: U+025B5 .. WHITE UP-POINTING SMALL TRIANGLE +.. |triangledown| unicode:: U+025BF .. WHITE DOWN-POINTING SMALL TRIANGLE +.. |triangleleft| unicode:: U+025C3 .. WHITE LEFT-POINTING SMALL TRIANGLE +.. |trianglelefteq| unicode:: U+022B4 .. NORMAL SUBGROUP OF OR EQUAL TO +.. |triangleq| unicode:: U+0225C .. DELTA EQUAL TO +.. |triangleright| unicode:: U+025B9 .. WHITE RIGHT-POINTING SMALL TRIANGLE +.. |trianglerighteq| unicode:: U+022B5 .. CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +.. |TripleDot| unicode:: U+020DB .. COMBINING THREE DOTS ABOVE +.. |twoheadleftarrow| unicode:: U+0219E .. LEFTWARDS TWO HEADED ARROW +.. |twoheadrightarrow| unicode:: U+021A0 .. RIGHTWARDS TWO HEADED ARROW +.. |ulcorner| unicode:: U+0231C .. TOP LEFT CORNER +.. |Union| unicode:: U+022C3 .. N-ARY UNION +.. |UnionPlus| unicode:: U+0228E .. MULTISET UNION +.. |UpArrow| unicode:: U+02191 .. UPWARDS ARROW +.. |Uparrow| unicode:: U+021D1 .. UPWARDS DOUBLE ARROW +.. |uparrow| unicode:: U+02191 .. UPWARDS ARROW +.. |UpArrowDownArrow| unicode:: U+021C5 .. UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +.. |UpDownArrow| unicode:: U+02195 .. UP DOWN ARROW +.. |Updownarrow| unicode:: U+021D5 .. UP DOWN DOUBLE ARROW +.. |updownarrow| unicode:: U+02195 .. UP DOWN ARROW +.. |UpEquilibrium| unicode:: U+0296E .. UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +.. |upharpoonleft| unicode:: U+021BF .. UPWARDS HARPOON WITH BARB LEFTWARDS +.. |upharpoonright| unicode:: U+021BE .. UPWARDS HARPOON WITH BARB RIGHTWARDS +.. |UpperLeftArrow| unicode:: U+02196 .. NORTH WEST ARROW +.. |UpperRightArrow| unicode:: U+02197 .. NORTH EAST ARROW +.. |upsilon| unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON +.. |UpTee| unicode:: U+022A5 .. UP TACK +.. |UpTeeArrow| unicode:: U+021A5 .. UPWARDS ARROW FROM BAR +.. |upuparrows| unicode:: U+021C8 .. UPWARDS PAIRED ARROWS +.. |urcorner| unicode:: U+0231D .. TOP RIGHT CORNER +.. |varepsilon| unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON +.. |varkappa| unicode:: U+003F0 .. GREEK KAPPA SYMBOL +.. |varnothing| unicode:: U+02205 .. EMPTY SET +.. |varphi| unicode:: U+003C6 .. GREEK SMALL LETTER PHI +.. |varpi| unicode:: U+003D6 .. GREEK PI SYMBOL +.. |varpropto| unicode:: U+0221D .. PROPORTIONAL TO +.. |varrho| unicode:: U+003F1 .. GREEK RHO SYMBOL +.. |varsigma| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA +.. |varsubsetneq| unicode:: U+0228A U+0FE00 .. SUBSET OF WITH NOT EQUAL TO - variant with stroke through bottom members +.. |varsubsetneqq| unicode:: U+02ACB U+0FE00 .. SUBSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members +.. |varsupsetneq| unicode:: U+0228B U+0FE00 .. SUPERSET OF WITH NOT EQUAL TO - variant with stroke through bottom members +.. |varsupsetneqq| unicode:: U+02ACC U+0FE00 .. SUPERSET OF ABOVE NOT EQUAL TO - variant with stroke through bottom members +.. |vartheta| unicode:: U+003D1 .. GREEK THETA SYMBOL +.. |vartriangleleft| unicode:: U+022B2 .. NORMAL SUBGROUP OF +.. |vartriangleright| unicode:: U+022B3 .. CONTAINS AS NORMAL SUBGROUP +.. |Vee| unicode:: U+022C1 .. N-ARY LOGICAL OR +.. |vee| unicode:: U+02228 .. LOGICAL OR +.. |Vert| unicode:: U+02016 .. DOUBLE VERTICAL LINE +.. |vert| unicode:: U+0007C .. VERTICAL LINE +.. |VerticalBar| unicode:: U+02223 .. DIVIDES +.. |VerticalTilde| unicode:: U+02240 .. WREATH PRODUCT +.. |VeryThinSpace| unicode:: U+0200A .. HAIR SPACE +.. |Wedge| unicode:: U+022C0 .. N-ARY LOGICAL AND +.. |wedge| unicode:: U+02227 .. LOGICAL AND +.. |wp| unicode:: U+02118 .. SCRIPT CAPITAL P +.. |wr| unicode:: U+02240 .. WREATH PRODUCT +.. |zeetrf| unicode:: U+02128 .. BLACK-LETTER CAPITAL Z diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt new file mode 100644 index 0000000..0177ccc --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt @@ -0,0 +1,113 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |af| unicode:: U+02061 .. FUNCTION APPLICATION +.. |aopf| unicode:: U+1D552 .. MATHEMATICAL DOUBLE-STRUCK SMALL A +.. |asympeq| unicode:: U+0224D .. EQUIVALENT TO +.. |bopf| unicode:: U+1D553 .. MATHEMATICAL DOUBLE-STRUCK SMALL B +.. |copf| unicode:: U+1D554 .. MATHEMATICAL DOUBLE-STRUCK SMALL C +.. |Cross| unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT +.. |DD| unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D +.. |dd| unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D +.. |dopf| unicode:: U+1D555 .. MATHEMATICAL DOUBLE-STRUCK SMALL D +.. |DownArrowBar| unicode:: U+02913 .. DOWNWARDS ARROW TO BAR +.. |DownBreve| unicode:: U+00311 .. COMBINING INVERTED BREVE +.. |DownLeftRightVector| unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON +.. |DownLeftTeeVector| unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +.. |DownLeftVectorBar| unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR +.. |DownRightTeeVector| unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +.. |DownRightVectorBar| unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +.. |ee| unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E +.. |EmptySmallSquare| unicode:: U+025FB .. WHITE MEDIUM SQUARE +.. |EmptyVerySmallSquare| unicode:: U+025AB .. WHITE SMALL SQUARE +.. |eopf| unicode:: U+1D556 .. MATHEMATICAL DOUBLE-STRUCK SMALL E +.. |Equal| unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS +.. |FilledSmallSquare| unicode:: U+025FC .. BLACK MEDIUM SQUARE +.. |FilledVerySmallSquare| unicode:: U+025AA .. BLACK SMALL SQUARE +.. |fopf| unicode:: U+1D557 .. MATHEMATICAL DOUBLE-STRUCK SMALL F +.. |gopf| unicode:: U+1D558 .. MATHEMATICAL DOUBLE-STRUCK SMALL G +.. |GreaterGreater| unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN +.. |Hat| unicode:: U+0005E .. CIRCUMFLEX ACCENT +.. |hopf| unicode:: U+1D559 .. MATHEMATICAL DOUBLE-STRUCK SMALL H +.. |HorizontalLine| unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL +.. |ic| unicode:: U+02063 .. INVISIBLE SEPARATOR +.. |ii| unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I +.. |iopf| unicode:: U+1D55A .. MATHEMATICAL DOUBLE-STRUCK SMALL I +.. |it| unicode:: U+02062 .. INVISIBLE TIMES +.. |jopf| unicode:: U+1D55B .. MATHEMATICAL DOUBLE-STRUCK SMALL J +.. |kopf| unicode:: U+1D55C .. MATHEMATICAL DOUBLE-STRUCK SMALL K +.. |larrb| unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR +.. |LeftDownTeeVector| unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +.. |LeftDownVectorBar| unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR +.. |LeftRightVector| unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON +.. |LeftTeeVector| unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR +.. |LeftTriangleBar| unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR +.. |LeftUpDownVector| unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON +.. |LeftUpTeeVector| unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR +.. |LeftUpVectorBar| unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR +.. |LeftVectorBar| unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR +.. |LessLess| unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN +.. |lopf| unicode:: U+1D55D .. MATHEMATICAL DOUBLE-STRUCK SMALL L +.. |mapstodown| unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR +.. |mapstoleft| unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR +.. |mapstoup| unicode:: U+021A5 .. UPWARDS ARROW FROM BAR +.. |MediumSpace| unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE +.. |mopf| unicode:: U+1D55E .. MATHEMATICAL DOUBLE-STRUCK SMALL M +.. |nbump| unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash +.. |nbumpe| unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash +.. |nesim| unicode:: U+02242 U+00338 .. MINUS TILDE with slash +.. |NewLine| unicode:: U+0000A .. LINE FEED (LF) +.. |NoBreak| unicode:: U+02060 .. WORD JOINER +.. |nopf| unicode:: U+1D55F .. MATHEMATICAL DOUBLE-STRUCK SMALL N +.. |NotCupCap| unicode:: U+0226D .. NOT EQUIVALENT TO +.. |NotHumpEqual| unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash +.. |NotLeftTriangleBar| unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash +.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash +.. |NotNestedLessLess| unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash +.. |NotRightTriangleBar| unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash +.. |NotSquareSubset| unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash +.. |NotSquareSuperset| unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash +.. |NotSucceedsTilde| unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash +.. |oopf| unicode:: U+1D560 .. MATHEMATICAL DOUBLE-STRUCK SMALL O +.. |OverBar| unicode:: U+000AF .. MACRON +.. |OverBrace| unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +.. |OverBracket| unicode:: U+023B4 .. TOP SQUARE BRACKET +.. |OverParenthesis| unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +.. |planckh| unicode:: U+0210E .. PLANCK CONSTANT +.. |popf| unicode:: U+1D561 .. MATHEMATICAL DOUBLE-STRUCK SMALL P +.. |Product| unicode:: U+0220F .. N-ARY PRODUCT +.. |qopf| unicode:: U+1D562 .. MATHEMATICAL DOUBLE-STRUCK SMALL Q +.. |rarrb| unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR +.. |RightDownTeeVector| unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +.. |RightDownVectorBar| unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +.. |RightTeeVector| unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR +.. |RightTriangleBar| unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE +.. |RightUpDownVector| unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON +.. |RightUpTeeVector| unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR +.. |RightUpVectorBar| unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR +.. |RightVectorBar| unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR +.. |ropf| unicode:: U+1D563 .. MATHEMATICAL DOUBLE-STRUCK SMALL R +.. |RoundImplies| unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD +.. |RuleDelayed| unicode:: U+029F4 .. RULE-DELAYED +.. |sopf| unicode:: U+1D564 .. MATHEMATICAL DOUBLE-STRUCK SMALL S +.. |Tab| unicode:: U+00009 .. CHARACTER TABULATION +.. |ThickSpace| unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em +.. |topf| unicode:: U+1D565 .. MATHEMATICAL DOUBLE-STRUCK SMALL T +.. |UnderBar| unicode:: U+00332 .. COMBINING LOW LINE +.. |UnderBrace| unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +.. |UnderBracket| unicode:: U+023B5 .. BOTTOM SQUARE BRACKET +.. |UnderParenthesis| unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +.. |uopf| unicode:: U+1D566 .. MATHEMATICAL DOUBLE-STRUCK SMALL U +.. |UpArrowBar| unicode:: U+02912 .. UPWARDS ARROW TO BAR +.. |Upsilon| unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON +.. |VerticalLine| unicode:: U+0007C .. VERTICAL LINE +.. |VerticalSeparator| unicode:: U+02758 .. LIGHT VERTICAL BAR +.. |vopf| unicode:: U+1D567 .. MATHEMATICAL DOUBLE-STRUCK SMALL V +.. |wopf| unicode:: U+1D568 .. MATHEMATICAL DOUBLE-STRUCK SMALL W +.. |xopf| unicode:: U+1D569 .. MATHEMATICAL DOUBLE-STRUCK SMALL X +.. |yopf| unicode:: U+1D56A .. MATHEMATICAL DOUBLE-STRUCK SMALL Y +.. |ZeroWidthSpace| unicode:: U+0200B .. ZERO WIDTH SPACE +.. |zopf| unicode:: U+1D56B .. MATHEMATICAL DOUBLE-STRUCK SMALL Z diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra.txt new file mode 100644 index 0000000..790a977 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra.txt @@ -0,0 +1,87 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |af| unicode:: U+02061 .. FUNCTION APPLICATION +.. |asympeq| unicode:: U+0224D .. EQUIVALENT TO +.. |Cross| unicode:: U+02A2F .. VECTOR OR CROSS PRODUCT +.. |DD| unicode:: U+02145 .. DOUBLE-STRUCK ITALIC CAPITAL D +.. |dd| unicode:: U+02146 .. DOUBLE-STRUCK ITALIC SMALL D +.. |DownArrowBar| unicode:: U+02913 .. DOWNWARDS ARROW TO BAR +.. |DownBreve| unicode:: U+00311 .. COMBINING INVERTED BREVE +.. |DownLeftRightVector| unicode:: U+02950 .. LEFT BARB DOWN RIGHT BARB DOWN HARPOON +.. |DownLeftTeeVector| unicode:: U+0295E .. LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +.. |DownLeftVectorBar| unicode:: U+02956 .. LEFTWARDS HARPOON WITH BARB DOWN TO BAR +.. |DownRightTeeVector| unicode:: U+0295F .. RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +.. |DownRightVectorBar| unicode:: U+02957 .. RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +.. |ee| unicode:: U+02147 .. DOUBLE-STRUCK ITALIC SMALL E +.. |EmptySmallSquare| unicode:: U+025FB .. WHITE MEDIUM SQUARE +.. |EmptyVerySmallSquare| unicode:: U+025AB .. WHITE SMALL SQUARE +.. |Equal| unicode:: U+02A75 .. TWO CONSECUTIVE EQUALS SIGNS +.. |FilledSmallSquare| unicode:: U+025FC .. BLACK MEDIUM SQUARE +.. |FilledVerySmallSquare| unicode:: U+025AA .. BLACK SMALL SQUARE +.. |GreaterGreater| unicode:: U+02AA2 .. DOUBLE NESTED GREATER-THAN +.. |Hat| unicode:: U+0005E .. CIRCUMFLEX ACCENT +.. |HorizontalLine| unicode:: U+02500 .. BOX DRAWINGS LIGHT HORIZONTAL +.. |ic| unicode:: U+02063 .. INVISIBLE SEPARATOR +.. |ii| unicode:: U+02148 .. DOUBLE-STRUCK ITALIC SMALL I +.. |it| unicode:: U+02062 .. INVISIBLE TIMES +.. |larrb| unicode:: U+021E4 .. LEFTWARDS ARROW TO BAR +.. |LeftDownTeeVector| unicode:: U+02961 .. DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +.. |LeftDownVectorBar| unicode:: U+02959 .. DOWNWARDS HARPOON WITH BARB LEFT TO BAR +.. |LeftRightVector| unicode:: U+0294E .. LEFT BARB UP RIGHT BARB UP HARPOON +.. |LeftTeeVector| unicode:: U+0295A .. LEFTWARDS HARPOON WITH BARB UP FROM BAR +.. |LeftTriangleBar| unicode:: U+029CF .. LEFT TRIANGLE BESIDE VERTICAL BAR +.. |LeftUpDownVector| unicode:: U+02951 .. UP BARB LEFT DOWN BARB LEFT HARPOON +.. |LeftUpTeeVector| unicode:: U+02960 .. UPWARDS HARPOON WITH BARB LEFT FROM BAR +.. |LeftUpVectorBar| unicode:: U+02958 .. UPWARDS HARPOON WITH BARB LEFT TO BAR +.. |LeftVectorBar| unicode:: U+02952 .. LEFTWARDS HARPOON WITH BARB UP TO BAR +.. |LessLess| unicode:: U+02AA1 .. DOUBLE NESTED LESS-THAN +.. |mapstodown| unicode:: U+021A7 .. DOWNWARDS ARROW FROM BAR +.. |mapstoleft| unicode:: U+021A4 .. LEFTWARDS ARROW FROM BAR +.. |mapstoup| unicode:: U+021A5 .. UPWARDS ARROW FROM BAR +.. |MediumSpace| unicode:: U+0205F .. MEDIUM MATHEMATICAL SPACE +.. |nbump| unicode:: U+0224E U+00338 .. GEOMETRICALLY EQUIVALENT TO with slash +.. |nbumpe| unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash +.. |nesim| unicode:: U+02242 U+00338 .. MINUS TILDE with slash +.. |NewLine| unicode:: U+0000A .. LINE FEED (LF) +.. |NoBreak| unicode:: U+02060 .. WORD JOINER +.. |NotCupCap| unicode:: U+0226D .. NOT EQUIVALENT TO +.. |NotHumpEqual| unicode:: U+0224F U+00338 .. DIFFERENCE BETWEEN with slash +.. |NotLeftTriangleBar| unicode:: U+029CF U+00338 .. LEFT TRIANGLE BESIDE VERTICAL BAR with slash +.. |NotNestedGreaterGreater| unicode:: U+02AA2 U+00338 .. DOUBLE NESTED GREATER-THAN with slash +.. |NotNestedLessLess| unicode:: U+02AA1 U+00338 .. DOUBLE NESTED LESS-THAN with slash +.. |NotRightTriangleBar| unicode:: U+029D0 U+00338 .. VERTICAL BAR BESIDE RIGHT TRIANGLE with slash +.. |NotSquareSubset| unicode:: U+0228F U+00338 .. SQUARE IMAGE OF with slash +.. |NotSquareSuperset| unicode:: U+02290 U+00338 .. SQUARE ORIGINAL OF with slash +.. |NotSucceedsTilde| unicode:: U+0227F U+00338 .. SUCCEEDS OR EQUIVALENT TO with slash +.. |OverBar| unicode:: U+000AF .. MACRON +.. |OverBrace| unicode:: U+0FE37 .. PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +.. |OverBracket| unicode:: U+023B4 .. TOP SQUARE BRACKET +.. |OverParenthesis| unicode:: U+0FE35 .. PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +.. |planckh| unicode:: U+0210E .. PLANCK CONSTANT +.. |Product| unicode:: U+0220F .. N-ARY PRODUCT +.. |rarrb| unicode:: U+021E5 .. RIGHTWARDS ARROW TO BAR +.. |RightDownTeeVector| unicode:: U+0295D .. DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +.. |RightDownVectorBar| unicode:: U+02955 .. DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +.. |RightTeeVector| unicode:: U+0295B .. RIGHTWARDS HARPOON WITH BARB UP FROM BAR +.. |RightTriangleBar| unicode:: U+029D0 .. VERTICAL BAR BESIDE RIGHT TRIANGLE +.. |RightUpDownVector| unicode:: U+0294F .. UP BARB RIGHT DOWN BARB RIGHT HARPOON +.. |RightUpTeeVector| unicode:: U+0295C .. UPWARDS HARPOON WITH BARB RIGHT FROM BAR +.. |RightUpVectorBar| unicode:: U+02954 .. UPWARDS HARPOON WITH BARB RIGHT TO BAR +.. |RightVectorBar| unicode:: U+02953 .. RIGHTWARDS HARPOON WITH BARB UP TO BAR +.. |RoundImplies| unicode:: U+02970 .. RIGHT DOUBLE ARROW WITH ROUNDED HEAD +.. |RuleDelayed| unicode:: U+029F4 .. RULE-DELAYED +.. |Tab| unicode:: U+00009 .. CHARACTER TABULATION +.. |ThickSpace| unicode:: U+02009 U+0200A U+0200A .. space of width 5/18 em +.. |UnderBar| unicode:: U+00332 .. COMBINING LOW LINE +.. |UnderBrace| unicode:: U+0FE38 .. PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +.. |UnderBracket| unicode:: U+023B5 .. BOTTOM SQUARE BRACKET +.. |UnderParenthesis| unicode:: U+0FE36 .. PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +.. |UpArrowBar| unicode:: U+02912 .. UPWARDS ARROW TO BAR +.. |Upsilon| unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON +.. |VerticalLine| unicode:: U+0007C .. VERTICAL LINE +.. |VerticalSeparator| unicode:: U+02758 .. LIGHT VERTICAL BAR +.. |ZeroWidthSpace| unicode:: U+0200B .. ZERO WIDTH SPACE diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/s5defs.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/s5defs.txt new file mode 100644 index 0000000..8aceeac --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/s5defs.txt @@ -0,0 +1,68 @@ +.. Definitions of interpreted text roles (classes) for S5/HTML data. +.. This data file has been placed in the public domain. + +.. Colours + ======= + +.. role:: black +.. role:: gray +.. role:: silver +.. role:: white + +.. role:: maroon +.. role:: red +.. role:: magenta +.. role:: fuchsia +.. role:: pink +.. role:: orange +.. role:: yellow +.. role:: lime +.. role:: green +.. role:: olive +.. role:: teal +.. role:: cyan +.. role:: aqua +.. role:: blue +.. role:: navy +.. role:: purple + + +.. Text Sizes + ========== + +.. role:: huge +.. role:: big +.. role:: small +.. role:: tiny + + +.. Display in Slides (Presentation Mode) Only + ========================================== + +.. role:: slide + :class: slide-display + + +.. Display in Outline Mode Only + ============================ + +.. role:: outline + + +.. Display in Print Only + ===================== + +.. role:: print + + +.. Display in Handout Mode Only + ============================ + +.. role:: handout + + +.. Incremental Display + =================== + +.. role:: incremental +.. default-role:: incremental diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt new file mode 100644 index 0000000..824dc61 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt @@ -0,0 +1,102 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |Aacute| unicode:: U+000C1 .. LATIN CAPITAL LETTER A WITH ACUTE +.. |aacute| unicode:: U+000E1 .. LATIN SMALL LETTER A WITH ACUTE +.. |Acirc| unicode:: U+000C2 .. LATIN CAPITAL LETTER A WITH CIRCUMFLEX +.. |acirc| unicode:: U+000E2 .. LATIN SMALL LETTER A WITH CIRCUMFLEX +.. |acute| unicode:: U+000B4 .. ACUTE ACCENT +.. |AElig| unicode:: U+000C6 .. LATIN CAPITAL LETTER AE +.. |aelig| unicode:: U+000E6 .. LATIN SMALL LETTER AE +.. |Agrave| unicode:: U+000C0 .. LATIN CAPITAL LETTER A WITH GRAVE +.. |agrave| unicode:: U+000E0 .. LATIN SMALL LETTER A WITH GRAVE +.. |Aring| unicode:: U+000C5 .. LATIN CAPITAL LETTER A WITH RING ABOVE +.. |aring| unicode:: U+000E5 .. LATIN SMALL LETTER A WITH RING ABOVE +.. |Atilde| unicode:: U+000C3 .. LATIN CAPITAL LETTER A WITH TILDE +.. |atilde| unicode:: U+000E3 .. LATIN SMALL LETTER A WITH TILDE +.. |Auml| unicode:: U+000C4 .. LATIN CAPITAL LETTER A WITH DIAERESIS +.. |auml| unicode:: U+000E4 .. LATIN SMALL LETTER A WITH DIAERESIS +.. |brvbar| unicode:: U+000A6 .. BROKEN BAR +.. |Ccedil| unicode:: U+000C7 .. LATIN CAPITAL LETTER C WITH CEDILLA +.. |ccedil| unicode:: U+000E7 .. LATIN SMALL LETTER C WITH CEDILLA +.. |cedil| unicode:: U+000B8 .. CEDILLA +.. |cent| unicode:: U+000A2 .. CENT SIGN +.. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN +.. |curren| unicode:: U+000A4 .. CURRENCY SIGN +.. |deg| unicode:: U+000B0 .. DEGREE SIGN +.. |divide| unicode:: U+000F7 .. DIVISION SIGN +.. |Eacute| unicode:: U+000C9 .. LATIN CAPITAL LETTER E WITH ACUTE +.. |eacute| unicode:: U+000E9 .. LATIN SMALL LETTER E WITH ACUTE +.. |Ecirc| unicode:: U+000CA .. LATIN CAPITAL LETTER E WITH CIRCUMFLEX +.. |ecirc| unicode:: U+000EA .. LATIN SMALL LETTER E WITH CIRCUMFLEX +.. |Egrave| unicode:: U+000C8 .. LATIN CAPITAL LETTER E WITH GRAVE +.. |egrave| unicode:: U+000E8 .. LATIN SMALL LETTER E WITH GRAVE +.. |ETH| unicode:: U+000D0 .. LATIN CAPITAL LETTER ETH +.. |eth| unicode:: U+000F0 .. LATIN SMALL LETTER ETH +.. |Euml| unicode:: U+000CB .. LATIN CAPITAL LETTER E WITH DIAERESIS +.. |euml| unicode:: U+000EB .. LATIN SMALL LETTER E WITH DIAERESIS +.. |frac12| unicode:: U+000BD .. VULGAR FRACTION ONE HALF +.. |frac14| unicode:: U+000BC .. VULGAR FRACTION ONE QUARTER +.. |frac34| unicode:: U+000BE .. VULGAR FRACTION THREE QUARTERS +.. |Iacute| unicode:: U+000CD .. LATIN CAPITAL LETTER I WITH ACUTE +.. |iacute| unicode:: U+000ED .. LATIN SMALL LETTER I WITH ACUTE +.. |Icirc| unicode:: U+000CE .. LATIN CAPITAL LETTER I WITH CIRCUMFLEX +.. |icirc| unicode:: U+000EE .. LATIN SMALL LETTER I WITH CIRCUMFLEX +.. |iexcl| unicode:: U+000A1 .. INVERTED EXCLAMATION MARK +.. |Igrave| unicode:: U+000CC .. LATIN CAPITAL LETTER I WITH GRAVE +.. |igrave| unicode:: U+000EC .. LATIN SMALL LETTER I WITH GRAVE +.. |iquest| unicode:: U+000BF .. INVERTED QUESTION MARK +.. |Iuml| unicode:: U+000CF .. LATIN CAPITAL LETTER I WITH DIAERESIS +.. |iuml| unicode:: U+000EF .. LATIN SMALL LETTER I WITH DIAERESIS +.. |laquo| unicode:: U+000AB .. LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +.. |macr| unicode:: U+000AF .. MACRON +.. |micro| unicode:: U+000B5 .. MICRO SIGN +.. |middot| unicode:: U+000B7 .. MIDDLE DOT +.. |nbsp| unicode:: U+000A0 .. NO-BREAK SPACE +.. |not| unicode:: U+000AC .. NOT SIGN +.. |Ntilde| unicode:: U+000D1 .. LATIN CAPITAL LETTER N WITH TILDE +.. |ntilde| unicode:: U+000F1 .. LATIN SMALL LETTER N WITH TILDE +.. |Oacute| unicode:: U+000D3 .. LATIN CAPITAL LETTER O WITH ACUTE +.. |oacute| unicode:: U+000F3 .. LATIN SMALL LETTER O WITH ACUTE +.. |Ocirc| unicode:: U+000D4 .. LATIN CAPITAL LETTER O WITH CIRCUMFLEX +.. |ocirc| unicode:: U+000F4 .. LATIN SMALL LETTER O WITH CIRCUMFLEX +.. |Ograve| unicode:: U+000D2 .. LATIN CAPITAL LETTER O WITH GRAVE +.. |ograve| unicode:: U+000F2 .. LATIN SMALL LETTER O WITH GRAVE +.. |ordf| unicode:: U+000AA .. FEMININE ORDINAL INDICATOR +.. |ordm| unicode:: U+000BA .. MASCULINE ORDINAL INDICATOR +.. |Oslash| unicode:: U+000D8 .. LATIN CAPITAL LETTER O WITH STROKE +.. |oslash| unicode:: U+000F8 .. LATIN SMALL LETTER O WITH STROKE +.. |Otilde| unicode:: U+000D5 .. LATIN CAPITAL LETTER O WITH TILDE +.. |otilde| unicode:: U+000F5 .. LATIN SMALL LETTER O WITH TILDE +.. |Ouml| unicode:: U+000D6 .. LATIN CAPITAL LETTER O WITH DIAERESIS +.. |ouml| unicode:: U+000F6 .. LATIN SMALL LETTER O WITH DIAERESIS +.. |para| unicode:: U+000B6 .. PILCROW SIGN +.. |plusmn| unicode:: U+000B1 .. PLUS-MINUS SIGN +.. |pound| unicode:: U+000A3 .. POUND SIGN +.. |raquo| unicode:: U+000BB .. RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +.. |reg| unicode:: U+000AE .. REGISTERED SIGN +.. |sect| unicode:: U+000A7 .. SECTION SIGN +.. |shy| unicode:: U+000AD .. SOFT HYPHEN +.. |sup1| unicode:: U+000B9 .. SUPERSCRIPT ONE +.. |sup2| unicode:: U+000B2 .. SUPERSCRIPT TWO +.. |sup3| unicode:: U+000B3 .. SUPERSCRIPT THREE +.. |szlig| unicode:: U+000DF .. LATIN SMALL LETTER SHARP S +.. |THORN| unicode:: U+000DE .. LATIN CAPITAL LETTER THORN +.. |thorn| unicode:: U+000FE .. LATIN SMALL LETTER THORN +.. |times| unicode:: U+000D7 .. MULTIPLICATION SIGN +.. |Uacute| unicode:: U+000DA .. LATIN CAPITAL LETTER U WITH ACUTE +.. |uacute| unicode:: U+000FA .. LATIN SMALL LETTER U WITH ACUTE +.. |Ucirc| unicode:: U+000DB .. LATIN CAPITAL LETTER U WITH CIRCUMFLEX +.. |ucirc| unicode:: U+000FB .. LATIN SMALL LETTER U WITH CIRCUMFLEX +.. |Ugrave| unicode:: U+000D9 .. LATIN CAPITAL LETTER U WITH GRAVE +.. |ugrave| unicode:: U+000F9 .. LATIN SMALL LETTER U WITH GRAVE +.. |uml| unicode:: U+000A8 .. DIAERESIS +.. |Uuml| unicode:: U+000DC .. LATIN CAPITAL LETTER U WITH DIAERESIS +.. |uuml| unicode:: U+000FC .. LATIN SMALL LETTER U WITH DIAERESIS +.. |Yacute| unicode:: U+000DD .. LATIN CAPITAL LETTER Y WITH ACUTE +.. |yacute| unicode:: U+000FD .. LATIN SMALL LETTER Y WITH ACUTE +.. |yen| unicode:: U+000A5 .. YEN SIGN +.. |yuml| unicode:: U+000FF .. LATIN SMALL LETTER Y WITH DIAERESIS diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-special.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-special.txt new file mode 100644 index 0000000..dc6f575 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-special.txt @@ -0,0 +1,37 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |bdquo| unicode:: U+0201E .. DOUBLE LOW-9 QUOTATION MARK +.. |circ| unicode:: U+002C6 .. MODIFIER LETTER CIRCUMFLEX ACCENT +.. |Dagger| unicode:: U+02021 .. DOUBLE DAGGER +.. |dagger| unicode:: U+02020 .. DAGGER +.. |emsp| unicode:: U+02003 .. EM SPACE +.. |ensp| unicode:: U+02002 .. EN SPACE +.. |euro| unicode:: U+020AC .. EURO SIGN +.. |gt| unicode:: U+0003E .. GREATER-THAN SIGN +.. |ldquo| unicode:: U+0201C .. LEFT DOUBLE QUOTATION MARK +.. |lrm| unicode:: U+0200E .. LEFT-TO-RIGHT MARK +.. |lsaquo| unicode:: U+02039 .. SINGLE LEFT-POINTING ANGLE QUOTATION MARK +.. |lsquo| unicode:: U+02018 .. LEFT SINGLE QUOTATION MARK +.. |lt| unicode:: U+0003C .. LESS-THAN SIGN +.. |mdash| unicode:: U+02014 .. EM DASH +.. |ndash| unicode:: U+02013 .. EN DASH +.. |OElig| unicode:: U+00152 .. LATIN CAPITAL LIGATURE OE +.. |oelig| unicode:: U+00153 .. LATIN SMALL LIGATURE OE +.. |permil| unicode:: U+02030 .. PER MILLE SIGN +.. |quot| unicode:: U+00022 .. QUOTATION MARK +.. |rdquo| unicode:: U+0201D .. RIGHT DOUBLE QUOTATION MARK +.. |rlm| unicode:: U+0200F .. RIGHT-TO-LEFT MARK +.. |rsaquo| unicode:: U+0203A .. SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +.. |rsquo| unicode:: U+02019 .. RIGHT SINGLE QUOTATION MARK +.. |sbquo| unicode:: U+0201A .. SINGLE LOW-9 QUOTATION MARK +.. |Scaron| unicode:: U+00160 .. LATIN CAPITAL LETTER S WITH CARON +.. |scaron| unicode:: U+00161 .. LATIN SMALL LETTER S WITH CARON +.. |thinsp| unicode:: U+02009 .. THIN SPACE +.. |tilde| unicode:: U+002DC .. SMALL TILDE +.. |Yuml| unicode:: U+00178 .. LATIN CAPITAL LETTER Y WITH DIAERESIS +.. |zwj| unicode:: U+0200D .. ZERO WIDTH JOINER +.. |zwnj| unicode:: U+0200C .. ZERO WIDTH NON-JOINER diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt b/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt new file mode 100644 index 0000000..8fe97f8 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt @@ -0,0 +1,130 @@ +.. This data file has been placed in the public domain. +.. Derived from the Unicode character mappings available from + . + Processed by unicode2rstsubs.py, part of Docutils: + . + +.. |alefsym| unicode:: U+02135 .. ALEF SYMBOL +.. |Alpha| unicode:: U+00391 .. GREEK CAPITAL LETTER ALPHA +.. |alpha| unicode:: U+003B1 .. GREEK SMALL LETTER ALPHA +.. |and| unicode:: U+02227 .. LOGICAL AND +.. |ang| unicode:: U+02220 .. ANGLE +.. |asymp| unicode:: U+02248 .. ALMOST EQUAL TO +.. |Beta| unicode:: U+00392 .. GREEK CAPITAL LETTER BETA +.. |beta| unicode:: U+003B2 .. GREEK SMALL LETTER BETA +.. |bull| unicode:: U+02022 .. BULLET +.. |cap| unicode:: U+02229 .. INTERSECTION +.. |Chi| unicode:: U+003A7 .. GREEK CAPITAL LETTER CHI +.. |chi| unicode:: U+003C7 .. GREEK SMALL LETTER CHI +.. |clubs| unicode:: U+02663 .. BLACK CLUB SUIT +.. |cong| unicode:: U+02245 .. APPROXIMATELY EQUAL TO +.. |crarr| unicode:: U+021B5 .. DOWNWARDS ARROW WITH CORNER LEFTWARDS +.. |cup| unicode:: U+0222A .. UNION +.. |dArr| unicode:: U+021D3 .. DOWNWARDS DOUBLE ARROW +.. |darr| unicode:: U+02193 .. DOWNWARDS ARROW +.. |Delta| unicode:: U+00394 .. GREEK CAPITAL LETTER DELTA +.. |delta| unicode:: U+003B4 .. GREEK SMALL LETTER DELTA +.. |diams| unicode:: U+02666 .. BLACK DIAMOND SUIT +.. |empty| unicode:: U+02205 .. EMPTY SET +.. |Epsilon| unicode:: U+00395 .. GREEK CAPITAL LETTER EPSILON +.. |epsilon| unicode:: U+003B5 .. GREEK SMALL LETTER EPSILON +.. |equiv| unicode:: U+02261 .. IDENTICAL TO +.. |Eta| unicode:: U+00397 .. GREEK CAPITAL LETTER ETA +.. |eta| unicode:: U+003B7 .. GREEK SMALL LETTER ETA +.. |exist| unicode:: U+02203 .. THERE EXISTS +.. |fnof| unicode:: U+00192 .. LATIN SMALL LETTER F WITH HOOK +.. |forall| unicode:: U+02200 .. FOR ALL +.. |frasl| unicode:: U+02044 .. FRACTION SLASH +.. |Gamma| unicode:: U+00393 .. GREEK CAPITAL LETTER GAMMA +.. |gamma| unicode:: U+003B3 .. GREEK SMALL LETTER GAMMA +.. |ge| unicode:: U+02265 .. GREATER-THAN OR EQUAL TO +.. |hArr| unicode:: U+021D4 .. LEFT RIGHT DOUBLE ARROW +.. |harr| unicode:: U+02194 .. LEFT RIGHT ARROW +.. |hearts| unicode:: U+02665 .. BLACK HEART SUIT +.. |hellip| unicode:: U+02026 .. HORIZONTAL ELLIPSIS +.. |image| unicode:: U+02111 .. BLACK-LETTER CAPITAL I +.. |infin| unicode:: U+0221E .. INFINITY +.. |int| unicode:: U+0222B .. INTEGRAL +.. |Iota| unicode:: U+00399 .. GREEK CAPITAL LETTER IOTA +.. |iota| unicode:: U+003B9 .. GREEK SMALL LETTER IOTA +.. |isin| unicode:: U+02208 .. ELEMENT OF +.. |Kappa| unicode:: U+0039A .. GREEK CAPITAL LETTER KAPPA +.. |kappa| unicode:: U+003BA .. GREEK SMALL LETTER KAPPA +.. |Lambda| unicode:: U+0039B .. GREEK CAPITAL LETTER LAMDA +.. |lambda| unicode:: U+003BB .. GREEK SMALL LETTER LAMDA +.. |lang| unicode:: U+02329 .. LEFT-POINTING ANGLE BRACKET +.. |lArr| unicode:: U+021D0 .. LEFTWARDS DOUBLE ARROW +.. |larr| unicode:: U+02190 .. LEFTWARDS ARROW +.. |lceil| unicode:: U+02308 .. LEFT CEILING +.. |le| unicode:: U+02264 .. LESS-THAN OR EQUAL TO +.. |lfloor| unicode:: U+0230A .. LEFT FLOOR +.. |lowast| unicode:: U+02217 .. ASTERISK OPERATOR +.. |loz| unicode:: U+025CA .. LOZENGE +.. |minus| unicode:: U+02212 .. MINUS SIGN +.. |Mu| unicode:: U+0039C .. GREEK CAPITAL LETTER MU +.. |mu| unicode:: U+003BC .. GREEK SMALL LETTER MU +.. |nabla| unicode:: U+02207 .. NABLA +.. |ne| unicode:: U+02260 .. NOT EQUAL TO +.. |ni| unicode:: U+0220B .. CONTAINS AS MEMBER +.. |notin| unicode:: U+02209 .. NOT AN ELEMENT OF +.. |nsub| unicode:: U+02284 .. NOT A SUBSET OF +.. |Nu| unicode:: U+0039D .. GREEK CAPITAL LETTER NU +.. |nu| unicode:: U+003BD .. GREEK SMALL LETTER NU +.. |oline| unicode:: U+0203E .. OVERLINE +.. |Omega| unicode:: U+003A9 .. GREEK CAPITAL LETTER OMEGA +.. |omega| unicode:: U+003C9 .. GREEK SMALL LETTER OMEGA +.. |Omicron| unicode:: U+0039F .. GREEK CAPITAL LETTER OMICRON +.. |omicron| unicode:: U+003BF .. GREEK SMALL LETTER OMICRON +.. |oplus| unicode:: U+02295 .. CIRCLED PLUS +.. |or| unicode:: U+02228 .. LOGICAL OR +.. |otimes| unicode:: U+02297 .. CIRCLED TIMES +.. |part| unicode:: U+02202 .. PARTIAL DIFFERENTIAL +.. |perp| unicode:: U+022A5 .. UP TACK +.. |Phi| unicode:: U+003A6 .. GREEK CAPITAL LETTER PHI +.. |phi| unicode:: U+003D5 .. GREEK PHI SYMBOL +.. |Pi| unicode:: U+003A0 .. GREEK CAPITAL LETTER PI +.. |pi| unicode:: U+003C0 .. GREEK SMALL LETTER PI +.. |piv| unicode:: U+003D6 .. GREEK PI SYMBOL +.. |Prime| unicode:: U+02033 .. DOUBLE PRIME +.. |prime| unicode:: U+02032 .. PRIME +.. |prod| unicode:: U+0220F .. N-ARY PRODUCT +.. |prop| unicode:: U+0221D .. PROPORTIONAL TO +.. |Psi| unicode:: U+003A8 .. GREEK CAPITAL LETTER PSI +.. |psi| unicode:: U+003C8 .. GREEK SMALL LETTER PSI +.. |radic| unicode:: U+0221A .. SQUARE ROOT +.. |rang| unicode:: U+0232A .. RIGHT-POINTING ANGLE BRACKET +.. |rArr| unicode:: U+021D2 .. RIGHTWARDS DOUBLE ARROW +.. |rarr| unicode:: U+02192 .. RIGHTWARDS ARROW +.. |rceil| unicode:: U+02309 .. RIGHT CEILING +.. |real| unicode:: U+0211C .. BLACK-LETTER CAPITAL R +.. |rfloor| unicode:: U+0230B .. RIGHT FLOOR +.. |Rho| unicode:: U+003A1 .. GREEK CAPITAL LETTER RHO +.. |rho| unicode:: U+003C1 .. GREEK SMALL LETTER RHO +.. |sdot| unicode:: U+022C5 .. DOT OPERATOR +.. |Sigma| unicode:: U+003A3 .. GREEK CAPITAL LETTER SIGMA +.. |sigma| unicode:: U+003C3 .. GREEK SMALL LETTER SIGMA +.. |sigmaf| unicode:: U+003C2 .. GREEK SMALL LETTER FINAL SIGMA +.. |sim| unicode:: U+0223C .. TILDE OPERATOR +.. |spades| unicode:: U+02660 .. BLACK SPADE SUIT +.. |sub| unicode:: U+02282 .. SUBSET OF +.. |sube| unicode:: U+02286 .. SUBSET OF OR EQUAL TO +.. |sum| unicode:: U+02211 .. N-ARY SUMMATION +.. |sup| unicode:: U+02283 .. SUPERSET OF +.. |supe| unicode:: U+02287 .. SUPERSET OF OR EQUAL TO +.. |Tau| unicode:: U+003A4 .. GREEK CAPITAL LETTER TAU +.. |tau| unicode:: U+003C4 .. GREEK SMALL LETTER TAU +.. |there4| unicode:: U+02234 .. THEREFORE +.. |Theta| unicode:: U+00398 .. GREEK CAPITAL LETTER THETA +.. |theta| unicode:: U+003B8 .. GREEK SMALL LETTER THETA +.. |thetasym| unicode:: U+003D1 .. GREEK THETA SYMBOL +.. |trade| unicode:: U+02122 .. TRADE MARK SIGN +.. |uArr| unicode:: U+021D1 .. UPWARDS DOUBLE ARROW +.. |uarr| unicode:: U+02191 .. UPWARDS ARROW +.. |upsih| unicode:: U+003D2 .. GREEK UPSILON WITH HOOK SYMBOL +.. |Upsilon| unicode:: U+003A5 .. GREEK CAPITAL LETTER UPSILON +.. |upsilon| unicode:: U+003C5 .. GREEK SMALL LETTER UPSILON +.. |weierp| unicode:: U+02118 .. SCRIPT CAPITAL P +.. |Xi| unicode:: U+0039E .. GREEK CAPITAL LETTER XI +.. |xi| unicode:: U+003BE .. GREEK SMALL LETTER XI +.. |Zeta| unicode:: U+00396 .. GREEK CAPITAL LETTER ZETA +.. |zeta| unicode:: U+003B6 .. GREEK SMALL LETTER ZETA diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__init__.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__init__.py new file mode 100644 index 0000000..9b3297e --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__init__.py @@ -0,0 +1,36 @@ +# $Id: __init__.py 8376 2019-08-27 19:49:29Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +# Internationalization details are documented in +# . + +""" +This package contains modules for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + +import sys + +from docutils.utils import normalize_language_tag + + +_languages = {} + +def get_language(language_code): + for tag in normalize_language_tag(language_code): + tag = tag.replace('-', '_') # '-' not valid in module names + if tag in _languages: + return _languages[tag] + try: + module = __import__(tag, globals(), locals(), level=1) + except ImportError: + try: + module = __import__(tag, globals(), locals(), level=0) + except ImportError: + continue + _languages[tag] = module + return module + return None diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b6e08893dd1b7abd419ec74625708af8e36f18c GIT binary patch literal 799 zcmZ8gOOMkq5FR^^Mxk964yy%m$hFe8kvOjq5+H$)_R=C~Bow8w+l}fx)^>qb-BS@K zxbXvk8{!}3%4z=qhdnV)A6l)W8PDUhXFl6`)9LttKg zh-}H@-L|n#rYSLi?LdyuMtO#!excH^f;D*#@4sJ?75PCJvinJmt?A5_Cz`Iv1E4@) z0Lx=-VccGWcGkcwW`DCU>02mX+MwN;FTWDRk=rYd`esmQQu*FC!?y_&>Vh6wU>1pmN=Y`m5A!RAMR@B*_SXwe(TX=4@ySb>}An#(0>(`;qtFX$d-n=k(%31H@ zIp?A`TaL$z$Fn?SWjfcHP+^rw#ia_R(&27n6=FL@hRyV=Mctlqy>Imhw^xr)0cqps zp-^&64z~I}Mm!?#VZPg{TXBqa;yCIw20o%ZF$^uWP|?Azg?`gWb2!q&h0W@Q#|?Fe XiP}5e(0pQG%KQzsV^fc|Et~!aoovt) literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/af.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/af.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a39db35b0c195eabd24a86c40cd3fc9cf974e15 GIT binary patch literal 2350 zcma)8Uvt|;5O-o(j-5DZ(m%8$Z5&FWDOC-nQ2vzCGQ%qm6kcwI$(*z+`9{)7y+3iI z&(a588D97#d;mQ$!?(y2dvaqNW;De+mT&j=Zuj>0yOn<)jfNfi{O)a>{IcEY{Oy$0 zPe95u`szRE0Ug$XHMR!p&;<{A;6ooaU;sndge@4sHtfJ9*o8f~3|HVPT!VMuI^2MF zVIL0QCftHU7{d{~2e;vUxC0-+hj5qV81BJGa36x#_t`o;AeoSO@G;3JBo9eGZR8O= zg3m}khsW>*#rhJyg0JBTd;?G6+eQxI+3PXu!t)oMRz<{ZKyAl~LDyjggTy zul*@iO{E#qOfMW=pfUG6}p=h}{#pCi1;pGC73Ejmob$J3d3AG6>y~M@X;7pniR@gf>+Wz{JPZ|{iiWnV&m&dHvz#s@ z@$3~FXdCKCiPEr5ZA)T&qf|T183KhdDwGjcqY}$iRmIU#B~s<(lxv}DpLkqQnfq^= zOSL0;PQ7Ni(`7DQ28Got#yxi|cSToikuXixE4FJcU&^g%m`i)@&u@7(vPvw?$7AZV zaY~KTA-~Q;w!u?MPhd`3q;9wZ5g>r6uGa+J$pVc|m5A#u1!DcMSZF2Nrns09b7p7S z-C);)Fss+hyg18=F4d|UxeBe=NM*j{plr%|nmSWj-Fj1_7BJPmqsU%}vcR1B&tkJ` z&y|o4v0`JpE_X>)T)444>SR++?LS%CuF%jipNx8G_2;yimv3RNyHrj0$kYL)^24!L z_fJlsh)zz}s2R}Pka`oT!$k+xtmkf!{;i|#(W2&Y{{6({<)jp4U}edpln61K(iIKT zDh$sarul?+B}_9tY1*066Q#}M;zg?`JbqA~)f-Rp0&Ip)-9HfhD?PlP=dG{(Z@KVY Vf6Iz4&Hw2?ev8-J;{N3y{R4d79E|_~ literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ca.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ca.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b99c2da155b947c01f9bd43dd44ed05ff6c53796 GIT binary patch literal 2705 zcmb7GOLH4V5VkF8^{{0pPH^5>5D0O|Mv#Pe2my*KMOEN37uRTeBu#mDb~6tr+24`_ zH$qXqz>OoS;s;R0Wv~2;ocLxW+lpPTRMfSz)89P0r~B(!{nYJt7V!J6-r6>&7Z(2W z%KYyxlm~dsKWJ!yEzlxcq$R3Rof;HTlUmfK4lUCPbs?*?202BiX`Rl{S$cyu=p3D= z3v`h#(Pg?qZ$dVy2YHL$rmOT0y-U~VJ-Qxbi*7*Phuoz2*&Vh-w`S6(K5Tvf`4Dm& za%U!Y$;(GUKBiCTQ`q_p@;QA0xd-_Ya-Y7M$tFE`c7xUE>xTG69;A7)Q?3?V8$od@tjC|gH)95#O%h?E{qvF?N{}T+c8>UdDV~^!dOK^ zIYL;frc_DlNK`e=A6HE+ij*gSosvEVRh_sMRU=8cF;!jXFtS2o$X#k z!)RF3h{P(FRnb^*f^X3A~Te|KMpD>Or z=gNpQbq&A&?qtufWlp<7+c354`dKkgUEP{1$I@wcF7`L*I z&4BXsEVD6J9NiME^ykr&KYgBgP((4=L$Ze~G7bi0xtd6rCIo^foPw*!wXtRIAk`-w z9Sm?OFWcc2g9kp|K;qOBfxo!qIdH;a-G*l@0yFFgv=7wa&_RvdvDWkrveXjooWGN_ z5E+Ov`GvdXmsG8NZ~|+vL0}Ck1VkyX&a>tOKg!F2Oec)8z;_gxvn&F^z%#c2Yv`hc zJV|^)fF>Y?ac5p0I>5dE2`}J#ie+vUY9X9oT1H z=@pRZ$?r;L01|x;b6tc6b%#h*i_&@W!u|}Xp&ND#aXSPHcNX))c_+_trJ%xNJK3{& z>ei18%wTV2+N~C?!w2}tYJ@&q1@n6XV>Lf;d^%EdY&tMh2L_theeygTB3Z08tADGn zc$??Z1TxRt@my4Sc5FkB9XqEA;p6VYu_J`54L2Rw?tEnDP0WuSjS!DL3EZh8O9FWD z2*~4oa`@yrf1G(UFAaJo9F!9#ACDr4bnMW;s@kkcwLj(eTlK2By-j(tz0JCzgTD*7 z-k^5&D^wWP@SiaA>w>=Sz4FbA@A@_?`h_fFrwX3zphzB%g-GL_axi#$dnfB-SMWSF z{qPCbrmv0d@Bb4q{e<5to>r}USxzn$_x*Ka{z6l4)Ei5SuOUleZVm0U_v*EN?&8wl Q(Sz`Q_59bF@o#kVe{kS`EC2ui literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/cs.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/cs.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..771e5328de1be9e3fca17a945610367e321e5883 GIT binary patch literal 3373 zcma)8&2k$>5LWD!WGQwM5=d;>me;WpqTr1ngr7hN0g7ubfy-Q6v)dzS%KMj@Stp)% z-~p)0fgDqm3!Z?B@R1kT3kRM8pXgo5lAO4KoziNizi(!Gd%o`7@0XUE6}*0S7Iy!> zT&et33}!D62aoWlf5jVASOw0pb1(<<;6N2>P=^I*KoicxA}qlLxCocvEw~I<;B9yZ zuEI4~h81YRDy+dev|$5W*o5n_1>0}~Zo<283tIz(e@5Y#Z?Ch0EsQt0$Gt*Y`I=Sv43O_?$V4 z11~{1`Xv-czezKEl{Juzd&a|;(H^%gJXmVkBI)+IO7@2@e; zE20k(x0_R$5M+Dfw0a0yR>L(DfZ<`toG3Ag-JEKQm}57mQllsvCkmtp?nIarW33b^ zg}M_NQw)sJiMk2O@oFJ@0<^0|E>PfFnIaUrKFS;lZjTd+z>iy)X9Q;3ns&&G_V)TV0cROgc5Ne>{2Sy*`ewM(;-&#C>?MubzZ|_m&E z?Qy^;e1!)Dq^@E3?OGXUf?}5?g}9T0p%^V>P}udEv!pmUpDO$I=4;1Ktf5-PBQ6^P zw%eyfL$O-OqOk2#I-^)EWKr10i8Lv~`be=9+#U;=z}0dQf}5|2oFLoVXK0_|cHT@0 zlKN(*P*m^i1fuBcqr9Tv?NjMSv0BLb7c3+&wSu92+;Q^y?k*(3?k-y@JNQA2uRI(! zCm&IoRg3zsUsaTglgiuiw_OvZ-BhMt7NHdnyBBqFRV*Z-?v|e! zN_Uku-IH%^-3|1e^dMh&5G9a>;$iVEq<_MjQ+29y=l*ANCcL>x@9eqri2qT${~xTg L=T5DE)~^2p({-T) literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/da.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/da.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..406a94740737912a0378a2853eebf29a187da6b6 GIT binary patch literal 2373 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 a#ku**GcDnX-#a`1`P|D_&qx30T>lIC0q}MJ literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/es.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/es.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42f3fcd551ee037ff1105438fcee691571585f44 GIT binary patch literal 2487 zcmbVN&2k$>5SFdg-`cVrCvkophzNv4z(x=PBoH7#aiypVT;}2$ZI7hEyR)15agu$O zTsUw@Q91Dj@f&bljywYwpZI21vSq5EDyU1N>7JgRp0B?i{n+n^4SaqLx_iHDH5z|< zW%+Xt$^(4O?-;1T8nnVzXcf|=0N)n1sY6}rQAlgF4(ZbdZ9=x_3~fWs(m6U0*`W(` z5pszx(=J`1*XVV+3K`HFbdBDmx9B?LZO9F}IhP^5L+{di6g|7kR_PXGR7pVZLq34q zhJ0Ab9lApwK|Y3jLU(b-J^B>#8QrJPAz#p!mH0CsJiE@C^wq=0@ay9H@L|rCG_xq- zYU=n@3{sxwQccZZlIg+18j;9_BBAVHBDi&0m_arPwRmW?i@i=ih$r?|$hQ7zV?Ayy zHp)z~PRyO3ltG-4U~R&oLYFO}b*9T;CY5D9ndX_c9MeE$RR6 z6k+a?BzolhdEGce22N4gi!)_8Vj@M$$B8ILXBXIQ+S?Fm$R&!MuWNy@6HST*NcZ zD&C>Rz_el$Lxk3gvJ_DOKc2+KDI2amR4`28>tNKJJ2}DB>6a1{o=V`Q1 zef74XpcnmGwD37s`&4H5)OPRO_oX%!;!lg+dIw6RX#4e6#_EN^fkZ(Q>-s|oZ0|H;>}r+6)3gl{9hlAL~r=TIY#p}-*^>f z^VQJbrq6KOG?|sFIjb^+%`8NE|e5djJ3c literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fa.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fa.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..577faccbec6b1117901243352df777a33443c0aa GIT binary patch literal 2366 zcmb7F%W@k<6qRi~Y{kx##7PK=0s&%REC_EBlCWS)r7EzQjjJ`cB~5uWGwJEhLo1x} zLklnXfGj9BvP}|4vGdyS1$@BFcn2GPARAVk?veaR6^m$UTHUw1&pmzay*)ooOq6r@ z{hlA4sZZo`f9t{S-!ukS@kYO*p`4wgA$y31X@v6TDNvD0G)iMsrhPO{6SSWW&_Oyx zhv^8tK}YErP112XK_}@=Iz?~MX*xp{I!kZUJ9LiTrT6H4I*(_HKA;cjqkEP;OcqT8 zy-FX`Cv<^6rO)Vd`hva$!dLV)eM1-N5`9aT&2xsX+?%vV=<4;{)OYP`;DOFYPh66$U~wbn|{7xjiD?FfH9;!Urw8 z%%~OkZUz^*#A{601sQ~{(=L0i&#jslIJ52jArlcN%X1|c%(II^)r9NVqdasQf`v`H z+;kgF53h{cgEAa7=XHwncZWWFc9MSK=3{sMkD2HnK;$FI{H)pauk9)~nc9#3_ zrg0elO9R z|E3QB#@c|8cA>;v{GcB!qtbSUS;-PqpR>nVttR+Qmu0sEb41|ZX`wQ4gWa~rB2|kV z;fB)Q7pV~UpBc0dm_oAzuXDkDhqos}9_}8By0bIHMbZkJEOMi?7)dy2q^15{(>~y{ z7OtKhq$AAN3<4GHG9K1tt7~<)&2gn+y~}n?^946^bMDyFVpi_$2_@Ve^VFmXCKP{| z%pn;~prNBKqGUlFgNoaUgPM7gWec)IFEKf`p$_WstYAIzVPF&|20L{QVR5H@ZjT_9 z^HMNB@(lfo;5U?uufkMD0GVd$WIaoCR1h*-*L+s1Tgzfn!|VDT+&Napcu#U<1=_!q z%mQSQz8yARnL(Zmh^ym!L3ItA>^0@7PqpoFZ_$9EE~+f2vh*8xhT`c+zwv~2@WWI- zEzQhO;LOa}6Q+ajCq4)mmI+EY(!I$eyP)s%Xf-F!Vv}k9{k|$&VKsC^OZg#lW|29! znw)#qY`a#wb78hs1uBB?MOE`n6H!$}vO4%QN7Xu;4)3I+ms$ZSk6+ezT=WZ?d?8;L e9(s*u*sL8voAv&G@5u0<#fz_jJT&}I@x*^Sz0;}y literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fi.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fi.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4522c89587dd87faff2f24932a8fabdd439aca80 GIT binary patch literal 2387 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/he.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/he.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b18dbbb82f5a5bd9ff1157bdccc78b22b1281ae1 GIT binary patch literal 1860 zcma)6OK%iM5MFy<-nG}y#5^4EVqRYGc)^%gLI_0S8bufLR5c4nyVv9W&z zL^9vZJbYYeeZT!<{ZY{KmF_#f2zs&T$>u;r zkqUac*$uIIAay`SG5{HvW>*Rmqtwl?TSxiWVC*puKgp+Nx$aK>U*^_?F=VL1z^!^B z=7lYJAxO6Z6jY)uOT-XusjmX#*3=*h(Fj_Wg3w5}XjEjYn*sw$%hm-9!a!wSs#<~U z2y$S;NO@`9SAldoe(0^Iou!SR)mD12MNxP!{GBQjDw6j9&S`>NOX=`}j7N3ria zPhyH^N4$_Shy$=SFAR(zpBzDSe3{lfz2W3b3Z_lIwxxkIf>4;gEvo^Q(N?;uM`f{9 z6?lFO(iTx{+A7M(7aob@KyeLh2?WI~d%n=xmN29sV<5XC_Km|FMOKDBlvTiG)V8Xn zXM%WOD}5<|a;tPh${W)$Bd{lp!&TGiJe|>}!!dL?4oQsz3dvk;$ktLkK~0 z&J`OBG@AwF-@!?SDTZl=8G>|<59YXE$gFfOqAd4>xN7YXc`=yXtSsI0uU zDm)B>tpT+XjoeeWrsIzGP({Wa)o~;-XVQtRGaQs%i8AnH+K6Oyl*O)h$WrGIqQ1~d z+X^*CNV8P^I2`FjAOFsw4%WVpp}o4^(+R|Y?8haXxcTU}d&&|6z` z8`*+xN$M_Q>z^h|yJenS{h@#l*%3qfsBH#OJ5rGo2a)jBsoa}=DSc;syVKcPSs%2? zD^<+b?d;}4-9~NN2N$qz_vLc5Wk>D}LWq5NpW9aN5tPcM^6=1S(r~6%B+OUG+p*5y PmAjwm_c%ZQR2KdNgTYT` literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/it.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/it.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4cf898d764e19061fa68b7c60f36b8db7951a06 GIT binary patch literal 2125 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/lv.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/lv.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f236554080962806116663ae24131ccdac2d1c5 GIT binary patch literal 2263 zcmb7FNpl-T7?rKn@)E}mS=j6lHUncpNLWG$fhukkMOEN37uToxT2gyvdWK$St-7_j!(Hz268CwTS9q1z_yVu z+bQL_RAaL}%JlY0Heitp#X{Nbks#}|Fx%Ovuf+qaUF2i_UOck9{c!!Cxp0ZB#X^~> zup5!{gQ^u}EW!@sP@$`~&^psqYa*2mmt>k}+7gB>m01xst<0M_ zQgx+@633!yYI<08wa62SkakLX4yqQD6;(S*$e607GaRzQVni;nfsb&qwD++12x-bqOxC!ISSO3AOaPdINZN7+ zhL;UZrBInaKg9EccrOAIc2IhkP|-h@fgf*zFp7FUO6S-tBBnA=;`sFwTgUP&WerGYEy7rHhm5AtA%N?cAN-Y5rERL ziSC&shz*`8_=N2nxC&}W{iPCEgpG@@+nU)7SmgX7EAiZiHcZt4=S>Nuos_xz%XVKnX zxLObJ;)3lE_D?T6SjS(c=I4gKfkk!q*VhA^=7U`3fm1m}F~sw5B196z#c=reW}FVN zE9#$^LH#n(W}uB7oV*jwAervwkE`C@G-H>Dd!8=y6S`Kr)m~h9j<#6OZK9u#{%@_H R@muH4bL{-@oqq3J{~Kh*?;`*J literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/nl.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/nl.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9a1a2022b0045f15670789f234220d491ce9204 GIT binary patch literal 2300 zcma)8-I5bU6wYpv$tEPr!Xk>xN)S{Q9fF9zAflzW+@Lpov(=e%k~Ep=8Tuy+Q$7k0 zpydnr4!*%udF5N|m0wSm-C(&CIhD>iXS&bt*Jtv}V9;ye^G9oA|JTh%t$nieHSxI^CiXs71FypMvgyKC9_2-KEb# zU(lB|eFfWJ(>HXF?$fvQfWE8g3O#&rRW#}Q$Bn%o%16B)y-Q|sD)rRMDGxJQ6iQF+ zaFUzhOKnVCuqM`SIAQ6$VLQwxJ;RTk@kx;BXMW~x^~BbHb)qYs!$Fm6(MhBaOw~$q zVi6IXvZ>l^Om3>yOlc>&Dl2m1B-obD9al}KimG!UjYe3aCn?LdTAH(pcr1-*ySz|I z*-Mq?c%0_Ryxc6Lu}pEQ92=R6$oR2QiP+#mO^qyOqBm31S&FZ-hrPn5Y5df~pV&xp zMBp`5-6Ype!X`p=a-4G6P3$6GvT$bIlCN4BJBd}gS=Ck<%2-7cHAPvfj?zi$327L4 zP<0F!sZ5~uT7?=^Et1Hwouty*s%3IG=@U<+PhA`&cvcQSh)Rbt+NxtYaoT59G-FAK zEt=$r+mwAL&6Hgns%Fb8=+SX=9GVkD>ta#{$JK)OMq=ZrGh9X~&gI47PKarE!x^b< zDnpTnhM#(zp*;~zc_AhGG|9a)P2gVi#vCAG)RVdB=0(P4jwYE_c-B9_W}D3XLFijo zN}b8Nh0z=-8;t`%lsRBil-*Q4(V=tm@;pMpV<_e^Qcjskbn51D?E@B#nmEy)<@wZc z;X_$W6g&>B%vf8;DS!Z|EZB^dCh+C(xRs}67dp)8afiX4K@7_lb85P9aJUmXe5!#l zb4sFayf>ng7n%`Hg*3;EEay&i5YYnlszVD*DAra8y$u-nOhog50~SrRzPz@IgHybg zmuq;O@>E1h&vH-ZB7Brv0XT|dU-HoUyjFy7pexG=*Yz6`gw-i1dKcrUF*j-F{*IljP(Tr zS3xMx*4f8~Cu~?JTn-8@Rz)*OPDEV(te8owY!$(AuBTP!Xg-u@HLyb`d&_O9Lj<|E zE6VdB`H<48E>W(IdPR3J#EaPKX?LQpqU9AW2i~X?_1;xnkI5WU4^_jh47n@Ls&#Oe z&^fbVU;o5QrD!hLiQdT_H9G-X+hf)_XLMW_7+Y2ldAzDzf+ELsTQ)81 zJQqqRUr}uzRS5je;T>07!|6By)I-j2PzI`xZ3f&9FL#hnP($dMPpMts^2lj zj*NAqm#<1Y(&??@d9`sr%gLwwApDQ8zhP;$TkZ9=H>UM^XIPiq>rXbZ@2}|I8|{6a JrN5)={{nXq1d{*& literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/pl.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/pl.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c0c139aea03bd9f199d0eb81ce200fd2a8ebfb9 GIT binary patch literal 2077 zcma)7OOq2f5H@Rj{9wJnE@1-;!FdrjVQ@m8B!rMu<(j053s$WleWmYJK{?Zuys9uUo^(y%i zL}&GrqH_zs_75DOMrv@39D_BeLj#(SKnvQ?fi4_}b?CtcoPd*X3N~R2PQz<(2DagK zI1A@s2hPI9$dy}7v6^t;0mOVu8=jj3IojkA$$ba;A8j% zK84TVbNB*tT!$~=E4Tq)!%g_6dM?7PN86+h-`=k6eiwf1{-knYCuvUQ*wZoZ7gTE@ z$F@IGrvEIO0@qvum##nJ)Oo{gUyZtk-*(2c=)=$azPs8bC;uNK9qJq|6iSj7qdppC zgDK!70o;_EvdN86rff`vbfhB+t&F2+Hl%W#)Sb{}Yf6noSfop#P*N1 z1q!Wsj(c=TsUrMP7>pXMljOmT8s_Vld?Mz<4KNRXAisD=XrY9$Nkz& zAp$R<>@X!A#heJy(P7R*huM4S!o*PC>uZ>FPki<)|L&UaFcc5BkFUPMh|xu4qu2$MjCC|vYa{Ti!zyT z3WzNkDa36K*Bv!u?$XGbJ-mn-Jr~EJI4MS53c}!WagXm_Ax%G}W9nl)E1aw5Po&_7 zI}um^vNKfLoJOMihTrwL4tD(}&c#VX9<<;r@cFOSO_fhDJe=k#gqaqWGzV}P_ z9p%L>Ok8`o6Qz9#C#0!{h6b##855HFHZA}a$zY*OtT$@PeJdiM)*U?1Bth*n1(o!8 z#0;gU$cf6S-@s|nNI?~|`NJI3#RIsR^Yi^Gi8Flu@ZdLdCMGiK zAhTh8@kRl1IrDhI*Or0t)5iuQry`R}8j$vdGGSvSgv`9)BQ;eXtssly<*~pkrKdB8 zs@i~k6hpBOL0PQRDZ1u7x?yuAv7`Y@o`%yau}GdMuufl?xoot6m+?X{M9OB!Uf5oV zARz1LbkT5i#`70oBXebaIppR7g85;$QMUH>K(W0&(yI*okHF4AxBL8FvDmwKZ`nU< z=2GM;4u{_lT%iYA=+sM1S%wubop7F~Sr`sy*Ro=OSy9B?4yt?G*nzQb@a*pgqxn@m vE88~;1wQ9DBUScy92(6=bM4qGK5NyyI*tqLO;SRtgsW+W7i?-|>p+&gnSkF>qN zghdxfEKrLoApyU@YyQC9u;5>0#W&ZEla^TEBadg!%$#%PeBYVzcb!gq0iR!@X`U82i$h2EmK=^eUC*C1Q;F1<(BDSmdHEzu1~4-(P)kPjd? zAs<$9i*C_JkdNsT`V>}g(`WQK-Jvh&F5RnSlkPw3vKoE)aAE5~@qPP&;e|{kSKV*4 zaenB96>-Yd(DR|_W<1ZO8rtqao9@0gCXow8Lb>ihaOaJ%T|HMu{fD8U&}plyzZ@Hf1!D%CVNra)iavjg)qR)tt=B=3{OY z!eVVsnO1UQ&Poz}Zdl#vTqZ?3l}g0@R3|&d@thkgC{CplhNrAyeBa1~EsIoP+c%f>(sk(RP4Rg!uVWzF!%Wz&c}HD;7G8mt3;YQ$}E zW{P7BiU^Y%g>2-~;L&>;;Mad4z#3>az+f zz-84=IN&&@d~*$VIXjo6hHuUV5PMysb8 zsus7~6V?ieN{q}MJ7ztoJ{c6N)!AYr2EquHh@z8={P55Wl7k^GnJfour7at%L9K>m zbIRXhRq+hh(t)MZT!jd;^Ap+z|BdH-*PO};Y z{w%guXB@v!iR3Yl-T0;Rsh*a3)h`!a<>S?b$SkX&IbsS~W;HYuHoZ^-ZUw93p~9W8 z5jW~)i7tbieG=tACLD@nUoug zc)F{PI1a!mYttq*7h&e>t*C5nZ<9{8w^^s^;B>eEFl^7RZp-SSTJ7@%b2a!5&E8i% zm*u@&=CM~fPj*1E$0H%qc&F(1pWfWbda#PuH?_U$X*9NHtn2N+@X)&LzPXVJ7AsxK}6Pl;yhmS(-9_tr4~XXEyNtU7w{f%dP)<$nN=qDl1t literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ru.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ru.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f39e056360d86e6962363c159a74b7719dda5ef6 GIT binary patch literal 2814 zcmcImOLG)e6i&!wCK(byAOVDs0aS?6L=fMoXq8*b65aGBb*Ilw(v_a>=5}8my-JAU z1Ju36AF$jEkH9b?;V*Pox$3PuU1#IU@7&HL1142&oT=&Qd+xdC@tyCS?yrW2t3CMq zRvMW4bEv214_Z20%Q<*9>K!a4Jois$lw2OAr9(sZH z(mvWxBQ#0}=pY@U7wIq^p)op&?>N=y7#*h*^b);Huh2<4MHBQYy+)_Wx^vpzL1$of zl3s_0vviK$p!4)5y+v=+JM=ESNAJ@G`hY&9kKpg(oe{f_KEBj5@k#P|^$Q(EuJA2S z_%m9}$XY{$q3h2?wdp|BI#P>dD1DNCT$`36)=EaTV7jX0rC4c)*Yu^l7N4owd!Cmi zRnPUMRrdmCE-y7?EN~U^Y_cm9Dw1S*ZY-7Xl4__u&$_IGSmq@sAZZUcK_d*bPx+t| z__2T;mG{S@?#X1(iLO}1EgVE~ai8}oaW$_f8G6Ez$vEQN2rx!~Rt$kfu98mdUXjUA zEYysQEgw#!yrO-V9p@zyv9v3ZOR_GMJ?J6~6$?MkE3WT&8nF$EI0hVU;M>(%cV^bZ zFOKZ0phn=kEYJJh1^~_b9Zy72UQz+V9wIp{v=>{vLN0FXu_J`z>xNw>R6#1c;s{-s zkV*y0?u*?puUr+%M`i31N1KF5&}ZKF1Z={c#Ywjy)hlcSebD zHZRXgK>)Bk9pJp0IIZ`Ap6T6mIbBWLR<@Ac$maQ0^+LY3pEsYR&Fn_HwEo{p+i6pu zB;le$a!-pRMes(PQh)wK8k9 zVe>&U-YI$QRIG#_d4h4MDS26=Xf&bsc63)vV2@!B&h##bO(2|33)Y)SZG$1(*h-FV z5@#EgHEwhubITy}Sfkr}(nrYmiOHp@&li4|7(FC#&m@OzTR5(0ZPT`Y<27 zxsD1Ww1f&EnN?idX-f@YU-JdV3`*t%<86>yck~oXln-Z`nnPt@=|eW7_Y})^x}5!# zeakko+a2KwqC#n**GiYx45ZH%3E~3j^<3FNp{+;RZVMoEDDcog!6!@va0q7$*@B7Q z;I^FIPEK?ae;c%o0fr2*E~d-+5W7MyjCM9}8BRS~r&3d&FuPDRyYR`B0<)Nw9W7L( zsM%`zl%q1pn0$d5SIop$0A^~tntg}l?i!*SJx2I}sR>(U{vTn#PjPSw8;k3A4^3DG zPi;Df6&U2DF6azNA%^QklUKXo?L3y;PDOtel!M!QIDErcgMUQ9AfULNLNGayf@#je z&W}j4mEMO|Gy6IjEBbvKtdp@~3~aM)SA?Si|9T_YCw%@7bOaJlOC^0r=9TrKZSRb9 zC{^SrH;gfB8sV&n+$h=Yiv~vf=7D|}PmgQ%V5IAXa$d${4lvDzM7^%$71uO+GRg{= zie~(6o==8D8Fnw#w9~!R%I#Y2HeI2pR3rTtJibLfGqvr>B2TvD%JKR4HygjI0cizdz6kBTN$6i;?uv#`=< m!t43Kg+@TylOOJc<>&`oO8uq29lig{_xJMI|7`cK^5{Q2F!tL3 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/sk.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/sk.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1669f579aee26c3154ba7a675d855f743ea6fc9 GIT binary patch literal 2818 zcma)8OLH4V5LWD!WGQwWV&Vip<=B`g$wm+!;SoYOaD{{6G8fnE_DGu2?#yN$ay-9) zD*gb6gsR+pbiVrfF_)WMOcChunZUB9k>K5@Ge}2 zRk#9I;XPP`b=ZJS*n(|n!46!5UD$*7VIMw#>v*@}2Hb>Ok8hGW2;nyF-GL9`Be(+} z!zb`5d20|J}<_*vC`VmzE!y-)zsT6#?o#wzIsz}wy zjK{8-aKXYTk@4X4LPnKl5GLF(MH5m}Hc~t$3oPS3MYBF>_Ia7*icnNgzzJ6$gvwyqmRg-&RZ!IokVEyv=u zEt0q*Sj1e$M$eegW++KD?jJ{#1d0N+=L;f_{!G}(Z`_QY+Xl+$K#ZQI1M1eWNS>`p zV@MTpOmOCQrq%PH-PT!AJ$73~zvw@uZV@Xz2o-w2#z5q$=2DYdFB@sX^*)lzjKBb?XK3ea79{)8PYcl!wM+ zB~=+|+Arf7J)`>MiCw|a#?x^0Z1jgNdLr_*)W@8i{3VB@=i!9z$8K|c*gOv0=J*VH z%w&;9kzzw$ogXbjyOK*czuhtx!=!Ag!KJUMgOq=q%;87 zl6D_%@1<&ZQ7;wAhuWUh&Ii~Wm(*w8I;*tDuC5lz+kb@x9IpRptyxF|ZlGe|qQE1sA{cghbHr8`QS&g6Sb vcl6+PcAPKVOC{KZ-7mg2_0Kp2)gYKV_do9`a_+4w{;u79D`w*N-`eVbPPo}9 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/sv.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/sv.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab133dad3aebcdffadd9449bdd5866f7db00afd8 GIT binary patch literal 1957 zcma)7%aYqf6m`b(bL^R9!c0PV#32MSB#t4x0)!+i*iuvtYv+N1#uX$$u@ou>=5Ll@~4+NC|ZM3?DR zx+}Y_Nmpq^*XS*}PH)o=xUgG2KD#3B6Ar&|UhFKBAB5 z6Z#bE@6l)UIekI*=}UTmJP)7kvL-z`XzYJge%n7d5+u!RlyWt7d@4p6FAAxqW)$c8 zEIKAp2t`8KQ7pK1T9{EDkF+?j+C|={@5B>(r_av+Gsb${S}c^gVx5RPZ&X2)lVEK^ zQK74r&^p&uFq6u%p3I6|TMjc&xfQHwWl?pGxK?P3^*Lp^lFM{Pk_fqGEt?lID*LHa zVjQMP5M-968aV*6d90+xl8TXd#Efe9_UJW7!B(f5n1K3a$vch3On{F znW{Y#oX}}I&f)9*TdbFdM(8;{p9MTYgUuu-7Q`HZW-L+`%%w_LXD$;frkg~)i>L+}Ls8-GWCbkl0COv*iNP|af} zp_u&>QqaPZl-LcBa<+K!0~JmsXr{cjBIadD`i5s2vO{Ltx5U~YNTg}mKOxK8o2P8S z(H+dHdSDA(TbZyRlqs=R%^38j5>J@se>5>qFP^(Doo;K!b zOWD9cw8S;lo~KQuu7}xDDKT3-$CL|30P0*B(5Holp3Cd&B);quyMTP==8jk!R-9Wl z;9;o6T-J!P4v%!Mo}wX%P5OlOj0;VqWntN-aRqv>opQU@(pZaFXrUre4hvDNyE=|m zF7`@R%(#&dm$4`?tvV;$soYjP!|qyTy2zF9Aa`ahxZ}0xRka?Aq^-MNi|zS-(OZ2u ztl|}z^a?MBPRmtzf4A02ym+A#oD@q@@}x#U?|IIyV5p&2f0&9+=LtjFnatBzbshkV7%DBCRV=VyIfW#`W zRpW5xyIrI@5t*-c2BUES-ek~EIaq_i=*tLyvmaEQ!$ZoW!$UT#4IJB0HQYX7lSLMN z8P@VgiTSyquVPU>{Q337X2qnC#n`EWM+w+GnhBAPlQImS-c7OzvVxG*OzO?7%|shJ zIsKn76EnY4JgvI-vz%Ni9{6Lz{D>h4g677#|9!X4W^SBW|GxUy_Pzg@v0C?gd+#rn Cd56>h literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/zh_cn.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/zh_cn.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ef853a6a19430a8aa6160da762c5353d0babb41 GIT binary patch literal 2664 zcma)8-FFj36c24an$S`Ng<1*(DM)}Nim0fFs4qVGg1)Q|J(InYWKK7`%j_&4`-FT` ztVI+`ZIu9(mcyYG&_khE{saGjeI=Wu|3aU0U99+F^EF~nji@&SPIS10?VKkmctvc z0#?GC@D{9s)zAiSLp!X24p}1AH!~p^$C0mpTQpZ9QMK&{#XzDhC1X%_;P931Sqb5zOL@QXNK+`2+7)&de>AcRLYbBrt)qrXuou@=toSJDppW<}C;FjXa z@EtuYcBJIxi*<662!RWkuE`07SRQbqiVjqc18z#W6Qi8#+=(I;At#ZW&ILgj)pSAS zM!^gxafomYX~`)9C0%1dIFkX*5iZAsZZO48srW2XPSuredznGFNkLMXpq!|3oLf20 z6uF5StiXv;lv71kD604srkye@Rh14{-hNGrjtndfoTQ>_f?!OfC`eAFc2Y49N&&>p zOc7uwTB3sBOhnO%u@a`yiRW1X)8ZtUrl=NBr;(FGPJ&ZIB?_u7jd?k6qCf<7Vv0&k z(}{8&H)#f%CzdKCPr{v^lStTc4qy&&#Jg*~fZZ`|U3sgv6*36mp zSfl5~5m+1vwL${MaXC9kGux~Dlln$rUo zu7gbA*L!z*;HD3!e;cUZxf2BHJ6{`q6lhQP)^Ge6Xz!2KN3I93=cxN&#E13UH{4%( zeCR$YKZBL2k?Pe`zP2(kIeqQ2y<_DcVb)hym7QkO`S1+CRAu_EU zduVT%>ws6qaEE){^Jn~p?$|?jU^Iwvb+lT3Y$Y+D*dX;lYDURD(~r`u!ZW)kk5?~_ zS9`~1)_C3W%B=>cYG(tE?%-5q>RhnvPbb~;w*vU{m1hr8nY>;deBu+RO%5XJm@8(NK9rraXbgQR&Wxt zcY)oikrG}FbCFgO&10Zj<~-#J?^t2Cx60#--29tuPVdBneAq1(XLIUI zN08dbH{DYM0USG88yV-TF*A0DpMsF&*=;Pu;>W2>oU4|DeyL3KAhb6x%2>#1yTkVj zv$lyaOXq?Dgn6~2SD3AHLCwOv+R-b-=0Can_)&fQcmR9KwR`;myxl+j$2H#O<#qF- ziibqAx4xti!hAC?_D87ei)|C;D!sg$!ra#eO%`VET+n-AUhU}h3Y!{g!&h2}?b}S$ zNpy9Au5@+DEk3~i6L{sJn0o#WGUb@}jx%pY_&O|;Kh1oT6(u8UFhjC5gDBm2QV$g= zRi$n_mpihvyOhPKc-T}k>)-v{%yLs?pZ$R`vv#pd(RLU|oTfb`9W0gZU5dfYOE^Vi g(OAQh*BlMLUn9-|3R~xS{1@N-no$==c^Y5$KVsFr*8l(j literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/zh_tw.cpython-38.pyc b/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/zh_tw.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e83529535bc92c458e056cd15b5b95831679b518 GIT binary patch literal 3643 zcma)9%W@k<6qRi~Y}t-O5*%AEj~_8s@K_McBM?G>4J$SYn<=VPt+_3!%cGe|caI(S zkFaqSY*J&A~h@KoLq%h6*gg5>#OsR$vuw!5Z9#_uvlPg?sQmtiyfS zfK8}D9U9Pt7Hok7+pq(>um=xdA3lHsY;AZ5AHpHH7l+Rqd1b9;jkD+ntKac#A)S>$q>cz zstiU^m`U$dlmOmi(ktmG7QU$lco(-9ME;4n6*H+gxPj1IvcN0Lq$h>%E%I0lB#Vb$ zbtneI0KZz9YMcat`!ccTE&35kkc5yf`BA7D?ujC5)(f~<^3|!E5AiUi^Kn`nam}!2 zdYG2P2-TRD`(l71sg9LcGAlX@3kvtBVkIP9YtPav5FwN7FA26lTqKxp672tiA z1lqMTJXvV`L8(HkMuoTLz7CU7S{`x+C|kK7q1@7}XeI|-yH;!Jatm!VF^)##xVWla z5E363r@Vb=oQY+e11(vo0%on_Nd7WG8njJoY%l`9tlK*fplRmjrQk+pbqcLpXP`i5 z;v*EJZk0fRHS{P7YmFU^!nddXM^Rd1x1{h!=B*UEJ#}J=^5D8}Q?zF8@)W#v6$un! zdm11lWg0gWW$P-OD1tMIGK$g2B920xNla1$$=6?JY|w_o=GWqcQ(NiB)N`i^;TG~C;6$! z@~Ky0zKp{25!ME*p|89pmGqP^MXbGLmBd`;6SJ17$(6j%B@caWR%0H|PG#SpPO+4Y z;vrK)rDe?YQ8-8|<7#KtLN>zUH{Izj3#|lEqGlHF*z4LvIlJZyok=~jwr=G`*|OR_ zT~EuoKFn$&#dNvtnBCdy6N)mMtVcnuvBD^PllcTB@1y!LCas1)5 zu$>uOQXG7qEIs=-%unngYxas8WO3ZP<}}16riLsE+q>px6sv|T3fsDJO^VRWJ(hx7 zV@D=%xnWhXf5XWMvU&Ix->10kH$#G?z8NVL)qQ&aQS@dWR}{Q=E!-$p4O#z#1q3EH zQMEs|i)p3Xg~;!Az13`h{|2xM;gH&G0RtEJ)K|1(Q)?NP4(WAH%i`Y%VnE5A| zh0cbY2kwdK_0Auij5@e0CXzsPvbPwiI#TJ*)!z@*F~hDtJBrWK#V4Z(l7K&5#?94l j*cD5~()`>zw)u>=fPFrqpR=65%a7l2UuvI!$~*r70M`kE literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/af.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/af.py new file mode 100644 index 0000000..89bf528 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/af.py @@ -0,0 +1,106 @@ +# $Id: af.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Jannie Hofmeyr +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Afrikaans-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + 'aandag': 'attention', + 'versigtig': 'caution', + 'code (translation required)': 'code', + 'gevaar': 'danger', + 'fout': 'error', + 'wenk': 'hint', + 'belangrik': 'important', + 'nota': 'note', + 'tip': 'tip', # hint and tip both have the same translation: wenk + 'waarskuwing': 'warning', + 'vermaning': 'admonition', + 'kantstreep': 'sidebar', + 'onderwerp': 'topic', + 'lynblok': 'line-block', + 'math (translation required)': 'math', + 'parsed-literal (translation required)': 'parsed-literal', + 'rubriek': 'rubric', + 'epigraaf': 'epigraph', + 'hoogtepunte': 'highlights', + 'pull-quote (translation required)': 'pull-quote', + u'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #'vrae': 'questions', + #'qa': 'questions', + #'faq': 'questions', + 'table (translation required)': 'table', + 'csv-table (translation required)': 'csv-table', + 'list-table (translation required)': 'list-table', + 'meta': 'meta', + #'beeldkaart': 'imagemap', + 'beeld': 'image', + 'figuur': 'figure', + 'insluiting': 'include', + 'rou': 'raw', + 'vervang': 'replace', + 'unicode': 'unicode', # should this be translated? unikode + 'datum': 'date', + 'klas': 'class', + 'role (translation required)': 'role', + 'default-role (translation required)': 'default-role', + 'title (translation required)': 'title', + 'inhoud': 'contents', + 'sectnum': 'sectnum', + 'section-numbering': 'sectnum', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer', + #'voetnote': 'footnotes', + #'aanhalings': 'citations', + 'teikennotas': 'target-notes', + 'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Afrikaans name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + 'afkorting': 'abbreviation', + 'ab': 'abbreviation', + 'akroniem': 'acronym', + 'ac': 'acronym', + u'code (translation required)': 'code', + 'indeks': 'index', + 'i': 'index', + 'voetskrif': 'subscript', + 'sub': 'subscript', + 'boskrif': 'superscript', + 'sup': 'superscript', + 'titelverwysing': 'title-reference', + 'titel': 'title-reference', + 't': 'title-reference', + 'pep-verwysing': 'pep-reference', + 'pep': 'pep-reference', + 'rfc-verwysing': 'rfc-reference', + 'rfc': 'rfc-reference', + 'nadruk': 'emphasis', + 'sterk': 'strong', + 'literal (translation required)': 'literal', + 'math (translation required)': 'math', + 'benoemde verwysing': 'named-reference', + 'anonieme verwysing': 'anonymous-reference', + 'voetnootverwysing': 'footnote-reference', + 'aanhalingverwysing': 'citation-reference', + 'vervangingsverwysing': 'substitution-reference', + 'teiken': 'target', + 'uri-verwysing': 'uri-reference', + 'uri': 'uri-reference', + 'url': 'uri-reference', + 'rou': 'raw',} +"""Mapping of Afrikaans role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/ca.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/ca.py new file mode 100644 index 0000000..f414e32 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/ca.py @@ -0,0 +1,125 @@ +# $Id: ca.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Ivan Vilata i Balaguer +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Catalan-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'atenci\u00F3': 'attention', + u'compte': 'caution', + u'code (translation required)': 'code', + u'perill': 'danger', + u'error': 'error', + u'suggeriment': 'hint', + u'important': 'important', + u'nota': 'note', + u'consell': 'tip', + u'av\u00EDs': 'warning', + u'advertiment': 'admonition', + u'nota-al-marge': 'sidebar', + u'nota-marge': 'sidebar', + u'tema': 'topic', + u'bloc-de-l\u00EDnies': 'line-block', + u'bloc-l\u00EDnies': 'line-block', + u'literal-analitzat': 'parsed-literal', + u'r\u00FAbrica': 'rubric', + u'ep\u00EDgraf': 'epigraph', + u'sumari': 'highlights', + u'cita-destacada': 'pull-quote', + u'compost': 'compound', + u'container (translation required)': 'container', + #'questions': 'questions', + u'taula': 'table', + u'taula-csv': 'csv-table', + u'taula-llista': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + u'math (translation required)': 'math', + u'meta': 'meta', + #'imagemap': 'imagemap', + u'imatge': 'image', + u'figura': 'figure', + u'inclou': 'include', + u'incloure': 'include', + u'cru': 'raw', + u'reempla\u00E7a': 'replace', + u'reempla\u00E7ar': 'replace', + u'unicode': 'unicode', + u'data': 'date', + u'classe': 'class', + u'rol': 'role', + u'default-role (translation required)': 'default-role', + u'title (translation required)': 'title', + u'contingut': 'contents', + u'numsec': 'sectnum', + u'numeraci\u00F3-de-seccions': 'sectnum', + u'numeraci\u00F3-seccions': 'sectnum', + u'cap\u00E7alera': 'header', + u'peu-de-p\u00E0gina': 'footer', + u'peu-p\u00E0gina': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'notes-amb-destinacions': 'target-notes', + u'notes-destinacions': 'target-notes', + u'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'} +"""Catalan name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'abreviatura': 'abbreviation', + u'abreviaci\u00F3': 'abbreviation', + u'abrev': 'abbreviation', + u'ab': 'abbreviation', + u'acr\u00F2nim': 'acronym', + u'ac': 'acronym', + u'code (translation required)': 'code', + u'\u00EDndex': 'index', + u'i': 'index', + u'sub\u00EDndex': 'subscript', + u'sub': 'subscript', + u'super\u00EDndex': 'superscript', + u'sup': 'superscript', + u'refer\u00E8ncia-a-t\u00EDtol': 'title-reference', + u'refer\u00E8ncia-t\u00EDtol': 'title-reference', + u't\u00EDtol': 'title-reference', + u't': 'title-reference', + u'refer\u00E8ncia-a-pep': 'pep-reference', + u'refer\u00E8ncia-pep': 'pep-reference', + u'pep': 'pep-reference', + u'refer\u00E8ncia-a-rfc': 'rfc-reference', + u'refer\u00E8ncia-rfc': 'rfc-reference', + u'rfc': 'rfc-reference', + u'\u00E8mfasi': 'emphasis', + u'destacat': 'strong', + u'literal': 'literal', + u'math (translation required)': 'math', + u'refer\u00E8ncia-amb-nom': 'named-reference', + u'refer\u00E8ncia-nom': 'named-reference', + u'refer\u00E8ncia-an\u00F2nima': 'anonymous-reference', + u'refer\u00E8ncia-a-nota-al-peu': 'footnote-reference', + u'refer\u00E8ncia-nota-al-peu': 'footnote-reference', + u'refer\u00E8ncia-a-cita': 'citation-reference', + u'refer\u00E8ncia-cita': 'citation-reference', + u'refer\u00E8ncia-a-substituci\u00F3': 'substitution-reference', + u'refer\u00E8ncia-substituci\u00F3': 'substitution-reference', + u'destinaci\u00F3': 'target', + u'refer\u00E8ncia-a-uri': 'uri-reference', + u'refer\u00E8ncia-uri': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + u'cru': 'raw',} +"""Mapping of Catalan role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/cs.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/cs.py new file mode 100644 index 0000000..63debee --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/cs.py @@ -0,0 +1,108 @@ +# $Id: cs.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Marek Blaha +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Czech-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'pozor': 'attention', + u'caution (translation required)': 'caution', # jak rozlisit caution a warning? + u'code (translation required)': 'code', + u'nebezpe\u010D\u00ED': 'danger', + u'chyba': 'error', + u'rada': 'hint', + u'd\u016Fle\u017Eit\u00E9': 'important', + u'pozn\u00E1mka': 'note', + u'tip (translation required)': 'tip', + u'varov\u00E1n\u00ED': 'warning', + u'admonition (translation required)': 'admonition', + u'sidebar (translation required)': 'sidebar', + u't\u00E9ma': 'topic', + u'line-block (translation required)': 'line-block', + u'parsed-literal (translation required)': 'parsed-literal', + u'odd\u00EDl': 'rubric', + u'moto': 'epigraph', + u'highlights (translation required)': 'highlights', + u'pull-quote (translation required)': 'pull-quote', + u'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #'questions': 'questions', + #'qa': 'questions', + #'faq': 'questions', + u'table (translation required)': 'table', + u'csv-table (translation required)': 'csv-table', + u'list-table (translation required)': 'list-table', + u'math (translation required)': 'math', + u'meta (translation required)': 'meta', + #'imagemap': 'imagemap', + u'image (translation required)': 'image', # obrazek + u'figure (translation required)': 'figure', # a tady? + u'include (translation required)': 'include', + u'raw (translation required)': 'raw', + u'replace (translation required)': 'replace', + u'unicode (translation required)': 'unicode', + u'datum': 'date', + u't\u0159\u00EDda': 'class', + u'role (translation required)': 'role', + u'default-role (translation required)': 'default-role', + u'title (translation required)': 'title', + u'obsah': 'contents', + u'sectnum (translation required)': 'sectnum', + u'section-numbering (translation required)': 'sectnum', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'target-notes (translation required)': 'target-notes', + u'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Czech name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'abbreviation (translation required)': 'abbreviation', + u'ab (translation required)': 'abbreviation', + u'acronym (translation required)': 'acronym', + u'ac (translation required)': 'acronym', + u'code (translation required)': 'code', + u'index (translation required)': 'index', + u'i (translation required)': 'index', + u'subscript (translation required)': 'subscript', + u'sub (translation required)': 'subscript', + u'superscript (translation required)': 'superscript', + u'sup (translation required)': 'superscript', + u'title-reference (translation required)': 'title-reference', + u'title (translation required)': 'title-reference', + u't (translation required)': 'title-reference', + u'pep-reference (translation required)': 'pep-reference', + u'pep (translation required)': 'pep-reference', + u'rfc-reference (translation required)': 'rfc-reference', + u'rfc (translation required)': 'rfc-reference', + u'emphasis (translation required)': 'emphasis', + u'strong (translation required)': 'strong', + u'literal (translation required)': 'literal', + u'math (translation required)': 'math', + u'named-reference (translation required)': 'named-reference', + u'anonymous-reference (translation required)': 'anonymous-reference', + u'footnote-reference (translation required)': 'footnote-reference', + u'citation-reference (translation required)': 'citation-reference', + u'substitution-reference (translation required)': 'substitution-reference', + u'target (translation required)': 'target', + u'uri-reference (translation required)': 'uri-reference', + u'uri (translation required)': 'uri-reference', + u'url (translation required)': 'uri-reference', + u'raw (translation required)': 'raw',} +"""Mapping of Czech role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/da.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/da.py new file mode 100644 index 0000000..a05540a --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/da.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +# $Id: da.py 7678 2013-07-03 09:57:36Z milde $ +# Author: E D +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Danish-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'giv agt': 'attention', + u'pas på': 'caution', + u'kode': 'code', + u'kode-blok': 'code', + u'kildekode': 'code', + u'fare': 'danger', + u'fejl': 'error', + u'vink': 'hint', + u'vigtigt': 'important', + u'bemærk': 'note', + u'tips': 'tip', + u'advarsel': 'warning', + u'formaning': 'admonition', + u'sidebjælke': 'sidebar', + u'emne': 'topic', + u'linje-blok': 'line-block', + u'linie-blok': 'line-block', + u'parset-literal': 'parsed-literal', + u'rubrik': 'rubric', + u'epigraf': 'epigraph', + u'fremhævninger': 'highlights', + u'pull-quote (translation required)': 'pull-quote', + u'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #'questions': 'questions', + u'tabel': 'table', + u'csv-tabel': 'csv-table', + u'liste-tabel': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + u'meta': 'meta', + u'math (translation required)': 'math', + #'imagemap': 'imagemap', + u'billede': 'image', + u'figur': 'figure', + u'inkludér': 'include', + u'inkluder': 'include', + u'rå': 'raw', + u'erstat': 'replace', + u'unicode': 'unicode', + u'dato': 'date', + u'klasse': 'class', + u'rolle': 'role', + u'forvalgt-rolle': 'default-role', + u'titel': 'title', + u'indhold': 'contents', + u'sektnum': 'sectnum', + u'sektions-nummerering': 'sectnum', + u'sidehovede': 'header', + u'sidefod': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'target-notes (translation required)': 'target-notes', + u'restructuredtext-test-direktiv': 'restructuredtext-test-directive'} +"""Danish name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'forkortelse': 'abbreviation', + u'fork': 'abbreviation', + u'akronym': 'acronym', + u'ac (translation required)': 'acronym', + u'kode': 'code', + u'indeks': 'index', + u'i': 'index', + u'subscript (translation required)': 'subscript', + u'sub (translation required)': 'subscript', + u'superscript (translation required)': 'superscript', + u'sup (translation required)': 'superscript', + u'titel-reference': 'title-reference', + u'titel': 'title-reference', + u't': 'title-reference', + u'pep-reference': 'pep-reference', + u'pep': 'pep-reference', + u'rfc-reference': 'rfc-reference', + u'rfc': 'rfc-reference', + u'emfase': 'emphasis', + u'kraftig': 'strong', + u'literal': 'literal', + u'math (translation required)': 'math', + u'navngivet-reference': 'named-reference', + u'anonym-reference': 'anonymous-reference', + u'fodnote-reference': 'footnote-reference', + u'citation-reference (translation required)': 'citation-reference', + u'substitutions-reference': 'substitution-reference', + u'target (translation required)': 'target', + u'uri-reference': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + u'rå': 'raw',} +"""Mapping of Danish role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/de.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/de.py new file mode 100644 index 0000000..92ea234 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/de.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +# $Id: de.py 8006 2016-12-22 23:02:44Z milde $ +# Authors: Engelbert Gruber ; +# Lea Wiemann +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +German-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + 'achtung': 'attention', + 'vorsicht': 'caution', + 'code': 'code', + 'gefahr': 'danger', + 'fehler': 'error', + 'hinweis': 'hint', + 'wichtig': 'important', + 'notiz': 'note', + 'tipp': 'tip', + 'warnung': 'warning', + 'ermahnung': 'admonition', + 'kasten': 'sidebar', + 'seitenkasten': 'sidebar', # kept for backwards compatibiltity + 'seitenleiste': 'sidebar', + 'thema': 'topic', + 'zeilenblock': 'line-block', + 'parsed-literal (translation required)': 'parsed-literal', + 'rubrik': 'rubric', + 'epigraph': 'epigraph', + 'highlights': 'highlights', + u'pull-quote': 'pull-quote', # commonly used in German too + u'seitenansprache': 'pull-quote', # cf. http://www.typografie.info/2/wiki.php?title=Seitenansprache + 'zusammengesetzt': 'compound', + 'verbund': 'compound', + u'container': 'container', + #'fragen': 'questions', + 'tabelle': 'table', + 'csv-tabelle': 'csv-table', + 'listentabelle': 'list-table', + u'mathe': 'math', + u'formel': 'math', + 'meta': 'meta', + #'imagemap': 'imagemap', + 'bild': 'image', + 'abbildung': 'figure', + u'unverändert': 'raw', + u'roh': 'raw', + u'einfügen': 'include', + 'ersetzung': 'replace', + 'ersetzen': 'replace', + 'ersetze': 'replace', + 'unicode': 'unicode', + 'datum': 'date', + 'klasse': 'class', + 'rolle': 'role', + u'standardrolle': 'default-role', + u'titel': 'title', + 'inhalt': 'contents', + u'kapitelnummerierung': 'sectnum', + u'abschnittsnummerierung': 'sectnum', + u'linkziel-fußnoten': 'target-notes', + u'kopfzeilen': 'header', + u'fußzeilen': 'footer', + #u'fußfnoten': 'footnotes', + #'zitate': 'citations', + } +"""German name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + u'abkürzung': 'abbreviation', + 'akronym': 'acronym', + u'code': 'code', + 'index': 'index', + 'tiefgestellt': 'subscript', + 'hochgestellt': 'superscript', + 'titel-referenz': 'title-reference', + 'pep-referenz': 'pep-reference', + 'rfc-referenz': 'rfc-reference', + 'betonung': 'emphasis', # for backwards compatibility + 'betont': 'emphasis', + 'fett': 'strong', + u'wörtlich': 'literal', + u'mathe': 'math', + 'benannte-referenz': 'named-reference', + 'unbenannte-referenz': 'anonymous-reference', + u'fußfnoten-referenz': 'footnote-reference', + 'zitat-referenz': 'citation-reference', + 'ersetzungs-referenz': 'substitution-reference', + 'ziel': 'target', + 'uri-referenz': 'uri-reference', + u'unverändert': 'raw', + u'roh': 'raw',} +"""Mapping of German role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/en.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/en.py new file mode 100644 index 0000000..f768816 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/en.py @@ -0,0 +1,110 @@ +# $Id: en.py 7179 2011-10-15 22:06:45Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +English-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + 'attention': 'attention', + 'caution': 'caution', + 'code': 'code', + 'code-block': 'code', + 'sourcecode': 'code', + 'danger': 'danger', + 'error': 'error', + 'hint': 'hint', + 'important': 'important', + 'note': 'note', + 'tip': 'tip', + 'warning': 'warning', + 'admonition': 'admonition', + 'sidebar': 'sidebar', + 'topic': 'topic', + 'line-block': 'line-block', + 'parsed-literal': 'parsed-literal', + 'rubric': 'rubric', + 'epigraph': 'epigraph', + 'highlights': 'highlights', + 'pull-quote': 'pull-quote', + 'compound': 'compound', + 'container': 'container', + #'questions': 'questions', + 'table': 'table', + 'csv-table': 'csv-table', + 'list-table': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + 'meta': 'meta', + 'math': 'math', + #'imagemap': 'imagemap', + 'image': 'image', + 'figure': 'figure', + 'include': 'include', + 'raw': 'raw', + 'replace': 'replace', + 'unicode': 'unicode', + 'date': 'date', + 'class': 'class', + 'role': 'role', + 'default-role': 'default-role', + 'title': 'title', + 'contents': 'contents', + 'sectnum': 'sectnum', + 'section-numbering': 'sectnum', + 'header': 'header', + 'footer': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + 'target-notes': 'target-notes', + 'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""English name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + 'abbreviation': 'abbreviation', + 'ab': 'abbreviation', + 'acronym': 'acronym', + 'ac': 'acronym', + 'code': 'code', + 'index': 'index', + 'i': 'index', + 'subscript': 'subscript', + 'sub': 'subscript', + 'superscript': 'superscript', + 'sup': 'superscript', + 'title-reference': 'title-reference', + 'title': 'title-reference', + 't': 'title-reference', + 'pep-reference': 'pep-reference', + 'pep': 'pep-reference', + 'rfc-reference': 'rfc-reference', + 'rfc': 'rfc-reference', + 'emphasis': 'emphasis', + 'strong': 'strong', + 'literal': 'literal', + 'math': 'math', + 'named-reference': 'named-reference', + 'anonymous-reference': 'anonymous-reference', + 'footnote-reference': 'footnote-reference', + 'citation-reference': 'citation-reference', + 'substitution-reference': 'substitution-reference', + 'target': 'target', + 'uri-reference': 'uri-reference', + 'uri': 'uri-reference', + 'url': 'uri-reference', + 'raw': 'raw',} +"""Mapping of English role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/eo.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/eo.py new file mode 100644 index 0000000..2f4e99d --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/eo.py @@ -0,0 +1,118 @@ +# $Id: eo.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Marcelo Huerta San Martin +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Esperanto-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'atentu': 'attention', + u'zorgu': 'caution', + u'code (translation required)': 'code', + u'dangxero': 'danger', + u'dan\u011dero': 'danger', + u'eraro': 'error', + u'spuro': 'hint', + u'grava': 'important', + u'noto': 'note', + u'helpeto': 'tip', + u'averto': 'warning', + u'admono': 'admonition', + u'flankteksto': 'sidebar', + u'temo': 'topic', + u'linea-bloko': 'line-block', + u'analizota-literalo': 'parsed-literal', + u'rubriko': 'rubric', + u'epigrafo': 'epigraph', + u'elstarajxoj': 'highlights', + u'elstara\u0135oj': 'highlights', + u'ekstera-citajxo': 'pull-quote', + u'ekstera-cita\u0135o': 'pull-quote', + u'kombinajxo': 'compound', + u'kombina\u0135o': 'compound', + u'tekstingo': 'container', + u'enhavilo': 'container', + #'questions': 'questions', + #'qa': 'questions', + #'faq': 'questions', + u'tabelo': 'table', + u'tabelo-vdk': 'csv-table', # "valoroj disigitaj per komoj" + u'tabelo-csv': 'csv-table', + u'tabelo-lista': 'list-table', + u'meta': 'meta', + 'math (translation required)': 'math', + #'imagemap': 'imagemap', + u'bildo': 'image', + u'figuro': 'figure', + u'inkludi': 'include', + u'senanaliza': 'raw', + u'anstatauxi': 'replace', + u'anstata\u016di': 'replace', + u'unicode': 'unicode', + u'dato': 'date', + u'klaso': 'class', + u'rolo': 'role', + u'preterlasita-rolo': 'default-role', + u'titolo': 'title', + u'enhavo': 'contents', + u'seknum': 'sectnum', + u'sekcia-numerado': 'sectnum', + u'kapsekcio': 'header', + u'piedsekcio': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'celaj-notoj': 'target-notes', + u'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Esperanto name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'mallongigo': 'abbreviation', + u'mall': 'abbreviation', + u'komenclitero': 'acronym', + u'kl': 'acronym', + u'code (translation required)': 'code', + u'indekso': 'index', + u'i': 'index', + u'subskribo': 'subscript', + u'sub': 'subscript', + u'supraskribo': 'superscript', + u'sup': 'superscript', + u'titola-referenco': 'title-reference', + u'titolo': 'title-reference', + u't': 'title-reference', + u'pep-referenco': 'pep-reference', + u'pep': 'pep-reference', + u'rfc-referenco': 'rfc-reference', + u'rfc': 'rfc-reference', + u'emfazo': 'emphasis', + u'forta': 'strong', + u'litera': 'literal', + 'math (translation required)': 'math', + u'nomita-referenco': 'named-reference', + u'nenomita-referenco': 'anonymous-reference', + u'piednota-referenco': 'footnote-reference', + u'citajxo-referenco': 'citation-reference', + u'cita\u0135o-referenco': 'citation-reference', + u'anstatauxa-referenco': 'substitution-reference', + u'anstata\u016da-referenco': 'substitution-reference', + u'celo': 'target', + u'uri-referenco': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + u'senanaliza': 'raw', +} +"""Mapping of Esperanto role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/es.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/es.py new file mode 100644 index 0000000..16c75a0 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/es.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +# $Id: es.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Marcelo Huerta San Martín +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Spanish-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + u'atenci\u00f3n': 'attention', + u'atencion': 'attention', + u'precauci\u00f3n': 'caution', + u'code (translation required)': 'code', + u'precaucion': 'caution', + u'peligro': 'danger', + u'error': 'error', + u'sugerencia': 'hint', + u'importante': 'important', + u'nota': 'note', + u'consejo': 'tip', + u'advertencia': 'warning', + u'exhortacion': 'admonition', + u'exhortaci\u00f3n': 'admonition', + u'nota-al-margen': 'sidebar', + u'tema': 'topic', + u'bloque-de-lineas': 'line-block', + u'bloque-de-l\u00edneas': 'line-block', + u'literal-evaluado': 'parsed-literal', + u'firma': 'rubric', + u'ep\u00edgrafe': 'epigraph', + u'epigrafe': 'epigraph', + u'destacado': 'highlights', + u'cita-destacada': 'pull-quote', + u'combinacion': 'compound', + u'combinaci\u00f3n': 'compound', + u'contenedor': 'container', + #'questions': 'questions', + #'qa': 'questions', + #'faq': 'questions', + u'tabla': 'table', + u'tabla-vsc': 'csv-table', + u'tabla-csv': 'csv-table', + u'tabla-lista': 'list-table', + u'meta': 'meta', + 'math (translation required)': 'math', + #'imagemap': 'imagemap', + u'imagen': 'image', + u'figura': 'figure', + u'incluir': 'include', + u'sin-analisis': 'raw', + u'sin-an\u00e1lisis': 'raw', + u'reemplazar': 'replace', + u'unicode': 'unicode', + u'fecha': 'date', + u'clase': 'class', + u'rol': 'role', + u'rol-por-omision': 'default-role', + u'rol-por-omisi\u00f3n': 'default-role', + u'titulo': 'title', + u't\u00edtulo': 'title', + u'contenido': 'contents', + u'numseccion': 'sectnum', + u'numsecci\u00f3n': 'sectnum', + u'numeracion-seccion': 'sectnum', + u'numeraci\u00f3n-secci\u00f3n': 'sectnum', + u'notas-destino': 'target-notes', + u'cabecera': 'header', + u'pie': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Spanish name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + u'abreviatura': 'abbreviation', + u'ab': 'abbreviation', + u'acronimo': 'acronym', + u'acronimo': 'acronym', + u'ac': 'acronym', + u'code (translation required)': 'code', + u'indice': 'index', + u'i': 'index', + u'subindice': 'subscript', + u'sub\u00edndice': 'subscript', + u'superindice': 'superscript', + u'super\u00edndice': 'superscript', + u'referencia-titulo': 'title-reference', + u'titulo': 'title-reference', + u't': 'title-reference', + u'referencia-pep': 'pep-reference', + u'pep': 'pep-reference', + u'referencia-rfc': 'rfc-reference', + u'rfc': 'rfc-reference', + u'enfasis': 'emphasis', + u'\u00e9nfasis': 'emphasis', + u'destacado': 'strong', + u'literal': 'literal', # "literal" is also a word in Spanish :-) + u'math (translation required)': 'math', + u'referencia-con-nombre': 'named-reference', + u'referencia-anonima': 'anonymous-reference', + u'referencia-an\u00f3nima': 'anonymous-reference', + u'referencia-nota-al-pie': 'footnote-reference', + u'referencia-cita': 'citation-reference', + u'referencia-sustitucion': 'substitution-reference', + u'referencia-sustituci\u00f3n': 'substitution-reference', + u'destino': 'target', + u'referencia-uri': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + u'sin-analisis': 'raw', + u'sin-an\u00e1lisis': 'raw', +} +"""Mapping of Spanish role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/fa.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/fa.py new file mode 100644 index 0000000..5547759 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/fa.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +# $Id: fa.py 4564 2016-08-10 11:48:42Z +# Author: Shahin +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Persian-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'توجه': u'attention', + u'احتیاط': u'caution', + u'کد': u'code', + u'بلوک-کد': u'code', + u'کد-منبع': u'code', + u'خطر': u'danger', + u'خطا': u'error', + u'راهنما': u'hint', + u'مهم': u'important', + u'یادداشت': u'note', + u'نکته': u'tip', + u'اخطار': u'warning', + u'تذکر': u'admonition', + u'نوار-کناری': u'sidebar', + u'موضوع': u'topic', + u'بلوک-خط': u'line-block', + u'تلفظ-پردازش-شده': u'parsed-literal', + u'سر-فصل': u'rubric', + u'کتیبه': u'epigraph', + u'نکات-برجسته': u'highlights', + u'نقل-قول': u'pull-quote', + u'ترکیب': u'compound', + u'ظرف': u'container', + #'questions': u'questions', + u'جدول': u'table', + u'جدول-csv': u'csv-table', + u'جدول-لیست': u'list-table', + #'qa': u'questions', + #'faq': u'questions', + u'متا': u'meta', + u'ریاضی': u'math', + #'imagemap': u'imagemap', + u'تصویر': u'image', + u'شکل': u'figure', + u'شامل': u'include', + u'خام': u'raw', + u'جایگزین': u'replace', + u'یونیکد': u'unicode', + u'تاریخ': u'date', + u'کلاس': u'class', + u'قانون': u'role', + u'قانون-پیش‌فرض': u'default-role', + u'عنوان': u'title', + u'محتوا': u'contents', + u'شماره-فصل': u'sectnum', + u'شماره‌گذاری-فصل': u'sectnum', + u'سرآیند': u'header', + u'پاصفحه': u'footer', + #'footnotes': u'footnotes', + #'citations': u'citations', + u'یادداشت-هدف': u'target-notes', + } +"""Persian name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'مخفف': u'abbreviation', + u'سرنام': u'acronym', + u'کد': u'code', + u'شاخص': u'index', + u'زیرنویس': u'subscript', + u'بالانویس': u'superscript', + u'عنوان': u'title-reference', + u'نیرو': u'pep-reference', + u'rfc-reference (translation required)': u'rfc-reference', + u'تاکید': u'emphasis', + u'قوی': u'strong', + u'لفظی': u'literal', + u'ریاضی': u'math', + u'منبع-نام‌گذاری': u'named-reference', + u'منبع-ناشناس': u'anonymous-reference', + u'منبع-پانویس': u'footnote-reference', + u'منبع-نقل‌فول': u'citation-reference', + u'منبع-جایگزینی': u'substitution-reference', + u'هدف': u'target', + u'منبع-uri': u'uri-reference', + u'uri': u'uri-reference', + u'url': u'uri-reference', + u'خام': u'raw',} +"""Mapping of Persian role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/fi.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/fi.py new file mode 100644 index 0000000..085407d --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/fi.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# $Id: fi.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Asko Soukka +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Finnish-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'huomio': u'attention', + u'varo': u'caution', + u'code (translation required)': 'code', + u'vaara': u'danger', + u'virhe': u'error', + u'vihje': u'hint', + u't\u00e4rke\u00e4\u00e4': u'important', + u'huomautus': u'note', + u'neuvo': u'tip', + u'varoitus': u'warning', + u'kehotus': u'admonition', + u'sivupalkki': u'sidebar', + u'aihe': u'topic', + u'rivi': u'line-block', + u'tasalevyinen': u'parsed-literal', + u'ohje': u'rubric', + u'epigraafi': u'epigraph', + u'kohokohdat': u'highlights', + u'lainaus': u'pull-quote', + u'taulukko': u'table', + u'csv-taulukko': u'csv-table', + u'list-table (translation required)': 'list-table', + u'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #u'kysymykset': u'questions', + u'meta': u'meta', + 'math (translation required)': 'math', + #u'kuvakartta': u'imagemap', + u'kuva': u'image', + u'kaavio': u'figure', + u'sis\u00e4llyt\u00e4': u'include', + u'raaka': u'raw', + u'korvaa': u'replace', + u'unicode': u'unicode', + u'p\u00e4iv\u00e4ys': u'date', + u'luokka': u'class', + u'rooli': u'role', + u'default-role (translation required)': 'default-role', + u'title (translation required)': 'title', + u'sis\u00e4llys': u'contents', + u'kappale': u'sectnum', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer', + #u'alaviitteet': u'footnotes', + #u'viitaukset': u'citations', + u'target-notes (translation required)': u'target-notes'} +"""Finnish name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'lyhennys': u'abbreviation', + u'akronyymi': u'acronym', + u'kirjainsana': u'acronym', + u'code (translation required)': 'code', + u'hakemisto': u'index', + u'luettelo': u'index', + u'alaindeksi': u'subscript', + u'indeksi': u'subscript', + u'yl\u00e4indeksi': u'superscript', + u'title-reference (translation required)': u'title-reference', + u'title (translation required)': u'title-reference', + u'pep-reference (translation required)': u'pep-reference', + u'rfc-reference (translation required)': u'rfc-reference', + u'korostus': u'emphasis', + u'vahvistus': u'strong', + u'tasalevyinen': u'literal', + 'math (translation required)': 'math', + u'named-reference (translation required)': u'named-reference', + u'anonymous-reference (translation required)': u'anonymous-reference', + u'footnote-reference (translation required)': u'footnote-reference', + u'citation-reference (translation required)': u'citation-reference', + u'substitution-reference (translation required)': u'substitution-reference', + u'kohde': u'target', + u'uri-reference (translation required)': u'uri-reference', + u'raw (translation required)': 'raw',} +"""Mapping of Finnish role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/fr.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/fr.py new file mode 100644 index 0000000..ed13690 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/fr.py @@ -0,0 +1,103 @@ +# $Id: fr.py 7119 2011-09-02 13:00:23Z milde $ +# Authors: David Goodger ; William Dode +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +French-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + u'attention': 'attention', + u'pr\u00E9caution': 'caution', + u'code': 'code', + u'danger': 'danger', + u'erreur': 'error', + u'conseil': 'hint', + u'important': 'important', + u'note': 'note', + u'astuce': 'tip', + u'avertissement': 'warning', + u'admonition': 'admonition', + u'encadr\u00E9': 'sidebar', + u'sujet': 'topic', + u'bloc-textuel': 'line-block', + u'bloc-interpr\u00E9t\u00E9': 'parsed-literal', + u'code-interpr\u00E9t\u00E9': 'parsed-literal', + u'intertitre': 'rubric', + u'exergue': 'epigraph', + u'\u00E9pigraphe': 'epigraph', + u'chapeau': 'highlights', + u'accroche': 'pull-quote', + u'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #u'questions': 'questions', + #u'qr': 'questions', + #u'faq': 'questions', + u'tableau': 'table', + u'csv-table (translation required)': 'csv-table', + u'list-table (translation required)': 'list-table', + u'm\u00E9ta': 'meta', + 'math (translation required)': 'math', + #u'imagemap (translation required)': 'imagemap', + u'image': 'image', + u'figure': 'figure', + u'inclure': 'include', + u'brut': 'raw', + u'remplacer': 'replace', + u'remplace': 'replace', + u'unicode': 'unicode', + u'date': 'date', + u'classe': 'class', + u'role (translation required)': 'role', + u'default-role (translation required)': 'default-role', + u'titre (translation required)': 'title', + u'sommaire': 'contents', + u'table-des-mati\u00E8res': 'contents', + u'sectnum': 'sectnum', + u'section-num\u00E9rot\u00E9e': 'sectnum', + u'liens': 'target-notes', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer', + #u'footnotes (translation required)': 'footnotes', + #u'citations (translation required)': 'citations', + } +"""French name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + u'abr\u00E9viation': 'abbreviation', + u'acronyme': 'acronym', + u'sigle': 'acronym', + u'code': 'code', + u'index': 'index', + u'indice': 'subscript', + u'ind': 'subscript', + u'exposant': 'superscript', + u'exp': 'superscript', + u'titre-r\u00E9f\u00E9rence': 'title-reference', + u'titre': 'title-reference', + u'pep-r\u00E9f\u00E9rence': 'pep-reference', + u'rfc-r\u00E9f\u00E9rence': 'rfc-reference', + u'emphase': 'emphasis', + u'fort': 'strong', + u'litt\u00E9ral': 'literal', + 'math (translation required)': 'math', + u'nomm\u00E9e-r\u00E9f\u00E9rence': 'named-reference', + u'anonyme-r\u00E9f\u00E9rence': 'anonymous-reference', + u'note-r\u00E9f\u00E9rence': 'footnote-reference', + u'citation-r\u00E9f\u00E9rence': 'citation-reference', + u'substitution-r\u00E9f\u00E9rence': 'substitution-reference', + u'lien': 'target', + u'uri-r\u00E9f\u00E9rence': 'uri-reference', + u'brut': 'raw',} +"""Mapping of French role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/gl.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/gl.py new file mode 100644 index 0000000..53d52c9 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/gl.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +# Author: David Goodger +# Contact: goodger@users.sourceforge.net +# Revision: $Revision: 4229 $ +# Date: $Date: 2005-12-23 00:46:16 +0100 (Fri, 23 Dec 2005) $ +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Galician-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'atenci\u00f3n': 'attention', + u'advertencia': 'caution', + u'code (translation required)': 'code', + u'perigo': 'danger', + u'erro': 'error', + u'pista': 'hint', + u'importante': 'important', + u'nota': 'note', + u'consello': 'tip', + u'aviso': 'warning', + u'admonici\u00f3n': 'admonition', + u'barra lateral': 'sidebar', + u't\u00f3pico': 'topic', + u'bloque-li\u00f1a': 'line-block', + u'literal-analizado': 'parsed-literal', + u'r\u00fabrica': 'rubric', + u'ep\u00edgrafe': 'epigraph', + u'realzados': 'highlights', + u'coller-citaci\u00f3n': 'pull-quote', + u'compor': 'compound', + u'recipiente': 'container', + #'questions': 'questions', + u't\u00e1boa': 'table', + u't\u00e1boa-csv': 'csv-table', + u't\u00e1boa-listaxe': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + u'meta': 'meta', + 'math (translation required)': 'math', + #'imagemap': 'imagemap', + u'imaxe': 'image', + u'figura': 'figure', + u'inclu\u00edr': 'include', + u'cru': 'raw', + u'substitu\u00edr': 'replace', + u'unicode': 'unicode', + u'data': 'date', + u'clase': 'class', + u'regra': 'role', + u'regra-predeterminada': 'default-role', + u't\u00edtulo': 'title', + u'contido': 'contents', + u'seccnum': 'sectnum', + u'secci\u00f3n-numerar': 'sectnum', + u'cabeceira': 'header', + u'p\u00e9 de p\u00e1xina': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'notas-destino': 'target-notes', + u'texto restruturado-proba-directiva': 'restructuredtext-test-directive'} +"""Galician name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'abreviatura': 'abbreviation', + u'ab': 'abbreviation', + u'acr\u00f3nimo': 'acronym', + u'ac': 'acronym', + u'code (translation required)': 'code', + u'\u00edndice': 'index', + u'i': 'index', + u'sub\u00edndice': 'subscript', + u'sub': 'subscript', + u'super\u00edndice': 'superscript', + u'sup': 'superscript', + u'referencia t\u00edtulo': 'title-reference', + u't\u00edtulo': 'title-reference', + u't': 'title-reference', + u'referencia-pep': 'pep-reference', + u'pep': 'pep-reference', + u'referencia-rfc': 'rfc-reference', + u'rfc': 'rfc-reference', + u'\u00e9nfase': 'emphasis', + u'forte': 'strong', + u'literal': 'literal', + 'math (translation required)': 'math', + u'referencia-nome': 'named-reference', + u'referencia-an\u00f3nimo': 'anonymous-reference', + u'referencia-nota ao p\u00e9': 'footnote-reference', + u'referencia-citaci\u00f3n': 'citation-reference', + u'referencia-substituci\u00f3n': 'substitution-reference', + u'destino': 'target', + u'referencia-uri': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + u'cru': 'raw',} +"""Mapping of Galician role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/he.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/he.py new file mode 100644 index 0000000..36b2609 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/he.py @@ -0,0 +1,108 @@ +# Author: Meir Kriheli +# Id: $Id: he.py 7119 2011-09-02 13:00:23Z milde $ +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +English-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'\u05ea\u05e9\u05d5\u05de\u05ea \u05dc\u05d1': 'attention', + u'\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea': 'caution', + u'code (translation required)': 'code', + u'\u05e1\u05db\u05e0\u05d4': 'danger', + u'\u05e9\u05d2\u05d9\u05d0\u05d4' : 'error', + u'\u05e8\u05de\u05d6': 'hint', + u'\u05d7\u05e9\u05d5\u05d1': 'important', + u'\u05d4\u05e2\u05e8\u05d4': 'note', + u'\u05d8\u05d9\u05e4': 'tip', + u'\u05d0\u05d6\u05d4\u05e8\u05d4': 'warning', + 'admonition': 'admonition', + 'sidebar': 'sidebar', + 'topic': 'topic', + 'line-block': 'line-block', + 'parsed-literal': 'parsed-literal', + 'rubric': 'rubric', + 'epigraph': 'epigraph', + 'highlights': 'highlights', + 'pull-quote': 'pull-quote', + 'compound': 'compound', + 'container': 'container', + #'questions': 'questions', + 'table': 'table', + 'csv-table': 'csv-table', + 'list-table': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + 'meta': 'meta', + 'math (translation required)': 'math', + #'imagemap': 'imagemap', + u'\u05ea\u05de\u05d5\u05e0\u05d4': 'image', + 'figure': 'figure', + 'include': 'include', + 'raw': 'raw', + 'replace': 'replace', + 'unicode': 'unicode', + 'date': 'date', + u'\u05e1\u05d2\u05e0\u05d5\u05df': 'class', + 'role': 'role', + 'default-role': 'default-role', + 'title': 'title', + u'\u05ea\u05d5\u05db\u05df': 'contents', + 'sectnum': 'sectnum', + 'section-numbering': 'sectnum', + 'header': 'header', + 'footer': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + 'target-notes': 'target-notes', + 'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""English name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + 'abbreviation': 'abbreviation', + 'ab': 'abbreviation', + 'acronym': 'acronym', + 'ac': 'acronym', + u'code (translation required)': 'code', + 'index': 'index', + 'i': 'index', + u'\u05ea\u05d7\u05ea\u05d9': 'subscript', + 'sub': 'subscript', + u'\u05e2\u05d9\u05dc\u05d9': 'superscript', + 'sup': 'superscript', + 'title-reference': 'title-reference', + 'title': 'title-reference', + 't': 'title-reference', + 'pep-reference': 'pep-reference', + 'pep': 'pep-reference', + 'rfc-reference': 'rfc-reference', + 'rfc': 'rfc-reference', + 'emphasis': 'emphasis', + 'strong': 'strong', + 'literal': 'literal', + 'math (translation required)': 'math', + 'named-reference': 'named-reference', + 'anonymous-reference': 'anonymous-reference', + 'footnote-reference': 'footnote-reference', + 'citation-reference': 'citation-reference', + 'substitution-reference': 'substitution-reference', + 'target': 'target', + 'uri-reference': 'uri-reference', + 'uri': 'uri-reference', + 'url': 'uri-reference', + 'raw': 'raw',} +"""Mapping of English role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/it.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/it.py new file mode 100644 index 0000000..bf36096 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/it.py @@ -0,0 +1,97 @@ +# $Id: it.py 7119 2011-09-02 13:00:23Z milde $ +# Authors: Nicola Larosa ; +# Lele Gaifax +# Copyright: This module has been placed in the public domain. + +# Beware: the italian translation of the reStructuredText documentation +# at http://docit.bice.dyndns.org/static/ReST, in particular +# http://docit.bice.dyndns.org/static/ReST/ref/rst/directives.html, needs +# to be synced with the content of this file. + +""" +Italian-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + 'attenzione': 'attention', + 'cautela': 'caution', + 'code (translation required)': 'code', + 'pericolo': 'danger', + 'errore': 'error', + 'suggerimento': 'hint', + 'importante': 'important', + 'nota': 'note', + 'consiglio': 'tip', + 'avvertenza': 'warning', + 'ammonizione': 'admonition', + 'riquadro': 'sidebar', + 'argomento': 'topic', + 'blocco-di-righe': 'line-block', + 'blocco-interpretato': 'parsed-literal', + 'rubrica': 'rubric', + 'epigrafe': 'epigraph', + 'punti-salienti': 'highlights', + 'estratto-evidenziato': 'pull-quote', + 'composito': 'compound', + u'container (translation required)': 'container', + #'questions': 'questions', + #'qa': 'questions', + #'faq': 'questions', + 'tabella': 'table', + 'tabella-csv': 'csv-table', + 'tabella-elenco': 'list-table', + 'meta': 'meta', + 'math (translation required)': 'math', + #'imagemap': 'imagemap', + 'immagine': 'image', + 'figura': 'figure', + 'includi': 'include', + 'grezzo': 'raw', + 'sostituisci': 'replace', + 'unicode': 'unicode', + 'data': 'date', + 'classe': 'class', + 'ruolo': 'role', + 'ruolo-predefinito': 'default-role', + 'titolo': 'title', + 'indice': 'contents', + 'contenuti': 'contents', + 'seznum': 'sectnum', + 'sezioni-autonumerate': 'sectnum', + 'annota-riferimenti-esterni': 'target-notes', + 'intestazione': 'header', + 'piede-pagina': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + 'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Italian name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + 'abbreviazione': 'abbreviation', + 'acronimo': 'acronym', + u'code (translation required)': 'code', + 'indice': 'index', + 'deponente': 'subscript', + 'esponente': 'superscript', + 'riferimento-titolo': 'title-reference', + 'riferimento-pep': 'pep-reference', + 'riferimento-rfc': 'rfc-reference', + 'enfasi': 'emphasis', + 'forte': 'strong', + 'letterale': 'literal', + 'math (translation required)': 'math', + 'riferimento-con-nome': 'named-reference', + 'riferimento-anonimo': 'anonymous-reference', + 'riferimento-nota': 'footnote-reference', + 'riferimento-citazione': 'citation-reference', + 'riferimento-sostituzione': 'substitution-reference', + 'destinazione': 'target', + 'riferimento-uri': 'uri-reference', + 'grezzo': 'raw',} +"""Mapping of Italian role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/ja.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/ja.py new file mode 100644 index 0000000..3d3e19d --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/ja.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +# $Id: ja.py 7119 2011-09-02 13:00:23Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Japanese-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + +# Corrections to these translations are welcome! +# 間違いがあれば、どうぞ正しい翻訳を教えて下さい。 + +directives = { + # language-dependent: fixed + u'注目': 'attention', + u'注意': 'caution', + u'code (translation required)': 'code', + u'危険': 'danger', + u'エラー': 'error', + u'ヒント': 'hint', + u'重要': 'important', + u'備考': 'note', + u'通報': 'tip', + u'警告': 'warning', + u'戒告': 'admonition', + u'サイドバー': 'sidebar', + u'トピック': 'topic', + u'ラインブロック': 'line-block', + u'パーズドリテラル': 'parsed-literal', + u'ルブリック': 'rubric', + u'エピグラフ': 'epigraph', + u'題言': 'epigraph', + u'ハイライト': 'highlights', + u'見所': 'highlights', + u'プルクオート': 'pull-quote', + u'合成': 'compound', + u'コンテナー': 'container', + u'容器': 'container', + u'表': 'table', + u'csv表': 'csv-table', + u'リスト表': 'list-table', + #u'質問': 'questions', + #u'問答': 'questions', + #u'faq': 'questions', + u'math (translation required)': 'math', + u'メタ': 'meta', + #u'イメージマプ': 'imagemap', + u'イメージ': 'image', + u'画像': 'image', + u'フィグア': 'figure', + u'図版': 'figure', + u'インクルード': 'include', + u'含む': 'include', + u'組み込み': 'include', + u'生': 'raw', + u'原': 'raw', + u'換える': 'replace', + u'取り換える': 'replace', + u'掛け替える': 'replace', + u'ユニコード': 'unicode', + u'日付': 'date', + u'クラス': 'class', + u'ロール': 'role', + u'役': 'role', + u'ディフォルトロール': 'default-role', + u'既定役': 'default-role', + u'タイトル': 'title', + u'題': 'title', # 題名 件名 + u'目次': 'contents', + u'節数': 'sectnum', + u'ヘッダ': 'header', + u'フッタ': 'footer', + #u'脚注': 'footnotes', # 脚註? + #u'サイテーション': 'citations',   # 出典 引証 引用 + u'ターゲットノート': 'target-notes', # 的注 的脚注 + } +"""Japanese name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'略': 'abbreviation', + u'頭字語': 'acronym', + u'code (translation required)': 'code', + u'インデックス': 'index', + u'索引': 'index', + u'添字': 'subscript', + u'下付': 'subscript', + u'下': 'subscript', + u'上付': 'superscript', + u'上': 'superscript', + u'題参照': 'title-reference', + u'pep参照': 'pep-reference', + u'rfc参照': 'rfc-reference', + u'強調': 'emphasis', + u'強い': 'strong', + u'リテラル': 'literal', + u'整形済み': 'literal', + u'math (translation required)': 'math', + u'名付参照': 'named-reference', + u'無名参照': 'anonymous-reference', + u'脚注参照': 'footnote-reference', + u'出典参照': 'citation-reference', + u'代入参照': 'substitution-reference', + u'的': 'target', + u'uri参照': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + u'生': 'raw',} +"""Mapping of Japanese role names to canonical role names for interpreted +text.""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/ko.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/ko.py new file mode 100644 index 0000000..8393cab --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/ko.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +# $Id: ko.py 8253 2019-04-15 10:01:10Z milde $ +# Author: Thomas SJ Kang +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Korean-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'집중': 'attention', + u'주의': 'caution', + u'코드': 'code', + u'코드-블록': 'code', + u'소스코드': 'code', + u'위험': 'danger', + u'오류': 'error', + u'실마리': 'hint', + u'중요한': 'important', + u'비고': 'note', + u'팁': 'tip', + u'경고': 'warning', + u'권고': 'admonition', + u'사이드바': 'sidebar', + u'주제': 'topic', + u'라인-블록': 'line-block', + u'파싱된-리터럴': 'parsed-literal', + u'지시문': 'rubric', + u'제명': 'epigraph', + u'하이라이': 'highlights', + u'발췌문': 'pull-quote', + u'합성어': 'compound', + u'컨테이너': 'container', + #u'질문': 'questions', + u'표': 'table', + u'csv-표': 'csv-table', + u'list-표': 'list-table', + #u'qa': 'questions', + #u'faq': 'questions', + u'메타': 'meta', + u'수학': 'math', + #u'이미지맵': 'imagemap', + u'이미지': 'image', + u'도표': 'figure', + u'포함': 'include', + 'raw': 'raw', + u'대신하다': 'replace', + 'unicode': 'unicode', + u'날짜': 'date', + 'class': 'class', + u'역할': 'role', + u'기본-역할': 'default-role', + u'제목': 'title', + u'내용': 'contents', + 'sectnum': 'sectnum', + u'섹션-번호-매기기': 'sectnum', + u'머리말': 'header', + u'꼬리말': 'footer', + #u'긱주': 'footnotes', + #u'인용구': 'citations', + u'목표-노트': 'target-notes', + u'restructuredtext 테스트 지시어': 'restructuredtext-test-directive'} +"""Korean name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'약어': 'abbreviation', + u'ab': 'abbreviation', + u'두음문자': 'acronym', + u'ac': 'acronym', + u'코드': 'code', + u'색인': 'index', + u'i': 'index', + u'다리-글자': 'subscript', + u'sub': 'subscript', + u'어깨-글자': 'superscript', + u'sup': 'superscript', + u'제목-참조': 'title-reference', + u'제목': 'title-reference', + u't': 'title-reference', + u'pep-참조': 'pep-reference', + u'pep': 'pep-reference', + u'rfc-참조': 'rfc-reference', + u'rfc': 'rfc-reference', + u'강조': 'emphasis', + u'굵게': 'strong', + u'기울기': 'literal', + u'수학': 'math', + u'명명된-참조': 'named-reference', + u'익명-참조': 'anonymous-reference', + u'각주-참조': 'footnote-reference', + u'인용-참조': 'citation-reference', + u'대리-참조': 'substitution-reference', + u'대상': 'target', + u'uri-참조': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + 'raw': 'raw',} +"""Mapping of Korean role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/lt.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/lt.py new file mode 100644 index 0000000..8168c6a --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/lt.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# $Id: lt.py 7668 2013-06-04 12:46:30Z milde $ +# Author: Dalius Dobravolskas +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Lithuanian-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'dėmesio': 'attention', + u'atsargiai': 'caution', + u'code (translation required)': 'code', + u'pavojinga': 'danger', + u'klaida': 'error', + u'užuomina': 'hint', + u'svarbu': 'important', + u'pastaba': 'note', + u'patarimas': 'tip', + u'įspėjimas': 'warning', + u'perspėjimas': 'admonition', + u'šoninė-juosta': 'sidebar', + u'tema': 'topic', + u'linijinis-blokas': 'line-block', + u'išanalizuotas-literalas': 'parsed-literal', + u'rubrika': 'rubric', + u'epigrafas': 'epigraph', + u'pagridiniai-momentai': 'highlights', + u'atitraukta-citata': 'pull-quote', + u'sudėtinis-darinys': 'compound', + u'konteineris': 'container', + #'questions': 'questions', + u'lentelė': 'table', + u'csv-lentelė': 'csv-table', + u'sąrašo-lentelė': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + u'meta': 'meta', + u'matematika': 'math', + #'imagemap': 'imagemap', + u'paveiksliukas': 'image', + u'iliustracija': 'figure', + u'pridėti': 'include', + u'žalia': 'raw', + u'pakeisti': 'replace', + u'unikodas': 'unicode', + u'data': 'date', + u'klasė': 'class', + u'rolė': 'role', + u'numatytoji-rolė': 'default-role', + u'titulas': 'title', + u'turinys': 'contents', + u'seknum': 'sectnum', + u'sekcijos-numeravimas': 'sectnum', + u'antraštė': 'header', + u'poraštė': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'nutaikytos-pastaba': 'target-notes', + u'restructuredtext-testinė-direktyva': 'restructuredtext-test-directive'} +"""Lithuanian name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + 'santrumpa': 'abbreviation', + 'sa': 'abbreviation', + 'akronimas': 'acronym', + 'ak': 'acronym', + u'code (translation required)': 'code', + 'indeksas': 'index', + 'i': 'index', + u'apatinis-indeksas': 'subscript', + 'sub': 'subscript', + u'viršutinis-indeksas': 'superscript', + 'sup': 'superscript', + u'antrašės-nuoroda': 'title-reference', + u'antraštė': 'title-reference', + 'a': 'title-reference', + 'pep-nuoroda': 'pep-reference', + 'pep': 'pep-reference', + 'rfc-nuoroda': 'rfc-reference', + 'rfc': 'rfc-reference', + u'paryškinimas': 'emphasis', + u'sustiprintas': 'strong', + u'literalas': 'literal', + u'matematika': 'math', + u'vardinė-nuoroda': 'named-reference', + u'anoniminė-nuoroda': 'anonymous-reference', + u'išnašos-nuoroda': 'footnote-reference', + u'citatos-nuoroda': 'citation-reference', + u'pakeitimo-nuoroda': 'substitution-reference', + u'taikinys': 'target', + u'uri-nuoroda': 'uri-reference', + 'uri': 'uri-reference', + 'url': 'uri-reference', + 'žalia': 'raw',} +"""Mapping of English role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/lv.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/lv.py new file mode 100644 index 0000000..3f8313c --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/lv.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +# $Id: lv.py 7975 2016-10-20 20:00:19Z milde $ +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Latvian-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + 'uzmanību': 'attention', + 'piesardzību': 'caution', + 'kods': 'code', + 'koda-bloks': 'code', + 'pirmkods': 'code', + 'bīstami': 'danger', + 'kļūda': 'error', + 'ieteikums': 'hint', + 'svarīgi': 'important', + 'piezīme': 'note', + 'padoms': 'tip', + 'brīdinājums': 'warning', + 'aizrādījums': 'admonition', + 'sānjosla': 'sidebar', + 'tēma': 'topic', + 'rindu-bloks': 'line-block', + 'parsēts-literālis': 'parsed-literal', + 'rubrika': 'rubric', + 'epigrāfs': 'epigraph', + 'apskats': 'highlights', + 'izvilkuma-citāts': 'pull-quote', + 'savienojums': 'compound', + 'konteiners': 'container', + #'questions': 'questions', + 'tabula': 'table', + 'csv-tabula': 'csv-table', + 'sarakstveida-tabula': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + 'meta': 'meta', + 'matemātika': 'math', + #'imagemap': 'imagemap', + 'attēls': 'image', + 'figūra': 'figure', + 'ietvert': 'include', + 'burtiski': 'raw', + 'aizvieto': 'replace', + 'unicode': 'unicode', + 'datums': 'date', + 'klase': 'class', + 'role': 'role', + 'noklusējuma-role': 'default-role', + 'virsraksts': 'title', + 'saturs': 'contents', + 'numurēt-sekcijas': 'sectnum', + 'galvene': 'header', + 'kājene': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + 'atsauces-apakšā': 'target-notes', + 'restructuredtext-testa-direktīva': 'restructuredtext-test-directive'} +"""English name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + 'saīsinājums': 'abbreviation', + 'īsi': 'abbreviation', + 'akronīms': 'acronym', + 'kods': 'code', + 'indekss': 'index', + 'i': 'index', + 'apakšraksts': 'subscript', + 'apakšā': 'subscript', + 'augšraksts': 'superscript', + 'augšā': 'superscript', + 'virsraksta-atsauce': 'title-reference', + 'virsraksts': 'title-reference', + 'v': 'title-reference', + 'atsauce-uz-pep': 'pep-reference', + 'pep': 'pep-reference', + 'atsauce-uz-rfc': 'rfc-reference', + 'rfc': 'rfc-reference', + 'izcēlums': 'emphasis', + 'blīvs': 'strong', + 'literālis': 'literal', + 'matemātika': 'math', + 'nosaukta-atsauce': 'named-reference', + 'nenosaukta-atsauce': 'anonymous-reference', + 'kājenes-atsauce': 'footnote-reference', + 'citātā-atsauce': 'citation-reference', + 'aizvietojuma-atsauce': 'substitution-reference', + 'mēr''kis': 'target', + 'atsauce-uz-uri': 'uri-reference', + 'uri': 'uri-reference', + 'url': 'uri-reference', + 'burtiski': 'raw',} +"""Mapping of English role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/nl.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/nl.py new file mode 100644 index 0000000..4dc2033 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/nl.py @@ -0,0 +1,112 @@ +# $Id: nl.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Martijn Pieters +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Dutch-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + 'attentie': 'attention', + 'let-op': 'caution', + 'code (translation required)': 'code', + 'gevaar': 'danger', + 'fout': 'error', + 'hint': 'hint', + 'belangrijk': 'important', + 'opmerking': 'note', + 'tip': 'tip', + 'waarschuwing': 'warning', + 'aanmaning': 'admonition', + 'katern': 'sidebar', + 'onderwerp': 'topic', + 'lijn-blok': 'line-block', + 'letterlijk-ontleed': 'parsed-literal', + 'rubriek': 'rubric', + 'opschrift': 'epigraph', + 'hoogtepunten': 'highlights', + 'pull-quote': 'pull-quote', # Dutch printers use the english term + 'samenstelling': 'compound', + 'verbinding': 'compound', + u'container (translation required)': 'container', + #'vragen': 'questions', + 'tabel': 'table', + 'csv-tabel': 'csv-table', + 'lijst-tabel': 'list-table', + #'veelgestelde-vragen': 'questions', + 'meta': 'meta', + 'math (translation required)': 'math', + #'imagemap': 'imagemap', + 'beeld': 'image', + 'figuur': 'figure', + 'opnemen': 'include', + 'onbewerkt': 'raw', + 'vervang': 'replace', + 'vervanging': 'replace', + 'unicode': 'unicode', + 'datum': 'date', + 'klasse': 'class', + 'rol': 'role', + u'default-role (translation required)': 'default-role', + 'title (translation required)': 'title', + 'inhoud': 'contents', + 'sectnum': 'sectnum', + 'sectie-nummering': 'sectnum', + 'hoofdstuk-nummering': 'sectnum', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer', + #'voetnoten': 'footnotes', + #'citaten': 'citations', + 'verwijzing-voetnoten': 'target-notes', + 'restructuredtext-test-instructie': 'restructuredtext-test-directive'} +"""Dutch name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + 'afkorting': 'abbreviation', + # 'ab': 'abbreviation', + 'acroniem': 'acronym', + 'ac': 'acronym', + u'code (translation required)': 'code', + 'index': 'index', + 'i': 'index', + 'inferieur': 'subscript', + 'inf': 'subscript', + 'superieur': 'superscript', + 'sup': 'superscript', + 'titel-referentie': 'title-reference', + 'titel': 'title-reference', + 't': 'title-reference', + 'pep-referentie': 'pep-reference', + 'pep': 'pep-reference', + 'rfc-referentie': 'rfc-reference', + 'rfc': 'rfc-reference', + 'nadruk': 'emphasis', + 'extra': 'strong', + 'extra-nadruk': 'strong', + 'vet': 'strong', + 'letterlijk': 'literal', + 'math (translation required)': 'math', + 'benoemde-referentie': 'named-reference', + 'anonieme-referentie': 'anonymous-reference', + 'voetnoot-referentie': 'footnote-reference', + 'citaat-referentie': 'citation-reference', + 'substitie-reference': 'substitution-reference', + 'verwijzing': 'target', + 'uri-referentie': 'uri-reference', + 'uri': 'uri-reference', + 'url': 'uri-reference', + 'onbewerkt': 'raw',} +"""Mapping of Dutch role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/pl.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/pl.py new file mode 100644 index 0000000..9cd7ddb --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/pl.py @@ -0,0 +1,102 @@ +# $Id$ +# Author: Robert Wojciechowicz +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Polish-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'uwaga': 'attention', + u'ostro\u017cnie': 'caution', + u'code (translation required)': 'code', + u'niebezpiecze\u0144stwo': 'danger', + u'b\u0142\u0105d': 'error', + u'wskaz\u00f3wka': 'hint', + u'wa\u017cne': 'important', + u'przypis': 'note', + u'rada': 'tip', + u'ostrze\u017cenie': 'warning', + u'upomnienie': 'admonition', + u'ramka': 'sidebar', + u'temat': 'topic', + u'blok-linii': 'line-block', + u'sparsowany-litera\u0142': 'parsed-literal', + u'rubryka': 'rubric', + u'epigraf': 'epigraph', + u'highlights': 'highlights', # FIXME no polish equivalent? + u'pull-quote': 'pull-quote', # FIXME no polish equivalent? + u'z\u0142o\u017cony': 'compound', + u'kontener': 'container', + #'questions': 'questions', + u'tabela': 'table', + u'tabela-csv': 'csv-table', + u'tabela-listowa': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + u'meta': 'meta', + 'math (translation required)': 'math', + #'imagemap': 'imagemap', + u'obraz': 'image', + u'rycina': 'figure', + u'do\u0142\u0105cz': 'include', + u'surowe': 'raw', + u'zast\u0105p': 'replace', + u'unikod': 'unicode', + u'data': 'date', + u'klasa': 'class', + u'rola': 'role', + u'rola-domy\u015blna': 'default-role', + u'tytu\u0142': 'title', + u'tre\u015b\u0107': 'contents', + u'sectnum': 'sectnum', + u'numeracja-sekcji': 'sectnum', + u'nag\u0142\u00f3wek': 'header', + u'stopka': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'target-notes': 'target-notes', # FIXME no polish equivalent? + u'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Polish name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'skr\u00f3t': 'abbreviation', + u'akronim': 'acronym', + u'code (translation required)': 'code', + u'indeks': 'index', + u'indeks-dolny': 'subscript', + u'indeks-g\u00f3rny': 'superscript', + u'referencja-tytu\u0142': 'title-reference', + u'referencja-pep': 'pep-reference', + u'referencja-rfc': 'rfc-reference', + u'podkre\u015blenie': 'emphasis', + u'wyt\u0142uszczenie': 'strong', + u'dos\u0142ownie': 'literal', + 'math (translation required)': 'math', + u'referencja-nazwana': 'named-reference', + u'referencja-anonimowa': 'anonymous-reference', + u'referencja-przypis': 'footnote-reference', + u'referencja-cytat': 'citation-reference', + u'referencja-podstawienie': 'substitution-reference', + u'cel': 'target', + u'referencja-uri': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + u'surowe': 'raw',} +"""Mapping of Polish role names to canonical role names for interpreted text. +""" + + + diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/pt_br.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/pt_br.py new file mode 100644 index 0000000..36d8c42 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/pt_br.py @@ -0,0 +1,108 @@ +# $Id: pt_br.py 7119 2011-09-02 13:00:23Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Brazilian Portuguese-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'aten\u00E7\u00E3o': 'attention', + 'cuidado': 'caution', + u'code (translation required)': 'code', + 'perigo': 'danger', + 'erro': 'error', + u'sugest\u00E3o': 'hint', + 'importante': 'important', + 'nota': 'note', + 'dica': 'tip', + 'aviso': 'warning', + u'exorta\u00E7\u00E3o': 'admonition', + 'barra-lateral': 'sidebar', + u't\u00F3pico': 'topic', + 'bloco-de-linhas': 'line-block', + 'literal-interpretado': 'parsed-literal', + 'rubrica': 'rubric', + u'ep\u00EDgrafo': 'epigraph', + 'destaques': 'highlights', + u'cita\u00E7\u00E3o-destacada': 'pull-quote', + u'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #'perguntas': 'questions', + #'qa': 'questions', + #'faq': 'questions', + u'table (translation required)': 'table', + u'csv-table (translation required)': 'csv-table', + u'list-table (translation required)': 'list-table', + 'meta': 'meta', + 'math (translation required)': 'math', + #'imagemap': 'imagemap', + 'imagem': 'image', + 'figura': 'figure', + u'inclus\u00E3o': 'include', + 'cru': 'raw', + u'substitui\u00E7\u00E3o': 'replace', + 'unicode': 'unicode', + 'data': 'date', + 'classe': 'class', + 'role (translation required)': 'role', + u'default-role (translation required)': 'default-role', + u'title (translation required)': 'title', + u'\u00EDndice': 'contents', + 'numsec': 'sectnum', + u'numera\u00E7\u00E3o-de-se\u00E7\u00F5es': 'sectnum', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer', + #u'notas-de-rorap\u00E9': 'footnotes', + #u'cita\u00E7\u00F5es': 'citations', + u'links-no-rodap\u00E9': 'target-notes', + 'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Brazilian Portuguese name to registered (in directives/__init__.py) +directive name mapping.""" + +roles = { + # language-dependent: fixed + u'abbrevia\u00E7\u00E3o': 'abbreviation', + 'ab': 'abbreviation', + u'acr\u00F4nimo': 'acronym', + 'ac': 'acronym', + u'code (translation required)': 'code', + u'\u00EDndice-remissivo': 'index', + 'i': 'index', + 'subscrito': 'subscript', + 'sub': 'subscript', + 'sobrescrito': 'superscript', + 'sob': 'superscript', + u'refer\u00EAncia-a-t\u00EDtulo': 'title-reference', + u't\u00EDtulo': 'title-reference', + 't': 'title-reference', + u'refer\u00EAncia-a-pep': 'pep-reference', + 'pep': 'pep-reference', + u'refer\u00EAncia-a-rfc': 'rfc-reference', + 'rfc': 'rfc-reference', + u'\u00EAnfase': 'emphasis', + 'forte': 'strong', + 'literal': 'literal', + 'math (translation required)': 'math', # translation required? + u'refer\u00EAncia-por-nome': 'named-reference', + u'refer\u00EAncia-an\u00F4nima': 'anonymous-reference', + u'refer\u00EAncia-a-nota-de-rodap\u00E9': 'footnote-reference', + u'refer\u00EAncia-a-cita\u00E7\u00E3o': 'citation-reference', + u'refer\u00EAncia-a-substitui\u00E7\u00E3o': 'substitution-reference', + 'alvo': 'target', + u'refer\u00EAncia-a-uri': 'uri-reference', + 'uri': 'uri-reference', + 'url': 'uri-reference', + 'cru': 'raw',} +"""Mapping of Brazilian Portuguese role names to canonical role names +for interpreted text.""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/ru.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/ru.py new file mode 100644 index 0000000..3089314 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/ru.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +# $Id: ru.py 7123 2011-09-12 08:28:31Z milde $ +# Author: Roman Suzi +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Russian-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + +directives = { + u'блок-строк': u'line-block', + u'meta': u'meta', + u'математика': 'math', + u'обработанный-литерал': u'parsed-literal', + u'выделенная-цитата': u'pull-quote', + u'код': 'code', + u'compound (translation required)': 'compound', + u'контейнер': 'container', + u'таблица': 'table', + u'csv-table (translation required)': 'csv-table', + u'list-table (translation required)': 'list-table', + u'сырой': u'raw', + u'замена': u'replace', + u'тестовая-директива-restructuredtext': u'restructuredtext-test-directive', + u'целевые-сноски': u'target-notes', + u'unicode': u'unicode', + u'дата': u'date', + u'боковая-полоса': u'sidebar', + u'важно': u'important', + u'включать': u'include', + u'внимание': u'attention', + u'выделение': u'highlights', + u'замечание': u'admonition', + u'изображение': u'image', + u'класс': u'class', + u'роль': 'role', + u'default-role (translation required)': 'default-role', + u'титул': 'title', + u'номер-раздела': u'sectnum', + u'нумерация-разделов': u'sectnum', + u'опасно': u'danger', + u'осторожно': u'caution', + u'ошибка': u'error', + u'подсказка': u'tip', + u'предупреждение': u'warning', + u'примечание': u'note', + u'рисунок': u'figure', + u'рубрика': u'rubric', + u'совет': u'hint', + u'содержание': u'contents', + u'тема': u'topic', + u'эпиграф': u'epigraph', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer',} +"""Russian name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + u'акроним': 'acronym', + u'код': 'code', + u'анонимная-ссылка': 'anonymous-reference', + u'буквально': 'literal', + u'математика': 'math', + u'верхний-индекс': 'superscript', + u'выделение': 'emphasis', + u'именованная-ссылка': 'named-reference', + u'индекс': 'index', + u'нижний-индекс': 'subscript', + u'сильное-выделение': 'strong', + u'сокращение': 'abbreviation', + u'ссылка-замена': 'substitution-reference', + u'ссылка-на-pep': 'pep-reference', + u'ссылка-на-rfc': 'rfc-reference', + u'ссылка-на-uri': 'uri-reference', + u'ссылка-на-заглавие': 'title-reference', + u'ссылка-на-сноску': 'footnote-reference', + u'цитатная-ссылка': 'citation-reference', + u'цель': 'target', + u'сырой': 'raw',} +"""Mapping of Russian role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/sk.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/sk.py new file mode 100644 index 0000000..a493e22 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/sk.py @@ -0,0 +1,95 @@ +# $Id: sk.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Miroslav Vasko +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Slovak-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + u'pozor': 'attention', + u'opatrne': 'caution', + u'code (translation required)': 'code', + u'nebezpe\xe8enstvo': 'danger', + u'chyba': 'error', + u'rada': 'hint', + u'd\xf4le\x9eit\xe9': 'important', + u'pozn\xe1mka': 'note', + u'tip (translation required)': 'tip', + u'varovanie': 'warning', + u'admonition (translation required)': 'admonition', + u'sidebar (translation required)': 'sidebar', + u't\xe9ma': 'topic', + u'blok-riadkov': 'line-block', + u'parsed-literal': 'parsed-literal', + u'rubric (translation required)': 'rubric', + u'epigraph (translation required)': 'epigraph', + u'highlights (translation required)': 'highlights', + u'pull-quote (translation required)': 'pull-quote', + u'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #u'questions': 'questions', + #u'qa': 'questions', + #u'faq': 'questions', + u'table (translation required)': 'table', + u'csv-table (translation required)': 'csv-table', + u'list-table (translation required)': 'list-table', + u'meta': 'meta', + 'math (translation required)': 'math', + #u'imagemap': 'imagemap', + u'obr\xe1zok': 'image', + u'tvar': 'figure', + u'vlo\x9ei\x9d': 'include', + u'raw (translation required)': 'raw', + u'nahradi\x9d': 'replace', + u'unicode': 'unicode', + u'd\u00E1tum': 'date', + u'class (translation required)': 'class', + u'role (translation required)': 'role', + u'default-role (translation required)': 'default-role', + u'title (translation required)': 'title', + u'obsah': 'contents', + u'\xe8as\x9d': 'sectnum', + u'\xe8as\x9d-\xe8\xedslovanie': 'sectnum', + u'cie\xbeov\xe9-pozn\xe1mky': 'target-notes', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer', + #u'footnotes': 'footnotes', + #u'citations': 'citations', + } +"""Slovak name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + u'abbreviation (translation required)': 'abbreviation', + u'acronym (translation required)': 'acronym', + u'code (translation required)': 'code', + u'index (translation required)': 'index', + u'subscript (translation required)': 'subscript', + u'superscript (translation required)': 'superscript', + u'title-reference (translation required)': 'title-reference', + u'pep-reference (translation required)': 'pep-reference', + u'rfc-reference (translation required)': 'rfc-reference', + u'emphasis (translation required)': 'emphasis', + u'strong (translation required)': 'strong', + u'literal (translation required)': 'literal', + 'math (translation required)': 'math', + u'named-reference (translation required)': 'named-reference', + u'anonymous-reference (translation required)': 'anonymous-reference', + u'footnote-reference (translation required)': 'footnote-reference', + u'citation-reference (translation required)': 'citation-reference', + u'substitution-reference (translation required)': 'substitution-reference', + u'target (translation required)': 'target', + u'uri-reference (translation required)': 'uri-reference', + u'raw (translation required)': 'raw',} +"""Mapping of Slovak role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/sv.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/sv.py new file mode 100644 index 0000000..01363bd --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/sv.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# $Id: sv.py 8012 2017-01-03 23:08:19Z milde $ +# Author: Adam Chodorowski +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Swedish language mappings for language-dependent features of reStructuredText. +""" + +__docformat__ = 'reStructuredText' + +directives = { + u'observera': 'attention', + u'akta': 'caution', # also 'försiktigt' + u'kod': 'code', + u'fara': 'danger', + u'fel': 'error', + u'vink': 'hint', # also 'hint' + u'viktigt': 'important', + u'notera': 'note', + u'tips': 'tip', + u'varning': 'warning', + u'anmärkning': 'admonition', # literal 'tillrättavisning', 'förmaning' + u'sidorad': 'sidebar', + u'ämne': 'topic', + u'tema': 'topic', + u'rad-block': 'line-block', + u'parsed-literal (translation required)': 'parsed-literal', # 'tolkad-bokstavlig'? + u'rubrik': 'rubric', + u'epigraf': 'epigraph', + u'höjdpunkter': 'highlights', + u'pull-quote (translation required)': 'pull-quote', + u'sammansatt': 'compound', + u'container': 'container', + # u'frågor': 'questions', + # NOTE: A bit long, but recommended by http://www.nada.kth.se/dataterm/: + # u'frågor-och-svar': 'questions', + # u'vanliga-frågor': 'questions', + u'tabell': 'table', + u'csv-tabell': 'csv-table', + u'list-tabell': 'list-table', + u'meta': 'meta', + u'matematik': 'math', + # u'bildkarta': 'imagemap', # FIXME: Translation might be too literal. + u'bild': 'image', + u'figur': 'figure', + u'inkludera': 'include', + u'rå': 'raw', + u'ersätta': 'replace', + u'unicode': 'unicode', + u'datum': 'date', + u'klass': 'class', + u'roll': 'role', + u'standardroll': 'default-role', + u'titel': 'title', + u'innehåll': 'contents', + u'sektionsnumrering': 'sectnum', + u'target-notes (translation required)': 'target-notes', + u'sidhuvud': 'header', + u'sidfot': 'footer', + # u'fotnoter': 'footnotes', + # u'citeringar': 'citations', + } +"""Swedish name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + u'förkortning': 'abbreviation', + u'akronym': 'acronym', + u'kod': 'code', + u'index': 'index', + u'nedsänkt': 'subscript', + u'upphöjd': 'superscript', + u'titel-referens': 'title-reference', + u'pep-referens': 'pep-reference', + u'rfc-referens': 'rfc-reference', + u'betoning': 'emphasis', + u'stark': 'strong', + u'bokstavlig': 'literal', # also 'ordagranna' + u'matematik': 'math', + u'namngiven-referens': 'named-reference', + u'anonym-referens': 'anonymous-reference', + u'fotnot-referens': 'footnote-reference', + u'citat-referens': 'citation-reference', + u'ersättnings-referens': 'substitution-reference', + u'mål': 'target', + u'uri-referens': 'uri-reference', + u'rå': 'raw',} +"""Mapping of Swedish role names to canonical role names for interpreted text. +""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_cn.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_cn.py new file mode 100644 index 0000000..f52d8e5 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_cn.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# $Id: zh_cn.py 7119 2011-09-02 13:00:23Z milde $ +# Author: Panjunyong +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Simplified Chinese language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'注意': 'attention', + u'小心': 'caution', + u'code (translation required)': 'code', + u'危险': 'danger', + u'错误': 'error', + u'提示': 'hint', + u'重要': 'important', + u'注解': 'note', + u'技巧': 'tip', + u'警告': 'warning', + u'忠告': 'admonition', + u'侧框': 'sidebar', + u'主题': 'topic', + u'line-block (translation required)': 'line-block', + u'parsed-literal (translation required)': 'parsed-literal', + u'醒目': 'rubric', + u'铭文': 'epigraph', + u'要点': 'highlights', + u'pull-quote (translation required)': 'pull-quote', + u'复合': 'compound', + u'容器': 'container', + #u'questions (translation required)': 'questions', + u'表格': 'table', + u'csv表格': 'csv-table', + u'列表表格': 'list-table', + #u'qa (translation required)': 'questions', + #u'faq (translation required)': 'questions', + u'元数据': 'meta', + u'math (translation required)': 'math', + #u'imagemap (translation required)': 'imagemap', + u'图片': 'image', + u'图例': 'figure', + u'包含': 'include', + u'原文': 'raw', + u'代替': 'replace', + u'统一码': 'unicode', + u'日期': 'date', + u'类型': 'class', + u'角色': 'role', + u'默认角色': 'default-role', + u'标题': 'title', + u'目录': 'contents', + u'章节序号': 'sectnum', + u'题头': 'header', + u'页脚': 'footer', + #u'footnotes (translation required)': 'footnotes', + #u'citations (translation required)': 'citations', + u'target-notes (translation required)': 'target-notes', + u'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Simplified Chinese name to registered (in directives/__init__.py) +directive name mapping.""" + +roles = { + # language-dependent: fixed + u'缩写': 'abbreviation', + u'简称': 'acronym', + u'code (translation required)': 'code', + u'index (translation required)': 'index', + u'i (translation required)': 'index', + u'下标': 'subscript', + u'上标': 'superscript', + u'title-reference (translation required)': 'title-reference', + u'title (translation required)': 'title-reference', + u't (translation required)': 'title-reference', + u'pep-reference (translation required)': 'pep-reference', + u'pep (translation required)': 'pep-reference', + u'rfc-reference (translation required)': 'rfc-reference', + u'rfc (translation required)': 'rfc-reference', + u'强调': 'emphasis', + u'加粗': 'strong', + u'字面': 'literal', + u'math (translation required)': 'math', + u'named-reference (translation required)': 'named-reference', + u'anonymous-reference (translation required)': 'anonymous-reference', + u'footnote-reference (translation required)': 'footnote-reference', + u'citation-reference (translation required)': 'citation-reference', + u'substitution-reference (translation required)': 'substitution-reference', + u'target (translation required)': 'target', + u'uri-reference (translation required)': 'uri-reference', + u'uri (translation required)': 'uri-reference', + u'url (translation required)': 'uri-reference', + u'raw (translation required)': 'raw',} +"""Mapping of Simplified Chinese role names to canonical role names +for interpreted text.""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_tw.py b/lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_tw.py new file mode 100644 index 0000000..8415919 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_tw.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# $Id: zh_tw.py 7119 2011-09-02 13:00:23Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read . Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Traditional Chinese language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + 'attention (translation required)': 'attention', + 'caution (translation required)': 'caution', + 'code (translation required)': 'code', + 'danger (translation required)': 'danger', + 'error (translation required)': 'error', + 'hint (translation required)': 'hint', + 'important (translation required)': 'important', + 'note (translation required)': 'note', + 'tip (translation required)': 'tip', + 'warning (translation required)': 'warning', + 'admonition (translation required)': 'admonition', + 'sidebar (translation required)': 'sidebar', + 'topic (translation required)': 'topic', + 'line-block (translation required)': 'line-block', + 'parsed-literal (translation required)': 'parsed-literal', + 'rubric (translation required)': 'rubric', + 'epigraph (translation required)': 'epigraph', + 'highlights (translation required)': 'highlights', + 'pull-quote (translation required)': 'pull-quote', + 'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #'questions (translation required)': 'questions', + 'table (translation required)': 'table', + 'csv-table (translation required)': 'csv-table', + 'list-table (translation required)': 'list-table', + #'qa (translation required)': 'questions', + #'faq (translation required)': 'questions', + 'meta (translation required)': 'meta', + 'math (translation required)': 'math', + #'imagemap (translation required)': 'imagemap', + 'image (translation required)': 'image', + 'figure (translation required)': 'figure', + 'include (translation required)': 'include', + 'raw (translation required)': 'raw', + 'replace (translation required)': 'replace', + 'unicode (translation required)': 'unicode', + u'日期': 'date', + 'class (translation required)': 'class', + 'role (translation required)': 'role', + u'default-role (translation required)': 'default-role', + u'title (translation required)': 'title', + 'contents (translation required)': 'contents', + 'sectnum (translation required)': 'sectnum', + 'section-numbering (translation required)': 'sectnum', + u'header (translation required)': 'header', + u'footer (translation required)': 'footer', + #'footnotes (translation required)': 'footnotes', + #'citations (translation required)': 'citations', + 'target-notes (translation required)': 'target-notes', + 'restructuredtext-test-directive': 'restructuredtext-test-directive'} +"""Traditional Chinese name to registered (in directives/__init__.py) +directive name mapping.""" + +roles = { + # language-dependent: fixed + 'abbreviation (translation required)': 'abbreviation', + 'ab (translation required)': 'abbreviation', + 'acronym (translation required)': 'acronym', + 'ac (translation required)': 'acronym', + u'code (translation required)': 'code', + 'index (translation required)': 'index', + 'i (translation required)': 'index', + 'subscript (translation required)': 'subscript', + 'sub (translation required)': 'subscript', + 'superscript (translation required)': 'superscript', + 'sup (translation required)': 'superscript', + 'title-reference (translation required)': 'title-reference', + 'title (translation required)': 'title-reference', + 't (translation required)': 'title-reference', + 'pep-reference (translation required)': 'pep-reference', + 'pep (translation required)': 'pep-reference', + 'rfc-reference (translation required)': 'rfc-reference', + 'rfc (translation required)': 'rfc-reference', + 'emphasis (translation required)': 'emphasis', + 'strong (translation required)': 'strong', + 'literal (translation required)': 'literal', + 'math (translation required)': 'math', + 'named-reference (translation required)': 'named-reference', + 'anonymous-reference (translation required)': 'anonymous-reference', + 'footnote-reference (translation required)': 'footnote-reference', + 'citation-reference (translation required)': 'citation-reference', + 'substitution-reference (translation required)': 'substitution-reference', + 'target (translation required)': 'target', + 'uri-reference (translation required)': 'uri-reference', + 'uri (translation required)': 'uri-reference', + 'url (translation required)': 'uri-reference', + 'raw (translation required)': 'raw',} +"""Mapping of Traditional Chinese role names to canonical role names for +interpreted text.""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/roles.py b/lib/python3.8/site-packages/docutils/parsers/rst/roles.py new file mode 100644 index 0000000..25b82d7 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/roles.py @@ -0,0 +1,399 @@ +# $Id: roles.py 8347 2019-08-26 12:12:02Z milde $ +# Author: Edward Loper +# Copyright: This module has been placed in the public domain. + +""" +This module defines standard interpreted text role functions, a registry for +interpreted text roles, and an API for adding to and retrieving from the +registry. + +The interface for interpreted role functions is as follows:: + + def role_fn(name, rawtext, text, lineno, inliner, + options={}, content=[]): + code... + + # Set function attributes for customization: + role_fn.options = ... + role_fn.content = ... + +Parameters: + +- ``name`` is the local name of the interpreted text role, the role name + actually used in the document. + +- ``rawtext`` is a string containing the entire interpreted text construct. + Return it as a ``problematic`` node linked to a system message if there is a + problem. + +- ``text`` is the interpreted text content, with backslash escapes converted + to nulls (``\x00``). + +- ``lineno`` is the line number where the interpreted text beings. + +- ``inliner`` is the Inliner object that called the role function. + It defines the following useful attributes: ``reporter``, + ``problematic``, ``memo``, ``parent``, ``document``. + +- ``options``: A dictionary of directive options for customization, to be + interpreted by the role function. Used for additional attributes for the + generated elements and other functionality. + +- ``content``: A list of strings, the directive content for customization + ("role" directive). To be interpreted by the role function. + +Function attributes for customization, interpreted by the "role" directive: + +- ``options``: A dictionary, mapping known option names to conversion + functions such as `int` or `float`. ``None`` or an empty dict implies no + options to parse. Several directive option conversion functions are defined + in the `directives` module. + + All role functions implicitly support the "class" option, unless disabled + with an explicit ``{'class': None}``. + +- ``content``: A boolean; true if content is allowed. Client code must handle + the case where content is required but not supplied (an empty content list + will be supplied). + +Note that unlike directives, the "arguments" function attribute is not +supported for role customization. Directive arguments are handled by the +"role" directive itself. + +Interpreted role functions return a tuple of two values: + +- A list of nodes which will be inserted into the document tree at the + point where the interpreted role was encountered (can be an empty + list). + +- A list of system messages, which will be inserted into the document tree + immediately after the end of the current inline block (can also be empty). +""" + +__docformat__ = 'reStructuredText' + +from docutils import nodes, utils +from docutils.parsers.rst import directives +from docutils.parsers.rst.languages import en as _fallback_language_module +from docutils.utils.code_analyzer import Lexer, LexerError + +DEFAULT_INTERPRETED_ROLE = 'title-reference' +""" +The canonical name of the default interpreted role. This role is used +when no role is specified for a piece of interpreted text. +""" + +_role_registry = {} +"""Mapping of canonical role names to role functions. Language-dependent role +names are defined in the ``language`` subpackage.""" + +_roles = {} +"""Mapping of local or language-dependent interpreted text role names to role +functions.""" + +def role(role_name, language_module, lineno, reporter): + """ + Locate and return a role function from its language-dependent name, along + with a list of system messages. If the role is not found in the current + language, check English. Return a 2-tuple: role function (``None`` if the + named role cannot be found) and a list of system messages. + """ + normname = role_name.lower() + messages = [] + msg_text = [] + + if normname in _roles: + return _roles[normname], messages + + if role_name: + canonicalname = None + try: + canonicalname = language_module.roles[normname] + except AttributeError as error: + msg_text.append('Problem retrieving role entry from language ' + 'module %r: %s.' % (language_module, error)) + except KeyError: + msg_text.append('No role entry for "%s" in module "%s".' + % (role_name, language_module.__name__)) + else: + canonicalname = DEFAULT_INTERPRETED_ROLE + + # If we didn't find it, try English as a fallback. + if not canonicalname: + try: + canonicalname = _fallback_language_module.roles[normname] + msg_text.append('Using English fallback for role "%s".' + % role_name) + except KeyError: + msg_text.append('Trying "%s" as canonical role name.' + % role_name) + # The canonical name should be an English name, but just in case: + canonicalname = normname + + # Collect any messages that we generated. + if msg_text: + message = reporter.info('\n'.join(msg_text), line=lineno) + messages.append(message) + + # Look the role up in the registry, and return it. + if canonicalname in _role_registry: + role_fn = _role_registry[canonicalname] + register_local_role(normname, role_fn) + return role_fn, messages + else: + return None, messages # Error message will be generated by caller. + +def register_canonical_role(name, role_fn): + """ + Register an interpreted text role by its canonical name. + + :Parameters: + - `name`: The canonical name of the interpreted role. + - `role_fn`: The role function. See the module docstring. + """ + set_implicit_options(role_fn) + _role_registry[name] = role_fn + +def register_local_role(name, role_fn): + """ + Register an interpreted text role by its local or language-dependent name. + + :Parameters: + - `name`: The local or language-dependent name of the interpreted role. + - `role_fn`: The role function. See the module docstring. + """ + set_implicit_options(role_fn) + _roles[name] = role_fn + +def set_implicit_options(role_fn): + """ + Add customization options to role functions, unless explicitly set or + disabled. + """ + if not hasattr(role_fn, 'options') or role_fn.options is None: + role_fn.options = {'class': directives.class_option} + elif 'class' not in role_fn.options: + role_fn.options['class'] = directives.class_option + +def register_generic_role(canonical_name, node_class): + """For roles which simply wrap a given `node_class` around the text.""" + role = GenericRole(canonical_name, node_class) + register_canonical_role(canonical_name, role) + + +class GenericRole(object): + + """ + Generic interpreted text role, where the interpreted text is simply + wrapped with the provided node class. + """ + + def __init__(self, role_name, node_class): + self.name = role_name + self.node_class = node_class + + def __call__(self, role, rawtext, text, lineno, inliner, + options={}, content=[]): + set_classes(options) + return [self.node_class(rawtext, text, **options)], [] + + +class CustomRole(object): + + """ + Wrapper for custom interpreted text roles. + """ + + def __init__(self, role_name, base_role, options={}, content=[]): + self.name = role_name + self.base_role = base_role + self.options = None + if hasattr(base_role, 'options'): + self.options = base_role.options + self.content = None + if hasattr(base_role, 'content'): + self.content = base_role.content + self.supplied_options = options + self.supplied_content = content + + def __call__(self, role, rawtext, text, lineno, inliner, + options={}, content=[]): + opts = self.supplied_options.copy() + opts.update(options) + cont = list(self.supplied_content) + if cont and content: + cont += '\n' + cont.extend(content) + return self.base_role(role, rawtext, text, lineno, inliner, + options=opts, content=cont) + + +def generic_custom_role(role, rawtext, text, lineno, inliner, + options={}, content=[]): + """""" + # Once nested inline markup is implemented, this and other methods should + # recursively call inliner.nested_parse(). + set_classes(options) + return [nodes.inline(rawtext, text, **options)], [] + +generic_custom_role.options = {'class': directives.class_option} + + +###################################################################### +# Define and register the standard roles: +###################################################################### + +register_generic_role('abbreviation', nodes.abbreviation) +register_generic_role('acronym', nodes.acronym) +register_generic_role('emphasis', nodes.emphasis) +register_generic_role('literal', nodes.literal) +register_generic_role('strong', nodes.strong) +register_generic_role('subscript', nodes.subscript) +register_generic_role('superscript', nodes.superscript) +register_generic_role('title-reference', nodes.title_reference) + +def pep_reference_role(role, rawtext, text, lineno, inliner, + options={}, content=[]): + try: + pepnum = int(utils.unescape(text)) + if pepnum < 0 or pepnum > 9999: + raise ValueError + except ValueError: + msg = inliner.reporter.error( + 'PEP number must be a number from 0 to 9999; "%s" is invalid.' + % text, line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + # Base URL mainly used by inliner.pep_reference; so this is correct: + ref = (inliner.document.settings.pep_base_url + + inliner.document.settings.pep_file_url_template % pepnum) + set_classes(options) + return [nodes.reference(rawtext, 'PEP ' + text, refuri=ref, + **options)], [] + +register_canonical_role('pep-reference', pep_reference_role) + +def rfc_reference_role(role, rawtext, text, lineno, inliner, + options={}, content=[]): + try: + if "#" in text: + rfcnum, section = utils.unescape(text).split("#", 1) + else: + rfcnum, section = utils.unescape(text), None + rfcnum = int(rfcnum) + if rfcnum < 1: + raise ValueError + except ValueError: + msg = inliner.reporter.error( + 'RFC number must be a number greater than or equal to 1; ' + '"%s" is invalid.' % text, line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + # Base URL mainly used by inliner.rfc_reference, so this is correct: + ref = inliner.document.settings.rfc_base_url + inliner.rfc_url % rfcnum + if section is not None: + ref += "#"+section + set_classes(options) + node = nodes.reference(rawtext, 'RFC ' + str(rfcnum), refuri=ref, + **options) + return [node], [] + +register_canonical_role('rfc-reference', rfc_reference_role) + +def raw_role(role, rawtext, text, lineno, inliner, options={}, content=[]): + if not inliner.document.settings.raw_enabled: + msg = inliner.reporter.warning('raw (and derived) roles disabled') + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + if 'format' not in options: + msg = inliner.reporter.error( + 'No format (Writer name) is associated with this role: "%s".\n' + 'The "raw" role cannot be used directly.\n' + 'Instead, use the "role" directive to create a new role with ' + 'an associated format.' % role, line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + set_classes(options) + node = nodes.raw(rawtext, utils.unescape(text, True), **options) + node.source, node.line = inliner.reporter.get_source_and_line(lineno) + return [node], [] + +raw_role.options = {'format': directives.unchanged} + +register_canonical_role('raw', raw_role) + +def code_role(role, rawtext, text, lineno, inliner, options={}, content=[]): + set_classes(options) + language = options.get('language', '') + classes = ['code'] + if 'classes' in options: + classes.extend(options['classes']) + if language and language not in classes: + classes.append(language) + try: + tokens = Lexer(utils.unescape(text, True), language, + inliner.document.settings.syntax_highlight) + except LexerError as error: + msg = inliner.reporter.warning(error) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + + node = nodes.literal(rawtext, '', classes=classes) + + # analyse content and add nodes for every token + for classes, value in tokens: + if classes: + node += nodes.inline(value, value, classes=classes) + else: + # insert as Text to decrease the verbosity of the output + node += nodes.Text(value, value) + + return [node], [] + +code_role.options = {'class': directives.class_option, + 'language': directives.unchanged} + +register_canonical_role('code', code_role) + +def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]): + set_classes(options) + i = rawtext.find('`') + text = rawtext.split('`')[1] + node = nodes.math(rawtext, text, **options) + return [node], [] + +register_canonical_role('math', math_role) + +###################################################################### +# Register roles that are currently unimplemented. +###################################################################### + +def unimplemented_role(role, rawtext, text, lineno, inliner, attributes={}): + msg = inliner.reporter.error( + 'Interpreted text role "%s" not implemented.' % role, line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + +register_canonical_role('index', unimplemented_role) +register_canonical_role('named-reference', unimplemented_role) +register_canonical_role('anonymous-reference', unimplemented_role) +register_canonical_role('uri-reference', unimplemented_role) +register_canonical_role('footnote-reference', unimplemented_role) +register_canonical_role('citation-reference', unimplemented_role) +register_canonical_role('substitution-reference', unimplemented_role) +register_canonical_role('target', unimplemented_role) + +# This should remain unimplemented, for testing purposes: +register_canonical_role('restructuredtext-unimplemented-role', + unimplemented_role) + + +def set_classes(options): + """ + Auxiliary function to set options['classes'] and delete + options['class']. + """ + if 'class' in options: + assert 'classes' not in options + options['classes'] = options['class'] + del options['class'] diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/states.py b/lib/python3.8/site-packages/docutils/parsers/rst/states.py new file mode 100644 index 0000000..6bbccec --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/states.py @@ -0,0 +1,3116 @@ +# $Id: states.py 8359 2019-08-26 16:45:33Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +This is the ``docutils.parsers.rst.states`` module, the core of +the reStructuredText parser. It defines the following: + +:Classes: + - `RSTStateMachine`: reStructuredText parser's entry point. + - `NestedStateMachine`: recursive StateMachine. + - `RSTState`: reStructuredText State superclass. + - `Inliner`: For parsing inline markup. + - `Body`: Generic classifier of the first line of a block. + - `SpecializedBody`: Superclass for compound element members. + - `BulletList`: Second and subsequent bullet_list list_items + - `DefinitionList`: Second+ definition_list_items. + - `EnumeratedList`: Second+ enumerated_list list_items. + - `FieldList`: Second+ fields. + - `OptionList`: Second+ option_list_items. + - `RFC2822List`: Second+ RFC2822-style fields. + - `ExtensionOptions`: Parses directive option fields. + - `Explicit`: Second+ explicit markup constructs. + - `SubstitutionDef`: For embedded directives in substitution definitions. + - `Text`: Classifier of second line of a text block. + - `SpecializedText`: Superclass for continuation lines of Text-variants. + - `Definition`: Second line of potential definition_list_item. + - `Line`: Second line of overlined section title or transition marker. + - `Struct`: An auxiliary collection class. + +:Exception classes: + - `MarkupError` + - `ParserError` + - `MarkupMismatch` + +:Functions: + - `escape2null()`: Return a string, escape-backslashes converted to nulls. + - `unescape()`: Return a string, nulls removed or restored to backslashes. + +:Attributes: + - `state_classes`: set of State classes used with `RSTStateMachine`. + +Parser Overview +=============== + +The reStructuredText parser is implemented as a recursive state machine, +examining its input one line at a time. To understand how the parser works, +please first become familiar with the `docutils.statemachine` module. In the +description below, references are made to classes defined in this module; +please see the individual classes for details. + +Parsing proceeds as follows: + +1. The state machine examines each line of input, checking each of the + transition patterns of the state `Body`, in order, looking for a match. + The implicit transitions (blank lines and indentation) are checked before + any others. The 'text' transition is a catch-all (matches anything). + +2. The method associated with the matched transition pattern is called. + + A. Some transition methods are self-contained, appending elements to the + document tree (`Body.doctest` parses a doctest block). The parser's + current line index is advanced to the end of the element, and parsing + continues with step 1. + + B. Other transition methods trigger the creation of a nested state machine, + whose job is to parse a compound construct ('indent' does a block quote, + 'bullet' does a bullet list, 'overline' does a section [first checking + for a valid section header], etc.). + + - In the case of lists and explicit markup, a one-off state machine is + created and run to parse contents of the first item. + + - A new state machine is created and its initial state is set to the + appropriate specialized state (`BulletList` in the case of the + 'bullet' transition; see `SpecializedBody` for more detail). This + state machine is run to parse the compound element (or series of + explicit markup elements), and returns as soon as a non-member element + is encountered. For example, the `BulletList` state machine ends as + soon as it encounters an element which is not a list item of that + bullet list. The optional omission of inter-element blank lines is + enabled by this nested state machine. + + - The current line index is advanced to the end of the elements parsed, + and parsing continues with step 1. + + C. The result of the 'text' transition depends on the next line of text. + The current state is changed to `Text`, under which the second line is + examined. If the second line is: + + - Indented: The element is a definition list item, and parsing proceeds + similarly to step 2.B, using the `DefinitionList` state. + + - A line of uniform punctuation characters: The element is a section + header; again, parsing proceeds as in step 2.B, and `Body` is still + used. + + - Anything else: The element is a paragraph, which is examined for + inline markup and appended to the parent element. Processing + continues with step 1. +""" + +__docformat__ = 'reStructuredText' + + +import sys +import re +from types import FunctionType, MethodType + +from docutils import nodes, statemachine, utils +from docutils import ApplicationError, DataError +from docutils.statemachine import StateMachineWS, StateWS +from docutils.nodes import fully_normalize_name as normalize_name +from docutils.nodes import whitespace_normalize_name +import docutils.parsers.rst +from docutils.parsers.rst import directives, languages, tableparser, roles +from docutils.parsers.rst.languages import en as _fallback_language_module +from docutils.utils import escape2null, unescape, column_width +from docutils.utils import punctuation_chars, roman, urischemes +from docutils.utils import split_escaped_whitespace + +class MarkupError(DataError): pass +class UnknownInterpretedRoleError(DataError): pass +class InterpretedRoleNotImplementedError(DataError): pass +class ParserError(ApplicationError): pass +class MarkupMismatch(Exception): pass + + +class Struct(object): + + """Stores data attributes for dotted-attribute access.""" + + def __init__(self, **keywordargs): + self.__dict__.update(keywordargs) + + +class RSTStateMachine(StateMachineWS): + + """ + reStructuredText's master StateMachine. + + The entry point to reStructuredText parsing is the `run()` method. + """ + + def run(self, input_lines, document, input_offset=0, match_titles=True, + inliner=None): + """ + Parse `input_lines` and modify the `document` node in place. + + Extend `StateMachineWS.run()`: set up parse-global data and + run the StateMachine. + """ + self.language = languages.get_language( + document.settings.language_code) + self.match_titles = match_titles + if inliner is None: + inliner = Inliner() + inliner.init_customizations(document.settings) + self.memo = Struct(document=document, + reporter=document.reporter, + language=self.language, + title_styles=[], + section_level=0, + section_bubble_up_kludge=False, + inliner=inliner) + self.document = document + self.attach_observer(document.note_source) + self.reporter = self.memo.reporter + self.node = document + results = StateMachineWS.run(self, input_lines, input_offset, + input_source=document['source']) + assert results == [], 'RSTStateMachine.run() results should be empty!' + self.node = self.memo = None # remove unneeded references + + +class NestedStateMachine(StateMachineWS): + + """ + StateMachine run from within other StateMachine runs, to parse nested + document structures. + """ + + def run(self, input_lines, input_offset, memo, node, match_titles=True): + """ + Parse `input_lines` and populate a `docutils.nodes.document` instance. + + Extend `StateMachineWS.run()`: set up document-wide data. + """ + self.match_titles = match_titles + self.memo = memo + self.document = memo.document + self.attach_observer(self.document.note_source) + self.reporter = memo.reporter + self.language = memo.language + self.node = node + results = StateMachineWS.run(self, input_lines, input_offset) + assert results == [], ('NestedStateMachine.run() results should be ' + 'empty!') + return results + + +class RSTState(StateWS): + + """ + reStructuredText State superclass. + + Contains methods used by all State subclasses. + """ + + nested_sm = NestedStateMachine + nested_sm_cache = [] + + def __init__(self, state_machine, debug=False): + self.nested_sm_kwargs = {'state_classes': state_classes, + 'initial_state': 'Body'} + StateWS.__init__(self, state_machine, debug) + + def runtime_init(self): + StateWS.runtime_init(self) + memo = self.state_machine.memo + self.memo = memo + self.reporter = memo.reporter + self.inliner = memo.inliner + self.document = memo.document + self.parent = self.state_machine.node + # enable the reporter to determine source and source-line + if not hasattr(self.reporter, 'get_source_and_line'): + self.reporter.get_source_and_line = self.state_machine.get_source_and_line + + + def goto_line(self, abs_line_offset): + """ + Jump to input line `abs_line_offset`, ignoring jumps past the end. + """ + try: + self.state_machine.goto_line(abs_line_offset) + except EOFError: + pass + + def no_match(self, context, transitions): + """ + Override `StateWS.no_match` to generate a system message. + + This code should never be run. + """ + self.reporter.severe( + 'Internal error: no transition pattern match. State: "%s"; ' + 'transitions: %s; context: %s; current line: %r.' + % (self.__class__.__name__, transitions, context, + self.state_machine.line)) + return context, None, [] + + def bof(self, context): + """Called at beginning of file.""" + return [], [] + + def nested_parse(self, block, input_offset, node, match_titles=False, + state_machine_class=None, state_machine_kwargs=None): + """ + Create a new StateMachine rooted at `node` and run it over the input + `block`. + """ + use_default = 0 + if state_machine_class is None: + state_machine_class = self.nested_sm + use_default += 1 + if state_machine_kwargs is None: + state_machine_kwargs = self.nested_sm_kwargs + use_default += 1 + block_length = len(block) + + state_machine = None + if use_default == 2: + try: + state_machine = self.nested_sm_cache.pop() + except IndexError: + pass + if not state_machine: + state_machine = state_machine_class(debug=self.debug, + **state_machine_kwargs) + state_machine.run(block, input_offset, memo=self.memo, + node=node, match_titles=match_titles) + if use_default == 2: + self.nested_sm_cache.append(state_machine) + else: + state_machine.unlink() + new_offset = state_machine.abs_line_offset() + # No `block.parent` implies disconnected -- lines aren't in sync: + if block.parent and (len(block) - block_length) != 0: + # Adjustment for block if modified in nested parse: + self.state_machine.next_line(len(block) - block_length) + return new_offset + + def nested_list_parse(self, block, input_offset, node, initial_state, + blank_finish, + blank_finish_state=None, + extra_settings={}, + match_titles=False, + state_machine_class=None, + state_machine_kwargs=None): + """ + Create a new StateMachine rooted at `node` and run it over the input + `block`. Also keep track of optional intermediate blank lines and the + required final one. + """ + if state_machine_class is None: + state_machine_class = self.nested_sm + if state_machine_kwargs is None: + state_machine_kwargs = self.nested_sm_kwargs.copy() + state_machine_kwargs['initial_state'] = initial_state + state_machine = state_machine_class(debug=self.debug, + **state_machine_kwargs) + if blank_finish_state is None: + blank_finish_state = initial_state + state_machine.states[blank_finish_state].blank_finish = blank_finish + for key, value in extra_settings.items(): + setattr(state_machine.states[initial_state], key, value) + state_machine.run(block, input_offset, memo=self.memo, + node=node, match_titles=match_titles) + blank_finish = state_machine.states[blank_finish_state].blank_finish + state_machine.unlink() + return state_machine.abs_line_offset(), blank_finish + + def section(self, title, source, style, lineno, messages): + """Check for a valid subsection and create one if it checks out.""" + if self.check_subsection(source, style, lineno): + self.new_subsection(title, lineno, messages) + + def check_subsection(self, source, style, lineno): + """ + Check for a valid subsection header. Return 1 (true) or None (false). + + When a new section is reached that isn't a subsection of the current + section, back up the line count (use ``previous_line(-x)``), then + ``raise EOFError``. The current StateMachine will finish, then the + calling StateMachine can re-examine the title. This will work its way + back up the calling chain until the correct section level isreached. + + @@@ Alternative: Evaluate the title, store the title info & level, and + back up the chain until that level is reached. Store in memo? Or + return in results? + + :Exception: `EOFError` when a sibling or supersection encountered. + """ + memo = self.memo + title_styles = memo.title_styles + mylevel = memo.section_level + try: # check for existing title style + level = title_styles.index(style) + 1 + except ValueError: # new title style + if len(title_styles) == memo.section_level: # new subsection + title_styles.append(style) + return 1 + else: # not at lowest level + self.parent += self.title_inconsistent(source, lineno) + return None + if level <= mylevel: # sibling or supersection + memo.section_level = level # bubble up to parent section + if len(style) == 2: + memo.section_bubble_up_kludge = True + # back up 2 lines for underline title, 3 for overline title + self.state_machine.previous_line(len(style) + 1) + raise EOFError # let parent section re-evaluate + if level == mylevel + 1: # immediate subsection + return 1 + else: # invalid subsection + self.parent += self.title_inconsistent(source, lineno) + return None + + def title_inconsistent(self, sourcetext, lineno): + error = self.reporter.severe( + 'Title level inconsistent:', nodes.literal_block('', sourcetext), + line=lineno) + return error + + def new_subsection(self, title, lineno, messages): + """Append new subsection to document tree. On return, check level.""" + memo = self.memo + mylevel = memo.section_level + memo.section_level += 1 + section_node = nodes.section() + self.parent += section_node + textnodes, title_messages = self.inline_text(title, lineno) + titlenode = nodes.title(title, '', *textnodes) + name = normalize_name(titlenode.astext()) + section_node['names'].append(name) + section_node += titlenode + section_node += messages + section_node += title_messages + self.document.note_implicit_target(section_node, section_node) + offset = self.state_machine.line_offset + 1 + absoffset = self.state_machine.abs_line_offset() + 1 + newabsoffset = self.nested_parse( + self.state_machine.input_lines[offset:], input_offset=absoffset, + node=section_node, match_titles=True) + self.goto_line(newabsoffset) + if memo.section_level <= mylevel: # can't handle next section? + raise EOFError # bubble up to supersection + # reset section_level; next pass will detect it properly + memo.section_level = mylevel + + def paragraph(self, lines, lineno): + """ + Return a list (paragraph & messages) & a boolean: literal_block next? + """ + data = '\n'.join(lines).rstrip() + if re.search(r'(?%(or_group)s)%(suffix)s' % locals() + if compile: + return re.compile(regexp, re.UNICODE) + else: + return regexp + + +class Inliner(object): + + """ + Parse inline markup; call the `parse()` method. + """ + + def __init__(self): + self.implicit_dispatch = [] + """List of (pattern, bound method) tuples, used by + `self.implicit_inline`.""" + + def init_customizations(self, settings): + # lookahead and look-behind expressions for inline markup rules + if getattr(settings, 'character_level_inline_markup', False): + start_string_prefix = u'(^|(?%s)(?P__?)' % self.simplename, + ('footnotelabel', r'\[', r'(?P\]_)', + [r'[0-9]+', # manually numbered + r'\#(%s)?' % self.simplename, # auto-numbered (w/ label?) + r'\*', # auto-symbol + r'(?P%s)' % self.simplename] # citation reference + ) + ] + ), + ('backquote', # interpreted text or phrase reference + '(?P(:%s:)?)' % self.simplename, # optional role + self.non_whitespace_after, + ['`(?!`)'] # but not literal + ) + ] + ) + self.start_string_prefix = start_string_prefix + self.end_string_suffix = end_string_suffix + self.parts = parts + + self.patterns = Struct( + initial=build_regexp(parts), + emphasis=re.compile(self.non_whitespace_escape_before + + r'(\*)' + end_string_suffix, re.UNICODE), + strong=re.compile(self.non_whitespace_escape_before + + r'(\*\*)' + end_string_suffix, re.UNICODE), + interpreted_or_phrase_ref=re.compile( + r""" + %(non_unescaped_whitespace_escape_before)s + ( + ` + (?P + (?P:%(simplename)s:)? + (?P__?)? + ) + ) + %(end_string_suffix)s + """ % args, re.VERBOSE | re.UNICODE), + embedded_link=re.compile( + r""" + ( + (?:[ \n]+|^) # spaces or beginning of line/string + < # open bracket + %(non_whitespace_after)s + (([^<>]|\x00[<>])+) # anything but unescaped angle brackets + %(non_whitespace_escape_before)s + > # close bracket + ) + $ # end of string + """ % args, re.VERBOSE | re.UNICODE), + literal=re.compile(self.non_whitespace_before + '(``)' + + end_string_suffix, re.UNICODE), + target=re.compile(self.non_whitespace_escape_before + + r'(`)' + end_string_suffix, re.UNICODE), + substitution_ref=re.compile(self.non_whitespace_escape_before + + r'(\|_{0,2})' + + end_string_suffix, re.UNICODE), + email=re.compile(self.email_pattern % args + '$', + re.VERBOSE | re.UNICODE), + uri=re.compile( + (r""" + %(start_string_prefix)s + (?P + (?P # absolute URI + (?P # scheme (http, ftp, mailto) + [a-zA-Z][a-zA-Z0-9.+-]* + ) + : + ( + ( # either: + (//?)? # hierarchical URI + %(uric)s* # URI characters + %(uri_end)s # final URI char + ) + ( # optional query + \?%(uric)s* + %(uri_end)s + )? + ( # optional fragment + \#%(uric)s* + %(uri_end)s + )? + ) + ) + | # *OR* + (?P # email address + """ + self.email_pattern + r""" + ) + ) + %(end_string_suffix)s + """) % args, re.VERBOSE | re.UNICODE), + pep=re.compile( + r""" + %(start_string_prefix)s + ( + (pep-(?P\d+)(.txt)?) # reference to source file + | + (PEP\s+(?P\d+)) # reference by name + ) + %(end_string_suffix)s""" % args, re.VERBOSE | re.UNICODE), + rfc=re.compile( + r""" + %(start_string_prefix)s + (RFC(-|\s+)?(?P\d+)) + %(end_string_suffix)s""" % args, re.VERBOSE | re.UNICODE)) + + self.implicit_dispatch.append((self.patterns.uri, + self.standalone_uri)) + if settings.pep_references: + self.implicit_dispatch.append((self.patterns.pep, + self.pep_reference)) + if settings.rfc_references: + self.implicit_dispatch.append((self.patterns.rfc, + self.rfc_reference)) + + def parse(self, text, lineno, memo, parent): + # Needs to be refactored for nested inline markup. + # Add nested_parse() method? + """ + Return 2 lists: nodes (text and inline elements), and system_messages. + + Using `self.patterns.initial`, a pattern which matches start-strings + (emphasis, strong, interpreted, phrase reference, literal, + substitution reference, and inline target) and complete constructs + (simple reference, footnote reference), search for a candidate. When + one is found, check for validity (e.g., not a quoted '*' character). + If valid, search for the corresponding end string if applicable, and + check it for validity. If not found or invalid, generate a warning + and ignore the start-string. Implicit inline markup (e.g. standalone + URIs) is found last. + """ + self.reporter = memo.reporter + self.document = memo.document + self.language = memo.language + self.parent = parent + pattern_search = self.patterns.initial.search + dispatch = self.dispatch + remaining = escape2null(text) + processed = [] + unprocessed = [] + messages = [] + while remaining: + match = pattern_search(remaining) + if match: + groups = match.groupdict() + method = dispatch[groups['start'] or groups['backquote'] + or groups['refend'] or groups['fnend']] + before, inlines, remaining, sysmessages = method(self, match, + lineno) + unprocessed.append(before) + messages += sysmessages + if inlines: + processed += self.implicit_inline(''.join(unprocessed), + lineno) + processed += inlines + unprocessed = [] + else: + break + remaining = ''.join(unprocessed) + remaining + if remaining: + processed += self.implicit_inline(remaining, lineno) + return processed, messages + + # Inline object recognition + # ------------------------- + # See also init_customizations(). + non_whitespace_before = r'(?]""" + # Last URI character; same as uric but no punctuation: + urilast = r"""[_~*/=+a-zA-Z0-9]""" + # End of a URI (either 'urilast' or 'uric followed by a + # uri_end_delim'): + uri_end = r"""(?:%(urilast)s|%(uric)s(?=%(uri_end_delim)s))""" % locals() + emailc = r"""[-_!~*'{|}/#?^`&=+$%a-zA-Z0-9\x00]""" + email_pattern = r""" + %(emailc)s+(?:\.%(emailc)s+)* # name + (? or + text = escaped[:match.start(0)] + unescaped = unescape(text) + rawtext = unescape(text, True) + aliastext = match.group(2) + rawaliastext = unescape(aliastext, True) + underscore_escaped = rawaliastext.endswith(r'\_') + if aliastext.endswith('_') and not (underscore_escaped + or self.patterns.uri.match(aliastext)): + aliastype = 'name' + alias = normalize_name(unescape(aliastext[:-1])) + target = nodes.target(match.group(1), refname=alias) + target.indirect_reference_name = whitespace_normalize_name( + unescape(aliastext[:-1])) + else: + aliastype = 'uri' + # remove unescaped whitespace + alias_parts = split_escaped_whitespace(match.group(2)) + alias = ' '.join(''.join(part.split()) + for part in alias_parts) + alias = self.adjust_uri(unescape(alias)) + if alias.endswith(r'\_'): + alias = alias[:-2] + '_' + target = nodes.target(match.group(1), refuri=alias) + target.referenced = 1 + if not aliastext: + raise ApplicationError('problem with embedded link: %r' + % aliastext) + if not text: + text = alias + unescaped = unescape(text) + rawtext = rawaliastext + else: + text = escaped + unescaped = unescape(text) + target = None + rawtext = unescape(escaped, True) + + refname = normalize_name(unescaped) + reference = nodes.reference(rawsource, text, + name=whitespace_normalize_name(unescaped)) + reference[0].rawsource = rawtext + + node_list = [reference] + + if rawsource[-2:] == '__': + if target and (aliastype == 'name'): + reference['refname'] = alias + self.document.note_refname(reference) + # self.document.note_indirect_target(target) # required? + elif target and (aliastype == 'uri'): + reference['refuri'] = alias + else: + reference['anonymous'] = 1 + else: + if target: + target['names'].append(refname) + if aliastype == 'name': + reference['refname'] = alias + self.document.note_indirect_target(target) + self.document.note_refname(reference) + else: + reference['refuri'] = alias + self.document.note_explicit_target(target, self.parent) + # target.note_referenced_by(name=refname) + node_list.append(target) + else: + reference['refname'] = refname + self.document.note_refname(reference) + return before, node_list, after, [] + + + def adjust_uri(self, uri): + match = self.patterns.email.match(uri) + if match: + return 'mailto:' + uri + else: + return uri + + def interpreted(self, rawsource, text, role, lineno): + role_fn, messages = roles.role(role, self.language, lineno, + self.reporter) + if role_fn: + nodes, messages2 = role_fn(role, rawsource, text, lineno, self) + return nodes, messages + messages2 + else: + msg = self.reporter.error( + 'Unknown interpreted text role "%s".' % role, + line=lineno) + return ([self.problematic(rawsource, rawsource, msg)], + messages + [msg]) + + def literal(self, match, lineno): + before, inlines, remaining, sysmessages, endstring = self.inline_obj( + match, lineno, self.patterns.literal, nodes.literal, + restore_backslashes=True) + return before, inlines, remaining, sysmessages + + def inline_internal_target(self, match, lineno): + before, inlines, remaining, sysmessages, endstring = self.inline_obj( + match, lineno, self.patterns.target, nodes.target) + if inlines and isinstance(inlines[0], nodes.target): + assert len(inlines) == 1 + target = inlines[0] + name = normalize_name(target.astext()) + target['names'].append(name) + self.document.note_explicit_target(target, self.parent) + return before, inlines, remaining, sysmessages + + def substitution_reference(self, match, lineno): + before, inlines, remaining, sysmessages, endstring = self.inline_obj( + match, lineno, self.patterns.substitution_ref, + nodes.substitution_reference) + if len(inlines) == 1: + subref_node = inlines[0] + if isinstance(subref_node, nodes.substitution_reference): + subref_text = subref_node.astext() + self.document.note_substitution_ref(subref_node, subref_text) + if endstring[-1:] == '_': + reference_node = nodes.reference( + '|%s%s' % (subref_text, endstring), '') + if endstring[-2:] == '__': + reference_node['anonymous'] = 1 + else: + reference_node['refname'] = normalize_name(subref_text) + self.document.note_refname(reference_node) + reference_node += subref_node + inlines = [reference_node] + return before, inlines, remaining, sysmessages + + def footnote_reference(self, match, lineno): + """ + Handles `nodes.footnote_reference` and `nodes.citation_reference` + elements. + """ + label = match.group('footnotelabel') + refname = normalize_name(label) + string = match.string + before = string[:match.start('whole')] + remaining = string[match.end('whole'):] + if match.group('citationlabel'): + refnode = nodes.citation_reference('[%s]_' % label, + refname=refname) + refnode += nodes.Text(label) + self.document.note_citation_ref(refnode) + else: + refnode = nodes.footnote_reference('[%s]_' % label) + if refname[0] == '#': + refname = refname[1:] + refnode['auto'] = 1 + self.document.note_autofootnote_ref(refnode) + elif refname == '*': + refname = '' + refnode['auto'] = '*' + self.document.note_symbol_footnote_ref( + refnode) + else: + refnode += nodes.Text(label) + if refname: + refnode['refname'] = refname + self.document.note_footnote_ref(refnode) + if utils.get_trim_footnote_ref_space(self.document.settings): + before = before.rstrip() + return (before, [refnode], remaining, []) + + def reference(self, match, lineno, anonymous=False): + referencename = match.group('refname') + refname = normalize_name(referencename) + referencenode = nodes.reference( + referencename + match.group('refend'), referencename, + name=whitespace_normalize_name(referencename)) + referencenode[0].rawsource = referencename + if anonymous: + referencenode['anonymous'] = 1 + else: + referencenode['refname'] = refname + self.document.note_refname(referencenode) + string = match.string + matchstart = match.start('whole') + matchend = match.end('whole') + return (string[:matchstart], [referencenode], string[matchend:], []) + + def anonymous_reference(self, match, lineno): + return self.reference(match, lineno, anonymous=1) + + def standalone_uri(self, match, lineno): + if (not match.group('scheme') + or match.group('scheme').lower() in urischemes.schemes): + if match.group('email'): + addscheme = 'mailto:' + else: + addscheme = '' + text = match.group('whole') + refuri = addscheme + unescape(text) + reference = nodes.reference(unescape(text, True), text, + refuri=refuri) + return [reference] + else: # not a valid scheme + raise MarkupMismatch + + def pep_reference(self, match, lineno): + text = match.group(0) + if text.startswith('pep-'): + pepnum = int(unescape(match.group('pepnum1'))) + elif text.startswith('PEP'): + pepnum = int(unescape(match.group('pepnum2'))) + else: + raise MarkupMismatch + ref = (self.document.settings.pep_base_url + + self.document.settings.pep_file_url_template % pepnum) + return [nodes.reference(unescape(text, True), text, refuri=ref)] + + rfc_url = 'rfc%d.html' + + def rfc_reference(self, match, lineno): + text = match.group(0) + if text.startswith('RFC'): + rfcnum = int(unescape(match.group('rfcnum'))) + ref = self.document.settings.rfc_base_url + self.rfc_url % rfcnum + else: + raise MarkupMismatch + return [nodes.reference(unescape(text, True), text, refuri=ref)] + + def implicit_inline(self, text, lineno): + """ + Check each of the patterns in `self.implicit_dispatch` for a match, + and dispatch to the stored method for the pattern. Recursively check + the text before and after the match. Return a list of `nodes.Text` + and inline element nodes. + """ + if not text: + return [] + for pattern, method in self.implicit_dispatch: + match = pattern.search(text) + if match: + try: + # Must recurse on strings before *and* after the match; + # there may be multiple patterns. + return (self.implicit_inline(text[:match.start()], lineno) + + method(match, lineno) + + self.implicit_inline(text[match.end():], lineno)) + except MarkupMismatch: + pass + return [nodes.Text(text, unescape(text, True))] + + dispatch = {'*': emphasis, + '**': strong, + '`': interpreted_or_phrase_ref, + '``': literal, + '_`': inline_internal_target, + ']_': footnote_reference, + '|': substitution_reference, + '_': reference, + '__': anonymous_reference} + + +def _loweralpha_to_int(s, _zero=(ord('a')-1)): + return ord(s) - _zero + +def _upperalpha_to_int(s, _zero=(ord('A')-1)): + return ord(s) - _zero + +def _lowerroman_to_int(s): + return roman.fromRoman(s.upper()) + + +class Body(RSTState): + + """ + Generic classifier of the first line of a block. + """ + + double_width_pad_char = tableparser.TableParser.double_width_pad_char + """Padding character for East Asian double-width text.""" + + enum = Struct() + """Enumerated list parsing information.""" + + enum.formatinfo = { + 'parens': Struct(prefix='(', suffix=')', start=1, end=-1), + 'rparen': Struct(prefix='', suffix=')', start=0, end=-1), + 'period': Struct(prefix='', suffix='.', start=0, end=-1)} + enum.formats = enum.formatinfo.keys() + enum.sequences = ['arabic', 'loweralpha', 'upperalpha', + 'lowerroman', 'upperroman'] # ORDERED! + enum.sequencepats = {'arabic': '[0-9]+', + 'loweralpha': '[a-z]', + 'upperalpha': '[A-Z]', + 'lowerroman': '[ivxlcdm]+', + 'upperroman': '[IVXLCDM]+',} + enum.converters = {'arabic': int, + 'loweralpha': _loweralpha_to_int, + 'upperalpha': _upperalpha_to_int, + 'lowerroman': _lowerroman_to_int, + 'upperroman': roman.fromRoman} + + enum.sequenceregexps = {} + for sequence in enum.sequences: + enum.sequenceregexps[sequence] = re.compile( + enum.sequencepats[sequence] + '$', re.UNICODE) + + grid_table_top_pat = re.compile(r'\+-[-+]+-\+ *$') + """Matches the top (& bottom) of a full table).""" + + simple_table_top_pat = re.compile('=+( +=+)+ *$') + """Matches the top of a simple table.""" + + simple_table_border_pat = re.compile('=+[ =]*$') + """Matches the bottom & header bottom of a simple table.""" + + pats = {} + """Fragments of patterns used by transitions.""" + + pats['nonalphanum7bit'] = '[!-/:-@[-`{-~]' + pats['alpha'] = '[a-zA-Z]' + pats['alphanum'] = '[a-zA-Z0-9]' + pats['alphanumplus'] = '[a-zA-Z0-9_-]' + pats['enum'] = ('(%(arabic)s|%(loweralpha)s|%(upperalpha)s|%(lowerroman)s' + '|%(upperroman)s|#)' % enum.sequencepats) + pats['optname'] = '%(alphanum)s%(alphanumplus)s*' % pats + # @@@ Loosen up the pattern? Allow Unicode? + pats['optarg'] = '(%(alpha)s%(alphanumplus)s*|<[^<>]+>)' % pats + pats['shortopt'] = r'(-|\+)%(alphanum)s( ?%(optarg)s)?' % pats + pats['longopt'] = r'(--|/)%(optname)s([ =]%(optarg)s)?' % pats + pats['option'] = r'(%(shortopt)s|%(longopt)s)' % pats + + for format in enum.formats: + pats[format] = '(?P<%s>%s%s%s)' % ( + format, re.escape(enum.formatinfo[format].prefix), + pats['enum'], re.escape(enum.formatinfo[format].suffix)) + + patterns = { + 'bullet': u'[-+*\u2022\u2023\u2043]( +|$)', + 'enumerator': r'(%(parens)s|%(rparen)s|%(period)s)( +|$)' % pats, + 'field_marker': r':(?![: ])([^:\\]|\\.|:(?!([ `]|$)))*(?>>( +|$)', + 'line_block': r'\|( +|$)', + 'grid_table_top': grid_table_top_pat, + 'simple_table_top': simple_table_top_pat, + 'explicit_markup': r'\.\.( +|$)', + 'anonymous': r'__( +|$)', + 'line': r'(%(nonalphanum7bit)s)\1* *$' % pats, + 'text': r''} + initial_transitions = ( + 'bullet', + 'enumerator', + 'field_marker', + 'option_marker', + 'doctest', + 'line_block', + 'grid_table_top', + 'simple_table_top', + 'explicit_markup', + 'anonymous', + 'line', + 'text') + + def indent(self, match, context, next_state): + """Block quote.""" + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_indented() + elements = self.block_quote(indented, line_offset) + self.parent += elements + if not blank_finish: + self.parent += self.unindent_warning('Block quote') + return context, next_state, [] + + def block_quote(self, indented, line_offset): + elements = [] + while indented: + (blockquote_lines, + attribution_lines, + attribution_offset, + indented, + new_line_offset) = self.split_attribution(indented, line_offset) + blockquote = nodes.block_quote() + self.nested_parse(blockquote_lines, line_offset, blockquote) + elements.append(blockquote) + if attribution_lines: + attribution, messages = self.parse_attribution( + attribution_lines, attribution_offset) + blockquote += attribution + elements += messages + line_offset = new_line_offset + while indented and not indented[0]: + indented = indented[1:] + line_offset += 1 + return elements + + # U+2014 is an em-dash: + attribution_pattern = re.compile(u'(---?(?!-)|\u2014) *(?=[^ \\n])', + re.UNICODE) + + def split_attribution(self, indented, line_offset): + """ + Check for a block quote attribution and split it off: + + * First line after a blank line must begin with a dash ("--", "---", + em-dash; matches `self.attribution_pattern`). + * Every line after that must have consistent indentation. + * Attributions must be preceded by block quote content. + + Return a tuple of: (block quote content lines, content offset, + attribution lines, attribution offset, remaining indented lines). + """ + blank = None + nonblank_seen = False + for i in range(len(indented)): + line = indented[i].rstrip() + if line: + if nonblank_seen and blank == i - 1: # last line blank + match = self.attribution_pattern.match(line) + if match: + attribution_end, indent = self.check_attribution( + indented, i) + if attribution_end: + a_lines = indented[i:attribution_end] + a_lines.trim_left(match.end(), end=1) + a_lines.trim_left(indent, start=1) + return (indented[:i], a_lines, + i, indented[attribution_end:], + line_offset + attribution_end) + nonblank_seen = True + else: + blank = i + else: + return (indented, None, None, None, None) + + def check_attribution(self, indented, attribution_start): + """ + Check attribution shape. + Return the index past the end of the attribution, and the indent. + """ + indent = None + i = attribution_start + 1 + for i in range(attribution_start + 1, len(indented)): + line = indented[i].rstrip() + if not line: + break + if indent is None: + indent = len(line) - len(line.lstrip()) + elif len(line) - len(line.lstrip()) != indent: + return None, None # bad shape; not an attribution + else: + # return index of line after last attribution line: + i += 1 + return i, (indent or 0) + + def parse_attribution(self, indented, line_offset): + text = '\n'.join(indented).rstrip() + lineno = self.state_machine.abs_line_number() + line_offset + textnodes, messages = self.inline_text(text, lineno) + node = nodes.attribution(text, '', *textnodes) + node.source, node.line = self.state_machine.get_source_and_line(lineno) + return node, messages + + def bullet(self, match, context, next_state): + """Bullet list item.""" + bulletlist = nodes.bullet_list() + (bulletlist.source, + bulletlist.line) = self.state_machine.get_source_and_line() + self.parent += bulletlist + bulletlist['bullet'] = match.string[0] + i, blank_finish = self.list_item(match.end()) + bulletlist += i + offset = self.state_machine.line_offset + 1 # next line + new_line_offset, blank_finish = self.nested_list_parse( + self.state_machine.input_lines[offset:], + input_offset=self.state_machine.abs_line_offset() + 1, + node=bulletlist, initial_state='BulletList', + blank_finish=blank_finish) + self.goto_line(new_line_offset) + if not blank_finish: + self.parent += self.unindent_warning('Bullet list') + return [], next_state, [] + + def list_item(self, indent): + if self.state_machine.line[indent:]: + indented, line_offset, blank_finish = ( + self.state_machine.get_known_indented(indent)) + else: + indented, indent, line_offset, blank_finish = ( + self.state_machine.get_first_known_indented(indent)) + listitem = nodes.list_item('\n'.join(indented)) + if indented: + self.nested_parse(indented, input_offset=line_offset, + node=listitem) + return listitem, blank_finish + + def enumerator(self, match, context, next_state): + """Enumerated List Item""" + format, sequence, text, ordinal = self.parse_enumerator(match) + if not self.is_enumerated_list_item(ordinal, sequence, format): + raise statemachine.TransitionCorrection('text') + enumlist = nodes.enumerated_list() + self.parent += enumlist + if sequence == '#': + enumlist['enumtype'] = 'arabic' + else: + enumlist['enumtype'] = sequence + enumlist['prefix'] = self.enum.formatinfo[format].prefix + enumlist['suffix'] = self.enum.formatinfo[format].suffix + if ordinal != 1: + enumlist['start'] = ordinal + msg = self.reporter.info( + 'Enumerated list start value not ordinal-1: "%s" (ordinal %s)' + % (text, ordinal)) + self.parent += msg + listitem, blank_finish = self.list_item(match.end()) + enumlist += listitem + offset = self.state_machine.line_offset + 1 # next line + newline_offset, blank_finish = self.nested_list_parse( + self.state_machine.input_lines[offset:], + input_offset=self.state_machine.abs_line_offset() + 1, + node=enumlist, initial_state='EnumeratedList', + blank_finish=blank_finish, + extra_settings={'lastordinal': ordinal, + 'format': format, + 'auto': sequence == '#'}) + self.goto_line(newline_offset) + if not blank_finish: + self.parent += self.unindent_warning('Enumerated list') + return [], next_state, [] + + def parse_enumerator(self, match, expected_sequence=None): + """ + Analyze an enumerator and return the results. + + :Return: + - the enumerator format ('period', 'parens', or 'rparen'), + - the sequence used ('arabic', 'loweralpha', 'upperroman', etc.), + - the text of the enumerator, stripped of formatting, and + - the ordinal value of the enumerator ('a' -> 1, 'ii' -> 2, etc.; + ``None`` is returned for invalid enumerator text). + + The enumerator format has already been determined by the regular + expression match. If `expected_sequence` is given, that sequence is + tried first. If not, we check for Roman numeral 1. This way, + single-character Roman numerals (which are also alphabetical) can be + matched. If no sequence has been matched, all sequences are checked in + order. + """ + groupdict = match.groupdict() + sequence = '' + for format in self.enum.formats: + if groupdict[format]: # was this the format matched? + break # yes; keep `format` + else: # shouldn't happen + raise ParserError('enumerator format not matched') + text = groupdict[format][self.enum.formatinfo[format].start + :self.enum.formatinfo[format].end] + if text == '#': + sequence = '#' + elif expected_sequence: + try: + if self.enum.sequenceregexps[expected_sequence].match(text): + sequence = expected_sequence + except KeyError: # shouldn't happen + raise ParserError('unknown enumerator sequence: %s' + % sequence) + elif text == 'i': + sequence = 'lowerroman' + elif text == 'I': + sequence = 'upperroman' + if not sequence: + for sequence in self.enum.sequences: + if self.enum.sequenceregexps[sequence].match(text): + break + else: # shouldn't happen + raise ParserError('enumerator sequence not matched') + if sequence == '#': + ordinal = 1 + else: + try: + ordinal = self.enum.converters[sequence](text) + except roman.InvalidRomanNumeralError: + ordinal = None + return format, sequence, text, ordinal + + def is_enumerated_list_item(self, ordinal, sequence, format): + """ + Check validity based on the ordinal value and the second line. + + Return true if the ordinal is valid and the second line is blank, + indented, or starts with the next enumerator or an auto-enumerator. + """ + if ordinal is None: + return None + try: + next_line = self.state_machine.next_line() + except EOFError: # end of input lines + self.state_machine.previous_line() + return 1 + else: + self.state_machine.previous_line() + if not next_line[:1].strip(): # blank or indented + return 1 + result = self.make_enumerator(ordinal + 1, sequence, format) + if result: + next_enumerator, auto_enumerator = result + try: + if ( next_line.startswith(next_enumerator) or + next_line.startswith(auto_enumerator) ): + return 1 + except TypeError: + pass + return None + + def make_enumerator(self, ordinal, sequence, format): + """ + Construct and return the next enumerated list item marker, and an + auto-enumerator ("#" instead of the regular enumerator). + + Return ``None`` for invalid (out of range) ordinals. + """ #" + if sequence == '#': + enumerator = '#' + elif sequence == 'arabic': + enumerator = str(ordinal) + else: + if sequence.endswith('alpha'): + if ordinal > 26: + return None + enumerator = chr(ordinal + ord('a') - 1) + elif sequence.endswith('roman'): + try: + enumerator = roman.toRoman(ordinal) + except roman.RomanError: + return None + else: # shouldn't happen + raise ParserError('unknown enumerator sequence: "%s"' + % sequence) + if sequence.startswith('lower'): + enumerator = enumerator.lower() + elif sequence.startswith('upper'): + enumerator = enumerator.upper() + else: # shouldn't happen + raise ParserError('unknown enumerator sequence: "%s"' + % sequence) + formatinfo = self.enum.formatinfo[format] + next_enumerator = (formatinfo.prefix + enumerator + formatinfo.suffix + + ' ') + auto_enumerator = formatinfo.prefix + '#' + formatinfo.suffix + ' ' + return next_enumerator, auto_enumerator + + def field_marker(self, match, context, next_state): + """Field list item.""" + field_list = nodes.field_list() + self.parent += field_list + field, blank_finish = self.field(match) + field_list += field + offset = self.state_machine.line_offset + 1 # next line + newline_offset, blank_finish = self.nested_list_parse( + self.state_machine.input_lines[offset:], + input_offset=self.state_machine.abs_line_offset() + 1, + node=field_list, initial_state='FieldList', + blank_finish=blank_finish) + self.goto_line(newline_offset) + if not blank_finish: + self.parent += self.unindent_warning('Field list') + return [], next_state, [] + + def field(self, match): + name = self.parse_field_marker(match) + src, srcline = self.state_machine.get_source_and_line() + lineno = self.state_machine.abs_line_number() + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end()) + field_node = nodes.field() + field_node.source = src + field_node.line = srcline + name_nodes, name_messages = self.inline_text(name, lineno) + field_node += nodes.field_name(name, '', *name_nodes) + field_body = nodes.field_body('\n'.join(indented), *name_messages) + field_node += field_body + if indented: + self.parse_field_body(indented, line_offset, field_body) + return field_node, blank_finish + + def parse_field_marker(self, match): + """Extract & return field name from a field marker match.""" + field = match.group()[1:] # strip off leading ':' + field = field[:field.rfind(':')] # strip off trailing ':' etc. + return field + + def parse_field_body(self, indented, offset, node): + self.nested_parse(indented, input_offset=offset, node=node) + + def option_marker(self, match, context, next_state): + """Option list item.""" + optionlist = nodes.option_list() + (optionlist.source, optionlist.line) = self.state_machine.get_source_and_line() + try: + listitem, blank_finish = self.option_list_item(match) + except MarkupError as error: + # This shouldn't happen; pattern won't match. + msg = self.reporter.error(u'Invalid option list marker: %s' % + error) + self.parent += msg + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end()) + elements = self.block_quote(indented, line_offset) + self.parent += elements + if not blank_finish: + self.parent += self.unindent_warning('Option list') + return [], next_state, [] + self.parent += optionlist + optionlist += listitem + offset = self.state_machine.line_offset + 1 # next line + newline_offset, blank_finish = self.nested_list_parse( + self.state_machine.input_lines[offset:], + input_offset=self.state_machine.abs_line_offset() + 1, + node=optionlist, initial_state='OptionList', + blank_finish=blank_finish) + self.goto_line(newline_offset) + if not blank_finish: + self.parent += self.unindent_warning('Option list') + return [], next_state, [] + + def option_list_item(self, match): + offset = self.state_machine.abs_line_offset() + options = self.parse_option_marker(match) + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end()) + if not indented: # not an option list item + self.goto_line(offset) + raise statemachine.TransitionCorrection('text') + option_group = nodes.option_group('', *options) + description = nodes.description('\n'.join(indented)) + option_list_item = nodes.option_list_item('', option_group, + description) + if indented: + self.nested_parse(indented, input_offset=line_offset, + node=description) + return option_list_item, blank_finish + + def parse_option_marker(self, match): + """ + Return a list of `node.option` and `node.option_argument` objects, + parsed from an option marker match. + + :Exception: `MarkupError` for invalid option markers. + """ + optlist = [] + optionstrings = match.group().rstrip().split(', ') + for optionstring in optionstrings: + tokens = optionstring.split() + delimiter = ' ' + firstopt = tokens[0].split('=', 1) + if len(firstopt) > 1: + # "--opt=value" form + tokens[:1] = firstopt + delimiter = '=' + elif (len(tokens[0]) > 2 + and ((tokens[0].startswith('-') + and not tokens[0].startswith('--')) + or tokens[0].startswith('+'))): + # "-ovalue" form + tokens[:1] = [tokens[0][:2], tokens[0][2:]] + delimiter = '' + if len(tokens) > 1 and (tokens[1].startswith('<') + and tokens[-1].endswith('>')): + # "-o " form; join all values into one token + tokens[1:] = [' '.join(tokens[1:])] + if 0 < len(tokens) <= 2: + option = nodes.option(optionstring) + option += nodes.option_string(tokens[0], tokens[0]) + if len(tokens) > 1: + option += nodes.option_argument(tokens[1], tokens[1], + delimiter=delimiter) + optlist.append(option) + else: + raise MarkupError( + 'wrong number of option tokens (=%s), should be 1 or 2: ' + '"%s"' % (len(tokens), optionstring)) + return optlist + + def doctest(self, match, context, next_state): + data = '\n'.join(self.state_machine.get_text_block()) + # TODO: prepend class value ['pycon'] (Python Console) + # parse with `directives.body.CodeBlock` (returns literal-block + # with class "code" and syntax highlight markup). + self.parent += nodes.doctest_block(data, data) + return [], next_state, [] + + def line_block(self, match, context, next_state): + """First line of a line block.""" + block = nodes.line_block() + self.parent += block + lineno = self.state_machine.abs_line_number() + line, messages, blank_finish = self.line_block_line(match, lineno) + block += line + self.parent += messages + if not blank_finish: + offset = self.state_machine.line_offset + 1 # next line + new_line_offset, blank_finish = self.nested_list_parse( + self.state_machine.input_lines[offset:], + input_offset=self.state_machine.abs_line_offset() + 1, + node=block, initial_state='LineBlock', + blank_finish=0) + self.goto_line(new_line_offset) + if not blank_finish: + self.parent += self.reporter.warning( + 'Line block ends without a blank line.', + line=lineno+1) + if len(block): + if block[0].indent is None: + block[0].indent = 0 + self.nest_line_block_lines(block) + return [], next_state, [] + + def line_block_line(self, match, lineno): + """Return one line element of a line_block.""" + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end(), + until_blank=True) + text = u'\n'.join(indented) + text_nodes, messages = self.inline_text(text, lineno) + line = nodes.line(text, '', *text_nodes) + if match.string.rstrip() != '|': # not empty + line.indent = len(match.group(1)) - 1 + return line, messages, blank_finish + + def nest_line_block_lines(self, block): + for index in range(1, len(block)): + if getattr(block[index], 'indent', None) is None: + block[index].indent = block[index - 1].indent + self.nest_line_block_segment(block) + + def nest_line_block_segment(self, block): + indents = [item.indent for item in block] + least = min(indents) + new_items = [] + new_block = nodes.line_block() + for item in block: + if item.indent > least: + new_block.append(item) + else: + if len(new_block): + self.nest_line_block_segment(new_block) + new_items.append(new_block) + new_block = nodes.line_block() + new_items.append(item) + if len(new_block): + self.nest_line_block_segment(new_block) + new_items.append(new_block) + block[:] = new_items + + def grid_table_top(self, match, context, next_state): + """Top border of a full table.""" + return self.table_top(match, context, next_state, + self.isolate_grid_table, + tableparser.GridTableParser) + + def simple_table_top(self, match, context, next_state): + """Top border of a simple table.""" + return self.table_top(match, context, next_state, + self.isolate_simple_table, + tableparser.SimpleTableParser) + + def table_top(self, match, context, next_state, + isolate_function, parser_class): + """Top border of a generic table.""" + nodelist, blank_finish = self.table(isolate_function, parser_class) + self.parent += nodelist + if not blank_finish: + msg = self.reporter.warning( + 'Blank line required after table.', + line=self.state_machine.abs_line_number()+1) + self.parent += msg + return [], next_state, [] + + def table(self, isolate_function, parser_class): + """Parse a table.""" + block, messages, blank_finish = isolate_function() + if block: + try: + parser = parser_class() + tabledata = parser.parse(block) + tableline = (self.state_machine.abs_line_number() - len(block) + + 1) + table = self.build_table(tabledata, tableline) + nodelist = [table] + messages + except tableparser.TableMarkupError as err: + nodelist = self.malformed_table(block, ' '.join(err.args), + offset=err.offset) + messages + else: + nodelist = messages + return nodelist, blank_finish + + def isolate_grid_table(self): + messages = [] + blank_finish = 1 + try: + block = self.state_machine.get_text_block(flush_left=True) + except statemachine.UnexpectedIndentationError as err: + block, src, srcline = err.args + messages.append(self.reporter.error('Unexpected indentation.', + source=src, line=srcline)) + blank_finish = 0 + block.disconnect() + # for East Asian chars: + block.pad_double_width(self.double_width_pad_char) + width = len(block[0].strip()) + for i in range(len(block)): + block[i] = block[i].strip() + if block[i][0] not in '+|': # check left edge + blank_finish = 0 + self.state_machine.previous_line(len(block) - i) + del block[i:] + break + if not self.grid_table_top_pat.match(block[-1]): # find bottom + blank_finish = 0 + # from second-last to third line of table: + for i in range(len(block) - 2, 1, -1): + if self.grid_table_top_pat.match(block[i]): + self.state_machine.previous_line(len(block) - i + 1) + del block[i+1:] + break + else: + messages.extend(self.malformed_table(block)) + return [], messages, blank_finish + for i in range(len(block)): # check right edge + if len(block[i]) != width or block[i][-1] not in '+|': + messages.extend(self.malformed_table(block)) + return [], messages, blank_finish + return block, messages, blank_finish + + def isolate_simple_table(self): + start = self.state_machine.line_offset + lines = self.state_machine.input_lines + limit = len(lines) - 1 + toplen = len(lines[start].strip()) + pattern_match = self.simple_table_border_pat.match + found = 0 + found_at = None + i = start + 1 + while i <= limit: + line = lines[i] + match = pattern_match(line) + if match: + if len(line.strip()) != toplen: + self.state_machine.next_line(i - start) + messages = self.malformed_table( + lines[start:i+1], 'Bottom/header table border does ' + 'not match top border.') + return [], messages, i == limit or not lines[i+1].strip() + found += 1 + found_at = i + if found == 2 or i == limit or not lines[i+1].strip(): + end = i + break + i += 1 + else: # reached end of input_lines + if found: + extra = ' or no blank line after table bottom' + self.state_machine.next_line(found_at - start) + block = lines[start:found_at+1] + else: + extra = '' + self.state_machine.next_line(i - start - 1) + block = lines[start:] + messages = self.malformed_table( + block, 'No bottom table border found%s.' % extra) + return [], messages, not extra + self.state_machine.next_line(end - start) + block = lines[start:end+1] + # for East Asian chars: + block.pad_double_width(self.double_width_pad_char) + return block, [], end == limit or not lines[end+1].strip() + + def malformed_table(self, block, detail='', offset=0): + block.replace(self.double_width_pad_char, '') + data = '\n'.join(block) + message = 'Malformed table.' + startline = self.state_machine.abs_line_number() - len(block) + 1 + if detail: + message += '\n' + detail + error = self.reporter.error(message, nodes.literal_block(data, data), + line=startline+offset) + return [error] + + def build_table(self, tabledata, tableline, stub_columns=0, widths=None): + colwidths, headrows, bodyrows = tabledata + table = nodes.table() + if widths == 'auto': + table['classes'] += ['colwidths-auto'] + elif widths: # "grid" or list of integers + table['classes'] += ['colwidths-given'] + tgroup = nodes.tgroup(cols=len(colwidths)) + table += tgroup + for colwidth in colwidths: + colspec = nodes.colspec(colwidth=colwidth) + if stub_columns: + colspec.attributes['stub'] = 1 + stub_columns -= 1 + tgroup += colspec + if headrows: + thead = nodes.thead() + tgroup += thead + for row in headrows: + thead += self.build_table_row(row, tableline) + tbody = nodes.tbody() + tgroup += tbody + for row in bodyrows: + tbody += self.build_table_row(row, tableline) + return table + + def build_table_row(self, rowdata, tableline): + row = nodes.row() + for cell in rowdata: + if cell is None: + continue + morerows, morecols, offset, cellblock = cell + attributes = {} + if morerows: + attributes['morerows'] = morerows + if morecols: + attributes['morecols'] = morecols + entry = nodes.entry(**attributes) + row += entry + if ''.join(cellblock): + self.nested_parse(cellblock, input_offset=tableline+offset, + node=entry) + return row + + + explicit = Struct() + """Patterns and constants used for explicit markup recognition.""" + + explicit.patterns = Struct( + target=re.compile(r""" + ( + _ # anonymous target + | # *OR* + (?!_) # no underscore at the beginning + (?P`?) # optional open quote + (?![ `]) # first char. not space or + # backquote + (?P # reference name + .+? + ) + %(non_whitespace_escape_before)s + (?P=quote) # close quote if open quote used + ) + (?%(simplename)s)_ + | # *OR* + ` # open backquote + (?![ ]) # not space + (?P.+?) # hyperlink phrase + %(non_whitespace_escape_before)s + `_ # close backquote, + # reference mark + ) + $ # end of string + """ % vars(Inliner), re.VERBOSE | re.UNICODE), + substitution=re.compile(r""" + ( + (?![ ]) # first char. not space + (?P.+?) # substitution text + %(non_whitespace_escape_before)s + \| # close delimiter + ) + ([ ]+|$) # followed by whitespace + """ % vars(Inliner), + re.VERBOSE | re.UNICODE),) + + def footnote(self, match): + src, srcline = self.state_machine.get_source_and_line() + indented, indent, offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end()) + label = match.group(1) + name = normalize_name(label) + footnote = nodes.footnote('\n'.join(indented)) + footnote.source = src + footnote.line = srcline + if name[0] == '#': # auto-numbered + name = name[1:] # autonumber label + footnote['auto'] = 1 + if name: + footnote['names'].append(name) + self.document.note_autofootnote(footnote) + elif name == '*': # auto-symbol + name = '' + footnote['auto'] = '*' + self.document.note_symbol_footnote(footnote) + else: # manually numbered + footnote += nodes.label('', label) + footnote['names'].append(name) + self.document.note_footnote(footnote) + if name: + self.document.note_explicit_target(footnote, footnote) + else: + self.document.set_id(footnote, footnote) + if indented: + self.nested_parse(indented, input_offset=offset, node=footnote) + return [footnote], blank_finish + + def citation(self, match): + src, srcline = self.state_machine.get_source_and_line() + indented, indent, offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end()) + label = match.group(1) + name = normalize_name(label) + citation = nodes.citation('\n'.join(indented)) + citation.source = src + citation.line = srcline + citation += nodes.label('', label) + citation['names'].append(name) + self.document.note_citation(citation) + self.document.note_explicit_target(citation, citation) + if indented: + self.nested_parse(indented, input_offset=offset, node=citation) + return [citation], blank_finish + + def hyperlink_target(self, match): + pattern = self.explicit.patterns.target + lineno = self.state_machine.abs_line_number() + block, indent, offset, blank_finish = \ + self.state_machine.get_first_known_indented( + match.end(), until_blank=True, strip_indent=False) + blocktext = match.string[:match.end()] + '\n'.join(block) + block = [escape2null(line) for line in block] + escaped = block[0] + blockindex = 0 + while True: + targetmatch = pattern.match(escaped) + if targetmatch: + break + blockindex += 1 + try: + escaped += block[blockindex] + except IndexError: + raise MarkupError('malformed hyperlink target.') + del block[:blockindex] + block[0] = (block[0] + ' ')[targetmatch.end()-len(escaped)-1:].strip() + target = self.make_target(block, blocktext, lineno, + targetmatch.group('name')) + return [target], blank_finish + + def make_target(self, block, block_text, lineno, target_name): + target_type, data = self.parse_target(block, block_text, lineno) + if target_type == 'refname': + target = nodes.target(block_text, '', refname=normalize_name(data)) + target.indirect_reference_name = data + self.add_target(target_name, '', target, lineno) + self.document.note_indirect_target(target) + return target + elif target_type == 'refuri': + target = nodes.target(block_text, '') + self.add_target(target_name, data, target, lineno) + return target + else: + return data + + def parse_target(self, block, block_text, lineno): + """ + Determine the type of reference of a target. + + :Return: A 2-tuple, one of: + + - 'refname' and the indirect reference name + - 'refuri' and the URI + - 'malformed' and a system_message node + """ + if block and block[-1].strip()[-1:] == '_': # possible indirect target + reference = ' '.join([line.strip() for line in block]) + refname = self.is_reference(reference) + if refname: + return 'refname', refname + ref_parts = split_escaped_whitespace(' '.join(block)) + reference = ' '.join(''.join(unescape(part).split()) + for part in ref_parts) + return 'refuri', reference + + def is_reference(self, reference): + match = self.explicit.patterns.reference.match( + whitespace_normalize_name(reference)) + if not match: + return None + return unescape(match.group('simple') or match.group('phrase')) + + def add_target(self, targetname, refuri, target, lineno): + target.line = lineno + if targetname: + name = normalize_name(unescape(targetname)) + target['names'].append(name) + if refuri: + uri = self.inliner.adjust_uri(refuri) + if uri: + target['refuri'] = uri + else: + raise ApplicationError('problem with URI: %r' % refuri) + self.document.note_explicit_target(target, self.parent) + else: # anonymous target + if refuri: + target['refuri'] = refuri + target['anonymous'] = 1 + self.document.note_anonymous_target(target) + + def substitution_def(self, match): + pattern = self.explicit.patterns.substitution + src, srcline = self.state_machine.get_source_and_line() + block, indent, offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end(), + strip_indent=False) + blocktext = (match.string[:match.end()] + '\n'.join(block)) + block.disconnect() + escaped = escape2null(block[0].rstrip()) + blockindex = 0 + while True: + subdefmatch = pattern.match(escaped) + if subdefmatch: + break + blockindex += 1 + try: + escaped = escaped + ' ' + escape2null(block[blockindex].strip()) + except IndexError: + raise MarkupError('malformed substitution definition.') + del block[:blockindex] # strip out the substitution marker + block[0] = (block[0].strip() + ' ')[subdefmatch.end()-len(escaped)-1:-1] + if not block[0]: + del block[0] + offset += 1 + while block and not block[-1].strip(): + block.pop() + subname = subdefmatch.group('name') + substitution_node = nodes.substitution_definition(blocktext) + substitution_node.source = src + substitution_node.line = srcline + if not block: + msg = self.reporter.warning( + 'Substitution definition "%s" missing contents.' % subname, + nodes.literal_block(blocktext, blocktext), + source=src, line=srcline) + return [msg], blank_finish + block[0] = block[0].strip() + substitution_node['names'].append( + nodes.whitespace_normalize_name(subname)) + new_abs_offset, blank_finish = self.nested_list_parse( + block, input_offset=offset, node=substitution_node, + initial_state='SubstitutionDef', blank_finish=blank_finish) + i = 0 + for node in substitution_node[:]: + if not (isinstance(node, nodes.Inline) or + isinstance(node, nodes.Text)): + self.parent += substitution_node[i] + del substitution_node[i] + else: + i += 1 + for node in substitution_node.traverse(nodes.Element): + if self.disallowed_inside_substitution_definitions(node): + pformat = nodes.literal_block('', node.pformat().rstrip()) + msg = self.reporter.error( + 'Substitution definition contains illegal element <%s>:' + % node.tagname, + pformat, nodes.literal_block(blocktext, blocktext), + source=src, line=srcline) + return [msg], blank_finish + if len(substitution_node) == 0: + msg = self.reporter.warning( + 'Substitution definition "%s" empty or invalid.' % subname, + nodes.literal_block(blocktext, blocktext), + source=src, line=srcline) + return [msg], blank_finish + self.document.note_substitution_def( + substitution_node, subname, self.parent) + return [substitution_node], blank_finish + + def disallowed_inside_substitution_definitions(self, node): + if (node['ids'] or + isinstance(node, nodes.reference) and node.get('anonymous') or + isinstance(node, nodes.footnote_reference) and node.get('auto')): + return True + else: + return False + + def directive(self, match, **option_presets): + """Returns a 2-tuple: list of nodes, and a "blank finish" boolean.""" + type_name = match.group(1) + directive_class, messages = directives.directive( + type_name, self.memo.language, self.document) + self.parent += messages + if directive_class: + return self.run_directive( + directive_class, match, type_name, option_presets) + else: + return self.unknown_directive(type_name) + + def run_directive(self, directive, match, type_name, option_presets): + """ + Parse a directive then run its directive function. + + Parameters: + + - `directive`: The class implementing the directive. Must be + a subclass of `rst.Directive`. + + - `match`: A regular expression match object which matched the first + line of the directive. + + - `type_name`: The directive name, as used in the source text. + + - `option_presets`: A dictionary of preset options, defaults for the + directive options. Currently, only an "alt" option is passed by + substitution definitions (value: the substitution name), which may + be used by an embedded image directive. + + Returns a 2-tuple: list of nodes, and a "blank finish" boolean. + """ + if isinstance(directive, (FunctionType, MethodType)): + from docutils.parsers.rst import convert_directive_function + directive = convert_directive_function(directive) + lineno = self.state_machine.abs_line_number() + initial_line_offset = self.state_machine.line_offset + indented, indent, line_offset, blank_finish \ + = self.state_machine.get_first_known_indented(match.end(), + strip_top=0) + block_text = '\n'.join(self.state_machine.input_lines[ + initial_line_offset : self.state_machine.line_offset + 1]) + try: + arguments, options, content, content_offset = ( + self.parse_directive_block(indented, line_offset, + directive, option_presets)) + except MarkupError as detail: + error = self.reporter.error( + 'Error in "%s" directive:\n%s.' % (type_name, + ' '.join(detail.args)), + nodes.literal_block(block_text, block_text), line=lineno) + return [error], blank_finish + directive_instance = directive( + type_name, arguments, options, content, lineno, + content_offset, block_text, self, self.state_machine) + try: + result = directive_instance.run() + except docutils.parsers.rst.DirectiveError as error: + msg_node = self.reporter.system_message(error.level, error.msg, + line=lineno) + msg_node += nodes.literal_block(block_text, block_text) + result = [msg_node] + assert isinstance(result, list), \ + 'Directive "%s" must return a list of nodes.' % type_name + for i in range(len(result)): + assert isinstance(result[i], nodes.Node), \ + ('Directive "%s" returned non-Node object (index %s): %r' + % (type_name, i, result[i])) + return (result, + blank_finish or self.state_machine.is_next_line_blank()) + + def parse_directive_block(self, indented, line_offset, directive, + option_presets): + option_spec = directive.option_spec + has_content = directive.has_content + if indented and not indented[0].strip(): + indented.trim_start() + line_offset += 1 + while indented and not indented[-1].strip(): + indented.trim_end() + if indented and (directive.required_arguments + or directive.optional_arguments + or option_spec): + for i, line in enumerate(indented): + if not line.strip(): + break + else: + i += 1 + arg_block = indented[:i] + content = indented[i+1:] + content_offset = line_offset + i + 1 + else: + content = indented + content_offset = line_offset + arg_block = [] + if option_spec: + options, arg_block = self.parse_directive_options( + option_presets, option_spec, arg_block) + else: + options = {} + if arg_block and not (directive.required_arguments + or directive.optional_arguments): + content = arg_block + indented[i:] + content_offset = line_offset + arg_block = [] + while content and not content[0].strip(): + content.trim_start() + content_offset += 1 + if directive.required_arguments or directive.optional_arguments: + arguments = self.parse_directive_arguments( + directive, arg_block) + else: + arguments = [] + if content and not has_content: + raise MarkupError('no content permitted') + return (arguments, options, content, content_offset) + + def parse_directive_options(self, option_presets, option_spec, arg_block): + options = option_presets.copy() + for i, line in enumerate(arg_block): + if re.match(Body.patterns['field_marker'], line): + opt_block = arg_block[i:] + arg_block = arg_block[:i] + break + else: + opt_block = [] + if opt_block: + success, data = self.parse_extension_options(option_spec, + opt_block) + if success: # data is a dict of options + options.update(data) + else: # data is an error string + raise MarkupError(data) + return options, arg_block + + def parse_directive_arguments(self, directive, arg_block): + required = directive.required_arguments + optional = directive.optional_arguments + arg_text = '\n'.join(arg_block) + arguments = arg_text.split() + if len(arguments) < required: + raise MarkupError('%s argument(s) required, %s supplied' + % (required, len(arguments))) + elif len(arguments) > required + optional: + if directive.final_argument_whitespace: + arguments = arg_text.split(None, required + optional - 1) + else: + raise MarkupError( + 'maximum %s argument(s) allowed, %s supplied' + % (required + optional, len(arguments))) + return arguments + + def parse_extension_options(self, option_spec, datalines): + """ + Parse `datalines` for a field list containing extension options + matching `option_spec`. + + :Parameters: + - `option_spec`: a mapping of option name to conversion + function, which should raise an exception on bad input. + - `datalines`: a list of input strings. + + :Return: + - Success value, 1 or 0. + - An option dictionary on success, an error string on failure. + """ + node = nodes.field_list() + newline_offset, blank_finish = self.nested_list_parse( + datalines, 0, node, initial_state='ExtensionOptions', + blank_finish=True) + if newline_offset != len(datalines): # incomplete parse of block + return 0, 'invalid option block' + try: + options = utils.extract_extension_options(node, option_spec) + except KeyError as detail: + return 0, ('unknown option: "%s"' % detail.args[0]) + except (ValueError, TypeError) as detail: + return 0, ('invalid option value: %s' % ' '.join(detail.args)) + except utils.ExtensionOptionError as detail: + return 0, ('invalid option data: %s' % ' '.join(detail.args)) + if blank_finish: + return 1, options + else: + return 0, 'option data incompletely parsed' + + def unknown_directive(self, type_name): + lineno = self.state_machine.abs_line_number() + indented, indent, offset, blank_finish = \ + self.state_machine.get_first_known_indented(0, strip_indent=False) + text = '\n'.join(indented) + error = self.reporter.error( + 'Unknown directive type "%s".' % type_name, + nodes.literal_block(text, text), line=lineno) + return [error], blank_finish + + def comment(self, match): + if not match.string[match.end():].strip() \ + and self.state_machine.is_next_line_blank(): # an empty comment? + return [nodes.comment()], 1 # "A tiny but practical wart." + indented, indent, offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end()) + while indented and not indented[-1].strip(): + indented.trim_end() + text = '\n'.join(indented) + return [nodes.comment(text, text)], blank_finish + + explicit.constructs = [ + (footnote, + re.compile(r""" + \.\.[ ]+ # explicit markup start + \[ + ( # footnote label: + [0-9]+ # manually numbered footnote + | # *OR* + \# # anonymous auto-numbered footnote + | # *OR* + \#%s # auto-number ed?) footnote label + | # *OR* + \* # auto-symbol footnote + ) + \] + ([ ]+|$) # whitespace or end of line + """ % Inliner.simplename, re.VERBOSE | re.UNICODE)), + (citation, + re.compile(r""" + \.\.[ ]+ # explicit markup start + \[(%s)\] # citation label + ([ ]+|$) # whitespace or end of line + """ % Inliner.simplename, re.VERBOSE | re.UNICODE)), + (hyperlink_target, + re.compile(r""" + \.\.[ ]+ # explicit markup start + _ # target indicator + (?![ ]|$) # first char. not space or EOL + """, re.VERBOSE | re.UNICODE)), + (substitution_def, + re.compile(r""" + \.\.[ ]+ # explicit markup start + \| # substitution indicator + (?![ ]|$) # first char. not space or EOL + """, re.VERBOSE | re.UNICODE)), + (directive, + re.compile(r""" + \.\.[ ]+ # explicit markup start + (%s) # directive name + [ ]? # optional space + :: # directive delimiter + ([ ]+|$) # whitespace or end of line + """ % Inliner.simplename, re.VERBOSE | re.UNICODE))] + + def explicit_markup(self, match, context, next_state): + """Footnotes, hyperlink targets, directives, comments.""" + nodelist, blank_finish = self.explicit_construct(match) + self.parent += nodelist + self.explicit_list(blank_finish) + return [], next_state, [] + + def explicit_construct(self, match): + """Determine which explicit construct this is, parse & return it.""" + errors = [] + for method, pattern in self.explicit.constructs: + expmatch = pattern.match(match.string) + if expmatch: + try: + return method(self, expmatch) + except MarkupError as error: + lineno = self.state_machine.abs_line_number() + message = ' '.join(error.args) + errors.append(self.reporter.warning(message, line=lineno)) + break + nodelist, blank_finish = self.comment(match) + return nodelist + errors, blank_finish + + def explicit_list(self, blank_finish): + """ + Create a nested state machine for a series of explicit markup + constructs (including anonymous hyperlink targets). + """ + offset = self.state_machine.line_offset + 1 # next line + newline_offset, blank_finish = self.nested_list_parse( + self.state_machine.input_lines[offset:], + input_offset=self.state_machine.abs_line_offset() + 1, + node=self.parent, initial_state='Explicit', + blank_finish=blank_finish, + match_titles=self.state_machine.match_titles) + self.goto_line(newline_offset) + if not blank_finish: + self.parent += self.unindent_warning('Explicit markup') + + def anonymous(self, match, context, next_state): + """Anonymous hyperlink targets.""" + nodelist, blank_finish = self.anonymous_target(match) + self.parent += nodelist + self.explicit_list(blank_finish) + return [], next_state, [] + + def anonymous_target(self, match): + lineno = self.state_machine.abs_line_number() + block, indent, offset, blank_finish \ + = self.state_machine.get_first_known_indented(match.end(), + until_blank=True) + blocktext = match.string[:match.end()] + '\n'.join(block) + block = [escape2null(line) for line in block] + target = self.make_target(block, blocktext, lineno, '') + return [target], blank_finish + + def line(self, match, context, next_state): + """Section title overline or transition marker.""" + if self.state_machine.match_titles: + return [match.string], 'Line', [] + elif match.string.strip() == '::': + raise statemachine.TransitionCorrection('text') + elif len(match.string.strip()) < 4: + msg = self.reporter.info( + 'Unexpected possible title overline or transition.\n' + "Treating it as ordinary text because it's so short.", + line=self.state_machine.abs_line_number()) + self.parent += msg + raise statemachine.TransitionCorrection('text') + else: + blocktext = self.state_machine.line + msg = self.reporter.severe( + 'Unexpected section title or transition.', + nodes.literal_block(blocktext, blocktext), + line=self.state_machine.abs_line_number()) + self.parent += msg + return [], next_state, [] + + def text(self, match, context, next_state): + """Titles, definition lists, paragraphs.""" + return [match.string], 'Text', [] + + +class RFC2822Body(Body): + + """ + RFC2822 headers are only valid as the first constructs in documents. As + soon as anything else appears, the `Body` state should take over. + """ + + patterns = Body.patterns.copy() # can't modify the original + patterns['rfc2822'] = r'[!-9;-~]+:( +|$)' + initial_transitions = [(name, 'Body') + for name in Body.initial_transitions] + initial_transitions.insert(-1, ('rfc2822', 'Body')) # just before 'text' + + def rfc2822(self, match, context, next_state): + """RFC2822-style field list item.""" + fieldlist = nodes.field_list(classes=['rfc2822']) + self.parent += fieldlist + field, blank_finish = self.rfc2822_field(match) + fieldlist += field + offset = self.state_machine.line_offset + 1 # next line + newline_offset, blank_finish = self.nested_list_parse( + self.state_machine.input_lines[offset:], + input_offset=self.state_machine.abs_line_offset() + 1, + node=fieldlist, initial_state='RFC2822List', + blank_finish=blank_finish) + self.goto_line(newline_offset) + if not blank_finish: + self.parent += self.unindent_warning( + 'RFC2822-style field list') + return [], next_state, [] + + def rfc2822_field(self, match): + name = match.string[:match.string.find(':')] + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end(), + until_blank=True) + fieldnode = nodes.field() + fieldnode += nodes.field_name(name, name) + fieldbody = nodes.field_body('\n'.join(indented)) + fieldnode += fieldbody + if indented: + self.nested_parse(indented, input_offset=line_offset, + node=fieldbody) + return fieldnode, blank_finish + + +class SpecializedBody(Body): + + """ + Superclass for second and subsequent compound element members. Compound + elements are lists and list-like constructs. + + All transition methods are disabled (redefined as `invalid_input`). + Override individual methods in subclasses to re-enable. + + For example, once an initial bullet list item, say, is recognized, the + `BulletList` subclass takes over, with a "bullet_list" node as its + container. Upon encountering the initial bullet list item, `Body.bullet` + calls its ``self.nested_list_parse`` (`RSTState.nested_list_parse`), which + starts up a nested parsing session with `BulletList` as the initial state. + Only the ``bullet`` transition method is enabled in `BulletList`; as long + as only bullet list items are encountered, they are parsed and inserted + into the container. The first construct which is *not* a bullet list item + triggers the `invalid_input` method, which ends the nested parse and + closes the container. `BulletList` needs to recognize input that is + invalid in the context of a bullet list, which means everything *other + than* bullet list items, so it inherits the transition list created in + `Body`. + """ + + def invalid_input(self, match=None, context=None, next_state=None): + """Not a compound element member. Abort this state machine.""" + self.state_machine.previous_line() # back up so parent SM can reassess + raise EOFError + + indent = invalid_input + bullet = invalid_input + enumerator = invalid_input + field_marker = invalid_input + option_marker = invalid_input + doctest = invalid_input + line_block = invalid_input + grid_table_top = invalid_input + simple_table_top = invalid_input + explicit_markup = invalid_input + anonymous = invalid_input + line = invalid_input + text = invalid_input + + +class BulletList(SpecializedBody): + + """Second and subsequent bullet_list list_items.""" + + def bullet(self, match, context, next_state): + """Bullet list item.""" + if match.string[0] != self.parent['bullet']: + # different bullet: new list + self.invalid_input() + listitem, blank_finish = self.list_item(match.end()) + self.parent += listitem + self.blank_finish = blank_finish + return [], next_state, [] + + +class DefinitionList(SpecializedBody): + + """Second and subsequent definition_list_items.""" + + def text(self, match, context, next_state): + """Definition lists.""" + return [match.string], 'Definition', [] + + +class EnumeratedList(SpecializedBody): + + """Second and subsequent enumerated_list list_items.""" + + def enumerator(self, match, context, next_state): + """Enumerated list item.""" + format, sequence, text, ordinal = self.parse_enumerator( + match, self.parent['enumtype']) + if ( format != self.format + or (sequence != '#' and (sequence != self.parent['enumtype'] + or self.auto + or ordinal != (self.lastordinal + 1))) + or not self.is_enumerated_list_item(ordinal, sequence, format)): + # different enumeration: new list + self.invalid_input() + if sequence == '#': + self.auto = 1 + listitem, blank_finish = self.list_item(match.end()) + self.parent += listitem + self.blank_finish = blank_finish + self.lastordinal = ordinal + return [], next_state, [] + + +class FieldList(SpecializedBody): + + """Second and subsequent field_list fields.""" + + def field_marker(self, match, context, next_state): + """Field list field.""" + field, blank_finish = self.field(match) + self.parent += field + self.blank_finish = blank_finish + return [], next_state, [] + + +class OptionList(SpecializedBody): + + """Second and subsequent option_list option_list_items.""" + + def option_marker(self, match, context, next_state): + """Option list item.""" + try: + option_list_item, blank_finish = self.option_list_item(match) + except MarkupError: + self.invalid_input() + self.parent += option_list_item + self.blank_finish = blank_finish + return [], next_state, [] + + +class RFC2822List(SpecializedBody, RFC2822Body): + + """Second and subsequent RFC2822-style field_list fields.""" + + patterns = RFC2822Body.patterns + initial_transitions = RFC2822Body.initial_transitions + + def rfc2822(self, match, context, next_state): + """RFC2822-style field list item.""" + field, blank_finish = self.rfc2822_field(match) + self.parent += field + self.blank_finish = blank_finish + return [], 'RFC2822List', [] + + blank = SpecializedBody.invalid_input + + +class ExtensionOptions(FieldList): + + """ + Parse field_list fields for extension options. + + No nested parsing is done (including inline markup parsing). + """ + + def parse_field_body(self, indented, offset, node): + """Override `Body.parse_field_body` for simpler parsing.""" + lines = [] + for line in list(indented) + ['']: + if line.strip(): + lines.append(line) + elif lines: + text = '\n'.join(lines) + node += nodes.paragraph(text, text) + lines = [] + + +class LineBlock(SpecializedBody): + + """Second and subsequent lines of a line_block.""" + + blank = SpecializedBody.invalid_input + + def line_block(self, match, context, next_state): + """New line of line block.""" + lineno = self.state_machine.abs_line_number() + line, messages, blank_finish = self.line_block_line(match, lineno) + self.parent += line + self.parent.parent += messages + self.blank_finish = blank_finish + return [], next_state, [] + + +class Explicit(SpecializedBody): + + """Second and subsequent explicit markup construct.""" + + def explicit_markup(self, match, context, next_state): + """Footnotes, hyperlink targets, directives, comments.""" + nodelist, blank_finish = self.explicit_construct(match) + self.parent += nodelist + self.blank_finish = blank_finish + return [], next_state, [] + + def anonymous(self, match, context, next_state): + """Anonymous hyperlink targets.""" + nodelist, blank_finish = self.anonymous_target(match) + self.parent += nodelist + self.blank_finish = blank_finish + return [], next_state, [] + + blank = SpecializedBody.invalid_input + + +class SubstitutionDef(Body): + + """ + Parser for the contents of a substitution_definition element. + """ + + patterns = { + 'embedded_directive': re.compile(r'(%s)::( +|$)' + % Inliner.simplename, re.UNICODE), + 'text': r''} + initial_transitions = ['embedded_directive', 'text'] + + def embedded_directive(self, match, context, next_state): + nodelist, blank_finish = self.directive(match, + alt=self.parent['names'][0]) + self.parent += nodelist + if not self.state_machine.at_eof(): + self.blank_finish = blank_finish + raise EOFError + + def text(self, match, context, next_state): + if not self.state_machine.at_eof(): + self.blank_finish = self.state_machine.is_next_line_blank() + raise EOFError + + +class Text(RSTState): + + """ + Classifier of second line of a text block. + + Could be a paragraph, a definition list item, or a title. + """ + + patterns = {'underline': Body.patterns['line'], + 'text': r''} + initial_transitions = [('underline', 'Body'), ('text', 'Body')] + + def blank(self, match, context, next_state): + """End of paragraph.""" + # NOTE: self.paragraph returns [ node, system_message(s) ], literalnext + paragraph, literalnext = self.paragraph( + context, self.state_machine.abs_line_number() - 1) + self.parent += paragraph + if literalnext: + self.parent += self.literal_block() + return [], 'Body', [] + + def eof(self, context): + if context: + self.blank(None, context, None) + return [] + + def indent(self, match, context, next_state): + """Definition list item.""" + definitionlist = nodes.definition_list() + definitionlistitem, blank_finish = self.definition_list_item(context) + definitionlist += definitionlistitem + self.parent += definitionlist + offset = self.state_machine.line_offset + 1 # next line + newline_offset, blank_finish = self.nested_list_parse( + self.state_machine.input_lines[offset:], + input_offset=self.state_machine.abs_line_offset() + 1, + node=definitionlist, initial_state='DefinitionList', + blank_finish=blank_finish, blank_finish_state='Definition') + self.goto_line(newline_offset) + if not blank_finish: + self.parent += self.unindent_warning('Definition list') + return [], 'Body', [] + + def underline(self, match, context, next_state): + """Section title.""" + lineno = self.state_machine.abs_line_number() + title = context[0].rstrip() + underline = match.string.rstrip() + source = title + '\n' + underline + messages = [] + if column_width(title) > len(underline): + if len(underline) < 4: + if self.state_machine.match_titles: + msg = self.reporter.info( + 'Possible title underline, too short for the title.\n' + "Treating it as ordinary text because it's so short.", + line=lineno) + self.parent += msg + raise statemachine.TransitionCorrection('text') + else: + blocktext = context[0] + '\n' + self.state_machine.line + msg = self.reporter.warning('Title underline too short.', + nodes.literal_block(blocktext, blocktext), line=lineno) + messages.append(msg) + if not self.state_machine.match_titles: + blocktext = context[0] + '\n' + self.state_machine.line + # We need get_source_and_line() here to report correctly + src, srcline = self.state_machine.get_source_and_line() + # TODO: why is abs_line_number() == srcline+1 + # if the error is in a table (try with test_tables.py)? + # print("get_source_and_line", srcline) + # print("abs_line_number", self.state_machine.abs_line_number()) + msg = self.reporter.severe('Unexpected section title.', + nodes.literal_block(blocktext, blocktext), + source=src, line=srcline) + self.parent += messages + self.parent += msg + return [], next_state, [] + style = underline[0] + context[:] = [] + self.section(title, source, style, lineno - 1, messages) + return [], next_state, [] + + def text(self, match, context, next_state): + """Paragraph.""" + startline = self.state_machine.abs_line_number() - 1 + msg = None + try: + block = self.state_machine.get_text_block(flush_left=True) + except statemachine.UnexpectedIndentationError as err: + block, src, srcline = err.args + msg = self.reporter.error('Unexpected indentation.', + source=src, line=srcline) + lines = context + list(block) + paragraph, literalnext = self.paragraph(lines, startline) + self.parent += paragraph + self.parent += msg + if literalnext: + try: + self.state_machine.next_line() + except EOFError: + pass + self.parent += self.literal_block() + return [], next_state, [] + + def literal_block(self): + """Return a list of nodes.""" + indented, indent, offset, blank_finish = \ + self.state_machine.get_indented() + while indented and not indented[-1].strip(): + indented.trim_end() + if not indented: + return self.quoted_literal_block() + data = '\n'.join(indented) + literal_block = nodes.literal_block(data, data) + (literal_block.source, + literal_block.line) = self.state_machine.get_source_and_line(offset+1) + nodelist = [literal_block] + if not blank_finish: + nodelist.append(self.unindent_warning('Literal block')) + return nodelist + + def quoted_literal_block(self): + abs_line_offset = self.state_machine.abs_line_offset() + offset = self.state_machine.line_offset + parent_node = nodes.Element() + new_abs_offset = self.nested_parse( + self.state_machine.input_lines[offset:], + input_offset=abs_line_offset, node=parent_node, match_titles=False, + state_machine_kwargs={'state_classes': (QuotedLiteralBlock,), + 'initial_state': 'QuotedLiteralBlock'}) + self.goto_line(new_abs_offset) + return parent_node.children + + def definition_list_item(self, termline): + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_indented() + itemnode = nodes.definition_list_item( + '\n'.join(termline + list(indented))) + lineno = self.state_machine.abs_line_number() - 1 + (itemnode.source, + itemnode.line) = self.state_machine.get_source_and_line(lineno) + termlist, messages = self.term(termline, lineno) + itemnode += termlist + definition = nodes.definition('', *messages) + itemnode += definition + if termline[0][-2:] == '::': + definition += self.reporter.info( + 'Blank line missing before literal block (after the "::")? ' + 'Interpreted as a definition list item.', + line=lineno+1) + self.nested_parse(indented, input_offset=line_offset, node=definition) + return itemnode, blank_finish + + classifier_delimiter = re.compile(' +: +') + + def term(self, lines, lineno): + """Return a definition_list's term and optional classifiers.""" + assert len(lines) == 1 + text_nodes, messages = self.inline_text(lines[0], lineno) + term_node = nodes.term(lines[0]) + (term_node.source, + term_node.line) = self.state_machine.get_source_and_line(lineno) + node_list = [term_node] + for i in range(len(text_nodes)): + node = text_nodes[i] + if isinstance(node, nodes.Text): + parts = self.classifier_delimiter.split(node) + if len(parts) == 1: + node_list[-1] += node + else: + text = parts[0].rstrip() + textnode = nodes.Text(text) + node_list[-1] += textnode + for part in parts[1:]: + node_list.append( + nodes.classifier(unescape(part, True), part)) + else: + node_list[-1] += node + return node_list, messages + + +class SpecializedText(Text): + + """ + Superclass for second and subsequent lines of Text-variants. + + All transition methods are disabled. Override individual methods in + subclasses to re-enable. + """ + + def eof(self, context): + """Incomplete construct.""" + return [] + + def invalid_input(self, match=None, context=None, next_state=None): + """Not a compound element member. Abort this state machine.""" + raise EOFError + + blank = invalid_input + indent = invalid_input + underline = invalid_input + text = invalid_input + + +class Definition(SpecializedText): + + """Second line of potential definition_list_item.""" + + def eof(self, context): + """Not a definition.""" + self.state_machine.previous_line(2) # so parent SM can reassess + return [] + + def indent(self, match, context, next_state): + """Definition list item.""" + itemnode, blank_finish = self.definition_list_item(context) + self.parent += itemnode + self.blank_finish = blank_finish + return [], 'DefinitionList', [] + + +class Line(SpecializedText): + + """ + Second line of over- & underlined section title or transition marker. + """ + + eofcheck = 1 # @@@ ??? + """Set to 0 while parsing sections, so that we don't catch the EOF.""" + + def eof(self, context): + """Transition marker at end of section or document.""" + marker = context[0].strip() + if self.memo.section_bubble_up_kludge: + self.memo.section_bubble_up_kludge = False + elif len(marker) < 4: + self.state_correction(context) + if self.eofcheck: # ignore EOFError with sections + lineno = self.state_machine.abs_line_number() - 1 + transition = nodes.transition(rawsource=context[0]) + transition.line = lineno + self.parent += transition + self.eofcheck = 1 + return [] + + def blank(self, match, context, next_state): + """Transition marker.""" + src, srcline = self.state_machine.get_source_and_line() + marker = context[0].strip() + if len(marker) < 4: + self.state_correction(context) + transition = nodes.transition(rawsource=marker) + transition.source = src + transition.line = srcline - 1 + self.parent += transition + return [], 'Body', [] + + def text(self, match, context, next_state): + """Potential over- & underlined title.""" + lineno = self.state_machine.abs_line_number() - 1 + overline = context[0] + title = match.string + underline = '' + try: + underline = self.state_machine.next_line() + except EOFError: + blocktext = overline + '\n' + title + if len(overline.rstrip()) < 4: + self.short_overline(context, blocktext, lineno, 2) + else: + msg = self.reporter.severe( + 'Incomplete section title.', + nodes.literal_block(blocktext, blocktext), + line=lineno) + self.parent += msg + return [], 'Body', [] + source = '%s\n%s\n%s' % (overline, title, underline) + overline = overline.rstrip() + underline = underline.rstrip() + if not self.transitions['underline'][0].match(underline): + blocktext = overline + '\n' + title + '\n' + underline + if len(overline.rstrip()) < 4: + self.short_overline(context, blocktext, lineno, 2) + else: + msg = self.reporter.severe( + 'Missing matching underline for section title overline.', + nodes.literal_block(source, source), + line=lineno) + self.parent += msg + return [], 'Body', [] + elif overline != underline: + blocktext = overline + '\n' + title + '\n' + underline + if len(overline.rstrip()) < 4: + self.short_overline(context, blocktext, lineno, 2) + else: + msg = self.reporter.severe( + 'Title overline & underline mismatch.', + nodes.literal_block(source, source), + line=lineno) + self.parent += msg + return [], 'Body', [] + title = title.rstrip() + messages = [] + if column_width(title) > len(overline): + blocktext = overline + '\n' + title + '\n' + underline + if len(overline.rstrip()) < 4: + self.short_overline(context, blocktext, lineno, 2) + else: + msg = self.reporter.warning( + 'Title overline too short.', + nodes.literal_block(source, source), + line=lineno) + messages.append(msg) + style = (overline[0], underline[0]) + self.eofcheck = 0 # @@@ not sure this is correct + self.section(title.lstrip(), source, style, lineno + 1, messages) + self.eofcheck = 1 + return [], 'Body', [] + + indent = text # indented title + + def underline(self, match, context, next_state): + overline = context[0] + blocktext = overline + '\n' + self.state_machine.line + lineno = self.state_machine.abs_line_number() - 1 + if len(overline.rstrip()) < 4: + self.short_overline(context, blocktext, lineno, 1) + msg = self.reporter.error( + 'Invalid section title or transition marker.', + nodes.literal_block(blocktext, blocktext), + line=lineno) + self.parent += msg + return [], 'Body', [] + + def short_overline(self, context, blocktext, lineno, lines=1): + msg = self.reporter.info( + 'Possible incomplete section title.\nTreating the overline as ' + "ordinary text because it's so short.", + line=lineno) + self.parent += msg + self.state_correction(context, lines) + + def state_correction(self, context, lines=1): + self.state_machine.previous_line(lines) + context[:] = [] + raise statemachine.StateCorrection('Body', 'text') + + +class QuotedLiteralBlock(RSTState): + + """ + Nested parse handler for quoted (unindented) literal blocks. + + Special-purpose. Not for inclusion in `state_classes`. + """ + + patterns = {'initial_quoted': r'(%(nonalphanum7bit)s)' % Body.pats, + 'text': r''} + initial_transitions = ('initial_quoted', 'text') + + def __init__(self, state_machine, debug=False): + RSTState.__init__(self, state_machine, debug) + self.messages = [] + self.initial_lineno = None + + def blank(self, match, context, next_state): + if context: + raise EOFError + else: + return context, next_state, [] + + def eof(self, context): + if context: + src, srcline = self.state_machine.get_source_and_line( + self.initial_lineno) + text = '\n'.join(context) + literal_block = nodes.literal_block(text, text) + literal_block.source = src + literal_block.line = srcline + self.parent += literal_block + else: + self.parent += self.reporter.warning( + 'Literal block expected; none found.', + line=self.state_machine.abs_line_number()) + # src not available, because statemachine.input_lines is empty + self.state_machine.previous_line() + self.parent += self.messages + return [] + + def indent(self, match, context, next_state): + assert context, ('QuotedLiteralBlock.indent: context should not ' + 'be empty!') + self.messages.append( + self.reporter.error('Unexpected indentation.', + line=self.state_machine.abs_line_number())) + self.state_machine.previous_line() + raise EOFError + + def initial_quoted(self, match, context, next_state): + """Match arbitrary quote character on the first line only.""" + self.remove_transition('initial_quoted') + quote = match.string[0] + pattern = re.compile(re.escape(quote), re.UNICODE) + # New transition matches consistent quotes only: + self.add_transition('quoted', + (pattern, self.quoted, self.__class__.__name__)) + self.initial_lineno = self.state_machine.abs_line_number() + return [match.string], next_state, [] + + def quoted(self, match, context, next_state): + """Match consistent quotes on subsequent lines.""" + context.append(match.string) + return context, next_state, [] + + def text(self, match, context, next_state): + if context: + self.messages.append( + self.reporter.error('Inconsistent literal block quoting.', + line=self.state_machine.abs_line_number())) + self.state_machine.previous_line() + raise EOFError + + +state_classes = (Body, BulletList, DefinitionList, EnumeratedList, FieldList, + OptionList, LineBlock, ExtensionOptions, Explicit, Text, + Definition, Line, SubstitutionDef, RFC2822Body, RFC2822List) +"""Standard set of State classes used to start `RSTStateMachine`.""" diff --git a/lib/python3.8/site-packages/docutils/parsers/rst/tableparser.py b/lib/python3.8/site-packages/docutils/parsers/rst/tableparser.py new file mode 100644 index 0000000..5539a74 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/parsers/rst/tableparser.py @@ -0,0 +1,542 @@ +# $Id: tableparser.py 8373 2019-08-27 12:11:30Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +This module defines table parser classes,which parse plaintext-graphic tables +and produce a well-formed data structure suitable for building a CALS table. + +:Classes: + - `GridTableParser`: Parse fully-formed tables represented with a grid. + - `SimpleTableParser`: Parse simple tables, delimited by top & bottom + borders. + +:Exception class: `TableMarkupError` + +:Function: + `update_dict_of_lists()`: Merge two dictionaries containing list values. +""" + +__docformat__ = 'reStructuredText' + + +import re +import sys +from docutils import DataError +from docutils.utils import strip_combining_chars + + +class TableMarkupError(DataError): + + """ + Raise if there is any problem with table markup. + + The keyword argument `offset` denotes the offset of the problem + from the table's start line. + """ + + def __init__(self, *args, **kwargs): + self.offset = kwargs.pop('offset', 0) + DataError.__init__(self, *args) + + +class TableParser(object): + + """ + Abstract superclass for the common parts of the syntax-specific parsers. + """ + + head_body_separator_pat = None + """Matches the row separator between head rows and body rows.""" + + double_width_pad_char = '\x00' + """Padding character for East Asian double-width text.""" + + def parse(self, block): + """ + Analyze the text `block` and return a table data structure. + + Given a plaintext-graphic table in `block` (list of lines of text; no + whitespace padding), parse the table, construct and return the data + necessary to construct a CALS table or equivalent. + + Raise `TableMarkupError` if there is any problem with the markup. + """ + self.setup(block) + self.find_head_body_sep() + self.parse_table() + structure = self.structure_from_cells() + return structure + + def find_head_body_sep(self): + """Look for a head/body row separator line; store the line index.""" + for i in range(len(self.block)): + line = self.block[i] + if self.head_body_separator_pat.match(line): + if self.head_body_sep: + raise TableMarkupError( + 'Multiple head/body row separators ' + '(table lines %s and %s); only one allowed.' + % (self.head_body_sep+1, i+1), offset=i) + else: + self.head_body_sep = i + self.block[i] = line.replace('=', '-') + if self.head_body_sep == 0 or self.head_body_sep == (len(self.block) + - 1): + raise TableMarkupError('The head/body row separator may not be ' + 'the first or last line of the table.', + offset=i) + + +class GridTableParser(TableParser): + + """ + Parse a grid table using `parse()`. + + Here's an example of a grid table:: + + +------------------------+------------+----------+----------+ + | Header row, column 1 | Header 2 | Header 3 | Header 4 | + +========================+============+==========+==========+ + | body row 1, column 1 | column 2 | column 3 | column 4 | + +------------------------+------------+----------+----------+ + | body row 2 | Cells may span columns. | + +------------------------+------------+---------------------+ + | body row 3 | Cells may | - Table cells | + +------------------------+ span rows. | - contain | + | body row 4 | | - body elements. | + +------------------------+------------+---------------------+ + + Intersections use '+', row separators use '-' (except for one optional + head/body row separator, which uses '='), and column separators use '|'. + + Passing the above table to the `parse()` method will result in the + following data structure:: + + ([24, 12, 10, 10], + [[(0, 0, 1, ['Header row, column 1']), + (0, 0, 1, ['Header 2']), + (0, 0, 1, ['Header 3']), + (0, 0, 1, ['Header 4'])]], + [[(0, 0, 3, ['body row 1, column 1']), + (0, 0, 3, ['column 2']), + (0, 0, 3, ['column 3']), + (0, 0, 3, ['column 4'])], + [(0, 0, 5, ['body row 2']), + (0, 2, 5, ['Cells may span columns.']), + None, + None], + [(0, 0, 7, ['body row 3']), + (1, 0, 7, ['Cells may', 'span rows.', '']), + (1, 1, 7, ['- Table cells', '- contain', '- body elements.']), + None], + [(0, 0, 9, ['body row 4']), None, None, None]]) + + The first item is a list containing column widths (colspecs). The second + item is a list of head rows, and the third is a list of body rows. Each + row contains a list of cells. Each cell is either None (for a cell unused + because of another cell's span), or a tuple. A cell tuple contains four + items: the number of extra rows used by the cell in a vertical span + (morerows); the number of extra columns used by the cell in a horizontal + span (morecols); the line offset of the first line of the cell contents; + and the cell contents, a list of lines of text. + """ + + head_body_separator_pat = re.compile(r'\+=[=+]+=\+ *$') + + def setup(self, block): + self.block = block[:] # make a copy; it may be modified + self.block.disconnect() # don't propagate changes to parent + self.bottom = len(block) - 1 + self.right = len(block[0]) - 1 + self.head_body_sep = None + self.done = [-1] * len(block[0]) + self.cells = [] + self.rowseps = {0: [0]} + self.colseps = {0: [0]} + + def parse_table(self): + """ + Start with a queue of upper-left corners, containing the upper-left + corner of the table itself. Trace out one rectangular cell, remember + it, and add its upper-right and lower-left corners to the queue of + potential upper-left corners of further cells. Process the queue in + top-to-bottom order, keeping track of how much of each text column has + been seen. + + We'll end up knowing all the row and column boundaries, cell positions + and their dimensions. + """ + corners = [(0, 0)] + while corners: + top, left = corners.pop(0) + if top == self.bottom or left == self.right \ + or top <= self.done[left]: + continue + result = self.scan_cell(top, left) + if not result: + continue + bottom, right, rowseps, colseps = result + update_dict_of_lists(self.rowseps, rowseps) + update_dict_of_lists(self.colseps, colseps) + self.mark_done(top, left, bottom, right) + cellblock = self.block.get_2D_block(top + 1, left + 1, + bottom, right) + cellblock.disconnect() # lines in cell can't sync with parent + cellblock.replace(self.double_width_pad_char, '') + self.cells.append((top, left, bottom, right, cellblock)) + corners.extend([(top, right), (bottom, left)]) + corners.sort() + if not self.check_parse_complete(): + raise TableMarkupError('Malformed table; parse incomplete.') + + def mark_done(self, top, left, bottom, right): + """For keeping track of how much of each text column has been seen.""" + before = top - 1 + after = bottom - 1 + for col in range(left, right): + assert self.done[col] == before + self.done[col] = after + + def check_parse_complete(self): + """Each text column should have been completely seen.""" + last = self.bottom - 1 + for col in range(self.right): + if self.done[col] != last: + return False + return True + + def scan_cell(self, top, left): + """Starting at the top-left corner, start tracing out a cell.""" + assert self.block[top][left] == '+' + result = self.scan_right(top, left) + return result + + def scan_right(self, top, left): + """ + Look for the top-right corner of the cell, and make note of all column + boundaries ('+'). + """ + colseps = {} + line = self.block[top] + for i in range(left + 1, self.right + 1): + if line[i] == '+': + colseps[i] = [top] + result = self.scan_down(top, left, i) + if result: + bottom, rowseps, newcolseps = result + update_dict_of_lists(colseps, newcolseps) + return bottom, i, rowseps, colseps + elif line[i] != '-': + return None + return None + + def scan_down(self, top, left, right): + """ + Look for the bottom-right corner of the cell, making note of all row + boundaries. + """ + rowseps = {} + for i in range(top + 1, self.bottom + 1): + if self.block[i][right] == '+': + rowseps[i] = [right] + result = self.scan_left(top, left, i, right) + if result: + newrowseps, colseps = result + update_dict_of_lists(rowseps, newrowseps) + return i, rowseps, colseps + elif self.block[i][right] != '|': + return None + return None + + def scan_left(self, top, left, bottom, right): + """ + Noting column boundaries, look for the bottom-left corner of the cell. + It must line up with the starting point. + """ + colseps = {} + line = self.block[bottom] + for i in range(right - 1, left, -1): + if line[i] == '+': + colseps[i] = [bottom] + elif line[i] != '-': + return None + if line[left] != '+': + return None + result = self.scan_up(top, left, bottom, right) + if result is not None: + rowseps = result + return rowseps, colseps + return None + + def scan_up(self, top, left, bottom, right): + """ + Noting row boundaries, see if we can return to the starting point. + """ + rowseps = {} + for i in range(bottom - 1, top, -1): + if self.block[i][left] == '+': + rowseps[i] = [left] + elif self.block[i][left] != '|': + return None + return rowseps + + def structure_from_cells(self): + """ + From the data collected by `scan_cell()`, convert to the final data + structure. + """ + rowseps = sorted(self.rowseps.keys()) # list of row boundaries + rowindex = {} + for i in range(len(rowseps)): + rowindex[rowseps[i]] = i # row boundary -> row number mapping + colseps = sorted(self.colseps.keys()) # list of column boundaries + colindex = {} + for i in range(len(colseps)): + colindex[colseps[i]] = i # column boundary -> col number map + colspecs = [(colseps[i] - colseps[i - 1] - 1) + for i in range(1, len(colseps))] # list of column widths + # prepare an empty table with the correct number of rows & columns + onerow = [None for i in range(len(colseps) - 1)] + rows = [onerow[:] for i in range(len(rowseps) - 1)] + # keep track of # of cells remaining; should reduce to zero + remaining = (len(rowseps) - 1) * (len(colseps) - 1) + for top, left, bottom, right, block in self.cells: + rownum = rowindex[top] + colnum = colindex[left] + assert rows[rownum][colnum] is None, ( + 'Cell (row %s, column %s) already used.' + % (rownum + 1, colnum + 1)) + morerows = rowindex[bottom] - rownum - 1 + morecols = colindex[right] - colnum - 1 + remaining -= (morerows + 1) * (morecols + 1) + # write the cell into the table + rows[rownum][colnum] = (morerows, morecols, top + 1, block) + assert remaining == 0, 'Unused cells remaining.' + if self.head_body_sep: # separate head rows from body rows + numheadrows = rowindex[self.head_body_sep] + headrows = rows[:numheadrows] + bodyrows = rows[numheadrows:] + else: + headrows = [] + bodyrows = rows + return (colspecs, headrows, bodyrows) + + +class SimpleTableParser(TableParser): + + """ + Parse a simple table using `parse()`. + + Here's an example of a simple table:: + + ===== ===== + col 1 col 2 + ===== ===== + 1 Second column of row 1. + 2 Second column of row 2. + Second line of paragraph. + 3 - Second column of row 3. + + - Second item in bullet + list (row 3, column 2). + 4 is a span + ------------ + 5 + ===== ===== + + Top and bottom borders use '=', column span underlines use '-', column + separation is indicated with spaces. + + Passing the above table to the `parse()` method will result in the + following data structure, whose interpretation is the same as for + `GridTableParser`:: + + ([5, 25], + [[(0, 0, 1, ['col 1']), + (0, 0, 1, ['col 2'])]], + [[(0, 0, 3, ['1']), + (0, 0, 3, ['Second column of row 1.'])], + [(0, 0, 4, ['2']), + (0, 0, 4, ['Second column of row 2.', + 'Second line of paragraph.'])], + [(0, 0, 6, ['3']), + (0, 0, 6, ['- Second column of row 3.', + '', + '- Second item in bullet', + ' list (row 3, column 2).'])], + [(0, 1, 10, ['4 is a span'])], + [(0, 0, 12, ['5']), + (0, 0, 12, [''])]]) + """ + + head_body_separator_pat = re.compile('=[ =]*$') + span_pat = re.compile('-[ -]*$') + + def setup(self, block): + self.block = block[:] # make a copy; it will be modified + self.block.disconnect() # don't propagate changes to parent + # Convert top & bottom borders to column span underlines: + self.block[0] = self.block[0].replace('=', '-') + self.block[-1] = self.block[-1].replace('=', '-') + self.head_body_sep = None + self.columns = [] + self.border_end = None + self.table = [] + self.done = [-1] * len(block[0]) + self.rowseps = {0: [0]} + self.colseps = {0: [0]} + + def parse_table(self): + """ + First determine the column boundaries from the top border, then + process rows. Each row may consist of multiple lines; accumulate + lines until a row is complete. Call `self.parse_row` to finish the + job. + """ + # Top border must fully describe all table columns. + self.columns = self.parse_columns(self.block[0], 0) + self.border_end = self.columns[-1][1] + firststart, firstend = self.columns[0] + offset = 1 # skip top border + start = 1 + text_found = None + while offset < len(self.block): + line = self.block[offset] + if self.span_pat.match(line): + # Column span underline or border; row is complete. + self.parse_row(self.block[start:offset], start, + (line.rstrip(), offset)) + start = offset + 1 + text_found = None + elif line[firststart:firstend].strip(): + # First column not blank, therefore it's a new row. + if text_found and offset != start: + self.parse_row(self.block[start:offset], start) + start = offset + text_found = 1 + elif not text_found: + start = offset + 1 + offset += 1 + + def parse_columns(self, line, offset): + """ + Given a column span underline, return a list of (begin, end) pairs. + """ + cols = [] + end = 0 + while True: + begin = line.find('-', end) + end = line.find(' ', begin) + if begin < 0: + break + if end < 0: + end = len(line) + cols.append((begin, end)) + if self.columns: + if cols[-1][1] != self.border_end: + raise TableMarkupError('Column span incomplete in table ' + 'line %s.' % (offset+1), + offset=offset) + # Allow for an unbounded rightmost column: + cols[-1] = (cols[-1][0], self.columns[-1][1]) + return cols + + def init_row(self, colspec, offset): + i = 0 + cells = [] + for start, end in colspec: + morecols = 0 + try: + assert start == self.columns[i][0] + while end != self.columns[i][1]: + i += 1 + morecols += 1 + except (AssertionError, IndexError): + raise TableMarkupError('Column span alignment problem ' + 'in table line %s.' % (offset+2), + offset=offset+1) + cells.append([0, morecols, offset, []]) + i += 1 + return cells + + def parse_row(self, lines, start, spanline=None): + """ + Given the text `lines` of a row, parse it and append to `self.table`. + + The row is parsed according to the current column spec (either + `spanline` if provided or `self.columns`). For each column, extract + text from each line, and check for text in column margins. Finally, + adjust for insignificant whitespace. + """ + if not (lines or spanline): + # No new row, just blank lines. + return + if spanline: + columns = self.parse_columns(*spanline) + span_offset = spanline[1] + else: + columns = self.columns[:] + span_offset = start + self.check_columns(lines, start, columns) + row = self.init_row(columns, start) + for i in range(len(columns)): + start, end = columns[i] + cellblock = lines.get_2D_block(0, start, len(lines), end) + cellblock.disconnect() # lines in cell can't sync with parent + cellblock.replace(self.double_width_pad_char, '') + row[i][3] = cellblock + self.table.append(row) + + def check_columns(self, lines, first_line, columns): + """ + Check for text in column margins and text overflow in the last column. + Raise TableMarkupError if anything but whitespace is in column margins. + Adjust the end value for the last column if there is text overflow. + """ + # "Infinite" value for a dummy last column's beginning, used to + # check for text overflow: + columns.append((sys.maxsize, None)) + lastcol = len(columns) - 2 + # combining characters do not contribute to the column width + lines = [strip_combining_chars(line) for line in lines] + + for i in range(len(columns) - 1): + start, end = columns[i] + nextstart = columns[i+1][0] + offset = 0 + for line in lines: + if i == lastcol and line[end:].strip(): + text = line[start:].rstrip() + new_end = start + len(text) + main_start, main_end = self.columns[-1] + columns[i] = (start, max(main_end, new_end)) + if new_end > main_end: + self.columns[-1] = (main_start, new_end) + elif line[end:nextstart].strip(): + raise TableMarkupError('Text in column margin ' + 'in table line %s.' % (first_line+offset+1), + offset=first_line+offset) + offset += 1 + columns.pop() + + def structure_from_cells(self): + colspecs = [end - start for start, end in self.columns] + first_body_row = 0 + if self.head_body_sep: + for i in range(len(self.table)): + if self.table[i][0][2] > self.head_body_sep: + first_body_row = i + break + return (colspecs, self.table[:first_body_row], + self.table[first_body_row:]) + + +def update_dict_of_lists(master, newdata): + """ + Extend the list values of `master` with those from `newdata`. + + Both parameters must be dictionaries containing list values. + """ + for key, values in newdata.items(): + master.setdefault(key, []).extend(values) diff --git a/lib/python3.8/site-packages/docutils/readers/__init__.py b/lib/python3.8/site-packages/docutils/readers/__init__.py new file mode 100644 index 0000000..01e4ace --- /dev/null +++ b/lib/python3.8/site-packages/docutils/readers/__init__.py @@ -0,0 +1,112 @@ +# $Id: __init__.py 8239 2018-11-21 21:46:00Z milde $ +# Authors: David Goodger ; Ueli Schlaepfer +# Copyright: This module has been placed in the public domain. + +""" +This package contains Docutils Reader modules. +""" + +__docformat__ = 'reStructuredText' + +import sys + +from docutils import utils, parsers, Component +from docutils.transforms import universal + + +class Reader(Component): + + """ + Abstract base class for docutils Readers. + + Each reader module or package must export a subclass also called 'Reader'. + + The two steps of a Reader's responsibility are to read data from the + source Input object and parse the data with the Parser object. + Call `read()` to process a document. + """ + + component_type = 'reader' + config_section = 'readers' + + def get_transforms(self): + return Component.get_transforms(self) + [ + universal.Decorations, + universal.ExposeInternals, + universal.StripComments,] + + def __init__(self, parser=None, parser_name=None): + """ + Initialize the Reader instance. + + Several instance attributes are defined with dummy initial values. + Subclasses may use these attributes as they wish. + """ + + self.parser = parser + """A `parsers.Parser` instance shared by all doctrees. May be left + unspecified if the document source determines the parser.""" + + if parser is None and parser_name: + self.set_parser(parser_name) + + self.source = None + """`docutils.io` IO object, source of input data.""" + + self.input = None + """Raw text input; either a single string or, for more complex cases, + a collection of strings.""" + + def set_parser(self, parser_name): + """Set `self.parser` by name.""" + parser_class = parsers.get_parser_class(parser_name) + self.parser = parser_class() + + def read(self, source, parser, settings): + self.source = source + if not self.parser: + self.parser = parser + self.settings = settings + self.input = self.source.read() + self.parse() + return self.document + + def parse(self): + """Parse `self.input` into a document tree.""" + self.document = document = self.new_document() + self.parser.parse(self.input, document) + document.current_source = document.current_line = None + + def new_document(self): + """Create and return a new empty document tree (root node).""" + document = utils.new_document(self.source.source_path, self.settings) + return document + + +class ReReader(Reader): + + """ + A reader which rereads an existing document tree (e.g. a + deserializer). + + Often used in conjunction with `writers.UnfilteredWriter`. + """ + + def get_transforms(self): + # Do not add any transforms. They have already been applied + # by the reader which originally created the document. + return Component.get_transforms(self) + + +_reader_aliases = {} + +def get_reader_class(reader_name): + """Return the Reader class from the `reader_name` module.""" + reader_name = reader_name.lower() + if reader_name in _reader_aliases: + reader_name = _reader_aliases[reader_name] + try: + module = __import__(reader_name, globals(), locals(), level=1) + except ImportError: + module = __import__(reader_name, globals(), locals(), level=0) + return module.Reader diff --git a/lib/python3.8/site-packages/docutils/readers/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/docutils/readers/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17fce73e187fa6073543e9461abc4f55d60c5d3f GIT binary patch literal 3303 zcmZ`*O^@5S873uJmOthrNq3V?zt}^&G1_>FJrpglEfUNIMS7S9nQV8fi!7U*u{^Tm zlJw5nm;nkT*B*P%9E1LV{uf<)+P_esK%bYAXT}381yZE=l6s%_`^%l3E<^iQ5G8-# zVeCJ&xZMIQo}rr&2FYS3dCa9J{oIQ^yo21I2XQcO#jSZ5hn(SCD{s%EIO6P&Oop=k zj>)zP-}-R}>qvI6?x+sd-HgRO*_FL_EbdGHm<{^tUw7Y3Gb0x1z5%Yc=~zVzZi`f*DJvIU+)c~7=w^p3}E z*^ym*iDXaq@$SeSxr=vK?#X?;dol#N`&C$TpZ<a$HwY(V#PQ$K%1w=h?7za zxeXUM9r=rNG8Ou^1O$jT!kRCQ73$kXsjWzbS&r-b(%h6{lIFRR;?tUePn-MROqHxzrOSUKWd`73FxQ z04XgbScB+^sy=g`*{NH-aw=&khwh3)a41Fu?#W<8zgp;Wq9BjdNn;MR)r3`8OCWC7 zZ!>{3uN%$DXb;iNV+@wP=NIgXTW{v02k5O+{~UKUpA0wRrfV0GC7CPkc?54;MD%1=Hp-N)Jg{{Fzu7YB=M z@pM^`ew2KAK2<7zdbS>qSD&5D4>l@3Xiyv^NmgVwNrsD+?%)oAZk%`WhzIoiZ~f70 zr~KhIyGIirw3|kA>P`Z`!sG(@6O59dMfyh<9y-ayyW((H+JkXp^d*Opdh35Xb&z$w z1V34tXX{#p^}hw&(Wb>jH8wuR!YV z7T=`#lKhyip?2JuEl$qUl~~s1gYov2hKy*1>&*1#CVCe`)vHO8BAqLzw|YPzWL31$$1kulq*NA#L7#WM&=2`~uhGPYYT^+^)3#Lb zF+MsYp+y_b3 z-`XZ-Z;0__Zn#QkFCH!fC!iaHN*rAvnzZeIG1pMnfD%`X2Au& z^2jl;!;=+H%G;f*B)H-9#v1wIa>6tA3%*lMO8W2>)|p&<|-w*yG*F zQfpvN8vE>T);WCTgI5c}9lQgduAtOpLJZ8?<@!@fDIUjQ9RLQX+=>=H5d+Bnxv~gp@CFa^=eG8T05;( z_(R&e1BB>bp*MzkpRXS@Fm4NP;2j+e`s9z~7D-ZdlcY}nnD>+9Z_6}qcG?MvJV_wi zO{!1qYN2RdoMfkoL1IEUckxv}AeP8EG>N6wjDv8)rkhbX&?IY8n<0OTyr7GC>_uVs zxUckchef| z>c^naKcV5LGzc2#{H;50bo4W9`~}_F6Li$p^ks{A`X!xr%#SdsqrfHJmY;?Ckwql< zgk7@rBa856{kO~pZxIco_mAL`f5nO?0kf^MuKt=M*m1T+g$j|V{>lpPYeWwUgo9xH zo7c57Q5jULc~j{%B~)GZDD4b<)YP`a??}+7R9iW+Yp&g@ja7NBbhVd|N#F?5GfGE8 zPLZLy)hHmU_Gw;@QKM90UZU_bRqv(SdZBfxouv-ExYt}ju2Y4zL*0_9%YiQQG;}WW zoPs4o9?rZ7(Kg~9f5dnBW3GQm%G9p9`BO5>)atwRMFkTa9`!DeH4 tr~Yz`It}Wd6E*$e7K7JnucFUu?*Bklo8vAB;G5nLc;DZDvA-91{|AB`E~Wqg literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/readers/__pycache__/doctree.cpython-38.pyc b/lib/python3.8/site-packages/docutils/readers/__pycache__/doctree.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6fd7f5d6c6ea793daa005317729608e02839f9f GIT binary patch literal 1497 zcmZ`(OK;pZ5T;(c%EpfZ=`9xm?I8ke8R#*OB0&NKxwt{R;%kouPKu+cqV@S&|wKzxn2y{b_%H#&G-=r{(JjW53g8cf`1Pj??C7 zBrBKd6zedGGCO@)lvijy72nmKSwc+qyS*O}_ zE_Ky6&^qo6fX)BFz$}Y~sqwycNP4GgJItIBt;L&-t;l6}gt&Q*(|(HvSP>wyPzFUL z!y=YZk;s@Z$jL`mOyv}@q{C#yA`bELjN^DAMTa0RfUi-$c>Bg97483k&1e4N8D9Bv zHoWPr;|t)Ouofg2*2kaEt?o?)^ErMnq5+4TIPHVc`*Wg%lFln_Ab;C0YGp6L%(-fn zQ=(QYFh~5_h_1t^s^!Apy}PG${z_M8Na&lk>)o8|#U)hk@#7IOrQ7uj{>+pAg_j=r zc;rSS&+{WbLVmV|_OB-%ZOWJ(k$-kajW+6BwW7W&v;{|%w_F(D`WG-pNeS%}u9o~p z_xxIr8Z_@M5MLh4_Kse94*wJN$dk;G+jVpgm4uaVPLS^%mbbL>O4KzM3q+Fpx3U0L zqASwl>R`R#qa3rqkl3mK&1TRVdxgEkX5vSo}m@vFp5Zl|=m zO{srAg|xm*#^3Uuj8LKRs@oRfRFhCFbqmrW^%F$1?9BpI;mO!=?^_7)|(mj+)(cq_s=$M2&TBd?MX00x}n)b zHs%_6Ci|D8-)qho8Uw!2t$72t{_{(zXsg2OzdU8B0n7jm$ z3s4LZ#4y3kU}k3ICNVJr+sdqbKnA%@?A#$v?h?0MA7sPaBOXTIAZ9b?7BPpLyU}kZ z88P<)g~R<9-tt;)%OZGFY@;IPIWJVO6lGP)C<~r1-z>x62OcplW*#{a{6dL3R<+=4 z#eY@r;YldOjVD!9uqZ1F9$Jl6@k%zH;0YHTe9FekQyDj-M3jZfBc-^2OQw)2)((z` z36qx~QY(%iQ$!5N*klH=m`MiAA~qW^`xX(0>7V*CD*M0*cnz!i;aXb`8f1-{Bj4XDVwqxW^dvwtZwfz3nQ13Sl987EIJc&stJs5jk$16yy4q-<=U2QQe=1tre6 zZK{&EuYdtSF-bl>tR9B8AFDEh$qi=s$`xn2It;3FXWS!Z{%*X(%G_CZgByLqy4S6X z0r|oHvvo(7bs)E8ov~oUgY|j=-LziM7OR#aNqqj|{G2#xk);I}4GL}HK(NMMwnS^j z{SJ+@NXny9x|F6xswfRjF>Y^k(V9{BPm3t$2e`!q&WKY`UxG+oaAdgn8QwqXF?;l9 zEEeIU0sq+cuXd7StRKtl^v1D zrytHK;}y^dJ|iiYZ9U1^ql3Pos3xXJ8641v5F5G(SVf$-9aiEQthN~)W!ciJO;z*# zDTq7)T)k+#0$oBEXcKJaBK;bFW37oIWleQCc%a p=aLckxAAf><^Iw1Hv%UZT literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/readers/__pycache__/standalone.cpython-38.pyc b/lib/python3.8/site-packages/docutils/readers/__pycache__/standalone.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8393d6c7137f5a55d82990fcb631393a9adac19 GIT binary patch literal 1941 zcmb7FOK&7K5blR(x@RWy$Yfs#4t?N|IrKyVZlEPA!Xq3avZ{L{ulxP31K%$wOy2D{&aY;% z`5{>BgQzcIpbmDZi(TqbzwodJe^KF=2&1xvTdo7^R?#j49F!pr%MR|i&gTwo)8M5; z1J*k0{@~*-^^cuNxZLj^Yr-ih1ZPo}7c6?t2xT(LgpBklizGYNvQBj^89iZ_Ix2}g zud7HcxF(m=E*{;rcm**!M-#6JGby-coHl{9m#T^1^sKTZS~J;nCCiv(JY}juWv z_J-}4?pSR=A6$8vpTT(?(1$prk8p=RrcYivfR_h&z16f=@J!sMt8RchT5fNkxUyJY z9psA408oQsB}FN8E_fueh(s1`EvmR+7p#aBOYNS{wXqiw6=_{EuA`M^7b+B~dZyTm z+GzjV9*kB;ZXA9XF>b=3(QFY>mXW&9lj(90$6UnVC${!@08=|lE}`;e(^FbVmSm(* z?3D}HPf&v>Q@Uvr8*CG-FT>V%PYnXqT?aa|f55I9}Vv zH@0|eRM*QjKu~@I5WEd04L-~F512vb|3o%jKC-F)%j3k8hWK*JT)h2;Xz&`%{;z5dL+5Aq3!+J`|qXYP;Qcg|0)_RkPVOSjJgkPxH;>n=zSWDBGZG5{Is(b@KV z>#+l5caJ7x>qiD~T{D<74e72+r(_G1xPJ_+1m4t!zY34OlA51Vs9v-i#4#!rC0JaWIm3N+T!55{d)fbD3$s*_H3Xcyt%_SV!&~-i&LUW;+!oyE5 zp^I=*ti9pkA@rL~#rS~mIovgWe$!}V+l16RF`48xY1}K$y(UZ&PD+*}O*ctOLF>ZIx02*VO^WqSN7Yp&q-L}UO+=<+NDn;X(fUcU zWF|zx2*-WJv<4hhqAHf+K`MBb&yzLt@Y}c731t=ZZD`CnQ#Kuo%*HSVH?l;+<>Vbc36Qb(WyE*!J#?*iFdNB+!H(t)P8s$gIr&V1$q#x+C|2 F{|{ZQL~#HB literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/readers/doctree.py b/lib/python3.8/site-packages/docutils/readers/doctree.py new file mode 100644 index 0000000..f8d3726 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/readers/doctree.py @@ -0,0 +1,46 @@ +# $Id: doctree.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: Martin Blais +# Copyright: This module has been placed in the public domain. + +"""Reader for existing document trees.""" + +from docutils import readers, utils, transforms + + +class Reader(readers.ReReader): + + """ + Adapt the Reader API for an existing document tree. + + The existing document tree must be passed as the ``source`` parameter to + the `docutils.core.Publisher` initializer, wrapped in a + `docutils.io.DocTreeInput` object:: + + pub = docutils.core.Publisher( + ..., source=docutils.io.DocTreeInput(document), ...) + + The original document settings are overridden; if you want to use the + settings of the original document, pass ``settings=document.settings`` to + the Publisher call above. + """ + + supported = ('doctree',) + + config_section = 'doctree reader' + config_section_dependencies = ('readers',) + + def parse(self): + """ + No parsing to do; refurbish the document tree instead. + Overrides the inherited method. + """ + self.document = self.input + # Create fresh Transformer object, to be populated from Writer + # component. + self.document.transformer = transforms.Transformer(self.document) + # Replace existing settings object with new one. + self.document.settings = self.settings + # Create fresh Reporter object because it is dependent on + # (new) settings. + self.document.reporter = utils.new_reporter( + self.document.get('source', ''), self.document.settings) diff --git a/lib/python3.8/site-packages/docutils/readers/pep.py b/lib/python3.8/site-packages/docutils/readers/pep.py new file mode 100644 index 0000000..0b3b424 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/readers/pep.py @@ -0,0 +1,48 @@ +# $Id: pep.py 7320 2012-01-19 22:33:02Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Python Enhancement Proposal (PEP) Reader. +""" + +__docformat__ = 'reStructuredText' + + +from docutils.readers import standalone +from docutils.transforms import peps, references, misc, frontmatter +from docutils.parsers import rst + + +class Reader(standalone.Reader): + + supported = ('pep',) + """Contexts this reader supports.""" + + settings_spec = ( + 'PEP Reader Option Defaults', + 'The --pep-references and --rfc-references options (for the ' + 'reStructuredText parser) are on by default.', + ()) + + config_section = 'pep reader' + config_section_dependencies = ('readers', 'standalone reader') + + def get_transforms(self): + transforms = standalone.Reader.get_transforms(self) + # We have PEP-specific frontmatter handling. + transforms.remove(frontmatter.DocTitle) + transforms.remove(frontmatter.SectionSubTitle) + transforms.remove(frontmatter.DocInfo) + transforms.extend([peps.Headers, peps.Contents, peps.TargetNotes]) + return transforms + + settings_default_overrides = {'pep_references': 1, 'rfc_references': 1} + + inliner_class = rst.states.Inliner + + def __init__(self, parser=None, parser_name=None): + """`parser` should be ``None``.""" + if parser is None: + parser = rst.Parser(rfc2822=True, inliner=self.inliner_class()) + standalone.Reader.__init__(self, parser, '') diff --git a/lib/python3.8/site-packages/docutils/readers/standalone.py b/lib/python3.8/site-packages/docutils/readers/standalone.py new file mode 100644 index 0000000..3c302ed --- /dev/null +++ b/lib/python3.8/site-packages/docutils/readers/standalone.py @@ -0,0 +1,66 @@ +# $Id: standalone.py 4802 2006-11-12 18:02:17Z goodger $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Standalone file Reader for the reStructuredText markup syntax. +""" + +__docformat__ = 'reStructuredText' + + +import sys +from docutils import frontend, readers +from docutils.transforms import frontmatter, references, misc + + +class Reader(readers.Reader): + + supported = ('standalone',) + """Contexts this reader supports.""" + + document = None + """A single document tree.""" + + settings_spec = ( + 'Standalone Reader', + None, + (('Disable the promotion of a lone top-level section title to ' + 'document title (and subsequent section title to document ' + 'subtitle promotion; enabled by default).', + ['--no-doc-title'], + {'dest': 'doctitle_xform', 'action': 'store_false', 'default': 1, + 'validator': frontend.validate_boolean}), + ('Disable the bibliographic field list transform (enabled by ' + 'default).', + ['--no-doc-info'], + {'dest': 'docinfo_xform', 'action': 'store_false', 'default': 1, + 'validator': frontend.validate_boolean}), + ('Activate the promotion of lone subsection titles to ' + 'section subtitles (disabled by default).', + ['--section-subtitles'], + {'dest': 'sectsubtitle_xform', 'action': 'store_true', 'default': 0, + 'validator': frontend.validate_boolean}), + ('Deactivate the promotion of lone subsection titles.', + ['--no-section-subtitles'], + {'dest': 'sectsubtitle_xform', 'action': 'store_false'}), + )) + + config_section = 'standalone reader' + config_section_dependencies = ('readers',) + + def get_transforms(self): + return readers.Reader.get_transforms(self) + [ + references.Substitutions, + references.PropagateTargets, + frontmatter.DocTitle, + frontmatter.SectionSubTitle, + frontmatter.DocInfo, + references.AnonymousHyperlinks, + references.IndirectHyperlinks, + references.Footnotes, + references.ExternalTargets, + references.InternalTargets, + references.DanglingReferences, + misc.Transitions, + ] diff --git a/lib/python3.8/site-packages/docutils/statemachine.py b/lib/python3.8/site-packages/docutils/statemachine.py new file mode 100644 index 0000000..4d77429 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/statemachine.py @@ -0,0 +1,1539 @@ + # $Id: statemachine.py 8435 2019-12-12 13:04:57Z milde $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +A finite state machine specialized for regular-expression-based text filters, +this module defines the following classes: + +- `StateMachine`, a state machine +- `State`, a state superclass +- `StateMachineWS`, a whitespace-sensitive version of `StateMachine` +- `StateWS`, a state superclass for use with `StateMachineWS` +- `SearchStateMachine`, uses `re.search()` instead of `re.match()` +- `SearchStateMachineWS`, uses `re.search()` instead of `re.match()` +- `ViewList`, extends standard Python lists. +- `StringList`, string-specific ViewList. + +Exception classes: + +- `StateMachineError` +- `UnknownStateError` +- `DuplicateStateError` +- `UnknownTransitionError` +- `DuplicateTransitionError` +- `TransitionPatternNotFound` +- `TransitionMethodNotFound` +- `UnexpectedIndentationError` +- `TransitionCorrection`: Raised to switch to another transition. +- `StateCorrection`: Raised to switch to another state & transition. + +Functions: + +- `string2lines()`: split a multi-line string into a list of one-line strings + + +How To Use This Module +====================== +(See the individual classes, methods, and attributes for details.) + +1. Import it: ``import statemachine`` or ``from statemachine import ...``. + You will also need to ``import re``. + +2. Derive a subclass of `State` (or `StateWS`) for each state in your state + machine:: + + class MyState(statemachine.State): + + Within the state's class definition: + + a) Include a pattern for each transition, in `State.patterns`:: + + patterns = {'atransition': r'pattern', ...} + + b) Include a list of initial transitions to be set up automatically, in + `State.initial_transitions`:: + + initial_transitions = ['atransition', ...] + + c) Define a method for each transition, with the same name as the + transition pattern:: + + def atransition(self, match, context, next_state): + # do something + result = [...] # a list + return context, next_state, result + # context, next_state may be altered + + Transition methods may raise an `EOFError` to cut processing short. + + d) You may wish to override the `State.bof()` and/or `State.eof()` implicit + transition methods, which handle the beginning- and end-of-file. + + e) In order to handle nested processing, you may wish to override the + attributes `State.nested_sm` and/or `State.nested_sm_kwargs`. + + If you are using `StateWS` as a base class, in order to handle nested + indented blocks, you may wish to: + + - override the attributes `StateWS.indent_sm`, + `StateWS.indent_sm_kwargs`, `StateWS.known_indent_sm`, and/or + `StateWS.known_indent_sm_kwargs`; + - override the `StateWS.blank()` method; and/or + - override or extend the `StateWS.indent()`, `StateWS.known_indent()`, + and/or `StateWS.firstknown_indent()` methods. + +3. Create a state machine object:: + + sm = StateMachine(state_classes=[MyState, ...], + initial_state='MyState') + +4. Obtain the input text, which needs to be converted into a tab-free list of + one-line strings. For example, to read text from a file called + 'inputfile':: + + input_string = open('inputfile').read() + input_lines = statemachine.string2lines(input_string) + +5. Run the state machine on the input text and collect the results, a list:: + + results = sm.run(input_lines) + +6. Remove any lingering circular references:: + + sm.unlink() +""" +from __future__ import print_function + +__docformat__ = 'restructuredtext' + +import sys +import re +import unicodedata +from docutils import utils +from docutils.utils.error_reporting import ErrorOutput + +if sys.version_info >= (3, 0): + unicode = str # noqa + + +class StateMachine(object): + + """ + A finite state machine for text filters using regular expressions. + + The input is provided in the form of a list of one-line strings (no + newlines). States are subclasses of the `State` class. Transitions consist + of regular expression patterns and transition methods, and are defined in + each state. + + The state machine is started with the `run()` method, which returns the + results of processing in a list. + """ + + def __init__(self, state_classes, initial_state, debug=False): + """ + Initialize a `StateMachine` object; add state objects. + + Parameters: + + - `state_classes`: a list of `State` (sub)classes. + - `initial_state`: a string, the class name of the initial state. + - `debug`: a boolean; produce verbose output if true (nonzero). + """ + + self.input_lines = None + """`StringList` of input lines (without newlines). + Filled by `self.run()`.""" + + self.input_offset = 0 + """Offset of `self.input_lines` from the beginning of the file.""" + + self.line = None + """Current input line.""" + + self.line_offset = -1 + """Current input line offset from beginning of `self.input_lines`.""" + + self.debug = debug + """Debugging mode on/off.""" + + self.initial_state = initial_state + """The name of the initial state (key to `self.states`).""" + + self.current_state = initial_state + """The name of the current state (key to `self.states`).""" + + self.states = {} + """Mapping of {state_name: State_object}.""" + + self.add_states(state_classes) + + self.observers = [] + """List of bound methods or functions to call whenever the current + line changes. Observers are called with one argument, ``self``. + Cleared at the end of `run()`.""" + + self._stderr = ErrorOutput() + """Wrapper around sys.stderr catching en-/decoding errors""" + + + def unlink(self): + """Remove circular references to objects no longer required.""" + for state in self.states.values(): + state.unlink() + self.states = None + + def run(self, input_lines, input_offset=0, context=None, + input_source=None, initial_state=None): + """ + Run the state machine on `input_lines`. Return results (a list). + + Reset `self.line_offset` and `self.current_state`. Run the + beginning-of-file transition. Input one line at a time and check for a + matching transition. If a match is found, call the transition method + and possibly change the state. Store the context returned by the + transition method to be passed on to the next transition matched. + Accumulate the results returned by the transition methods in a list. + Run the end-of-file transition. Finally, return the accumulated + results. + + Parameters: + + - `input_lines`: a list of strings without newlines, or `StringList`. + - `input_offset`: the line offset of `input_lines` from the beginning + of the file. + - `context`: application-specific storage. + - `input_source`: name or path of source of `input_lines`. + - `initial_state`: name of initial state. + """ + self.runtime_init() + if isinstance(input_lines, StringList): + self.input_lines = input_lines + else: + self.input_lines = StringList(input_lines, source=input_source) + self.input_offset = input_offset + self.line_offset = -1 + self.current_state = initial_state or self.initial_state + if self.debug: + print(( + u'\nStateMachine.run: input_lines (line_offset=%s):\n| %s' + % (self.line_offset, u'\n| '.join(self.input_lines))), file=self._stderr) + transitions = None + results = [] + state = self.get_state() + try: + if self.debug: + print('\nStateMachine.run: bof transition', file=self._stderr) + context, result = state.bof(context) + results.extend(result) + while True: + try: + try: + self.next_line() + if self.debug: + source, offset = self.input_lines.info( + self.line_offset) + print(( + u'\nStateMachine.run: line (source=%r, ' + u'offset=%r):\n| %s' + % (source, offset, self.line)), file=self._stderr) + context, next_state, result = self.check_line( + context, state, transitions) + except EOFError: + if self.debug: + print(( + '\nStateMachine.run: %s.eof transition' + % state.__class__.__name__), file=self._stderr) + result = state.eof(context) + results.extend(result) + break + else: + results.extend(result) + except TransitionCorrection as exception: + self.previous_line() # back up for another try + transitions = (exception.args[0],) + if self.debug: + print(( + '\nStateMachine.run: TransitionCorrection to ' + 'state "%s", transition %s.' + % (state.__class__.__name__, transitions[0])), file=self._stderr) + continue + except StateCorrection as exception: + self.previous_line() # back up for another try + next_state = exception.args[0] + if len(exception.args) == 1: + transitions = None + else: + transitions = (exception.args[1],) + if self.debug: + print(( + '\nStateMachine.run: StateCorrection to state ' + '"%s", transition %s.' + % (next_state, transitions[0])), file=self._stderr) + else: + transitions = None + state = self.get_state(next_state) + except: + if self.debug: + self.error() + raise + self.observers = [] + return results + + def get_state(self, next_state=None): + """ + Return current state object; set it first if `next_state` given. + + Parameter `next_state`: a string, the name of the next state. + + Exception: `UnknownStateError` raised if `next_state` unknown. + """ + if next_state: + if self.debug and next_state != self.current_state: + print(( + '\nStateMachine.get_state: Changing state from ' + '"%s" to "%s" (input line %s).' + % (self.current_state, next_state, + self.abs_line_number())), file=self._stderr) + self.current_state = next_state + try: + return self.states[self.current_state] + except KeyError: + raise UnknownStateError(self.current_state) + + def next_line(self, n=1): + """Load `self.line` with the `n`'th next line and return it.""" + try: + try: + self.line_offset += n + self.line = self.input_lines[self.line_offset] + except IndexError: + self.line = None + raise EOFError + return self.line + finally: + self.notify_observers() + + def is_next_line_blank(self): + """Return 1 if the next line is blank or non-existant.""" + try: + return not self.input_lines[self.line_offset + 1].strip() + except IndexError: + return 1 + + def at_eof(self): + """Return 1 if the input is at or past end-of-file.""" + return self.line_offset >= len(self.input_lines) - 1 + + def at_bof(self): + """Return 1 if the input is at or before beginning-of-file.""" + return self.line_offset <= 0 + + def previous_line(self, n=1): + """Load `self.line` with the `n`'th previous line and return it.""" + self.line_offset -= n + if self.line_offset < 0: + self.line = None + else: + self.line = self.input_lines[self.line_offset] + self.notify_observers() + return self.line + + def goto_line(self, line_offset): + """Jump to absolute line offset `line_offset`, load and return it.""" + try: + try: + self.line_offset = line_offset - self.input_offset + self.line = self.input_lines[self.line_offset] + except IndexError: + self.line = None + raise EOFError + return self.line + finally: + self.notify_observers() + + def get_source(self, line_offset): + """Return source of line at absolute line offset `line_offset`.""" + return self.input_lines.source(line_offset - self.input_offset) + + def abs_line_offset(self): + """Return line offset of current line, from beginning of file.""" + return self.line_offset + self.input_offset + + def abs_line_number(self): + """Return line number of current line (counting from 1).""" + return self.line_offset + self.input_offset + 1 + + def get_source_and_line(self, lineno=None): + """Return (source, line) tuple for current or given line number. + + Looks up the source and line number in the `self.input_lines` + StringList instance to count for included source files. + + If the optional argument `lineno` is given, convert it from an + absolute line number to the corresponding (source, line) pair. + """ + if lineno is None: + offset = self.line_offset + else: + offset = lineno - self.input_offset - 1 + try: + src, srcoffset = self.input_lines.info(offset) + srcline = srcoffset + 1 + except (TypeError): + # line is None if index is "Just past the end" + src, srcline = self.get_source_and_line(offset + self.input_offset) + return src, srcline + 1 + except (IndexError): # `offset` is off the list + src, srcline = None, None + # raise AssertionError('cannot find line %d in %s lines' % + # (offset, len(self.input_lines))) + # # list(self.input_lines.lines()))) + return (src, srcline) + + def insert_input(self, input_lines, source): + self.input_lines.insert(self.line_offset + 1, '', + source='internal padding after '+source, + offset=len(input_lines)) + self.input_lines.insert(self.line_offset + 1, '', + source='internal padding before '+source, + offset=-1) + self.input_lines.insert(self.line_offset + 2, + StringList(input_lines, source)) + + def get_text_block(self, flush_left=False): + """ + Return a contiguous block of text. + + If `flush_left` is true, raise `UnexpectedIndentationError` if an + indented line is encountered before the text block ends (with a blank + line). + """ + try: + block = self.input_lines.get_text_block(self.line_offset, + flush_left) + self.next_line(len(block) - 1) + return block + except UnexpectedIndentationError as err: + block = err.args[0] + self.next_line(len(block) - 1) # advance to last line of block + raise + + def check_line(self, context, state, transitions=None): + """ + Examine one line of input for a transition match & execute its method. + + Parameters: + + - `context`: application-dependent storage. + - `state`: a `State` object, the current state. + - `transitions`: an optional ordered list of transition names to try, + instead of ``state.transition_order``. + + Return the values returned by the transition method: + + - context: possibly modified from the parameter `context`; + - next state name (`State` subclass name); + - the result output of the transition, a list. + + When there is no match, ``state.no_match()`` is called and its return + value is returned. + """ + if transitions is None: + transitions = state.transition_order + state_correction = None + if self.debug: + print(( + '\nStateMachine.check_line: state="%s", transitions=%r.' + % (state.__class__.__name__, transitions)), file=self._stderr) + for name in transitions: + pattern, method, next_state = state.transitions[name] + match = pattern.match(self.line) + if match: + if self.debug: + print(( + '\nStateMachine.check_line: Matched transition ' + '"%s" in state "%s".' + % (name, state.__class__.__name__)), file=self._stderr) + return method(match, context, next_state) + else: + if self.debug: + print(( + '\nStateMachine.check_line: No match in state "%s".' + % state.__class__.__name__), file=self._stderr) + return state.no_match(context, transitions) + + def add_state(self, state_class): + """ + Initialize & add a `state_class` (`State` subclass) object. + + Exception: `DuplicateStateError` raised if `state_class` was already + added. + """ + statename = state_class.__name__ + if statename in self.states: + raise DuplicateStateError(statename) + self.states[statename] = state_class(self, self.debug) + + def add_states(self, state_classes): + """ + Add `state_classes` (a list of `State` subclasses). + """ + for state_class in state_classes: + self.add_state(state_class) + + def runtime_init(self): + """ + Initialize `self.states`. + """ + for state in self.states.values(): + state.runtime_init() + + def error(self): + """Report error details.""" + type, value, module, line, function = _exception_data() + print(u'%s: %s' % (type, value), file=self._stderr) + print('input line %s' % (self.abs_line_number()), file=self._stderr) + print((u'module %s, line %s, function %s' % + (module, line, function)), file=self._stderr) + + def attach_observer(self, observer): + """ + The `observer` parameter is a function or bound method which takes two + arguments, the source and offset of the current line. + """ + self.observers.append(observer) + + def detach_observer(self, observer): + self.observers.remove(observer) + + def notify_observers(self): + for observer in self.observers: + try: + info = self.input_lines.info(self.line_offset) + except IndexError: + info = (None, None) + observer(*info) + + +class State(object): + + """ + State superclass. Contains a list of transitions, and transition methods. + + Transition methods all have the same signature. They take 3 parameters: + + - An `re` match object. ``match.string`` contains the matched input line, + ``match.start()`` gives the start index of the match, and + ``match.end()`` gives the end index. + - A context object, whose meaning is application-defined (initial value + ``None``). It can be used to store any information required by the state + machine, and the retured context is passed on to the next transition + method unchanged. + - The name of the next state, a string, taken from the transitions list; + normally it is returned unchanged, but it may be altered by the + transition method if necessary. + + Transition methods all return a 3-tuple: + + - A context object, as (potentially) modified by the transition method. + - The next state name (a return value of ``None`` means no state change). + - The processing result, a list, which is accumulated by the state + machine. + + Transition methods may raise an `EOFError` to cut processing short. + + There are two implicit transitions, and corresponding transition methods + are defined: `bof()` handles the beginning-of-file, and `eof()` handles + the end-of-file. These methods have non-standard signatures and return + values. `bof()` returns the initial context and results, and may be used + to return a header string, or do any other processing needed. `eof()` + should handle any remaining context and wrap things up; it returns the + final processing result. + + Typical applications need only subclass `State` (or a subclass), set the + `patterns` and `initial_transitions` class attributes, and provide + corresponding transition methods. The default object initialization will + take care of constructing the list of transitions. + """ + + patterns = None + """ + {Name: pattern} mapping, used by `make_transition()`. Each pattern may + be a string or a compiled `re` pattern. Override in subclasses. + """ + + initial_transitions = None + """ + A list of transitions to initialize when a `State` is instantiated. + Each entry is either a transition name string, or a (transition name, next + state name) pair. See `make_transitions()`. Override in subclasses. + """ + + nested_sm = None + """ + The `StateMachine` class for handling nested processing. + + If left as ``None``, `nested_sm` defaults to the class of the state's + controlling state machine. Override it in subclasses to avoid the default. + """ + + nested_sm_kwargs = None + """ + Keyword arguments dictionary, passed to the `nested_sm` constructor. + + Two keys must have entries in the dictionary: + + - Key 'state_classes' must be set to a list of `State` classes. + - Key 'initial_state' must be set to the name of the initial state class. + + If `nested_sm_kwargs` is left as ``None``, 'state_classes' defaults to the + class of the current state, and 'initial_state' defaults to the name of + the class of the current state. Override in subclasses to avoid the + defaults. + """ + + def __init__(self, state_machine, debug=False): + """ + Initialize a `State` object; make & add initial transitions. + + Parameters: + + - `statemachine`: the controlling `StateMachine` object. + - `debug`: a boolean; produce verbose output if true. + """ + + self.transition_order = [] + """A list of transition names in search order.""" + + self.transitions = {} + """ + A mapping of transition names to 3-tuples containing + (compiled_pattern, transition_method, next_state_name). Initialized as + an instance attribute dynamically (instead of as a class attribute) + because it may make forward references to patterns and methods in this + or other classes. + """ + + self.add_initial_transitions() + + self.state_machine = state_machine + """A reference to the controlling `StateMachine` object.""" + + self.debug = debug + """Debugging mode on/off.""" + + if self.nested_sm is None: + self.nested_sm = self.state_machine.__class__ + if self.nested_sm_kwargs is None: + self.nested_sm_kwargs = {'state_classes': [self.__class__], + 'initial_state': self.__class__.__name__} + + def runtime_init(self): + """ + Initialize this `State` before running the state machine; called from + `self.state_machine.run()`. + """ + pass + + def unlink(self): + """Remove circular references to objects no longer required.""" + self.state_machine = None + + def add_initial_transitions(self): + """Make and add transitions listed in `self.initial_transitions`.""" + if self.initial_transitions: + names, transitions = self.make_transitions( + self.initial_transitions) + self.add_transitions(names, transitions) + + def add_transitions(self, names, transitions): + """ + Add a list of transitions to the start of the transition list. + + Parameters: + + - `names`: a list of transition names. + - `transitions`: a mapping of names to transition tuples. + + Exceptions: `DuplicateTransitionError`, `UnknownTransitionError`. + """ + for name in names: + if name in self.transitions: + raise DuplicateTransitionError(name) + if name not in transitions: + raise UnknownTransitionError(name) + self.transition_order[:0] = names + self.transitions.update(transitions) + + def add_transition(self, name, transition): + """ + Add a transition to the start of the transition list. + + Parameter `transition`: a ready-made transition 3-tuple. + + Exception: `DuplicateTransitionError`. + """ + if name in self.transitions: + raise DuplicateTransitionError(name) + self.transition_order[:0] = [name] + self.transitions[name] = transition + + def remove_transition(self, name): + """ + Remove a transition by `name`. + + Exception: `UnknownTransitionError`. + """ + try: + del self.transitions[name] + self.transition_order.remove(name) + except: + raise UnknownTransitionError(name) + + def make_transition(self, name, next_state=None): + """ + Make & return a transition tuple based on `name`. + + This is a convenience function to simplify transition creation. + + Parameters: + + - `name`: a string, the name of the transition pattern & method. This + `State` object must have a method called '`name`', and a dictionary + `self.patterns` containing a key '`name`'. + - `next_state`: a string, the name of the next `State` object for this + transition. A value of ``None`` (or absent) implies no state change + (i.e., continue with the same state). + + Exceptions: `TransitionPatternNotFound`, `TransitionMethodNotFound`. + """ + if next_state is None: + next_state = self.__class__.__name__ + try: + pattern = self.patterns[name] + if not hasattr(pattern, 'match'): + pattern = self.patterns[name] = re.compile(pattern) + except KeyError: + raise TransitionPatternNotFound( + '%s.patterns[%r]' % (self.__class__.__name__, name)) + try: + method = getattr(self, name) + except AttributeError: + raise TransitionMethodNotFound( + '%s.%s' % (self.__class__.__name__, name)) + return (pattern, method, next_state) + + def make_transitions(self, name_list): + """ + Return a list of transition names and a transition mapping. + + Parameter `name_list`: a list, where each entry is either a transition + name string, or a 1- or 2-tuple (transition name, optional next state + name). + """ + stringtype = type('') + names = [] + transitions = {} + for namestate in name_list: + if isinstance(namestate, stringtype): + transitions[namestate] = self.make_transition(namestate) + names.append(namestate) + else: + transitions[namestate[0]] = self.make_transition(*namestate) + names.append(namestate[0]) + return names, transitions + + def no_match(self, context, transitions): + """ + Called when there is no match from `StateMachine.check_line()`. + + Return the same values returned by transition methods: + + - context: unchanged; + - next state name: ``None``; + - empty result list. + + Override in subclasses to catch this event. + """ + return context, None, [] + + def bof(self, context): + """ + Handle beginning-of-file. Return unchanged `context`, empty result. + + Override in subclasses. + + Parameter `context`: application-defined storage. + """ + return context, [] + + def eof(self, context): + """ + Handle end-of-file. Return empty result. + + Override in subclasses. + + Parameter `context`: application-defined storage. + """ + return [] + + def nop(self, match, context, next_state): + """ + A "do nothing" transition method. + + Return unchanged `context` & `next_state`, empty result. Useful for + simple state changes (actionless transitions). + """ + return context, next_state, [] + + +class StateMachineWS(StateMachine): + + """ + `StateMachine` subclass specialized for whitespace recognition. + + There are three methods provided for extracting indented text blocks: + + - `get_indented()`: use when the indent is unknown. + - `get_known_indented()`: use when the indent is known for all lines. + - `get_first_known_indented()`: use when only the first line's indent is + known. + """ + + def get_indented(self, until_blank=False, strip_indent=True): + """ + Return a block of indented lines of text, and info. + + Extract an indented block where the indent is unknown for all lines. + + :Parameters: + - `until_blank`: Stop collecting at the first blank line if true. + - `strip_indent`: Strip common leading indent if true (default). + + :Return: + - the indented block (a list of lines of text), + - its indent, + - its first line offset from BOF, and + - whether or not it finished with a blank line. + """ + offset = self.abs_line_offset() + indented, indent, blank_finish = self.input_lines.get_indented( + self.line_offset, until_blank, strip_indent) + if indented: + self.next_line(len(indented) - 1) # advance to last indented line + while indented and not indented[0].strip(): + indented.trim_start() + offset += 1 + return indented, indent, offset, blank_finish + + def get_known_indented(self, indent, until_blank=False, strip_indent=True): + """ + Return an indented block and info. + + Extract an indented block where the indent is known for all lines. + Starting with the current line, extract the entire text block with at + least `indent` indentation (which must be whitespace, except for the + first line). + + :Parameters: + - `indent`: The number of indent columns/characters. + - `until_blank`: Stop collecting at the first blank line if true. + - `strip_indent`: Strip `indent` characters of indentation if true + (default). + + :Return: + - the indented block, + - its first line offset from BOF, and + - whether or not it finished with a blank line. + """ + offset = self.abs_line_offset() + indented, indent, blank_finish = self.input_lines.get_indented( + self.line_offset, until_blank, strip_indent, + block_indent=indent) + self.next_line(len(indented) - 1) # advance to last indented line + while indented and not indented[0].strip(): + indented.trim_start() + offset += 1 + return indented, offset, blank_finish + + def get_first_known_indented(self, indent, until_blank=False, + strip_indent=True, strip_top=True): + """ + Return an indented block and info. + + Extract an indented block where the indent is known for the first line + and unknown for all other lines. + + :Parameters: + - `indent`: The first line's indent (# of columns/characters). + - `until_blank`: Stop collecting at the first blank line if true + (1). + - `strip_indent`: Strip `indent` characters of indentation if true + (1, default). + - `strip_top`: Strip blank lines from the beginning of the block. + + :Return: + - the indented block, + - its indent, + - its first line offset from BOF, and + - whether or not it finished with a blank line. + """ + offset = self.abs_line_offset() + indented, indent, blank_finish = self.input_lines.get_indented( + self.line_offset, until_blank, strip_indent, + first_indent=indent) + self.next_line(len(indented) - 1) # advance to last indented line + if strip_top: + while indented and not indented[0].strip(): + indented.trim_start() + offset += 1 + return indented, indent, offset, blank_finish + + +class StateWS(State): + + """ + State superclass specialized for whitespace (blank lines & indents). + + Use this class with `StateMachineWS`. The transitions 'blank' (for blank + lines) and 'indent' (for indented text blocks) are added automatically, + before any other transitions. The transition method `blank()` handles + blank lines and `indent()` handles nested indented blocks. Indented + blocks trigger a new state machine to be created by `indent()` and run. + The class of the state machine to be created is in `indent_sm`, and the + constructor keyword arguments are in the dictionary `indent_sm_kwargs`. + + The methods `known_indent()` and `firstknown_indent()` are provided for + indented blocks where the indent (all lines' and first line's only, + respectively) is known to the transition method, along with the attributes + `known_indent_sm` and `known_indent_sm_kwargs`. Neither transition method + is triggered automatically. + """ + + indent_sm = None + """ + The `StateMachine` class handling indented text blocks. + + If left as ``None``, `indent_sm` defaults to the value of + `State.nested_sm`. Override it in subclasses to avoid the default. + """ + + indent_sm_kwargs = None + """ + Keyword arguments dictionary, passed to the `indent_sm` constructor. + + If left as ``None``, `indent_sm_kwargs` defaults to the value of + `State.nested_sm_kwargs`. Override it in subclasses to avoid the default. + """ + + known_indent_sm = None + """ + The `StateMachine` class handling known-indented text blocks. + + If left as ``None``, `known_indent_sm` defaults to the value of + `indent_sm`. Override it in subclasses to avoid the default. + """ + + known_indent_sm_kwargs = None + """ + Keyword arguments dictionary, passed to the `known_indent_sm` constructor. + + If left as ``None``, `known_indent_sm_kwargs` defaults to the value of + `indent_sm_kwargs`. Override it in subclasses to avoid the default. + """ + + ws_patterns = {'blank': re.compile(' *$'), + 'indent': re.compile(' +')} + """Patterns for default whitespace transitions. May be overridden in + subclasses.""" + + ws_initial_transitions = ('blank', 'indent') + """Default initial whitespace transitions, added before those listed in + `State.initial_transitions`. May be overridden in subclasses.""" + + def __init__(self, state_machine, debug=False): + """ + Initialize a `StateSM` object; extends `State.__init__()`. + + Check for indent state machine attributes, set defaults if not set. + """ + State.__init__(self, state_machine, debug) + if self.indent_sm is None: + self.indent_sm = self.nested_sm + if self.indent_sm_kwargs is None: + self.indent_sm_kwargs = self.nested_sm_kwargs + if self.known_indent_sm is None: + self.known_indent_sm = self.indent_sm + if self.known_indent_sm_kwargs is None: + self.known_indent_sm_kwargs = self.indent_sm_kwargs + + def add_initial_transitions(self): + """ + Add whitespace-specific transitions before those defined in subclass. + + Extends `State.add_initial_transitions()`. + """ + State.add_initial_transitions(self) + if self.patterns is None: + self.patterns = {} + self.patterns.update(self.ws_patterns) + names, transitions = self.make_transitions( + self.ws_initial_transitions) + self.add_transitions(names, transitions) + + def blank(self, match, context, next_state): + """Handle blank lines. Does nothing. Override in subclasses.""" + return self.nop(match, context, next_state) + + def indent(self, match, context, next_state): + """ + Handle an indented text block. Extend or override in subclasses. + + Recursively run the registered state machine for indented blocks + (`self.indent_sm`). + """ + indented, indent, line_offset, blank_finish = \ + self.state_machine.get_indented() + sm = self.indent_sm(debug=self.debug, **self.indent_sm_kwargs) + results = sm.run(indented, input_offset=line_offset) + return context, next_state, results + + def known_indent(self, match, context, next_state): + """ + Handle a known-indent text block. Extend or override in subclasses. + + Recursively run the registered state machine for known-indent indented + blocks (`self.known_indent_sm`). The indent is the length of the + match, ``match.end()``. + """ + indented, line_offset, blank_finish = \ + self.state_machine.get_known_indented(match.end()) + sm = self.known_indent_sm(debug=self.debug, + **self.known_indent_sm_kwargs) + results = sm.run(indented, input_offset=line_offset) + return context, next_state, results + + def first_known_indent(self, match, context, next_state): + """ + Handle an indented text block (first line's indent known). + + Extend or override in subclasses. + + Recursively run the registered state machine for known-indent indented + blocks (`self.known_indent_sm`). The indent is the length of the + match, ``match.end()``. + """ + indented, line_offset, blank_finish = \ + self.state_machine.get_first_known_indented(match.end()) + sm = self.known_indent_sm(debug=self.debug, + **self.known_indent_sm_kwargs) + results = sm.run(indented, input_offset=line_offset) + return context, next_state, results + + +class _SearchOverride(object): + + """ + Mix-in class to override `StateMachine` regular expression behavior. + + Changes regular expression matching, from the default `re.match()` + (succeeds only if the pattern matches at the start of `self.line`) to + `re.search()` (succeeds if the pattern matches anywhere in `self.line`). + When subclassing a `StateMachine`, list this class **first** in the + inheritance list of the class definition. + """ + + def match(self, pattern): + """ + Return the result of a regular expression search. + + Overrides `StateMachine.match()`. + + Parameter `pattern`: `re` compiled regular expression. + """ + return pattern.search(self.line) + + +class SearchStateMachine(_SearchOverride, StateMachine): + """`StateMachine` which uses `re.search()` instead of `re.match()`.""" + pass + + +class SearchStateMachineWS(_SearchOverride, StateMachineWS): + """`StateMachineWS` which uses `re.search()` instead of `re.match()`.""" + pass + + +class ViewList(object): + + """ + List with extended functionality: slices of ViewList objects are child + lists, linked to their parents. Changes made to a child list also affect + the parent list. A child list is effectively a "view" (in the SQL sense) + of the parent list. Changes to parent lists, however, do *not* affect + active child lists. If a parent list is changed, any active child lists + should be recreated. + + The start and end of the slice can be trimmed using the `trim_start()` and + `trim_end()` methods, without affecting the parent list. The link between + child and parent lists can be broken by calling `disconnect()` on the + child list. + + Also, ViewList objects keep track of the source & offset of each item. + This information is accessible via the `source()`, `offset()`, and + `info()` methods. + """ + + def __init__(self, initlist=None, source=None, items=None, + parent=None, parent_offset=None): + self.data = [] + """The actual list of data, flattened from various sources.""" + + self.items = [] + """A list of (source, offset) pairs, same length as `self.data`: the + source of each line and the offset of each line from the beginning of + its source.""" + + self.parent = parent + """The parent list.""" + + self.parent_offset = parent_offset + """Offset of this list from the beginning of the parent list.""" + + if isinstance(initlist, ViewList): + self.data = initlist.data[:] + self.items = initlist.items[:] + elif initlist is not None: + self.data = list(initlist) + if items: + self.items = items + else: + self.items = [(source, i) for i in range(len(initlist))] + assert len(self.data) == len(self.items), 'data mismatch' + + def __str__(self): + return str(self.data) + + def __repr__(self): + return '%s(%s, items=%s)' % (self.__class__.__name__, + self.data, self.items) + + def __lt__(self, other): return self.data < self.__cast(other) + def __le__(self, other): return self.data <= self.__cast(other) + def __eq__(self, other): return self.data == self.__cast(other) + def __ne__(self, other): return self.data != self.__cast(other) + def __gt__(self, other): return self.data > self.__cast(other) + def __ge__(self, other): return self.data >= self.__cast(other) + + def __cmp__(self, other): + # from https://docs.python.org/3.0/whatsnew/3.0.html + mine = self.data + yours = self.__cast(other) + return (mine > yours) - (yours < mine) + + def __cast(self, other): + if isinstance(other, ViewList): + return other.data + else: + return other + + def __contains__(self, item): return item in self.data + def __len__(self): return len(self.data) + + # The __getitem__()/__setitem__() methods check whether the index + # is a slice first, since indexing a native list with a slice object + # just works. + + def __getitem__(self, i): + if isinstance(i, slice): + assert i.step in (None, 1), 'cannot handle slice with stride' + return self.__class__(self.data[i.start:i.stop], + items=self.items[i.start:i.stop], + parent=self, parent_offset=i.start or 0) + else: + return self.data[i] + + def __setitem__(self, i, item): + if isinstance(i, slice): + assert i.step in (None, 1), 'cannot handle slice with stride' + if not isinstance(item, ViewList): + raise TypeError('assigning non-ViewList to ViewList slice') + self.data[i.start:i.stop] = item.data + self.items[i.start:i.stop] = item.items + assert len(self.data) == len(self.items), 'data mismatch' + if self.parent: + self.parent[(i.start or 0) + self.parent_offset + : (i.stop or len(self)) + self.parent_offset] = item + else: + self.data[i] = item + if self.parent: + self.parent[i + self.parent_offset] = item + + def __delitem__(self, i): + try: + del self.data[i] + del self.items[i] + if self.parent: + del self.parent[i + self.parent_offset] + except TypeError: + assert i.step is None, 'cannot handle slice with stride' + del self.data[i.start:i.stop] + del self.items[i.start:i.stop] + if self.parent: + del self.parent[(i.start or 0) + self.parent_offset + : (i.stop or len(self)) + self.parent_offset] + + def __add__(self, other): + if isinstance(other, ViewList): + return self.__class__(self.data + other.data, + items=(self.items + other.items)) + else: + raise TypeError('adding non-ViewList to a ViewList') + + def __radd__(self, other): + if isinstance(other, ViewList): + return self.__class__(other.data + self.data, + items=(other.items + self.items)) + else: + raise TypeError('adding ViewList to a non-ViewList') + + def __iadd__(self, other): + if isinstance(other, ViewList): + self.data += other.data + else: + raise TypeError('argument to += must be a ViewList') + return self + + def __mul__(self, n): + return self.__class__(self.data * n, items=(self.items * n)) + + __rmul__ = __mul__ + + def __imul__(self, n): + self.data *= n + self.items *= n + return self + + def extend(self, other): + if not isinstance(other, ViewList): + raise TypeError('extending a ViewList with a non-ViewList') + if self.parent: + self.parent.insert(len(self.data) + self.parent_offset, other) + self.data.extend(other.data) + self.items.extend(other.items) + + def append(self, item, source=None, offset=0): + if source is None: + self.extend(item) + else: + if self.parent: + self.parent.insert(len(self.data) + self.parent_offset, item, + source, offset) + self.data.append(item) + self.items.append((source, offset)) + + def insert(self, i, item, source=None, offset=0): + if source is None: + if not isinstance(item, ViewList): + raise TypeError('inserting non-ViewList with no source given') + self.data[i:i] = item.data + self.items[i:i] = item.items + if self.parent: + index = (len(self.data) + i) % len(self.data) + self.parent.insert(index + self.parent_offset, item) + else: + self.data.insert(i, item) + self.items.insert(i, (source, offset)) + if self.parent: + index = (len(self.data) + i) % len(self.data) + self.parent.insert(index + self.parent_offset, item, + source, offset) + + def pop(self, i=-1): + if self.parent: + index = (len(self.data) + i) % len(self.data) + self.parent.pop(index + self.parent_offset) + self.items.pop(i) + return self.data.pop(i) + + def trim_start(self, n=1): + """ + Remove items from the start of the list, without touching the parent. + """ + if n > len(self.data): + raise IndexError("Size of trim too large; can't trim %s items " + "from a list of size %s." % (n, len(self.data))) + elif n < 0: + raise IndexError('Trim size must be >= 0.') + del self.data[:n] + del self.items[:n] + if self.parent: + self.parent_offset += n + + def trim_end(self, n=1): + """ + Remove items from the end of the list, without touching the parent. + """ + if n > len(self.data): + raise IndexError("Size of trim too large; can't trim %s items " + "from a list of size %s." % (n, len(self.data))) + elif n < 0: + raise IndexError('Trim size must be >= 0.') + del self.data[-n:] + del self.items[-n:] + + def remove(self, item): + index = self.index(item) + del self[index] + + def count(self, item): return self.data.count(item) + def index(self, item): return self.data.index(item) + + def reverse(self): + self.data.reverse() + self.items.reverse() + self.parent = None + + def sort(self, *args): + tmp = sorted(zip(self.data, self.items), *args) + self.data = [entry[0] for entry in tmp] + self.items = [entry[1] for entry in tmp] + self.parent = None + + def info(self, i): + """Return source & offset for index `i`.""" + try: + return self.items[i] + except IndexError: + if i == len(self.data): # Just past the end + return self.items[i - 1][0], None + else: + raise + + def source(self, i): + """Return source for index `i`.""" + return self.info(i)[0] + + def offset(self, i): + """Return offset for index `i`.""" + return self.info(i)[1] + + def disconnect(self): + """Break link between this list and parent list.""" + self.parent = None + + def xitems(self): + """Return iterator yielding (source, offset, value) tuples.""" + for (value, (source, offset)) in zip(self.data, self.items): + yield (source, offset, value) + + def pprint(self): + """Print the list in `grep` format (`source:offset:value` lines)""" + for line in self.xitems(): + print("%s:%d:%s" % line) + + +class StringList(ViewList): + + """A `ViewList` with string-specific methods.""" + + def trim_left(self, length, start=0, end=sys.maxsize): + """ + Trim `length` characters off the beginning of each item, in-place, + from index `start` to `end`. No whitespace-checking is done on the + trimmed text. Does not affect slice parent. + """ + self.data[start:end] = [line[length:] + for line in self.data[start:end]] + + def get_text_block(self, start, flush_left=False): + """ + Return a contiguous block of text. + + If `flush_left` is true, raise `UnexpectedIndentationError` if an + indented line is encountered before the text block ends (with a blank + line). + """ + end = start + last = len(self.data) + while end < last: + line = self.data[end] + if not line.strip(): + break + if flush_left and (line[0] == ' '): + source, offset = self.info(end) + raise UnexpectedIndentationError(self[start:end], source, + offset + 1) + end += 1 + return self[start:end] + + def get_indented(self, start=0, until_blank=False, strip_indent=True, + block_indent=None, first_indent=None): + """ + Extract and return a StringList of indented lines of text. + + Collect all lines with indentation, determine the minimum indentation, + remove the minimum indentation from all indented lines (unless + `strip_indent` is false), and return them. All lines up to but not + including the first unindented line will be returned. + + :Parameters: + - `start`: The index of the first line to examine. + - `until_blank`: Stop collecting at the first blank line if true. + - `strip_indent`: Strip common leading indent if true (default). + - `block_indent`: The indent of the entire block, if known. + - `first_indent`: The indent of the first line, if known. + + :Return: + - a StringList of indented lines with mininum indent removed; + - the amount of the indent; + - a boolean: did the indented block finish with a blank line or EOF? + """ + indent = block_indent # start with None if unknown + end = start + if block_indent is not None and first_indent is None: + first_indent = block_indent + if first_indent is not None: + end += 1 + last = len(self.data) + while end < last: + line = self.data[end] + if line and (line[0] != ' ' + or (block_indent is not None + and line[:block_indent].strip())): + # Line not indented or insufficiently indented. + # Block finished properly iff the last indented line blank: + blank_finish = ((end > start) + and not self.data[end - 1].strip()) + break + stripped = line.lstrip() + if not stripped: # blank line + if until_blank: + blank_finish = 1 + break + elif block_indent is None: + line_indent = len(line) - len(stripped) + if indent is None: + indent = line_indent + else: + indent = min(indent, line_indent) + end += 1 + else: + blank_finish = 1 # block ends at end of lines + block = self[start:end] + if first_indent is not None and block: + block.data[0] = block.data[0][first_indent:] + if indent and strip_indent: + block.trim_left(indent, start=(first_indent is not None)) + return block, indent or 0, blank_finish + + def get_2D_block(self, top, left, bottom, right, strip_indent=True): + block = self[top:bottom] + indent = right + for i in range(len(block.data)): + # get slice from line, care for combining characters + ci = utils.column_indices(block.data[i]) + try: + left = ci[left] + except IndexError: + left += len(block.data[i]) - len(ci) + try: + right = ci[right] + except IndexError: + right += len(block.data[i]) - len(ci) + block.data[i] = line = block.data[i][left:right].rstrip() + if line: + indent = min(indent, len(line) - len(line.lstrip())) + if strip_indent and 0 < indent < right: + block.data = [line[indent:] for line in block.data] + return block + + def pad_double_width(self, pad_char): + """ + Pad all double-width characters in self by appending `pad_char` to each. + For East Asian language support. + """ + east_asian_width = unicodedata.east_asian_width + for i in range(len(self.data)): + line = self.data[i] + if isinstance(line, unicode): + new = [] + for char in line: + new.append(char) + if east_asian_width(char) in 'WF': # 'W'ide & 'F'ull-width + new.append(pad_char) + self.data[i] = ''.join(new) + + def replace(self, old, new): + """Replace all occurrences of substring `old` with `new`.""" + for i in range(len(self.data)): + self.data[i] = self.data[i].replace(old, new) + + +class StateMachineError(Exception): pass +class UnknownStateError(StateMachineError): pass +class DuplicateStateError(StateMachineError): pass +class UnknownTransitionError(StateMachineError): pass +class DuplicateTransitionError(StateMachineError): pass +class TransitionPatternNotFound(StateMachineError): pass +class TransitionMethodNotFound(StateMachineError): pass +class UnexpectedIndentationError(StateMachineError): pass + + +class TransitionCorrection(Exception): + + """ + Raise from within a transition method to switch to another transition. + + Raise with one argument, the new transition name. + """ + + +class StateCorrection(Exception): + + """ + Raise from within a transition method to switch to another state. + + Raise with one or two arguments: new state name, and an optional new + transition name. + """ + +def string2lines(astring, tab_width=8, convert_whitespace=False, + whitespace=re.compile('[\v\f]')): + """ + Return a list of one-line strings with tabs expanded, no newlines, and + trailing whitespace stripped. + + Each tab is expanded with between 1 and `tab_width` spaces, so that the + next character's index becomes a multiple of `tab_width` (8 by default). + + Parameters: + + - `astring`: a multi-line string. + - `tab_width`: the number of columns between tab stops. + - `convert_whitespace`: convert form feeds and vertical tabs to spaces? + """ + if convert_whitespace: + astring = whitespace.sub(' ', astring) + # TODO: add a test for too long lines (max_line_lenght = 1000, say)? + # See bug #381. + return [s.expandtabs(tab_width).rstrip() for s in astring.splitlines()] + +def _exception_data(): + """ + Return exception information: + + - the exception's class name; + - the exception object; + - the name of the file containing the offending code; + - the line number of the offending code; + - the function name of the offending code. + """ + type, value, traceback = sys.exc_info() + while traceback.tb_next: + traceback = traceback.tb_next + code = traceback.tb_frame.f_code + return (type.__name__, value, code.co_filename, traceback.tb_lineno, + code.co_name) diff --git a/lib/python3.8/site-packages/docutils/transforms/__init__.py b/lib/python3.8/site-packages/docutils/transforms/__init__.py new file mode 100644 index 0000000..3be3349 --- /dev/null +++ b/lib/python3.8/site-packages/docutils/transforms/__init__.py @@ -0,0 +1,172 @@ +# $Id: __init__.py 8358 2019-08-26 16:45:09Z milde $ +# Authors: David Goodger ; Ueli Schlaepfer +# Copyright: This module has been placed in the public domain. + +""" +This package contains modules for standard tree transforms available +to Docutils components. Tree transforms serve a variety of purposes: + +- To tie up certain syntax-specific "loose ends" that remain after the + initial parsing of the input plaintext. These transforms are used to + supplement a limited syntax. + +- To automate the internal linking of the document tree (hyperlink + references, footnote references, etc.). + +- To extract useful information from the document tree. These + transforms may be used to construct (for example) indexes and tables + of contents. + +Each transform is an optional step that a Docutils component may +choose to perform on the parsed document. +""" + +__docformat__ = 'reStructuredText' + + +from docutils import languages, ApplicationError, TransformSpec + + +class TransformError(ApplicationError): pass + + +class Transform(object): + + """ + Docutils transform component abstract base class. + """ + + default_priority = None + """Numerical priority of this transform, 0 through 999 (override).""" + + def __init__(self, document, startnode=None): + """ + Initial setup for in-place document transforms. + """ + + self.document = document + """The document tree to transform.""" + + self.startnode = startnode + """Node from which to begin the transform. For many transforms which + apply to the document as a whole, `startnode` is not set (i.e. its + value is `None`).""" + + self.language = languages.get_language( + document.settings.language_code, document.reporter) + """Language module local to this document.""" + + def apply(self, **kwargs): + """Override to apply the transform to the document tree.""" + raise NotImplementedError('subclass must override this method') + + +class Transformer(TransformSpec): + + """ + Stores transforms (`Transform` classes) and applies them to document + trees. Also keeps track of components by component type name. + """ + + def __init__(self, document): + self.transforms = [] + """List of transforms to apply. Each item is a 4-tuple: + ``(priority string, transform class, pending node or None, kwargs)``. + """ + + self.unknown_reference_resolvers = [] + """List of hook functions which assist in resolving references""" + + self.document = document + """The `nodes.document` object this Transformer is attached to.""" + + self.applied = [] + """Transforms already applied, in order.""" + + self.sorted = 0 + """Boolean: is `self.tranforms` sorted?""" + + self.components = {} + """Mapping of component type name to component object. Set by + `self.populate_from_components()`.""" + + self.serialno = 0 + """Internal serial number to keep track of the add order of + transforms.""" + + def add_transform(self, transform_class, priority=None, **kwargs): + """ + Store a single transform. Use `priority` to override the default. + `kwargs` is a dictionary whose contents are passed as keyword + arguments to the `apply` method of the transform. This can be used to + pass application-specific data to the transform instance. + """ + if priority is None: + priority = transform_class.default_priority + priority_string = self.get_priority_string(priority) + self.transforms.append( + (priority_string, transform_class, None, kwargs)) + self.sorted = 0 + + def add_transforms(self, transform_list): + """Store multiple transforms, with default priorities.""" + for transform_class in transform_list: + priority_string = self.get_priority_string( + transform_class.default_priority) + self.transforms.append( + (priority_string, transform_class, None, {})) + self.sorted = 0 + + def add_pending(self, pending, priority=None): + """Store a transform with an associated `pending` node.""" + transform_class = pending.transform + if priority is None: + priority = transform_class.default_priority + priority_string = self.get_priority_string(priority) + self.transforms.append( + (priority_string, transform_class, pending, {})) + self.sorted = 0 + + def get_priority_string(self, priority): + """ + Return a string, `priority` combined with `self.serialno`. + + This ensures FIFO order on transforms with identical priority. + """ + self.serialno += 1 + return '%03d-%03d' % (priority, self.serialno) + + def populate_from_components(self, components): + """ + Store each component's default transforms, with default priorities. + Also, store components by type name in a mapping for later lookup. + """ + for component in components: + if component is None: + continue + self.add_transforms(component.get_transforms()) + self.components[component.component_type] = component + self.sorted = 0 + # Set up all of the reference resolvers for this transformer. Each + # component of this transformer is able to register its own helper + # functions to help resolve references. + unknown_reference_resolvers = [] + for i in components: + unknown_reference_resolvers.extend(i.unknown_reference_resolvers) + decorated_list = sorted((f.priority, f) for f in unknown_reference_resolvers) + self.unknown_reference_resolvers.extend(f[1] for f in decorated_list) + + def apply_transforms(self): + """Apply all of the stored transforms, in priority order.""" + self.document.reporter.attach_observer( + self.document.note_transform_message) + while self.transforms: + if not self.sorted: + # Unsorted initially, and whenever a transform is added. + self.transforms.sort() + self.transforms.reverse() + self.sorted = 1 + priority, transform_class, pending, kwargs = self.transforms.pop() + transform = transform_class(self.document, startnode=pending) + transform.apply(**kwargs) + self.applied.append((priority, transform_class, pending, kwargs)) diff --git a/lib/python3.8/site-packages/docutils/transforms/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/docutils/transforms/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c6df1198f3c3ae1215ea171238b0d8129bf3b0c GIT binary patch literal 5358 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 Ak^lez literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/transforms/__pycache__/frontmatter.cpython-38.pyc b/lib/python3.8/site-packages/docutils/transforms/__pycache__/frontmatter.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e258154c8b836d9974a430413b5b09b5f17edbc9 GIT binary patch literal 16529 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 F{{omu1=G?I4}*>Rn?bqhP zXTN7Mkl`0hhAKGqk_P$>8KED!euREgw$N|6ep6oflyx^|KWcrFnW4(_v{2>L#8#(; z*)R3j^jb+rt52<-4((Jc`9M9f&*2Q~@+v4wsZ3W?%?C^Us=aFdPU}(+Np<}b=)8|& zuAx#4yJ3mIt~@CcUwYF2f+c|r;8j>fJ87Q(HXRB=shtshtY%h)<9H_Nn6v9>ct-eBoJK(1q%S~{#E9;n#Z5?6>5b5mCS?Cr&=wK^M2t)eySac8O=jMUJ^ z2c@ytnVYusec@!!>1F@+7#rf2Rv%q7WNZh;{0!Bcjo1mF^AVT)Dx33D&QXuVnK$Q8 z(UuICE_SPExj@&in#QKu(tfJO;_#{vJI8TVp;qJakwW(B3ay~@G zc*xs)*4|k}WX}!nK0}c9`voqd->+Kz{3frmYVYK!G5402J)67B`vk}6u6Aok!&__7 zU?ysq?ISmqL9?|u<*k@*rB1$OPG#e&%<2^+jy~C_O7pMGGe84{Y_yp~_f0dmC zHkb!C95qgb*cEQ& zqm9v~^xdrBD!amLc-BVmEhj zW}cy!=KVol4iA&2P9K|cs$rgTB-wy|o(@%?QnB067s%!YRker1gDjW&C$vaofsUF$ z;nk?8h~GvrJyeu*A@{j2uJMR(@YZ)i2z~{v(DNaQxZn|FZSH>)2D8gA2lpaHbq9vl zmLY7=F2k;%bsc4yVF5CXWUtRK^7!?fMZBAYvH=*2stb+>GlFiDK3&pRooPgt^$0S} zB_4<)F85Eg+sx()1X9}@sE1imQ1$`N z7si)ay1Zj3W7V{tUzCn4&MmLeoO+UCeHdTCB%I64?b|gIf|cVt3(xO57fC{2uU98} z-GkP-`E$kBPpyfC*!|6yd&8y3!|bm23LH`5&I6C82i~v3WoHpo;odFam z-H+Oi!1!)A(4?D0*zF^w@m?W2RqK57Rfkg1_Rl3<;WDQ32~^jD)x|00#2$(vUl_l{ zXBQuwM?f9sLt10`5p_^;et(YG13bZR^7BMUM!+Wdp)el2i#xss6WLr?#Y?gE4XLV&JM zx^6`Lh3h@)V+6HihY=+AS3WeHztL9&{&Z#p@r#p_;vH7|;cR0zPSmFpJ^I>db?P`E zyO;-Gq0h;07Z=T4O+=vIMfIF6Yxe687B5!H(MA5medwA`H zYq&d0?%6n3sj==&I4I@uicQ8-NR6U*BA#{UHq3A0RE~hv;NvxEj8~Og8ZVskv68*n zjg^B-uLw!pgZCw$G(F|J7ah_&h}S=*ow}$G94;l1nGRgbrAF0QY`1FPGxVMZ=DB|h z`Z`T?yg(%2s73z*ttteYK~cvfCayx3Iga@y35ZwRw4^~42i$u#hq};^DDICG1A`EM zbif_q3*mLX6@K`Q2-WOJiZ3Ex zlXSP+a#oT}_r#>XY^m+{6UXHAwyoL!Z32Dj_S}uTe|Fl#d`+0*-j$B}oX!8|LKWSq W-?n!NSPU_{k2Bfe9j|k_bNze#?8jFC literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/transforms/__pycache__/parts.cpython-38.pyc b/lib/python3.8/site-packages/docutils/transforms/__pycache__/parts.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ca374fff48e202e345b215238895707d014c60c GIT binary patch literal 6015 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 Ly=V4b>b?74L6i~x literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/docutils/transforms/__pycache__/peps.cpython-38.pyc b/lib/python3.8/site-packages/docutils/transforms/__pycache__/peps.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d33a1e6ba2a37153f8f867815b5e4f027e4e7226 GIT binary patch literal 8982 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

    \n' + self.in_document_title = len(self.body) + else: + assert isinstance(node.parent, nodes.section) + h_level = self.section_level + self.initial_header_level - 1 + atts = {} + if (len(node.parent) >= 2 and + isinstance(node.parent[1], nodes.subtitle)): + atts['CLASS'] = 'with-subtitle' + self.body.append( + self.starttag(node, 'h%s' % h_level, '', **atts)) + atts = {} + if node.hasattr('refid'): + atts['class'] = 'toc-backref' + atts['href'] = '#' + node['refid'] + if atts: + self.body.append(self.starttag({}, 'a', '', **atts)) + close_tag = '\n' % (h_level) + else: + close_tag = '\n' % (h_level) + self.context.append(close_tag) + + def depart_title(self, node): + self.body.append(self.context.pop()) + if self.in_document_title: + self.title = self.body[self.in_document_title:-1] + self.in_document_title = 0 + self.body_pre_docinfo.extend(self.body) + self.html_title.extend(self.body) + del self.body[:] + + def visit_title_reference(self, node): + self.body.append(self.starttag(node, 'cite', '')) + + def depart_title_reference(self, node): + self.body.append('') + + # TODO: use the new HTML5 element

    yja~WxFc`yfrj%BE^ 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%0Ay}5phF%Yq4Q1qkIf-;CS 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 a$1xo%1ox9%9ceNF__ldZ2ky8&yz@WAsp(Gu literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/dateutil/zoneinfo/rebuild.py b/lib/python3.8/site-packages/dateutil/zoneinfo/rebuild.py new file mode 100644 index 0000000..78f0d1a --- /dev/null +++ b/lib/python3.8/site-packages/dateutil/zoneinfo/rebuild.py @@ -0,0 +1,53 @@ +import logging +import os +import tempfile +import shutil +import json +from subprocess import check_call +from tarfile import TarFile + +from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME + + +def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): + """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* + + filename is the timezone tarball from ``ftp.iana.org/tz``. + + """ + tmpdir = tempfile.mkdtemp() + zonedir = os.path.join(tmpdir, "zoneinfo") + moduledir = os.path.dirname(__file__) + try: + with TarFile.open(filename) as tf: + for name in zonegroups: + tf.extract(name, tmpdir) + filepaths = [os.path.join(tmpdir, n) for n in zonegroups] + try: + check_call(["zic", "-d", zonedir] + filepaths) + except OSError as e: + _print_on_nosuchfile(e) + raise + # write metadata file + with open(os.path.join(zonedir, METADATA_FN), 'w') as f: + json.dump(metadata, f, indent=4, sort_keys=True) + target = os.path.join(moduledir, ZONEFILENAME) + with TarFile.open(target, "w:%s" % format) as tf: + for entry in os.listdir(zonedir): + entrypath = os.path.join(zonedir, entry) + tf.add(entrypath, entry) + finally: + shutil.rmtree(tmpdir) + + +def _print_on_nosuchfile(e): + """Print helpful troubleshooting message + + e is an exception raised by subprocess.check_call() + + """ + if e.errno == 2: + logging.error( + "Could not find zic. Perhaps you need to install " + "libc-bin or some other package that provides it, " + "or it's not in your PATH?") diff --git a/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA new file mode 100644 index 0000000..7905cc9 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD new file mode 100644 index 0000000..d127cc8 --- /dev/null +++ b/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/__pycache__,, +distlib/resources.cpython-38.pyc,, +distlib/scripts.cpython-38.pyc,, +distlib/database.cpython-38.pyc,, +distlib/metadata.cpython-38.pyc,, +distlib/index.cpython-38.pyc,, +distlib/markers.cpython-38.pyc,, +distlib/_backport/tarfile.cpython-38.pyc,, +distlib-0.3.0.dist-info/__pycache__,, +distlib/locators.cpython-38.pyc,, +distlib/_backport/sysconfig.cpython-38.pyc,, +distlib/_backport/__init__.cpython-38.pyc,, +distlib/_backport/misc.cpython-38.pyc,, +distlib/wheel.cpython-38.pyc,, +distlib/util.cpython-38.pyc,, +distlib/_backport/shutil.cpython-38.pyc,, +distlib-0.3.0.dist-info/INSTALLER,, +distlib-0.3.0.virtualenv,, +distlib/__init__.cpython-38.pyc,, +distlib/manifest.cpython-38.pyc,, +distlib/version.cpython-38.pyc,, +distlib/compat.cpython-38.pyc,, +distlib/_backport/__pycache__,, \ No newline at end of file diff --git a/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt new file mode 100644 index 0000000..f68bb07 --- /dev/null +++ b/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt @@ -0,0 +1 @@ +distlib diff --git a/lib/python3.8/site-packages/distlib-0.3.0.virtualenv b/lib/python3.8/site-packages/distlib-0.3.0.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.8/site-packages/distlib/__init__.py b/lib/python3.8/site-packages/distlib/__init__.py new file mode 100644 index 0000000..e19aebd --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaaae9f562d981fed2f185ea261e0f0ebefb0a73 GIT binary patch literal 1032 zcmah{OK;Oa5T3Qyk2q}!1tER_Ldt=-QZF13s(^}zsvM|z`LZ(JB{lIQtQ|xnZtV|g zkNHb`<;0mACuY`d6BQ)Z+R=>XoB3vD=gsD31bA{DihT#*2N~-pL}L$cQ=yO`Spf-1 zCt=S)x{{xQ>4Cq6=F9XB}3O@T7!9PIdyaxqm zfeO!A(o?;&NbwUmXAF4`VHo~IP8ct|ozd=SCnID1Ff{h?HXA4uBuql$*g(e&p5;wj z$cOI?occkJ+sF{VG1HOBI)M-Ks?z zzs+@v!1zf~Ph!j+&yL%py4oE*jGMew4`yjLO(&{}Wyc*0kym*u#AtS`akkK>Vo3>^ zwTH~~$Md3ikyf%$`mY8Fx<@hhP^=o1&M72rH~oZ5Px@$kGN6fRdasNEFAwQ7si$}w zjzYpAEZNw$xO5C}RPo99T4lACtLAlpP~#uj(za3mg%=jvYxRyg=l|Js4@0}uv~1T& zxGMAZ7CE+vVz5p@u8hjRJfu@gwjIhQ;X4T1l%>I$@}kbBL#Aom*SVrhtF%=Ih`3E| z%Xnvl@4LL(bpZz!Nn*bMQl2;Sc7vihZ z4X!2bU+-#1?NV5<>Ax&zwQl#duC)m+7R2->sy)CQO54JWPYIPaQ7YvH=3h0L@KLwz WkEz0DK!rKn8MqD`uq}4ii`XB72GgGa literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/distlib/__pycache__/compat.cpython-38.pyc b/lib/python3.8/site-packages/distlib/__pycache__/compat.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99c462b957f3dc524e52265d38fe526c0c808344 GIT binary patch literal 32181 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/distlib/__pycache__/util.cpython-38.pyc b/lib/python3.8/site-packages/distlib/__pycache__/util.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67a5a56c1490d4fac85cbb7471d2acad47b9746f GIT binary patch literal 48135 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 ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg b/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/_backport/sysconfig.py b/lib/python3.8/site-packages/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..b470a37 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/_backport/tarfile.py b/lib/python3.8/site-packages/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/compat.py b/lib/python3.8/site-packages/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/database.py b/lib/python3.8/site-packages/distlib/database.py new file mode 100644 index 0000000..c16c0c8 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/index.py b/lib/python3.8/site-packages/distlib/index.py new file mode 100644 index 0000000..7a87cdc --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/locators.py b/lib/python3.8/site-packages/distlib/locators.py new file mode 100644 index 0000000..12a1d06 --- /dev/null +++ b/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/lib/python3.8/site-packages/distlib/manifest.py b/lib/python3.8/site-packages/distlib/manifest.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/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

    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 YweX75$}qG!oLto&Z*OXENFeS10^Op|+W-In literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/__pycache__/retrying.cpython-38.pyc b/lib/python3.8/site-packages/__pycache__/retrying.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c395deb9567d7dad1728c69b85f0bed8425be9a0 GIT binary patch literal 7992 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 VPvmgYpJ^KQGfQ95URe5-{{g&(c`N_` literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc b/lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d14cac121b1b4380ee565d5d826d5c8bbeffa18 GIT binary patch literal 26874 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 Sso;;{%n&#QJdgBg>;D0Ye;xb) literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/_virtualenv.pth b/lib/python3.8/site-packages/_virtualenv.pth new file mode 100644 index 0000000..1c3ff99 --- /dev/null +++ b/lib/python3.8/site-packages/_virtualenv.pth @@ -0,0 +1 @@ +import _virtualenv \ No newline at end of file diff --git a/lib/python3.8/site-packages/_virtualenv.py b/lib/python3.8/site-packages/_virtualenv.py new file mode 100644 index 0000000..b399da4 --- /dev/null +++ b/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/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER b/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt b/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/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/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA b/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA new file mode 100644 index 0000000..56a3d6e --- /dev/null +++ b/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/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD b/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD new file mode 100644 index 0000000..a976068 --- /dev/null +++ b/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.dist-info/INSTALLER,, +appdirs-1.4.3.virtualenv,, +appdirs-1.4.3.dist-info/__pycache__,, +appdirs.cpython-38.pyc,, \ No newline at end of file diff --git a/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL b/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/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/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt b/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt new file mode 100644 index 0000000..d64bc32 --- /dev/null +++ b/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt @@ -0,0 +1 @@ +appdirs diff --git a/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv b/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.8/site-packages/appdirs.py b/lib/python3.8/site-packages/appdirs.py new file mode 100644 index 0000000..ae67001 --- /dev/null +++ b/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/lib/python3.8/site-packages/blinker-1.4.dist-info/AUTHORS b/lib/python3.8/site-packages/blinker-1.4.dist-info/AUTHORS new file mode 100644 index 0000000..ee0dd62 --- /dev/null +++ b/lib/python3.8/site-packages/blinker-1.4.dist-info/AUTHORS @@ -0,0 +1,8 @@ +Blinker was originally written by Jason Kirtland. + +Contributors are: + +- Jason Kirtland + +Blinker includes code from Louie, by Patrick K. O'Brien, Mike +C. Fletcher, and Matthew R. Scott. diff --git a/lib/python3.8/site-packages/blinker-1.4.dist-info/INSTALLER b/lib/python3.8/site-packages/blinker-1.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/blinker-1.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/blinker-1.4.dist-info/LICENSE b/lib/python3.8/site-packages/blinker-1.4.dist-info/LICENSE new file mode 100644 index 0000000..88f6e84 --- /dev/null +++ b/lib/python3.8/site-packages/blinker-1.4.dist-info/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) The Blinker authors and contributors + +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/lib/python3.8/site-packages/blinker-1.4.dist-info/METADATA b/lib/python3.8/site-packages/blinker-1.4.dist-info/METADATA new file mode 100644 index 0000000..25cb9f2 --- /dev/null +++ b/lib/python3.8/site-packages/blinker-1.4.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: blinker +Version: 1.4 +Summary: Fast, simple object-to-object and broadcast signaling +Home-page: http://pythonhosted.org/blinker/ +Author: Jason Kirtland +Author-email: jek@discorporate.us +License: MIT License +Keywords: signal emit events broadcast +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.4 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.0 +Classifier: Programming Language :: Python :: 3.1 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities + +[![Build Status](https://travis-ci.org/jek/blinker.svg?branch=master)](https://travis-ci.org/jek/blinker) + + +# Blinker + +Blinker provides a fast dispatching system that allows any number of +interested parties to subscribe to events, or "signals". + +Signal receivers can subscribe to specific senders or receive signals +sent by any sender. + + >>> from blinker import signal + >>> started = signal('round-started') + >>> def each(round): + ... print "Round %s!" % round + ... + >>> started.connect(each) + + >>> def round_two(round): + ... print "This is round two." + ... + >>> started.connect(round_two, sender=2) + + >>> for round in range(1, 4): + ... started.send(round) + ... + Round 1! + Round 2! + This is round two. + Round 3! + +See the [Blinker documentation](https://pythonhosted.org/blinker/) for more information. + +## Requirements + +Blinker requires Python 2.4 or higher, Python 3.0 or higher, or Jython 2.5 or higher. + +## Changelog Summary + +1.3 (July 3, 2013) + + - The global signal stash behind blinker.signal() is now backed by a + regular name-to-Signal dictionary. Previously, weak references were + held in the mapping and ephemeral usage in code like + ``signal('foo').connect(...)`` could have surprising program behavior + depending on import order of modules. + - blinker.Namespace is now built on a regular dict. Use + blinker.WeakNamespace for the older, weak-referencing behavior. + - Signal.connect('text-sender') uses an alternate hashing strategy to + avoid sharp edges in text identity. + +1.2 (October 26, 2011) + + - Added Signal.receiver_connected and Signal.receiver_disconnected + per-Signal signals. + - Deprecated the global 'receiver_connected' signal. + - Verified Python 3.2 support (no changes needed!) + +1.1 (July 21, 2010) + + - Added ``@signal.connect_via(sender)`` decorator + - Added ``signal.connected_to`` shorthand name for the + ``temporarily_connected_to`` context manager. + +1.0 (March 28, 2010) + + - Python 3.x compatibility + +0.9 (February 26, 2010) + + - Sphinx docs, project website + - Added ``with a_signal.temporarily_connected_to(receiver): ...`` support + + diff --git a/lib/python3.8/site-packages/blinker-1.4.dist-info/RECORD b/lib/python3.8/site-packages/blinker-1.4.dist-info/RECORD new file mode 100644 index 0000000..517b8e9 --- /dev/null +++ b/lib/python3.8/site-packages/blinker-1.4.dist-info/RECORD @@ -0,0 +1,15 @@ +blinker-1.4.dist-info/AUTHORS,sha256=f2tPqeT2VyCL9D9YelVKScG65gDrGzbMES0zp7b0p48,207 +blinker-1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +blinker-1.4.dist-info/LICENSE,sha256=7pmpCeGwT1Pz1JOD5kYromjPSTiLs6ZXRV2snjjN8Oo,1094 +blinker-1.4.dist-info/METADATA,sha256=xjofN2QBb0zejTtGF8S000R3eRXw5uGzdG15LjEy3ak,3308 +blinker-1.4.dist-info/RECORD,, +blinker-1.4.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +blinker-1.4.dist-info/top_level.txt,sha256=2NmsENM0J2t9Z8mkjxHDmGMQj7Bm8f5ZTTYe1x1fZtM,8 +blinker/__init__.py,sha256=vgkMDX61C3h5jhFvxiGJ_FCkajPLZi-KzZr_AAfV-_0,300 +blinker/__pycache__/__init__.cpython-38.pyc,, +blinker/__pycache__/_saferef.cpython-38.pyc,, +blinker/__pycache__/_utilities.cpython-38.pyc,, +blinker/__pycache__/base.cpython-38.pyc,, +blinker/_saferef.py,sha256=OprBfoWWJd791Qm9OY5c-v1bIo2qLalHah8hqAA18Sw,9223 +blinker/_utilities.py,sha256=ev0IgdfH4wMSmLO-J3gVZSc-umhhmJiQJWdQNy6lyTY,4457 +blinker/base.py,sha256=MJ_qn4ladUGMAU2M1k2OIPfgUi_INhbqfLrvjdsmHVM,16319 diff --git a/lib/python3.8/site-packages/blinker-1.4.dist-info/WHEEL b/lib/python3.8/site-packages/blinker-1.4.dist-info/WHEEL new file mode 100644 index 0000000..b552003 --- /dev/null +++ b/lib/python3.8/site-packages/blinker-1.4.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/lib/python3.8/site-packages/blinker-1.4.dist-info/top_level.txt b/lib/python3.8/site-packages/blinker-1.4.dist-info/top_level.txt new file mode 100644 index 0000000..1ff4ca5 --- /dev/null +++ b/lib/python3.8/site-packages/blinker-1.4.dist-info/top_level.txt @@ -0,0 +1 @@ +blinker diff --git a/lib/python3.8/site-packages/blinker/__init__.py b/lib/python3.8/site-packages/blinker/__init__.py new file mode 100644 index 0000000..3ea239c --- /dev/null +++ b/lib/python3.8/site-packages/blinker/__init__.py @@ -0,0 +1,22 @@ +from blinker.base import ( + ANY, + NamedSignal, + Namespace, + Signal, + WeakNamespace, + receiver_connected, + signal, +) + +__all__ = [ + 'ANY', + 'NamedSignal', + 'Namespace', + 'Signal', + 'WeakNamespace', + 'receiver_connected', + 'signal', + ] + + +__version__ = '1.4' diff --git a/lib/python3.8/site-packages/blinker/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/blinker/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbf6364fed7871f84f2810d1b98bccfb0aafc33d GIT binary patch literal 414 zcma)&&q@O^5XQ5Av+deTpTSGPb`g4%qA$=(5os>Nc4w?{lQitMioTKH6Xoj3N6?dr z6ztI%@`G<+zM0AGXf$L#-qQjuBE~*~I1TQ_wSWD>0~tn&=}1I67O_r5qEnITOk_G2 zx#ogL3}Z|%#SC-gSZui{a3BUaT(L>{={?wlyX0oMcIC3xge$oa*c6YJ2?UH~rAPdL?!uDO^@tR!D=F7=YoNbgeEp@X^ z-P1oB9S5kD0&pdOpWe%z0eE9w8LR`o=ha@@%1S#u7=J-aIDLK~Qd4X1Ws8rS>Nv9k fkVftSX7!T}Wm_h!7Jg6WCo#sJHDdk9)@M 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/blinker/__pycache__/_utilities.cpython-38.pyc b/lib/python3.8/site-packages/blinker/__pycache__/_utilities.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbda3ad4b83573ea8f8b61d45980fae254d2f404 GIT binary patch literal 5550 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/blinker/__pycache__/base.cpython-38.pyc b/lib/python3.8/site-packages/blinker/__pycache__/base.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba160ee8326bdb3d8b13aa19bce2663617779e2a GIT binary patch literal 14312 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 nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +"""Refactored 'safe reference from dispatcher.py""" + +import operator +import sys +import traceback +import weakref + + +try: + callable +except NameError: + def callable(object): + return hasattr(object, '__call__') + + +if sys.version_info < (3,): + get_self = operator.attrgetter('im_self') + get_func = operator.attrgetter('im_func') +else: + get_self = operator.attrgetter('__self__') + get_func = operator.attrgetter('__func__') + + +def safe_ref(target, on_delete=None): + """Return a *safe* weak reference to a callable target. + + - ``target``: The object to be weakly referenced, if it's a bound + method reference, will create a BoundMethodWeakref, otherwise + creates a simple weakref. + + - ``on_delete``: If provided, will have a hard reference stored to + the callable to be called after the safe reference goes out of + scope with the reference object, (either a weakref or a + BoundMethodWeakref) as argument. + """ + try: + im_self = get_self(target) + except AttributeError: + if callable(on_delete): + return weakref.ref(target, on_delete) + else: + return weakref.ref(target) + else: + if im_self is not None: + # Turn a bound method into a BoundMethodWeakref instance. + # Keep track of these instances for lookup by disconnect(). + assert hasattr(target, 'im_func') or hasattr(target, '__func__'), ( + "safe_ref target %r has im_self, but no im_func, " + "don't know how to create reference" % target) + reference = BoundMethodWeakref(target=target, on_delete=on_delete) + return reference + + +class BoundMethodWeakref(object): + """'Safe' and reusable weak references to instance methods. + + BoundMethodWeakref objects provide a mechanism for referencing a + bound method without requiring that the method object itself + (which is normally a transient object) is kept alive. Instead, + the BoundMethodWeakref object keeps weak references to both the + object and the function which together define the instance method. + + Attributes: + + - ``key``: The identity key for the reference, calculated by the + class's calculate_key method applied to the target instance method. + + - ``deletion_methods``: Sequence of callable objects taking single + argument, a reference to this object which will be called when + *either* the target object or target function is garbage + collected (i.e. when this object becomes invalid). These are + specified as the on_delete parameters of safe_ref calls. + + - ``weak_self``: Weak reference to the target object. + + - ``weak_func``: Weak reference to the target function. + + Class Attributes: + + - ``_all_instances``: Class attribute pointing to all live + BoundMethodWeakref objects indexed by the class's + calculate_key(target) method applied to the target objects. + This weak value dictionary is used to short-circuit creation so + that multiple references to the same (object, function) pair + produce the same BoundMethodWeakref instance. + """ + + _all_instances = weakref.WeakValueDictionary() + + def __new__(cls, target, on_delete=None, *arguments, **named): + """Create new instance or return current instance. + + Basically this method of construction allows us to + short-circuit creation of references to already- referenced + instance methods. The key corresponding to the target is + calculated, and if there is already an existing reference, + that is returned, with its deletion_methods attribute updated. + Otherwise the new instance is created and registered in the + table of already-referenced methods. + """ + key = cls.calculate_key(target) + current = cls._all_instances.get(key) + if current is not None: + current.deletion_methods.append(on_delete) + return current + else: + base = super(BoundMethodWeakref, cls).__new__(cls) + cls._all_instances[key] = base + base.__init__(target, on_delete, *arguments, **named) + return base + + def __init__(self, target, on_delete=None): + """Return a weak-reference-like instance for a bound method. + + - ``target``: The instance-method target for the weak reference, + must have im_self and im_func attributes and be + reconstructable via the following, which is true of built-in + instance methods:: + + target.im_func.__get__( target.im_self ) + + - ``on_delete``: Optional callback which will be called when + this weak reference ceases to be valid (i.e. either the + object or the function is garbage collected). Should take a + single argument, which will be passed a pointer to this + object. + """ + def remove(weak, self=self): + """Set self.isDead to True when method or instance is destroyed.""" + methods = self.deletion_methods[:] + del self.deletion_methods[:] + try: + del self.__class__._all_instances[self.key] + except KeyError: + pass + for function in methods: + try: + if callable(function): + function(self) + except Exception: + try: + traceback.print_exc() + except AttributeError: + e = sys.exc_info()[1] + print ('Exception during saferef %s ' + 'cleanup function %s: %s' % (self, function, e)) + self.deletion_methods = [on_delete] + self.key = self.calculate_key(target) + im_self = get_self(target) + im_func = get_func(target) + self.weak_self = weakref.ref(im_self, remove) + self.weak_func = weakref.ref(im_func, remove) + self.self_name = str(im_self) + self.func_name = str(im_func.__name__) + + def calculate_key(cls, target): + """Calculate the reference key for this reference. + + Currently this is a two-tuple of the id()'s of the target + object and the target function respectively. + """ + return (id(get_self(target)), id(get_func(target))) + calculate_key = classmethod(calculate_key) + + def __str__(self): + """Give a friendly representation of the object.""" + return "%s(%s.%s)" % ( + self.__class__.__name__, + self.self_name, + self.func_name, + ) + + __repr__ = __str__ + + def __nonzero__(self): + """Whether we are still a valid reference.""" + return self() is not None + + def __cmp__(self, other): + """Compare with another reference.""" + if not isinstance(other, self.__class__): + return cmp(self.__class__, type(other)) + return cmp(self.key, other.key) + + def __call__(self): + """Return a strong reference to the bound method. + + If the target cannot be retrieved, then will return None, + otherwise returns a bound instance method for our object and + function. + + Note: You may call this method any number of times, as it does + not invalidate the reference. + """ + target = self.weak_self() + if target is not None: + function = self.weak_func() + if function is not None: + return function.__get__(target) + return None diff --git a/lib/python3.8/site-packages/blinker/_utilities.py b/lib/python3.8/site-packages/blinker/_utilities.py new file mode 100644 index 0000000..056270d --- /dev/null +++ b/lib/python3.8/site-packages/blinker/_utilities.py @@ -0,0 +1,163 @@ +from weakref import ref + +from blinker._saferef import BoundMethodWeakref + + +try: + callable +except NameError: + def callable(object): + return hasattr(object, '__call__') + + +try: + from collections import defaultdict +except: + class defaultdict(dict): + + def __init__(self, default_factory=None, *a, **kw): + if (default_factory is not None and + not hasattr(default_factory, '__call__')): + raise TypeError('first argument must be callable') + dict.__init__(self, *a, **kw) + self.default_factory = default_factory + + def __getitem__(self, key): + try: + return dict.__getitem__(self, key) + except KeyError: + return self.__missing__(key) + + def __missing__(self, key): + if self.default_factory is None: + raise KeyError(key) + self[key] = value = self.default_factory() + return value + + def __reduce__(self): + if self.default_factory is None: + args = tuple() + else: + args = self.default_factory, + return type(self), args, None, None, self.items() + + def copy(self): + return self.__copy__() + + def __copy__(self): + return type(self)(self.default_factory, self) + + def __deepcopy__(self, memo): + import copy + return type(self)(self.default_factory, + copy.deepcopy(self.items())) + + def __repr__(self): + return 'defaultdict(%s, %s)' % (self.default_factory, + dict.__repr__(self)) + + +try: + from contextlib import contextmanager +except ImportError: + def contextmanager(fn): + def oops(*args, **kw): + raise RuntimeError("Python 2.5 or above is required to use " + "context managers.") + oops.__name__ = fn.__name__ + return oops + +class _symbol(object): + + def __init__(self, name): + """Construct a new named symbol.""" + self.__name__ = self.name = name + + def __reduce__(self): + return symbol, (self.name,) + + def __repr__(self): + return self.name +_symbol.__name__ = 'symbol' + + +class symbol(object): + """A constant symbol. + + >>> symbol('foo') is symbol('foo') + True + >>> symbol('foo') + foo + + A slight refinement of the MAGICCOOKIE=object() pattern. The primary + advantage of symbol() is its repr(). They are also singletons. + + Repeated calls of symbol('name') will all return the same instance. + + """ + symbols = {} + + def __new__(cls, name): + try: + return cls.symbols[name] + except KeyError: + return cls.symbols.setdefault(name, _symbol(name)) + + +try: + text = (str, unicode) +except NameError: + text = str + + +def hashable_identity(obj): + if hasattr(obj, '__func__'): + return (id(obj.__func__), id(obj.__self__)) + elif hasattr(obj, 'im_func'): + return (id(obj.im_func), id(obj.im_self)) + elif isinstance(obj, text): + return obj + else: + return id(obj) + + +WeakTypes = (ref, BoundMethodWeakref) + + +class annotatable_weakref(ref): + """A weakref.ref that supports custom instance attributes.""" + + +def reference(object, callback=None, **annotations): + """Return an annotated weak ref.""" + if callable(object): + weak = callable_reference(object, callback) + else: + weak = annotatable_weakref(object, callback) + for key, value in annotations.items(): + setattr(weak, key, value) + return weak + + +def callable_reference(object, callback=None): + """Return an annotated weak ref, supporting bound instance methods.""" + if hasattr(object, 'im_self') and object.im_self is not None: + return BoundMethodWeakref(target=object, on_delete=callback) + elif hasattr(object, '__self__') and object.__self__ is not None: + return BoundMethodWeakref(target=object, on_delete=callback) + return annotatable_weakref(object, callback) + + +class lazy_property(object): + """A @property that is only evaluated once.""" + + def __init__(self, deferred): + self._deferred = deferred + self.__doc__ = deferred.__doc__ + + def __get__(self, obj, cls): + if obj is None: + return self + value = self._deferred(obj) + setattr(obj, self._deferred.__name__, value) + return value diff --git a/lib/python3.8/site-packages/blinker/base.py b/lib/python3.8/site-packages/blinker/base.py new file mode 100644 index 0000000..cc5880e --- /dev/null +++ b/lib/python3.8/site-packages/blinker/base.py @@ -0,0 +1,455 @@ +# -*- coding: utf-8; fill-column: 76 -*- +"""Signals and events. + +A small implementation of signals, inspired by a snippet of Django signal +API client code seen in a blog post. Signals are first-class objects and +each manages its own receivers and message emission. + +The :func:`signal` function provides singleton behavior for named signals. + +""" +from warnings import warn +from weakref import WeakValueDictionary + +from blinker._utilities import ( + WeakTypes, + contextmanager, + defaultdict, + hashable_identity, + lazy_property, + reference, + symbol, + ) + + +ANY = symbol('ANY') +ANY.__doc__ = 'Token for "any sender".' +ANY_ID = 0 + + +class Signal(object): + """A notification emitter.""" + + #: An :obj:`ANY` convenience synonym, allows ``Signal.ANY`` + #: without an additional import. + ANY = ANY + + @lazy_property + def receiver_connected(self): + """Emitted after each :meth:`connect`. + + The signal sender is the signal instance, and the :meth:`connect` + arguments are passed through: *receiver*, *sender*, and *weak*. + + .. versionadded:: 1.2 + + """ + return Signal(doc="Emitted after a receiver connects.") + + @lazy_property + def receiver_disconnected(self): + """Emitted after :meth:`disconnect`. + + The sender is the signal instance, and the :meth:`disconnect` arguments + are passed through: *receiver* and *sender*. + + Note, this signal is emitted **only** when :meth:`disconnect` is + called explicitly. + + The disconnect signal can not be emitted by an automatic disconnect + (due to a weakly referenced receiver or sender going out of scope), + as the receiver and/or sender instances are no longer available for + use at the time this signal would be emitted. + + An alternative approach is available by subscribing to + :attr:`receiver_connected` and setting up a custom weakref cleanup + callback on weak receivers and senders. + + .. versionadded:: 1.2 + + """ + return Signal(doc="Emitted after a receiver disconnects.") + + def __init__(self, doc=None): + """ + :param doc: optional. If provided, will be assigned to the signal's + __doc__ attribute. + + """ + if doc: + self.__doc__ = doc + #: A mapping of connected receivers. + #: + #: The values of this mapping are not meaningful outside of the + #: internal :class:`Signal` implementation, however the boolean value + #: of the mapping is useful as an extremely efficient check to see if + #: any receivers are connected to the signal. + self.receivers = {} + self._by_receiver = defaultdict(set) + self._by_sender = defaultdict(set) + self._weak_senders = {} + + def connect(self, receiver, sender=ANY, weak=True): + """Connect *receiver* to signal events sent by *sender*. + + :param receiver: A callable. Will be invoked by :meth:`send` with + `sender=` as a single positional argument and any \*\*kwargs that + were provided to a call to :meth:`send`. + + :param sender: Any object or :obj:`ANY`, defaults to ``ANY``. + Restricts notifications delivered to *receiver* to only those + :meth:`send` emissions sent by *sender*. If ``ANY``, the receiver + will always be notified. A *receiver* may be connected to + multiple *sender* values on the same Signal through multiple calls + to :meth:`connect`. + + :param weak: If true, the Signal will hold a weakref to *receiver* + and automatically disconnect when *receiver* goes out of scope or + is garbage collected. Defaults to True. + + """ + receiver_id = hashable_identity(receiver) + if weak: + receiver_ref = reference(receiver, self._cleanup_receiver) + receiver_ref.receiver_id = receiver_id + else: + receiver_ref = receiver + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = hashable_identity(sender) + + self.receivers.setdefault(receiver_id, receiver_ref) + self._by_sender[sender_id].add(receiver_id) + self._by_receiver[receiver_id].add(sender_id) + del receiver_ref + + if sender is not ANY and sender_id not in self._weak_senders: + # wire together a cleanup for weakref-able senders + try: + sender_ref = reference(sender, self._cleanup_sender) + sender_ref.sender_id = sender_id + except TypeError: + pass + else: + self._weak_senders.setdefault(sender_id, sender_ref) + del sender_ref + + # broadcast this connection. if receivers raise, disconnect. + if ('receiver_connected' in self.__dict__ and + self.receiver_connected.receivers): + try: + self.receiver_connected.send(self, + receiver=receiver, + sender=sender, + weak=weak) + except: + self.disconnect(receiver, sender) + raise + if receiver_connected.receivers and self is not receiver_connected: + try: + receiver_connected.send(self, + receiver_arg=receiver, + sender_arg=sender, + weak_arg=weak) + except: + self.disconnect(receiver, sender) + raise + return receiver + + def connect_via(self, sender, weak=False): + """Connect the decorated function as a receiver for *sender*. + + :param sender: Any object or :obj:`ANY`. The decorated function + will only receive :meth:`send` emissions sent by *sender*. If + ``ANY``, the receiver will always be notified. A function may be + decorated multiple times with differing *sender* values. + + :param weak: If true, the Signal will hold a weakref to the + decorated function and automatically disconnect when *receiver* + goes out of scope or is garbage collected. Unlike + :meth:`connect`, this defaults to False. + + The decorated function will be invoked by :meth:`send` with + `sender=` as a single positional argument and any \*\*kwargs that + were provided to the call to :meth:`send`. + + + .. versionadded:: 1.1 + + """ + def decorator(fn): + self.connect(fn, sender, weak) + return fn + return decorator + + @contextmanager + def connected_to(self, receiver, sender=ANY): + """Execute a block with the signal temporarily connected to *receiver*. + + :param receiver: a receiver callable + :param sender: optional, a sender to filter on + + This is a context manager for use in the ``with`` statement. It can + be useful in unit tests. *receiver* is connected to the signal for + the duration of the ``with`` block, and will be disconnected + automatically when exiting the block: + + .. testsetup:: + + from __future__ import with_statement + from blinker import Signal + on_ready = Signal() + receiver = lambda sender: None + + .. testcode:: + + with on_ready.connected_to(receiver): + # do stuff + on_ready.send(123) + + .. versionadded:: 1.1 + + """ + self.connect(receiver, sender=sender, weak=False) + try: + yield None + except: + self.disconnect(receiver) + raise + else: + self.disconnect(receiver) + + def temporarily_connected_to(self, receiver, sender=ANY): + """An alias for :meth:`connected_to`. + + :param receiver: a receiver callable + :param sender: optional, a sender to filter on + + .. versionadded:: 0.9 + + .. versionchanged:: 1.1 + Renamed to :meth:`connected_to`. ``temporarily_connected_to`` was + deprecated in 1.2 and will be removed in a subsequent version. + + """ + warn("temporarily_connected_to is deprecated; " + "use connected_to instead.", + DeprecationWarning) + return self.connected_to(receiver, sender) + + def send(self, *sender, **kwargs): + """Emit this signal on behalf of *sender*, passing on \*\*kwargs. + + Returns a list of 2-tuples, pairing receivers with their return + value. The ordering of receiver notification is undefined. + + :param \*sender: Any object or ``None``. If omitted, synonymous + with ``None``. Only accepts one positional argument. + + :param \*\*kwargs: Data to be sent to receivers. + + """ + # Using '*sender' rather than 'sender=None' allows 'sender' to be + # used as a keyword argument- i.e. it's an invisible name in the + # function signature. + if len(sender) == 0: + sender = None + elif len(sender) > 1: + raise TypeError('send() accepts only one positional argument, ' + '%s given' % len(sender)) + else: + sender = sender[0] + if not self.receivers: + return [] + else: + return [(receiver, receiver(sender, **kwargs)) + for receiver in self.receivers_for(sender)] + + def has_receivers_for(self, sender): + """True if there is probably a receiver for *sender*. + + Performs an optimistic check only. Does not guarantee that all + weakly referenced receivers are still alive. See + :meth:`receivers_for` for a stronger search. + + """ + if not self.receivers: + return False + if self._by_sender[ANY_ID]: + return True + if sender is ANY: + return False + return hashable_identity(sender) in self._by_sender + + def receivers_for(self, sender): + """Iterate all live receivers listening for *sender*.""" + # TODO: test receivers_for(ANY) + if self.receivers: + sender_id = hashable_identity(sender) + if sender_id in self._by_sender: + ids = (self._by_sender[ANY_ID] | + self._by_sender[sender_id]) + else: + ids = self._by_sender[ANY_ID].copy() + for receiver_id in ids: + receiver = self.receivers.get(receiver_id) + if receiver is None: + continue + if isinstance(receiver, WeakTypes): + strong = receiver() + if strong is None: + self._disconnect(receiver_id, ANY_ID) + continue + receiver = strong + yield receiver + + def disconnect(self, receiver, sender=ANY): + """Disconnect *receiver* from this signal's events. + + :param receiver: a previously :meth:`connected` callable + + :param sender: a specific sender to disconnect from, or :obj:`ANY` + to disconnect from all senders. Defaults to ``ANY``. + + """ + if sender is ANY: + sender_id = ANY_ID + else: + sender_id = hashable_identity(sender) + receiver_id = hashable_identity(receiver) + self._disconnect(receiver_id, sender_id) + + if ('receiver_disconnected' in self.__dict__ and + self.receiver_disconnected.receivers): + self.receiver_disconnected.send(self, + receiver=receiver, + sender=sender) + + def _disconnect(self, receiver_id, sender_id): + if sender_id == ANY_ID: + if self._by_receiver.pop(receiver_id, False): + for bucket in self._by_sender.values(): + bucket.discard(receiver_id) + self.receivers.pop(receiver_id, None) + else: + self._by_sender[sender_id].discard(receiver_id) + self._by_receiver[receiver_id].discard(sender_id) + + def _cleanup_receiver(self, receiver_ref): + """Disconnect a receiver from all senders.""" + self._disconnect(receiver_ref.receiver_id, ANY_ID) + + def _cleanup_sender(self, sender_ref): + """Disconnect all receivers from a sender.""" + sender_id = sender_ref.sender_id + assert sender_id != ANY_ID + self._weak_senders.pop(sender_id, None) + for receiver_id in self._by_sender.pop(sender_id, ()): + self._by_receiver[receiver_id].discard(sender_id) + + def _cleanup_bookkeeping(self): + """Prune unused sender/receiver bookeeping. Not threadsafe. + + Connecting & disconnecting leave behind a small amount of bookeeping + for the receiver and sender values. Typical workloads using Blinker, + for example in most web apps, Flask, CLI scripts, etc., are not + adversely affected by this bookkeeping. + + With a long-running Python process performing dynamic signal routing + with high volume- e.g. connecting to function closures, "senders" are + all unique object instances, and doing all of this over and over- you + may see memory usage will grow due to extraneous bookeeping. (An empty + set() for each stale sender/receiver pair.) + + This method will prune that bookeeping away, with the caveat that such + pruning is not threadsafe. The risk is that cleanup of a fully + disconnected receiver/sender pair occurs while another thread is + connecting that same pair. If you are in the highly dynamic, unique + receiver/sender situation that has lead you to this method, that + failure mode is perhaps not a big deal for you. + """ + for mapping in (self._by_sender, self._by_receiver): + for _id, bucket in list(mapping.items()): + if not bucket: + mapping.pop(_id, None) + + def _clear_state(self): + """Throw away all signal state. Useful for unit tests.""" + self._weak_senders.clear() + self.receivers.clear() + self._by_sender.clear() + self._by_receiver.clear() + + +receiver_connected = Signal("""\ +Sent by a :class:`Signal` after a receiver connects. + +:argument: the Signal that was connected to +:keyword receiver_arg: the connected receiver +:keyword sender_arg: the sender to connect to +:keyword weak_arg: true if the connection to receiver_arg is a weak reference + +.. deprecated:: 1.2 + +As of 1.2, individual signals have their own private +:attr:`~Signal.receiver_connected` and +:attr:`~Signal.receiver_disconnected` signals with a slightly simplified +call signature. This global signal is planned to be removed in 1.6. + +""") + + +class NamedSignal(Signal): + """A named generic notification emitter.""" + + def __init__(self, name, doc=None): + Signal.__init__(self, doc) + + #: The name of this signal. + self.name = name + + def __repr__(self): + base = Signal.__repr__(self) + return "%s; %r>" % (base[:-1], self.name) + + +class Namespace(dict): + """A mapping of signal names to signals.""" + + def signal(self, name, doc=None): + """Return the :class:`NamedSignal` *name*, creating it if required. + + Repeated calls to this function will return the same signal object. + + """ + try: + return self[name] + except KeyError: + return self.setdefault(name, NamedSignal(name, doc)) + + +class WeakNamespace(WeakValueDictionary): + """A weak mapping of signal names to signals. + + Automatically cleans up unused Signals when the last reference goes out + of scope. This namespace implementation exists for a measure of legacy + compatibility with Blinker <= 1.2, and may be dropped in the future. + + .. versionadded:: 1.3 + + """ + + def signal(self, name, doc=None): + """Return the :class:`NamedSignal` *name*, creating it if required. + + Repeated calls to this function will return the same signal object. + + """ + try: + return self[name] + except KeyError: + return self.setdefault(name, NamedSignal(name, doc)) + + +signal = Namespace().signal diff --git a/lib/python3.8/site-packages/cachecontrol/__init__.py b/lib/python3.8/site-packages/cachecontrol/__init__.py new file mode 100644 index 0000000..a1bbbbe --- /dev/null +++ b/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/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..378ccedb476ee268ec95d61b62bd56fbed1604af GIT binary patch literal 523 zcmYjNy>8nu5TM2bD9l_&$A9#P?x6{*#k=c9&b;j7Q5ln4H;DT;EC#RWYI+K~6$(f$Zxz6>% z<$fU-8KZdVmcEe1Q(U-}FJ(#b>W*#7;r>!JJ98P@gu!v^yMT#*X_LVR)tI`fZq(jz zo48T&z*G4DIkVqFa44Ec3e*|HlkllX=m{3raBe?Iy3;s3PANV4g$y$ zz<6aH(I)^u3`S~Bpm;>pbp~;iQWol8Wt@+wdR~g^VotsD~i(T&i2KzU87~we^Ag!LG#iAMv(eqrwCdhfaRnm0uVgy>O_em zmEBd{6L>(;Gm!SdK_B`7&N^SA^*b8)yIX-d+_Q{K?ovfMxy$kM%4CM#NeN0&eDxsN`xca%vJ!MV3hgL+$s|iLt}bxpkCe*>N&iJWezDiAq*0sU~Rf>cg9k9zjDA`~Uz? z1)H(R5xvjJlnPJq=k3T9`?iNL+mR;@Y%dTU=yBWbioNH4)cTybB=Q0N4TNwBv4I~s zA3YsM{QXD2eKdYF8c$kR;NZb~@b1H_#~=(bv?S+j&dOHle?ciJ0pY?|p>fVh&Pve6 zZs~#aO1}Dqz&h1$%(E4 zEmfLi=>`t7U3q#9C#Dcz<;QWFrzVaS!mB*Hs%p>VTBX{glj?>YNscoaFQu6kLM!A+ z6-+Mu6I8C2*;I8wp?uUHTx#Pk# zj$e`gjE1vfDTm9oGIEm)KTefdC)w~}R-6p8^mw>B1z`C*gI^AHYUEohphj{c_0U3Z z%ny^AWP{bI>Hq@ki9=|R&P{qqISrUk8FdLG?CZ__qi_3nusf=WgUgx+PZ2*EZR$UR zDA~#f?~pUMq;p!j3$A9H0~ldjr=&0GnfD3F@43Xdb8iu-cPYW2fblW+rz7VVX}1wM6oXlVL8UKvVUkd~jiDG={4iOjWUr?c)Ak%>-W4N})rdo>hss0bIEo@NeY-TMJe7 zj@N01x_ZN^HIs>uN>_Zn5{Z$~E%3ES@ne!KZj=hIUd?qNX)gLLbpRt(tJ%VWP!JAD z)wY`>)vNsr9L-)X?y8V4>NbkkQTzbJkKxrgM7)3oz@P*81=OVn&LKNwn>$C>FbRP? zp5Tq!J%|#igw)ap5C}`Rp^;ZQ`b$eC52*Adl0d!L(1`(^SjpzDpbMsEFzRiQIP4`u zGL&r5RwKdA9GKI>X#D~M4cq!JfpR53WBI3cwFj&JVpjvba5W|QLlc0mW4hZt)XZy* za}N8(9nkau3!Cr%jo1*$MeDhL)-ng%8xYXI0?gVsH_a`i==QL|j7 zsBo=u2w7_VIS4K+jAyA1pQTwA;tg4^U_zGRWOR)suaai1^4jF8Ffum~L9^2f3pGRF zCe;uw#?!aKd*jCtiF-m$3L#^RK)C!ZP)sn#?H+71c#(bj`yl>G&e1UtJ*-3TL5pq~ zI?Kj)Hd45x??l05w$2xECa0!y;^`{l5H1TXUs22MS2Vh7gM3`yjCeOaKQXgQ0#}FE z>2pM5(96ZPhI6(dG;5vi-`}HNe3x;h9h&;&I*=fbKNz7W;SO4}7 zD&ChXw;XO>BBHL6nM|}j%)AK`7m+|AT7@^UYERcWPINvMqxwCPqAe~3j+BSy!t~Bq#e+n!)ezEJWeq| zxvo!L-laa{PCyS_NL=vaHhHoCa?UAdUC*_1xqH*OO?$AKv&|dd?aXgc6k`&;8bKjB zw-hO9n1Rv*Zny1Og3?jntq;Ysbi8u1KY_LXA3xuLv2!$x6$L@A-MtQ;HPz>%@d%zi z?7<$7pp1diB~O+zj;kP!mxWkEi4s@cIQ|TZgIc2oVArO58>_8*74BN?HTA_rW*HPe zHl|x){a{^y;TS6#eGi0BeHXrY_xpG6wH{9Yy7!^YE&Zw-r=fEnyCbI#VcQpVftI&1KyC3Mh*VK~?^P`b(i~0AyH70WzRLmvt%poNoXm CpZ|sc literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc b/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..035188b7cc136c8332574bd01010f40992da0032 GIT binary patch literal 1756 zcma)7OK;Oa5Z<*N$8noBv`|0-*YQn!W&_NN|qe9s4&92|0A zIvi5P3Sk@2vT>qmSr zCIUbAXRp~yBHoPpLh_;4{1OP+_rm6Om~@+AaL`N#vX{h98!wt!Ao*tM`A1%tXH8X4 zKZ&JC!s5_K2f5zm5}(Z!SURju;WxnI>tLEJ)c=!$z_yDLh_Nm#)GHwJ(ho1}a|OE) zOL(hiTvkC@5E3lct=cT4C}TiOVlIfuc*rHM&BdwBQY(x;W;0o+PqV{xur);xe7a7H zye@?)`C*drb#RzuvpS2SY^{1Zw_G>&BJR4m?YdFI`XTDeuKOK2S6IX{ydhRmAZBp` z#VnZ8uzCW!fECVASem8dpStzo;-7`CTd=bRh$)S2rZN450+E5jKwN{FtPKB4%wiQq zWC}!H$}4YRUKEjAS9*eE*}<1LKp>Mx#HAyet^}xQ)6&&-fv&j`!kFa-^Q2eTR3Y1y zAP%I9GdY*0;s;bq+1$Gr0b4<+MTcusJdKIN6;<$@hWp?#>1K5nbkR5<%T>I`7x7LvD8{8{+K7&{fSyxIzLMwU1Nlh4%_s$R!OAHx zx!F&lFkIkFT&jg4gah}pGRz@bG%Zs^_|=6KIK2mmC}KJ?#e)g9>)_JUBwaLHil7e> zlnDZRW7A=6R;XgQ>J*qS*1$pFc!--Q?x48D^hG4U1%BA53zFLgklYY>+p3#+*>zds q!vs}|FM9YbC}?IDzZPm5l=oaYrxTQ0FN+a;h2ySrFpOorw)z)|vq-uC literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/cachecontrol/__pycache__/compat.cpython-38.pyc b/lib/python3.8/site-packages/cachecontrol/__pycache__/compat.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eba9258176a5715a0cdc7d1d90be3c74570b3b18 GIT binary patch literal 682 zcmZ`#&5qMB5VoCUo9(8h;=}SoG#xEw5F~KF{boq%9^1Vwgt`w68`1>CiwzG;< zR1r-DrQ{We)A>X0ORMLyW0dB&fbVsKs8*R3ef=+0~BJfgXv` zrP`nO>PV$Md%+Q_Lp>JbOOCI5N34!|c5tMSi3xUc4Lg})-`{#AToIFAQL*P_p8UjF z$(**M#;Ny4)+cz*9-p0^J_Bz}?V-!1U%s=;QW+1`eAZ^DRq}0a3+KV%Q<>M&M;puAnq^a7OXcXj_EbZrb!%o2pT8pW+SvHU>s# TbV{#AjApn`lObn+@f7jj4eGD{ literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc b/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a4269a93ab1e9ef66660f3df8b9cfdcef534991 GIT binary patch literal 7749 zcma)B&2Jn>cJHt0>FF7Mh?FQ&yK8jl*yhOmkXOdq5@dO8%GxL^(^`G4cPwktoGK2R zoar7{_fTY`Cx=kLCWip~2L!=zZ{9;rdkS*MAqWEG66Dy|0132*9Fju6y@LOVf<&{;m5ebrzn`xP?*ZJj@nS= zU2ACat~YdfHyQ@+dZ*Mi8>ULMMyK4h8W!p$W_BuFyJ5?Exl`@d8Z}kn>TrTj9;uBf zt_`P|h1wZbVfIs{G4m6JRaxz+!fJf>P;Z=N+C8N{5x-;K-{#JC6!kjZ<_{gW(+-3e zZFfVb7l?>6XDbj+Kjh96ymbWsqR+!9T(zHJ3Cc!YO=~?@gq*n%Z$>emXV=}3-||E5 zhhF6E@f%(%dZvOHZ54W0cU#*W5B5DSJh$V;T*Ox%FD-rc`0CpGuYUe!{c8RFrL{FY z)8oZDo<4glYfF!)n!kH>X_eYq#Jc!tsF=9cafO#qM9NT2lp}Sh9Vr7ffuI)@l$tDc zSsJn|Eht+h2*iwkd56{$IkL z=<>C09~&9FYY#mU_1(_ehn=9khTUH49bjhu<<)oBuvL7e=eBm;HV@ZYv_q}Hk3`T} z%kLd7R(l6&Wi-=s7$KyYDWyqOoWZ?C592>-{V}fa5elwA&lS>f==WJ>u+metVQ^?N zD?e2Z)rN_>#VWF1W;UxrYb{n|6S!B{B%8wBX6M*6JAHMNvE{b769rDlx#MjWD(r;YLBGQsxmM;t$^9T&m6G4M-zs6k#gFQwSW>Cp zMg{?}fnsSJb>rDTq4%?YM&T_( zZJ({6sGEWYNK0}eX;t2uJaXHipe;}BaCA)4IoaxNc6c+4+^8QmTLI%?y_6au?`(-V zbP(sMn5V9_aU!V_SustGRQuMQ`sn*nZew`HHSeB~=X^Z4g{3@u> z)TLauQHda#L-kQ( zgzgr1cKLxcUUYb++~TEA{LX>nZiYdp4>}wo9CLvVolfwCvsDKN2#4{t@VUD7Tzx;* zudc1t4XN8{<)i%;??qnVrzN5msj(Aye!Y_FtxhN=vHsM|j(l1f9r@ItBcGP!kx#AS z$fwoZkkXNdQgdpc`ZqVJFFHQfdJ+7?vnUjOMzz$MW~r8DsD?48PHU%ZSl;cW4WrG| zamfuMPn9S`Y}t`|Px(@XDHnCTt80Q3LN4g!Y${TWm}loYNJ6O$TD-7+LR&^uFO5zE zl5vuwFG2GoxU?+|r6x<%nf~%WqhQ8g)do0bLzR_e34?K@9YM)F1!@B|B1d;a`TSo8 zrKB{}kCgE77k5z8$n}BFOiWf?P^e{4j;C={%L~dQZD0*5KUe%eG?d8LwZ(5#h5k`# zXtG*@5me`=mU;raQrIc zm{i37O0E;fTtQ*&+P_kTGdAjEQckR$%8{Op{3$pk2Go6O2q(k+FEH+Yh4^ z!S`^O$cHz~UVpRWwHoD~@b>T`p6-cY|6q(Hw!#&RPP3ShgRSH)BA!?$O<2hdN2)wm zm!GTeNk=BgO~=c(+E8ZlsC|Fe51#nh!7La!%oDstpy4VGVZ8FO7fSbw$@RHB%P)<0 zg8bcEzFdX#o#bG??9jrUO^$lqPIY*SRB!VrErkF=bc=-7ORb;sgO7v=L~6omwsGo9 zjBobaseQ|5d_QZlAJY7?I;^Vic6qZ|x5Wi4IW2EiM;0OlLLK__zxzM3CN-%-(uus;z*^D29t8sNsO3r zIh%3G?`WOF45ku0nR-XbXMH}ObuF=XjbCXZ<2*l-#X^D> zGI}J@Om?7JmaDjMQhK!O_3y=e1hen*s4sl@e5v#d@Gk5Hh&~AFd6C2SJ%lR+*hes6 z*$Ge=PrUG$3r-(#x#@O7o`FCIzxeyNgJ4&htDdv?TDbTUAF&EWj#utxA(4}vWM|tA zoyEcoFD_@(ayAcoZip!9rdUR&%ox6PT2C0(CM@fs12&gV_TGr+H-K`;$T|od1hCAW z>vaeZ#&5}En7;-l%t50|h{f3g6=%zNt4Br{#)A-i{4f(BEi#wj;^j+kIUfgmi2d$x zpe!Flbq*GfCA%aUP!IALj_Wgr@G68uE=G=6PYr5I4Qhy&?({`_Y=mNut^#vsJOIBX zf6-$gq$1?JR~ky%p!J3m?VqXGuwmutauYsq+qcl-X&$c zLIrsV@g5a2hM+Jfiy;7ZT^6S0C$8`@8(>@+cnAWLsmXYU(>9ZsQ>z6y;xiY{lAhaL zK?pI`A^G}r?hSL1WpmJ4EjU3^=O(npO$|~E(1&d~l~e~r5QG;S)m)BrHX3CjYohOr z6c+7uv)F6#ktENyuSwHr5I$;3%9HMLG80}ipVU6Oh6xI#1TU!8bW62WLpw{QUV|s3 zJNZG}ZCle`Xa=?0ptW==>B&-O$ak8yZs47zPUbC>Xsv->`cp-FVNe~^HMHC0UFE%| z$FHoP2B%pu$(LLy1&E`3$DiO~+?B%hk+VVwx?>DWG9*@@eGKIhn0Jt-{N&k>Vdckj#AsiPpEdRfuv+o6%Zv8ni8K-LHa9x zhN4mR`I7=dW!g)5k8GP|kUI+y#E^yxe792&{s&01PzqZ%hb_Z~(niSZn{eh74lkt# zs$fUaGwEq)5S%f37G$mfOlUhK+p<`a&J3`Ip2^iw(jqeOOyB`K!L;3q*kXVd*oiGf z7068u%_Bu@Mdj@2P>rlaKU8;h(4jYW8lXjjqq3|6lps7-hBn?-C4eBHVI&oT0jxBz z2~L3f->`D-m=QIh#Uywj{$cc10;9whzrz}804;bHzmxNqkVw9rq_=R`w)iia3#%r8 zHL)LHQ6pfkmNU=RB%7DGXre}&|_!*QkUT6w>RBY{r)kr*g1g1Ie-s5NiOG4a{0!{ zSJ`~Q3G$y`Pyk6X=(g}(ePu%GLfjfbln;uW>L`REvz{9rq*6zO_qSoaffM>&nSU%O zoVx|42{v~SAB_Q&`FqkDJCp`OBttnY!YHqW8_y>R|HDtNz$Uk&?fCTvJs8=MLn-pP zx$BX>i6G8Ru?9uHAHOmh^aQYxQRQO%gS)5Wp1k=|;qoN_J03NIEy&d%@d&3+NGa=) zsuvr^o+}On_C`Uvxz@@sNe&$e-sIQ;ZugROFaRO>&_s>=Zw?o75C|W;fJKN~ zR2=)*ku^)pUdX(*7m3TDNOkN`=76PTlh*Lq2L3TIp`2c-hdj!iGV6Dd@~s{lMT!YC zfr(G4!}qA5Ni?R5hQj_eOvISbEpdlvXvhZg21qCZ6rS!OL7nmb9}tJ+CKZdk7UDt0 zAYZ1#3zp3nnr42j>Gtn6W9BQ(G!RSL6i@1g^m>`^vk_a8uS7Iio*^E{XW0~$D$_4a zlYHoflC8~;y`zx|if{3bqY1W1#>J0<%rY)|7w(}L^Nu>~&A4|&ND1$V5HY-%kVRA5 z>R-T;Q}7sBzf`vH&4B4oE!ZP-SUFN|Ac&$c4fYLvnl`u@!)lUot!2R^StRK*OYyT$ zC_=e>>22o;eMsqa9HbiX2JQ=K>4-EaPXr)LaU)4Z${GbD+t8=e%blPv3donGIq0(t zzA=!|prZi(+wLCde8e%M&eE{t32#aOIed=`N`3&bAuw>BY~!QG6aEG|;=2uI<~!uy z3EGc%w1WudBwq%i6N;w_y*Rc=;vwYRqGV6;Bk9vcsvf?MB2hkn1=%+Q`^e@gN6Mco z@Q{>7M;`DYGH_pLlrR^R@kCD2p_`s+tCv!BH&yq(R2$QLzt!n8&I*klbNH2OZSLbV zitD?WL`dMs(2&&rI=(_jc08$_NwnFb*95OJ6<@v92_Tj5`s#?2n58*PdMoQX=t6!$?O9#HX^3i?hkW@IE>qxFdy6tCb4 zsQ^fpUzSjPVOyGN&*IXpA6bDlZGR?d>*vHSn$t4n<)Hbg2J3YjZ^TdOb(MD!^RD(I z56O87LmIP%J6%O;uirwv&qEo-WO$Q|MWa%L%{=?|Qo%93E%Sa-AkvnnO$L0Df|b*n>r-vc z-5|}6xY1JaGu};fzjOx0P6feV&OHl} zK&9O_oa0Fz@{cf?wr1p*97C0#L~r1pL*m#;Y<4KY-&>NiKgcxpHo=m9e_5}nr}-KZ z1etpLW$VSFJYE@7n6h5g-wpLlD`t4Po?f>F0k)z)5|!0gps*iE^907)HQde& z(yIbn_kk}%d=V?iwTXdJD0fzu-Ey$ZLpbtgo`8WIx-wMK$$Ko#=V0|6QuKdEv(GzC)j44))hp4~L`}s2Oc5v_>Ytf?Eh}-iB#KOwH7PoOQ z_@m@G8dmlwjRLJ;y=}3pLJg z-W1{;yi#*bLkLwQLYNIW!#qH7hYDlsVJtzr!-r1{rliLg(QrMgMa}3zv>rzWb?`8k cEG??XxnBLxc*QDjW%Rs4_&q)aK6=gIU+qE)$p8QV literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc b/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46527d54b3af1029c4bfef4b2dbe7a9387d1a1f9 GIT binary patch literal 4174 zcmbtX&2t<_74PnuotYi2RMAroZ0n z_j|v7`}4_3pW%sZFZkkR#{NYwCm$OxZ=)m)2+1UGuv%X88aMBvCQNPBEK}Px8?|T@ znoiB(Oj^=zxJ|F-HH)=k)35pXR*=qPR-2Hn^iY@HXR;{$$4vUs9`nA)E>)VY;7t`p|G)VV4 zQJuyOA8Hp+?xG~q5Gfn*j17e32l!!Av8)SWQjcRS?W|$j+l#umc6(7q^|r+NQHyHm z#Mcg)Dq)E)KU&yqH=~7SSEW%eTzD9(v>P@S-f6Tq78>!|LT4}CY`1RBzp()Aqidb8 zz8!8v$wED>Z(`L}s@jc(BvNtMhIf0)lZ>hWwgU7CsuQ zs5fO9+vfvLR^>L?-E{qpsxWi4ldnuhB*uhXOk$>7p)3PZm)-(w7scU0ITos6APhQ>cq_TAoAg8w8x! z{>t!N)N-AmIDCp|P%$=ZG+?vX;`_XBXMo|hr>^21ewE@g-nUX~fbR!96G1^*nUy-Z zVl-#q9u?`T_MU0py3HWT$K4gVGivRhS1e4B*Xw~%xiF~*WE9c^tyskXP;aZ9_+WP{>Y z7mTUZqPCN$v94Ve?Q|my{|2q`3WS~>x+fUgY|AhWYh~CJM{@Ml$-8wauY=vN(Tz?W zzPgSTFQ6og5RCi6o~NIi5X#H#_G+bRtECVqjO(mh{1jAu>ugM1?=%fzQ-qw zwE5V`s=ur*Lq|mx3_)@Isd*y-h#0`U_4FAY<>FJ%4;t-ICc*A+`c+4LAD^`UkWTtt zrP|7{oOa>oFin+q*4wHXrn>w?yv1wXG#^#9)eTHkgnvbjs98YoDOc%&+2})bCxing z;1pZ%S-8Ttr^!jy1xxTbQMSgMVy2Bbg&Z<+%0KZUaX2_c5ra%XKeN(Wfun|B2ApW@ zQN_5)2JxT=4zUgd$jVZe$x$n8=W-^b4brk?0i;z(?fhLjaGDFM1dU-uurwUyZwvKX zyj$cf&N62>c8T@MX<^`Gw1x{vT!y<`xa;q^yYjw)CnxAy?YlWV(&9R(ju`)m$XEKK z_?#}Na_?6U!Sm~Tm3CKEDCjFkK~sSr>YJ6YB`e@P1X#D8R>BHGyiw_@2Cmmze&y&n znFv(cYgWY zXJF>$8Tm#YEfvgtzLN9kMQ(KEWNrjfqWr9q=SVG()X6+4hy0H*@44z8qI0CK;hSm+ zsRI%lgFbEdz*yR+OsSQ7*Og0?h;%@l)tMg3BxDmbO^8NLlWahq(|_)NtbqV z34#HhmvG&9)*QwCSJPksPxxPz3TMLg<``W6N2se0UZlgVKa&nG2=7~CdyR$nZA|UW zq-+b}ZE|+x8Ye>hd*i`yGQ_Kv$&M|MBm#Yb6dVuq7a!c>UrFgs}^GA7TGM`_SU0}>yM7UjmxG*)> sPELm=@ik~8jA6`J`{$}jY%jF3{Yhu3s%?SAuoT+8#oa3}F5EN0=kd~H| z2F?s?qcTFCsYIpUX&I~N6Uq5sipe=0o~~q7>s7aP(3$s2_D%zaXCIo%jZ4L4#WD54 zW=Mj+!f8Juc&f-XhewWlBU|R_f%>$6=I9~ysi&U#$j3hMnWDGpfqU|UDdzc4M#;#d z2aclRB2R{S6$GudlN&pnSPhLd&0fPWtMv{V>zZnKTpjfq4eQECYlkP}E_r42y49}k zl-*~wbNw43_B;@aERP^U#ehvDWzu%Lt;=U+Y&9N`j0Zp*){_8ffY91Ae(R8gM&l#D(cL!ZcT+zd=#kS7)z`GPJOEO9l@ipwHco{xfm e8Rbr3fw6(VZ9BCy`d#=G_7nlnObDHffBymLoSIqy literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/cachecontrol/_cmd.py b/lib/python3.8/site-packages/cachecontrol/_cmd.py new file mode 100644 index 0000000..ee8d60d --- /dev/null +++ b/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/lib/python3.8/site-packages/cachecontrol/adapter.py b/lib/python3.8/site-packages/cachecontrol/adapter.py new file mode 100644 index 0000000..de50006 --- /dev/null +++ b/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/lib/python3.8/site-packages/cachecontrol/cache.py b/lib/python3.8/site-packages/cachecontrol/cache.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/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/lib/python3.8/site-packages/cachecontrol/caches/__init__.py b/lib/python3.8/site-packages/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/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/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..544fff1e04b8a22841f58bd04b21a5e60f24b0eb GIT binary patch literal 267 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 T4|q$o@Ck5j(RPB)#)JO@swCnf literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc b/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e788cbdc0bc6c21619af47b83e0d65031fbe8614 GIT binary patch literal 1527 zcmZ`(OK;pZ5avVD%9~xseI@CsEYOR9c6I0_hafGI0!@Hm4>eMt0t!J9X|Ectv>~Y^ zUMQ#dhj@?vOS<-yzmQXAC=1>iDFKp04oCBS^U(A8d`e(cL7YG1g#3$#{Sm<7SD5xb zERsm7$(m-AqRcc~vy6F}YrYP$fRf*d3}kptWT=AoJPT!XOp?h5uqFxZV_ChfY}M3W zE}U}JT7i7pFZTza8W21LL6M9~k}*joJ0}^JTn4ZQ@=!){a!$ctEDzu& zl2dsL_KBRyIqb0v0mtor`iGL09Xzo;Hz?zL4AWvrI@*yOSRRv0x&(wl+0=Ey`oJoE zVkYq7l9&V7KK_-inzc&Tt#N8wq<>b%wS`U}>E<-m)r)j<=2lJp^WuJLE2n%%?QV7e@^JjQ`Ce%!l#07A#@ z*Q4u>?VwQVA3E;X1>cc-F?pQExYuQT8Ui+wcab#Q+c*&?7dZ+kKMY z=Kn)`1V$sjoo|T|_f>c!sWjj;b9i{u_cw5N2j&>sFZMz^n3WXN)>j5Uq}!uCVqX0pUdR!r z=Y=*`*nja>qP5Bj>^xN>5V2_*4J>{Xbt7t}q;L&TYXCQLx_-D=`gkXFC#|0e zVDcSY4$)^fK!P%Xra!>`tBbYD^M0D=>qfR3!)=6&&JUzU4+jD 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/lib/python3.8/site-packages/cachecontrol/filewrapper.py b/lib/python3.8/site-packages/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/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/lib/python3.8/site-packages/cachecontrol/heuristics.py b/lib/python3.8/site-packages/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/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/lib/python3.8/site-packages/cachecontrol/serialize.py b/lib/python3.8/site-packages/cachecontrol/serialize.py new file mode 100644 index 0000000..572cf0e --- /dev/null +++ b/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/lib/python3.8/site-packages/cachecontrol/wrapper.py b/lib/python3.8/site-packages/cachecontrol/wrapper.py new file mode 100644 index 0000000..d8e6fc6 --- /dev/null +++ b/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/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/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/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/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/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA new file mode 100644 index 0000000..e897b3d --- /dev/null +++ b/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/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD new file mode 100644 index 0000000..a32f1bf --- /dev/null +++ b/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-2019.11.28.dist-info/__pycache__,, +certifi/__init__.cpython-38.pyc,, +certifi/__pycache__,, +certifi/core.cpython-38.pyc,, +certifi/__main__.cpython-38.pyc,, +certifi-2019.11.28.dist-info/INSTALLER,, +certifi-2019.11.28.virtualenv,, \ No newline at end of file diff --git a/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/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/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt new file mode 100644 index 0000000..963eac5 --- /dev/null +++ b/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv b/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.8/site-packages/certifi/__init__.py b/lib/python3.8/site-packages/certifi/__init__.py new file mode 100644 index 0000000..0d59a05 --- /dev/null +++ b/lib/python3.8/site-packages/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2019.11.28" diff --git a/lib/python3.8/site-packages/certifi/__main__.py b/lib/python3.8/site-packages/certifi/__main__.py new file mode 100644 index 0000000..5f1da0d --- /dev/null +++ b/lib/python3.8/site-packages/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8d0faa7a3037dce25e8cc5f87b4e9cdade50104 GIT binary patch literal 230 zcmWIL<>g`kf=m{UcoQJ~7{oyaOhAqU5EqL8i4=wu#vF!R#wbQch7_hKrWEF222GZi zj6f+(##^lA8L367Ra`~}hL(DUhI&R8ewxftEXnyrsYM`TZgI!Qm!%dJXXfX{$FF24 zVgZVQiCH0aDN%{qqB^mj7#(Ea|#hE3k zx&?{J*@@|?#rnyqMJ1VOnfmeZnR%Hd@$q^EmA5!-a`RJ4b5iX24z_z)QRC2xp{ zUtr?W0_v0Q-JLDndwR3+I70xHr1S&&XTR(sg5?~_9Rdk7M*@pT<2e?wNM6u9645m( z2J2bIrS+;(Ww*+n|B+=kwQ_l5#8S)LO24$N%Y7|#)jH3#W?q>#*M@HgQ{|lXmy zW%dQ4Xv%y31BM}nx`c8EKpx%W*T~0j_zBE`nP|E`BGPl>oF@G(M>w1O+5;WwN^X6T zgvhv%bj;UbD3onkBST7QrL?59zyVk9$PPi_`-;@2k)&B#FV~FRD(ja_lM8JYM5{Z} zt$c0TjPf{DCbb$ZjJc+*k>@gu!DitsM2v6Ci{~k==)0#9>IOFq~4`2flgS WNbgVzA0a*6MtRmpusM?KrST8q{&s8t literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/certifi/cacert.pem b/lib/python3.8/site-packages/certifi/cacert.pem new file mode 100644 index 0000000..a4758ef --- /dev/null +++ b/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----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=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----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----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/lib/python3.8/site-packages/certifi/core.py b/lib/python3.8/site-packages/certifi/core.py new file mode 100644 index 0000000..53404e1 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt new file mode 100644 index 0000000..72c87d7 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA new file mode 100644 index 0000000..f1f13a8 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD new file mode 100644 index 0000000..93325e8 --- /dev/null +++ b/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/universaldetector.cpython-38.pyc,, +../../../bin/chardetect,, +chardet/langcyrillicmodel.cpython-38.pyc,, +chardet/chardistribution.cpython-38.pyc,, +chardet/mbcharsetprober.cpython-38.pyc,, +chardet/mbcsgroupprober.cpython-38.pyc,, +chardet-3.0.4.dist-info/INSTALLER,, +../../../bin/chardetect-3.8,, +chardet-3.0.4.virtualenv,, +chardet/jpcntx.cpython-38.pyc,, +chardet/euctwprober.cpython-38.pyc,, +chardet/gb2312freq.cpython-38.pyc,, +chardet/langturkishmodel.cpython-38.pyc,, +chardet/euctwfreq.cpython-38.pyc,, +chardet/escsm.cpython-38.pyc,, +chardet/hebrewprober.cpython-38.pyc,, +chardet/escprober.cpython-38.pyc,, +chardet/big5prober.cpython-38.pyc,, +chardet/langhungarianmodel.cpython-38.pyc,, +chardet/__init__.cpython-38.pyc,, +chardet/eucjpprober.cpython-38.pyc,, +chardet/cli/chardetect.cpython-38.pyc,, +chardet/cli/__init__.cpython-38.pyc,, +chardet/version.cpython-38.pyc,, +chardet/compat.cpython-38.pyc,, +chardet/sjisprober.cpython-38.pyc,, +chardet/charsetprober.cpython-38.pyc,, +chardet/langbulgarianmodel.cpython-38.pyc,, +chardet/euckrfreq.cpython-38.pyc,, +chardet/langthaimodel.cpython-38.pyc,, +chardet/gb2312prober.cpython-38.pyc,, +chardet/sbcharsetprober.cpython-38.pyc,, +chardet/utf8prober.cpython-38.pyc,, +chardet-3.0.4.dist-info/__pycache__,, +chardet/mbcssm.cpython-38.pyc,, +chardet/sbcsgroupprober.cpython-38.pyc,, +chardet/jisfreq.cpython-38.pyc,, +chardet/cli/__pycache__,, +chardet/charsetgroupprober.cpython-38.pyc,, +chardet/__pycache__,, +chardet/euckrprober.cpython-38.pyc,, +chardet/big5freq.cpython-38.pyc,, +chardet/latin1prober.cpython-38.pyc,, +chardet/langgreekmodel.cpython-38.pyc,, +chardet/cp949prober.cpython-38.pyc,, +chardet/langhebrewmodel.cpython-38.pyc,, +../../../bin/chardetect3,, +chardet/codingstatemachine.cpython-38.pyc,, +chardet/enums.cpython-38.pyc,, \ No newline at end of file diff --git a/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL new file mode 100644 index 0000000..ef99c6c --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt new file mode 100644 index 0000000..a884269 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt new file mode 100644 index 0000000..79236f2 --- /dev/null +++ b/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt @@ -0,0 +1 @@ +chardet diff --git a/lib/python3.8/site-packages/chardet-3.0.4.virtualenv b/lib/python3.8/site-packages/chardet-3.0.4.virtualenv new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.8/site-packages/chardet/__init__.py b/lib/python3.8/site-packages/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/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/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b796572ffb38f990c72abc67260cafd5a209a44 GIT binary patch literal 823 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 Q!p-}JUtW|L(PKpWKUE^3&Hw-a literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..394bc06c0301780a59817e877c6cc40a734416e7 GIT binary patch literal 1107 zcma)5&2G~`5Z?7)+$brfRe=L1I7OoM0V;7o2$G@-sVPVi9DG?h-fgmCZHL|UAyIFs z)YmA-zLF(QoOlIJ%-D@;gpgQk$KTG_^YhK@r+&XnU`a1z-vdH^;Gw-dIJ|*vjzMt3 zsUjJTDMjokCv#)B#;)=*KlW?vsUYjb9ZF6J_jzzhcp&K7jYHmbBCF4`wor{iybNiv^Y-4J)B5UkfAb4Xr#Q)H%Gj z7)w=R3}ZLs*J(5_G7)8^wqlh;pQW~CqN1THW|5N9XtA{OB7c7PGBVPNgGG{lNoK-C zDKv)*8%?47Mctvp#Zrfm$5Yq_0ioNpOGCQayW{9^Q^#LqAz>r@6>H%XNN~<75C7CV zpwT@PHLAsZI95H(0*YgKl8FImj01u=tB0+K?Qi}sYG;JAWyHS&hbqZuB@l7Y3feAn zV;_XrI!uqTs>@hb@KPb}G4>URZY(u#RR}yn!|hVnWN cq~YY%u3Nd>H6(o16!`ivCWJ%KqxIwd2E0565C8xG literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2d7ed72062c0585dbf610c3388db56b448f7be7 GIT binary patch literal 6193 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9ba58a22ea409114d783566609e24461b65a9f4 GIT binary patch literal 2621 zcmbtW+iu%N5G8e?D8|mkMS-Gd(S2xv3TP#ueJR|aur9R1Sf&h-4jR5tGupY#j8&#a`_i5w$ASD4Yxa=Di?GiP|ZyK5-WqKfYSqAAMnXk2X- zFb+V(6cklFrLRzxmR>2e#MGB%uLO3PR=}=Ey9{=fYG7;9u7F*mI@r3jt60jDe@ z^B{a0Ojy$}_Jcf|rhK3Df`oM9AdyqZ*EC3)XB+ciG7F-(8K$#_5yB1MXew9-AmTGn zOz~8>e~GGInU=f?Eqhg3@ibb6^J;}*CG$LUvLIs%#~{$$X(R}PlM~M7oC%g>cn3yk zbbih_m_*=oK?0H|(R0Q{5EHlq3$v7y5Keu@NR%|?YD+kRvcwZDOQ7sVtn@)GrePHz;_?^eD`K!WrU}35L z=(ncnjJ0MthwB8bM-k6p%~mH)C#^U-Yt1hJ+T{D@4=oX8?AtZyqP6xy3$HDj^9zm# z)8(;v1^+BnnGj)o(%Z5K6rX#3rVM@6|k7pY$mUBKN6?RT|dKM*qI-ZNdZ>sofd z&<}^FcF(umLbHdie{5b0$H%ZN0eLe*arFOza2$lwC}ArQ><McyWZ_r#*= zxb2Z!RL#+7IPx^hb>0QSCve@y76>@H1pzP;#0)h+^gpkwZJdNY@1;m*oRbbfXQJM>qCP4nkzi)xG z#Dj+z$D4+IlrD(CT%{_IM`^LY&smo9MC=2HGXhkG;Rw55IZFt{JxO^4>>VZY07!XF zeg~G3Vb)NKau|y%A&1FV>`hqa!%Y8jfgf>u3~r^o_-Y%V=Jp$Q!?-r~b=&N>UF(tQ z>8JLayN6b1G8N;0f%aEEFACCzX>&sX|CuS*pGhp1b6DV#NRxuOuqaz{Rq3w=_0|Es- zOcN1NDBl!#aJFlX(cN-}8(C{P`WA^CM4l z9v^px1Fzb%`j!iPzS{d*Ct*ctg9!8+I7!>kIA7HoT^5%@OV6IbM};iAlHNJe8^`pP dzLc}C+n~_zuf8jOLhs65Dz&@yyLUi9{|7)FYr+5k literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5939d77482cb4b11bc86a38067fa05ce458eb043 GIT binary patch literal 2606 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 QzQ>A^V|A)xAQV66Uw4B=>i_@% literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75e07b729787651cb3f338b9b24fd4192d3f78fa GIT binary patch literal 12036 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 KkUC}RRR06M1xZo> literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..556a27ebbc33e434e07b526ee6985e67aa1b228a GIT binary patch literal 1115 zcma)5KW`H;6u0kRt|2X@DhMPdm?F{M00RR;(6nMGDX38yZm}+Blbq_i3$|}a)Gd|z zHOkoU!{n8TufW86PODypknqXxetx#!pWk~vSzqrG7)21X9}yuxanT+DEZ)J?`ye>s zRFaaWlp^+|SNf^%urGr$OhbnQ8I_&1L&*oiLmr(I9tpbi)0lTgq#ysHV5(2;qhTXW zu{SqjFwN9Rn9r&n3k5q{gPIrBWMncUhFLx>DgoLj2PcEW#2S~GSwh#T6V;ddTN@Uf)9mg`OCJm6W z({g$z)0+eR80&}eF=o4rl{If9;vQq)fbG?eybF h9TtHV4ef^Q=S;U^xvfb2W|iRErx*}6LXW!7{{t>i2-5%n literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc9d061fc6c112c5bdee70888ad1e62511f5d3e9 GIT binary patch literal 27156 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e6b2bae539cd8fdb3686022d8f8d5cc62ff2d1b GIT binary patch literal 19080 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 ee_b`DIuIUZ?Ccxe9 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 literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/gb2312prober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/gb2312prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71d61b684a7e5a1151f1a6294827b09940d4c91a GIT binary patch literal 1123 zcma)5%Wl&^6rJ%aZj?SKDiVkdtcV1)Xj!m82%4g9NI{BV;myeLOcRT-9cIRhMBSxQ zf1@n>OS5IgFRFSV^%2129lZJ&3@4mQ zQqq)C^gZd7e(F2lmq8h(q4NV7m7TOh$qC^hk1hz01YP=R%sV5}kAG1J)u;Bsu#u)X znj0~gW@;qNXH}1df}Pz#&5LR>GMN#>ET0yYfYnDQM+b*54~`3MR55N$QCIJ)OwM(o zVRyUTWuqY*emef}F^42~hJQ2DufP!`rJSVRB{`#L)0(ks^7}NI)}=_wMj5fllCOm_O(v5gSx*vKjFZ{iOzY}!|8=4ZBVNq1{985= zI>~_|E=)2RBL_3b)c$O)VyNUPyc!)sw`iBfbg{RN)BdWLzW_tf2KY1f!zlpao!Y4V zSM9)>>Y;I-GxuO>dsqv!$f~Rq&tOG+V2HPPcqi-nssGE|8KBa%_;>19X4RwtK#<{8 z+PlrJPV{3W5ldvub{Q*c-bnO&jC}{l+Z~6WjR8-f-pti~h^zL%*v%W(av>$i;1+`| zJc2+tr91&g;}wo+FY;*D_o!P(L2Z}g8xUH)6yjueTN!D*TxEN?oXG5s<9JO|t;`~b dqCs=0K^Jb literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34d7056594e49f28571298922f1b8569b3e8d8d0 GIT binary patch literal 2996 zcmZuzTTdHD6rP#AuwK><*KjSl^y)U?rYQ++dL!TvtHDH=q|!>&$avPqU~DpLC&hK7 zN7I zoCeW_jjYUg)jP7X?n$U{P%4%SnQFG`<)Bm7qct^u9|VuMR1lX5>S}_)%$jQm-8F^b z_6XCpM2{O0mTQZM+be9>5xs6yIBrZt-7_NQ_B|naD$a<$JqPoiE${;dLv>&Ozx4#)Ex!+6)~mcF_6!R^GY6nLUiIzz$z~U&Mj|U zdJn_Z9sLSMAN_{#JHj6be&AdhhP8{z8-qE^mBdh)4H9?tW3|%&3-UF zS9cy3%cAnopT7Lw>}(Eqv-O~i`-GqW2|$%pX@fjw`|N-qHx0ryg}OpRp{cM(q17P! zk+5%u9MW{$4h+Ax<4K8(2NvhWa78tDD_ijV1R5^9YGOmt z6#i;vXIBouI-lbH^#KqXqh`ljAMRvzrnMWVNMJB@0VkOR5I_MBkqQPfQwT(WqiE?P z=t7>;^Ko4cf+U9!h7rypj3Z37;T%e10N=sqTL1*@(@k0*=(0_1TCNo}*bn8lVYs@6 zGOU3nK{REE#L766BT&dulr=d4g&S=W96Gb>g#3is3EP5x;EHcogjWK3F|z$H>sr3A9{`vgPmbjc; zZi(r;>A(s*+(`z#p|qBnUrZe`wbp>B;{K$)U+o3i|S5MZw%pKP)%CI_(0K+V3^pa=93ZO}#X<+qPm19CF7mys8cH2D4i*&CyT^&1!j6>jV~vI;e4?Kb$p{(*x>8CRgYK7rQI;}-o~*i z5>;R(P{rsBB8$njN0_=f`j8TGYfX22AISHi(JSn}G zY*9G_H99i4Y3!Q^SoUBEqkucmtSudRQlpd(qlgqxgQF;LN~CORs#lz)3-EjO#3L_q zSTM4jO7k$n7H-Y2^2JnUZ9ct_33JYx;9e?ox4TXyq99g) zgp#Y2^F`s6bDl~}!2r&^yt0_Q-JZ6UtSogf`L%V|QfUaJlYBUs{4w>Ev)kS=Sngwj zCAvdxNKptVqo#9)E?&^r@Kd~C_y`J~$kKrs@)_FllB^zBrEIxS zgTrYY#``J{vJ)Am)#KD3+j$++0k8uZvdT6!h{TJ?)e8-4GXxOsVqv~F!+ifP3{;^Z zFQbH+N?t*DiK!AhPob6SmIxl}95Z(62vXq|pTt`OZZzB)Y>r1mt%S0}`F%L4!xs4} z{^}is*AVbpDPKpJM!>LV*Q5*a|qWE@Dx|aq`ZidiewePv!DhR zoJ?@1sqV__*!nR7E-8pMZx%VPRN}nDZSWkI>g+{Izk$zxAHZTdJ@p#8p<_LBY|FNE zcw^ReM(uIF+kVIc{;9(Rbq7Eb0_&r26F)(#)XC~l GC-*;Nq@m0J literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46ef9e4c1953c380b351c66160060f641cfef79d GIT binary patch literal 22108 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 z z?I?liXqJ@@sPV%eRA+x4bpRgRbKfJON~oGpMVv-l*i{OMbS^n@7Vr$+6bHGEu*s0R zUgtW^y&{KkhRk@-%NL|6QV1TVsn$;r2}_{|A?A>zIJKG!;8KS<+FZLEANU&8`!1C^ zH;T3rODHgsoQ5`Wu0u!=PJx_YJPPK5Qdxu`h_I1X9}r~jQ5fJ|P>lm@b9Lel_hhjb zzOWo;*byKMB4@$jwm}u95n^0<2x+4VJ@D$HfLtHeWT3G5PNAvbsb zs4Cack>tVw7?Pq12%ah0_Z-Ol!agpCE&ET~=&T$mQZ5`>&H=+L;oF4_)qu1I~h1qF0uQy-9Zy5Z)am4pW) z5a%^y`yNJe5Lm@iTp(~zsRMoXdUD}50wG6-GMvUBXAlZjM%X+$f(%*kWR}z%3N#8A zVq3G0`hZkZ8bu=poLU9L=zy?da6s?^3vCoiRdQjtp<9Lrvx^DLg!UTZK@f6+B~_%W z3?gll4+uu3?ph#dcBuXg63NLzYfg_wLJi!6YA6W_I0+mX2ngL7XRt&=JaZNtY0mAT z>QciXa8y+#*qk%0;>ibuRSG5y5ZYwPkopOt(Gs2tg9jLH3{?sA9IscZsw)gK1VV4f z1L2$XUaT2_s7^Xr@gQa1K46I3d!zDN;EoEK4nV0qhJ4h8~6^@r0B@20^91 zhTz}+T{R8I=+ZyKjfTS&rLa;oJqK#_9IQ#oOf~}G(^#*!-Rb{XGXk)Q~ zw6wKCpmOtI(NHCHIH5=CQpp)AToyfXXu-fN1irfm)dwV!MtbyuR!89}6Bem#vjbAw z2q93W!^MRhA?F}7EbwWp;!$uAIYM)DLknsS^gseBIR)V<+?7iuOUBg)6p*SBj>qn+ z!8SX>0eNUaLtqXe%yg9a1Oriqn`cf>k>CtJl?NZHWLBh}q~u(TZ2=O(EV4czx~c2= zrf?|Stj>9O7^TwzfjQ{OQ7y>~R6t~Qt}C&_T_6Vp0!EVaSZo6q1kt8Gz=l?3!E>af zcvKmVfdExO5MVnpSzBf*=SSRdAtAeY9D1xL%lH z0WZujr0O7NDBK)p6Tns}WK$oIN6E>CQSyKT;tilmi05Q;6j+HlaGKB?23eKfUbUFB zgQ^fW6mSS#IRtE(BLN!%k>1|m3DHw2U_v}c=G?&p63O^5N=XiIiFjyW3gD2VEp&jx zP&L$(1&H)O7%2e|mn|u6_Tqt4P$`6&f~4f6a-?8L?Es<{JcJ8zMzfgufTRr`8XVO$ z&i-&ns9^wLjB0?m96QKi=oM!#R20Zzq&F8JgaIc#UMY09R0Ru$TuB;KY`4{r3k3(c zatAfbstLV~B#P$-4+(Pl4#*xJx$ zhXwVS(`!2F11iBwIVjYC2hN;Zd(>R$fX^4DEDRUy`vK35Dha0=loHAp=ncWyi%0b* zG@phb9gvfm=dzXV+Q|W7-!SC#sD_+W;>eW@(*ivrC8au7230%6g=s*ThOug|o>dp9 zAaWjQ$#dmlZ2|1^GyTCQh;DjH2Ejt`%*h>w0wJeYqKCjAZ`HJ!|wuBZ$M}ZlfjYGqa)-9(Irlgsyjo7QXt|C zLynQob+=%_Kq|9ds47xEz=VioxN^;@D)b7rw*lXEKp-8(WOC@5J4)4bXqcjLCBY+f z&mANcxe&^%hk8Q6m-r^r(iFgtpSo00}b)F|N}b9qy4z@i121Jld=VY07X3cxW~ULFgqX z1P{|_K6pS-2*N|F(o3Ug6Cy##xlTPGbSM}PqaZvXgc`wikYlmrN`sioUdoIYz#*iA zoHN1_N*#bP3Rgim(hNxlMAkKV{mj7#54q-e_x)*=oLWmBgTz4v4rAyH3T_3x;wab~ znAsjj+U7RWYY5ogvPy5*Zu!75Tq-;}00YrT0GLn(4Qc%ZIRK^IR++5>&U9@0w3^Io&JynN?s-z6kNP2f~eL!S^ z!x%iPcX!YBm!Uy$AW#T6SuEf|rBRD~E)f>O(x%88*&a;vofR)iwXMdkVQd( zMFkC{J|Jl+(MXOSHozPO=cy3SDS?zi=ye+O_Iji2XjJd}!*!{uG)N6yM^LIXWvC^9 z<-1R^qP+PfOtfyy9jfRr%J(x8kugW`hifuz+z}es6yZjaiu{4XUGQF zK|yJfilfRN;LQcoD<3$*uz&IeFe6nE+Nd@i2M?$;Djbm9dag+iDj;)BBV_irBs}~e z!$_Iw4Sa(2&=*2Avpp!lguMjE4Cl%hcAA1YJM^Fz;yyQfP#+LIBJms`j|!m>q8An> z4hVxv%Wfpi-d}(<3UW}$Q3wYl0Uk4G(>p@w@*PPI7L2O&oZ*Qm$c>N`PeB<{ACM&) z4NIPa^;C0shd6sn9jpY1E5?(+HmORGQir|&XCBhr-6N>Vkotgthy9R3k14^}rWYWF zD1^_Edg{lctwc(P5MMeDn(J{Qk`lt_QBj>6x&(WfM(ErS+6IIfHF&=@y-owG-g6En_9;6lypYhpM)$H~1sE#@}v(yJ958N!#DSA#J z7r?fayix~RC8Z7HQ$U*#N0P&Mr=0<_R1#PKOsH3?(n~=w9TZ%uRXp1OBT_?--q2>4 zAqNl09tY5aQ4Q6SLLlOt2UuOw>xEvx7+E9$EUBIlbIx!bcyo<&86*xWhvNy>vxA&x zgGWwPdbAN{Tzx>2sYcH#Ua3&Zg*JNuAGJdkREL#FD(+|M&0Q7+j%6++2+!d9fM}$y z=T?}*(*PlK^Fo`tN^RuSWf(|-I1N%SqMmJd;QSpAoU5b?sUkyFNJ)V+@a)B-*BlTO zV4N$n9aJ-}J|IhuG6&qD4q)xz$T>=nsw)XNXM_%LRE5BzK8KS-q>#{N)pg*_H4+4f zOAw-}uvhe|3J(Hvfu69DTOW`hhnfpsNkf1T9)YUVM$Q$_h5T>m=aPPQ1$HfH4q+Ic z_nfF3kB2%BSa5D^mSy6g|@O=PyQ-IX7$^b$<&EYw!7)bR9F^#0zf78hVV7AO& z=9Y2}nk$X9QFVL5aH{T>RPKuep=xjNT(q7La)x+0SHI#y$widBraS&4@32mX(s8(P z5G_3XH^1m|KO}D))pOEEEV`f}|?2Lw%u5Rn4*vJ0K;6m4pG% zGD@v@;H;|EoK(!9U=`A^h*Ay~hldVlSOAQ1FI^=bZFsgB(u-2(hBoPgf)LUM6`nKl z+=BubVEI5WN`u7} z$wG&_7W65|8I9cffan1U51zTXqu`;6r(u+m@W?4HR2>dqsM@N}0V!By7!b5NfC9!GQ!wTNfe;EompMHJ36{k{ zY!sm#gn^0>Q>xmFC)h%1xK%t2;F3s{GQ$qSI|oFzbOX%U2qOiIt0Pp1p1PW$v)?VG zS7umKOU_v}Qpt3D^&Ilv(-1-#iKzc9&(F8D5;PeR1 z(E))4a)hBuXpT1J1_Hr)lG=u6sFqS&m_ZnNZPRluIX8^$3?l_opd-(y4@g?;yiqLZ zNfu;Uz>~^eJIvV@a-rZo5eJ`x=m2MLX`}>4^_)@aa9XKqE@(NNG*{~bve9GFb38b2 z00YPY24@aWgG@KikwC2CQN=)tVTNFE6d(mmH888d0-jo6vFb=>KtRrs=4c~SIG%=H zAS{8o8gLR2HXZc=0jK1#mbph7SqrqMrA3kAZtISSGT zWiNsTX@LaL`7Cfn31iCbI5CX=S3u_AWkSYTf!_XTFuGjt0Q-+I%-Vi>Qg$G1t zS@6^sJeDOS%*f#S2?|Jh5E4eYgNz~!TFI4+E3ryWT^54p+AX*+wcugsz?chzsKO#x zQmeEvmz)X=nGyC%g3t@jxp+z=RP(XoDZv;T%`rJ#)1aCG3QdcRg$ve$3J3-kd#M6exPro>1?$nsKJ%&h`;rwIW=NfP&1P2%a4o zvYEc``pV7Er0?^SU*-RR>wYUt@o>bwUmA? zRmZCn>F4okxjLDCo~TY$_obi9)#>W~^z&r(z*=kN!RaHfY+T>i8IFhNcXuYkcPG#8 zY;3nFZHh+0P2kr|x0d= zH%5b<8`q|%2iqIt$t>O-Rm0JAVNmVv45tgDw1~;=_Ov%1ZeP0H8vR0&^P`u}y}f&F zc<$Pb(PVgYuv$F64b%>8;K_u#P7MFRUz%PNtvJ`&Qq4ZE)d*!TDz|KL6r{ zH-39`DrHCaWpg^4`?Gm4o4hSE^KkYaNalm|JSd+AbX>Wx#M$r6WT1l`_AcGy{dDyJNjW_Oj|PZdaWyIW4@hk;2>SCEBSljYH#%Y zDtUv}J89mP#mTYUai(>vcc!(_I@8MdZtJ@#PME~YmM*N${(Y^y2mD$0;!1zEWqAju zOP7a}0hevIne6!euRZ%)gEyXkb#U>eH=bX6>B6hevFFoMSFV5ae7Ze%o~Lv`4`q)2 zTklPVgYjgvzLc)%lo-ZmlgU@Ex3t*qw?Ci0 z`|acHe&>PqsrGWpciNA&Z$38f*fP!hE10iy+9%HIYHzJI%88ZE>~1~u{OW}_UwkPn zws4uI_g&td42CAE#lwVf)mB$d<#*Z6#b2I7rL8a}! z>E7=rZ|_gD`Il_|GZ{V)_CCttkCItmIRE;0zV%H$8}|M&Xa7Be@^hM=&b;Z26Ty7QaL=od5M#CVwAAQksy-*dv1$j{C{r0;Ql&RY2a>Ga!Ark`ii8@|_F zPVf4&?d8tR$4jTxd_1L3t*@r`(XV8)l1;v9)Bg3*Zn~_K_eSS(F3(EWb#^f~huhor z<>ZO|dWN7W-|fFi-{bsj_S?(7PWyP58^4(ncYWn|*)!>ToL^M+gUUnNO24V5_i=h+ z9(w-G^RK)fpT^u-f8BMt{y1gh8R^V_C&Rij`~+Q>cwjD{qD{K33V)8 zi07()ih9*jx;BX^U7Mx+%R#y}OLwl#@r261EY#QL-E^_qqwg24&GMaVb8`Q+`NO1e z@8fL#E1B7i$)D7-e}yMMC3`>2=09?dtI{4lmHqEzQ+Sd8bIRX!0nVn6^?v%DY~Ka= zLTMMDY;M46`mhUEVD4-A=``-2^2mG!{q`uwt1AnmN7K*g;_h2lhMN=K%d@v!F7H#_ ayxyn%@6J9#p8i5Y@Tu7Q-s$tFAO9aK?Hls| literal 0 HcmV?d00001 diff --git a/lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc b/lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f3d0ec3c0fcdfaeae89ca26b7fb2c15ee1a5f0d GIT binary patch literal 23605 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