From b5bd525c76b2f3540efbda1b500f77799818e9c7 Mon Sep 17 00:00:00 2001 From: Adrian Amaglio Date: Wed, 26 Feb 2020 13:37:19 +0100 Subject: [PATCH] blog --- .gitignore | 2 + blog-generator/Makefile | 75 + .../__pycache__/pelicanconf.cpython-38.pyc | Bin 0 -> 665 bytes blog-generator/content/test.md | 6 + blog-generator/output/archives.html | 46 + blog-generator/output/authors.html | 47 + blog-generator/output/categories.html | 43 + blog-generator/output/index.html | 43 + blog-generator/output/tags.html | 47 + blog-generator/output/theme/css/fonts.css | 12 + blog-generator/output/theme/css/main.css | 467 + blog-generator/output/theme/css/pygment.css | 205 + blog-generator/output/theme/css/reset.css | 52 + blog-generator/output/theme/css/typogrify.css | 3 + blog-generator/output/theme/css/wide.css | 48 + .../theme/fonts/Yanone_Kaffeesatz_400.eot | Bin 0 -> 20932 bytes .../theme/fonts/Yanone_Kaffeesatz_400.svg | 407 + .../theme/fonts/Yanone_Kaffeesatz_400.ttf | Bin 0 -> 39168 bytes .../theme/fonts/Yanone_Kaffeesatz_400.woff | Bin 0 -> 22256 bytes .../theme/fonts/Yanone_Kaffeesatz_400.woff2 | Bin 0 -> 18320 bytes blog-generator/output/theme/fonts/font.css | 12 + .../output/theme/images/icons/aboutme.png | Bin 0 -> 411 bytes .../output/theme/images/icons/bitbucket.png | Bin 0 -> 3178 bytes .../output/theme/images/icons/delicious.png | Bin 0 -> 827 bytes .../output/theme/images/icons/facebook.png | Bin 0 -> 150 bytes .../output/theme/images/icons/github.png | Bin 0 -> 606 bytes .../output/theme/images/icons/gitorious.png | Bin 0 -> 223 bytes .../output/theme/images/icons/gittip.png | Bin 0 -> 402 bytes .../theme/images/icons/google-groups.png | Bin 0 -> 420 bytes .../output/theme/images/icons/google-plus.png | Bin 0 -> 511 bytes .../output/theme/images/icons/hackernews.png | Bin 0 -> 2771 bytes .../output/theme/images/icons/lastfm.png | Bin 0 -> 840 bytes .../output/theme/images/icons/linkedin.png | Bin 0 -> 625 bytes .../output/theme/images/icons/reddit.png | Bin 0 -> 458 bytes .../output/theme/images/icons/rss.png | Bin 0 -> 751 bytes .../output/theme/images/icons/slideshare.png | Bin 0 -> 435 bytes .../output/theme/images/icons/speakerdeck.png | Bin 0 -> 580 bytes .../theme/images/icons/stackoverflow.png | Bin 0 -> 414 bytes .../output/theme/images/icons/twitter.png | Bin 0 -> 416 bytes .../output/theme/images/icons/vimeo.png | Bin 0 -> 349 bytes .../output/theme/images/icons/youtube.png | Bin 0 -> 316 bytes blog-generator/pelicanconf.py | 35 + blog-generator/publishconf.py | 25 + blog-generator/tasks.py | 110 + .../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 .../__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 .../__pycache__/rstpep2html.cpython-38.pyc | Bin 0 -> 613 bytes blog-generator/venv/bin/activate | 78 + blog-generator/venv/bin/activate.csh | 42 + blog-generator/venv/bin/activate.fish | 76 + blog-generator/venv/bin/activate.ps1 | 150 + blog-generator/venv/bin/activate_this.py | 36 + blog-generator/venv/bin/easy_install | 11 + blog-generator/venv/bin/easy_install-3.8 | 11 + blog-generator/venv/bin/markdown_py | 8 + blog-generator/venv/bin/pelican | 8 + blog-generator/venv/bin/pelican-import | 8 + blog-generator/venv/bin/pelican-quickstart | 8 + blog-generator/venv/bin/pelican-themes | 8 + blog-generator/venv/bin/pip | 11 + blog-generator/venv/bin/pip3 | 11 + blog-generator/venv/bin/pip3.8 | 11 + blog-generator/venv/bin/pygmentize | 8 + blog-generator/venv/bin/python | Bin 0 -> 14088 bytes blog-generator/venv/bin/python-config | 78 + blog-generator/venv/bin/python3 | 1 + blog-generator/venv/bin/python3.8 | 1 + blog-generator/venv/bin/rst2html.py | 23 + blog-generator/venv/bin/rst2html4.py | 26 + blog-generator/venv/bin/rst2html5.py | 35 + blog-generator/venv/bin/rst2latex.py | 26 + blog-generator/venv/bin/rst2man.py | 26 + blog-generator/venv/bin/rst2odt.py | 30 + blog-generator/venv/bin/rst2odt_prepstyles.py | 67 + blog-generator/venv/bin/rst2pseudoxml.py | 23 + blog-generator/venv/bin/rst2s5.py | 24 + blog-generator/venv/bin/rst2xetex.py | 27 + blog-generator/venv/bin/rst2xml.py | 23 + blog-generator/venv/bin/rstpep2html.py | 25 + blog-generator/venv/bin/unidecode | 8 + blog-generator/venv/bin/wheel | 11 + blog-generator/venv/include/python3.8 | 1 + .../venv/lib/python3.8/__future__.py | 1 + .../__pycache__/__future__.cpython-38.pyc | Bin 0 -> 4169 bytes .../__pycache__/_bootlocale.cpython-38.pyc | Bin 0 -> 1281 bytes .../_collections_abc.cpython-38.pyc | Bin 0 -> 28779 bytes .../__pycache__/_weakrefset.cpython-38.pyc | Bin 0 -> 7638 bytes .../python3.8/__pycache__/abc.cpython-38.pyc | Bin 0 -> 5372 bytes .../__pycache__/base64.cpython-38.pyc | Bin 0 -> 17107 bytes .../__pycache__/bisect.cpython-38.pyc | Bin 0 -> 2392 bytes .../__pycache__/codecs.cpython-38.pyc | Bin 0 -> 33951 bytes .../python3.8/__pycache__/copy.cpython-38.pyc | Bin 0 -> 7001 bytes .../__pycache__/copyreg.cpython-38.pyc | Bin 0 -> 4356 bytes .../python3.8/__pycache__/enum.cpython-38.pyc | Bin 0 -> 24437 bytes .../__pycache__/fnmatch.cpython-38.pyc | Bin 0 -> 3370 bytes .../__pycache__/functools.cpython-38.pyc | Bin 0 -> 27935 bytes .../__pycache__/genericpath.cpython-38.pyc | Bin 0 -> 4039 bytes .../__pycache__/hashlib.cpython-38.pyc | Bin 0 -> 6765 bytes .../__pycache__/heapq.cpython-38.pyc | Bin 0 -> 14108 bytes .../python3.8/__pycache__/hmac.cpython-38.pyc | Bin 0 -> 6426 bytes .../python3.8/__pycache__/imp.cpython-38.pyc | Bin 0 -> 9847 bytes .../python3.8/__pycache__/io.cpython-38.pyc | Bin 0 -> 3492 bytes .../__pycache__/keyword.cpython-38.pyc | Bin 0 -> 1036 bytes .../__pycache__/linecache.cpython-38.pyc | Bin 0 -> 3877 bytes .../__pycache__/locale.cpython-38.pyc | Bin 0 -> 34727 bytes .../__pycache__/ntpath.cpython-38.pyc | Bin 0 -> 14695 bytes .../__pycache__/operator.cpython-38.pyc | Bin 0 -> 13729 bytes .../python3.8/__pycache__/os.cpython-38.pyc | Bin 0 -> 31361 bytes .../__pycache__/posixpath.cpython-38.pyc | Bin 0 -> 10466 bytes .../__pycache__/random.cpython-38.pyc | Bin 0 -> 20146 bytes .../python3.8/__pycache__/re.cpython-38.pyc | Bin 0 -> 14346 bytes .../__pycache__/reprlib.cpython-38.pyc | Bin 0 -> 5341 bytes .../__pycache__/shutil.cpython-38.pyc | Bin 0 -> 36338 bytes .../python3.8/__pycache__/site.cpython-38.pyc | Bin 0 -> 22196 bytes .../__pycache__/sre_compile.cpython-38.pyc | Bin 0 -> 15180 bytes .../__pycache__/sre_constants.cpython-38.pyc | Bin 0 -> 6397 bytes .../__pycache__/sre_parse.cpython-38.pyc | Bin 0 -> 21685 bytes .../python3.8/__pycache__/stat.cpython-38.pyc | Bin 0 -> 4410 bytes .../__pycache__/struct.cpython-38.pyc | Bin 0 -> 368 bytes .../__pycache__/tarfile.cpython-38.pyc | Bin 0 -> 62572 bytes .../__pycache__/tempfile.cpython-38.pyc | Bin 0 -> 23497 bytes .../__pycache__/token.cpython-38.pyc | Bin 0 -> 2523 bytes .../__pycache__/tokenize.cpython-38.pyc | Bin 0 -> 17198 bytes .../__pycache__/types.cpython-38.pyc | Bin 0 -> 9215 bytes .../__pycache__/warnings.cpython-38.pyc | Bin 0 -> 13794 bytes .../__pycache__/weakref.cpython-38.pyc | Bin 0 -> 19556 bytes .../venv/lib/python3.8/_bootlocale.py | 1 + .../venv/lib/python3.8/_collections_abc.py | 1 + .../venv/lib/python3.8/_dummy_thread.py | 1 + .../venv/lib/python3.8/_weakrefset.py | 1 + blog-generator/venv/lib/python3.8/abc.py | 1 + blog-generator/venv/lib/python3.8/base64.py | 1 + blog-generator/venv/lib/python3.8/bisect.py | 1 + blog-generator/venv/lib/python3.8/codecs.py | 1 + blog-generator/venv/lib/python3.8/collections | 1 + .../lib/python3.8/config-3.8-x86_64-linux-gnu | 1 + blog-generator/venv/lib/python3.8/copy.py | 1 + blog-generator/venv/lib/python3.8/copyreg.py | 1 + .../venv/lib/python3.8/distutils/__init__.py | 116 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2821 bytes .../lib/python3.8/distutils/distutils.cfg | 6 + blog-generator/venv/lib/python3.8/encodings | 1 + blog-generator/venv/lib/python3.8/enum.py | 1 + blog-generator/venv/lib/python3.8/fnmatch.py | 1 + .../venv/lib/python3.8/functools.py | 1 + .../venv/lib/python3.8/genericpath.py | 1 + blog-generator/venv/lib/python3.8/hashlib.py | 1 + blog-generator/venv/lib/python3.8/heapq.py | 1 + blog-generator/venv/lib/python3.8/hmac.py | 1 + blog-generator/venv/lib/python3.8/imp.py | 1 + blog-generator/venv/lib/python3.8/importlib | 1 + blog-generator/venv/lib/python3.8/io.py | 1 + blog-generator/venv/lib/python3.8/keyword.py | 1 + blog-generator/venv/lib/python3.8/lib-dynload | 1 + .../venv/lib/python3.8/linecache.py | 1 + blog-generator/venv/lib/python3.8/locale.py | 1 + .../lib/python3.8/no-global-site-packages.txt | 0 blog-generator/venv/lib/python3.8/ntpath.py | 1 + blog-generator/venv/lib/python3.8/operator.py | 1 + .../venv/lib/python3.8/orig-prefix.txt | 1 + blog-generator/venv/lib/python3.8/os.py | 1 + .../venv/lib/python3.8/posixpath.py | 1 + blog-generator/venv/lib/python3.8/random.py | 1 + blog-generator/venv/lib/python3.8/re.py | 1 + blog-generator/venv/lib/python3.8/reprlib.py | 1 + .../venv/lib/python3.8/rlcompleter.py | 1 + blog-generator/venv/lib/python3.8/shutil.py | 1 + .../Jinja2-2.11.1.dist-info/INSTALLER | 1 + .../Jinja2-2.11.1.dist-info/LICENSE.rst | 28 + .../Jinja2-2.11.1.dist-info/METADATA | 106 + .../Jinja2-2.11.1.dist-info/RECORD | 61 + .../Jinja2-2.11.1.dist-info/WHEEL | 6 + .../Jinja2-2.11.1.dist-info/entry_points.txt | 3 + .../Jinja2-2.11.1.dist-info/top_level.txt | 1 + .../Markdown-3.2.1.dist-info/INSTALLER | 1 + .../Markdown-3.2.1.dist-info/LICENSE.md | 29 + .../Markdown-3.2.1.dist-info/METADATA | 57 + .../Markdown-3.2.1.dist-info/RECORD | 74 + .../Markdown-3.2.1.dist-info/WHEEL | 6 + .../Markdown-3.2.1.dist-info/entry_points.txt | 23 + .../Markdown-3.2.1.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.5.2.dist-info/AUTHORS | 228 + .../Pygments-2.5.2.dist-info/INSTALLER | 1 + .../Pygments-2.5.2.dist-info/LICENSE | 25 + .../Pygments-2.5.2.dist-info/METADATA | 50 + .../Pygments-2.5.2.dist-info/RECORD | 451 + .../Pygments-2.5.2.dist-info/WHEEL | 6 + .../Pygments-2.5.2.dist-info/entry_points.txt | 3 + .../Pygments-2.5.2.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__/easy_install.cpython-38.pyc | Bin 0 -> 285 bytes .../__pycache__/six.cpython-38.pyc | Bin 0 -> 26852 bytes .../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 + .../python3.8/site-packages/blinker/base.py | 455 + .../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 ++ .../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 + .../python3.8/site-packages/dateutil/tz/tz.py | 1849 ++++ .../site-packages/dateutil/tz/win.py | 370 + .../python3.8/site-packages/dateutil/tzwin.py | 2 + .../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 + .../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 .../python3.8/site-packages/docutils/core.py | 666 ++ .../site-packages/docutils/examples.py | 97 + .../site-packages/docutils/frontend.py | 863 ++ .../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 + .../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 .../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 + .../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 -> 4777 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 -> 48293 bytes .../__pycache__/constants.cpython-38.pyc | Bin 0 -> 1506 bytes .../jinja2/__pycache__/debug.cpython-38.pyc | Bin 0 -> 5174 bytes .../__pycache__/defaults.cpython-38.pyc | Bin 0 -> 1082 bytes .../__pycache__/environment.cpython-38.pyc | Bin 0 -> 43966 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 -> 39771 bytes .../__pycache__/idtracking.cpython-38.pyc | Bin 0 -> 9840 bytes .../jinja2/__pycache__/lexer.cpython-38.pyc | Bin 0 -> 19217 bytes .../jinja2/__pycache__/loaders.cpython-38.pyc | Bin 0 -> 18249 bytes .../jinja2/__pycache__/meta.cpython-38.pyc | Bin 0 -> 3458 bytes .../__pycache__/nativetypes.cpython-38.pyc | Bin 0 -> 4214 bytes .../jinja2/__pycache__/nodes.cpython-38.pyc | Bin 0 -> 35372 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 -> 27609 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 -> 22799 bytes .../jinja2/__pycache__/visitor.cpython-38.pyc | Bin 0 -> 3267 bytes .../python3.8/site-packages/jinja2/_compat.py | 132 + .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/asyncfilters.py | 159 + .../site-packages/jinja2/asyncsupport.py | 264 + .../python3.8/site-packages/jinja2/bccache.py | 350 + .../site-packages/jinja2/compiler.py | 1843 ++++ .../site-packages/jinja2/constants.py | 21 + .../python3.8/site-packages/jinja2/debug.py | 271 + .../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 ++ .../python3.8/site-packages/jinja2/filters.py | 1382 +++ .../site-packages/jinja2/idtracking.py | 290 + .../python3.8/site-packages/jinja2/lexer.py | 841 ++ .../python3.8/site-packages/jinja2/loaders.py | 572 ++ .../python3.8/site-packages/jinja2/meta.py | 101 + .../site-packages/jinja2/nativetypes.py | 111 + .../python3.8/site-packages/jinja2/nodes.py | 1088 +++ .../site-packages/jinja2/optimizer.py | 41 + .../python3.8/site-packages/jinja2/parser.py | 939 ++ .../python3.8/site-packages/jinja2/runtime.py | 1011 ++ .../python3.8/site-packages/jinja2/sandbox.py | 510 + .../python3.8/site-packages/jinja2/tests.py | 215 + .../python3.8/site-packages/jinja2/utils.py | 727 ++ .../python3.8/site-packages/jinja2/visitor.py | 81 + .../site-packages/markdown/__init__.py | 61 + .../site-packages/markdown/__main__.py | 151 + .../site-packages/markdown/__meta__.py | 55 + .../__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 -> 1637 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 -> 12243 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 -> 13642 bytes .../site-packages/markdown/blockparser.py | 125 + .../site-packages/markdown/blockprocessors.py | 592 ++ .../python3.8/site-packages/markdown/core.py | 408 + .../markdown/extensions/__init__.py | 104 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3957 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 -> 8079 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 -> 9842 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 | 355 + .../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 + .../python3.8/site-packages/markdown/util.py | 456 + .../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 .../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 .../python3.8/site-packages/pelican/cache.py | 141 + .../site-packages/pelican/contents.py | 615 ++ .../site-packages/pelican/generators.py | 937 ++ .../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 + .../python3.8/site-packages/pelican/server.py | 143 + .../site-packages/pelican/settings.py | 668 ++ .../site-packages/pelican/signals.py | 52 + .../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 + .../python3.8/site-packages/pelican/utils.py | 921 ++ .../site-packages/pelican/writers.py | 278 + .../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 | 704 ++ .../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 + .../python3.8/site-packages/pip/__init__.py | 18 + .../python3.8/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 626 bytes .../pip/__pycache__/__main__.cpython-38.pyc | Bin 0 -> 419 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 675 bytes .../__pycache__/build_env.cpython-38.pyc | Bin 0 -> 7480 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 8697 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 0 -> 10642 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 12479 bytes .../__pycache__/legacy_resolve.cpython-38.pyc | Bin 0 -> 9895 bytes .../__pycache__/locations.cpython-38.pyc | Bin 0 -> 4489 bytes .../_internal/__pycache__/main.cpython-38.pyc | Bin 0 -> 612 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 3581 bytes .../__pycache__/pyproject.cpython-38.pyc | Bin 0 -> 3731 bytes .../self_outdated_check.cpython-38.pyc | Bin 0 -> 5490 bytes .../__pycache__/wheel_builder.cpython-38.pyc | Bin 0 -> 6696 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 -> 233 bytes .../__pycache__/autocompletion.cpython-38.pyc | Bin 0 -> 4950 bytes .../__pycache__/base_command.cpython-38.pyc | Bin 0 -> 5844 bytes .../cli/__pycache__/cmdoptions.cpython-38.pyc | Bin 0 -> 20325 bytes .../command_context.cpython-38.pyc | Bin 0 -> 1308 bytes .../cli/__pycache__/main.cpython-38.pyc | Bin 0 -> 1403 bytes .../__pycache__/main_parser.cpython-38.pyc | Bin 0 -> 2156 bytes .../cli/__pycache__/parser.cpython-38.pyc | Bin 0 -> 8974 bytes .../__pycache__/req_command.cpython-38.pyc | Bin 0 -> 8286 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 362 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 -> 2849 bytes .../commands/__pycache__/check.cpython-38.pyc | Bin 0 -> 1309 bytes .../__pycache__/completion.cpython-38.pyc | Bin 0 -> 3010 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 0 -> 6572 bytes .../commands/__pycache__/debug.cpython-38.pyc | Bin 0 -> 4086 bytes .../__pycache__/download.cpython-38.pyc | Bin 0 -> 3918 bytes .../__pycache__/freeze.cpython-38.pyc | Bin 0 -> 2909 bytes .../commands/__pycache__/hash.cpython-38.pyc | Bin 0 -> 1987 bytes .../commands/__pycache__/help.cpython-38.pyc | Bin 0 -> 1183 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 16180 bytes .../commands/__pycache__/list.cpython-38.pyc | Bin 0 -> 8938 bytes .../__pycache__/search.cpython-38.pyc | Bin 0 -> 4481 bytes .../commands/__pycache__/show.cpython-38.pyc | Bin 0 -> 6322 bytes .../__pycache__/uninstall.cpython-38.pyc | Bin 0 -> 2691 bytes .../commands/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 5243 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 | 701 ++ .../pip/_internal/commands/list.py | 313 + .../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 -> 809 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 1925 bytes .../__pycache__/installed.cpython-38.pyc | Bin 0 -> 1205 bytes .../__pycache__/sdist.cpython-38.pyc | Bin 0 -> 3468 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1557 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 -> 187 bytes .../__pycache__/collector.cpython-38.pyc | Bin 0 -> 14153 bytes .../__pycache__/package_finder.cpython-38.pyc | Bin 0 -> 25746 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 -> 221 bytes .../__pycache__/candidate.cpython-38.pyc | Bin 0 -> 1418 bytes .../__pycache__/format_control.cpython-38.pyc | Bin 0 -> 2413 bytes .../models/__pycache__/index.cpython-38.pyc | Bin 0 -> 1143 bytes .../models/__pycache__/link.cpython-38.pyc | Bin 0 -> 6656 bytes .../models/__pycache__/scheme.cpython-38.pyc | Bin 0 -> 859 bytes .../__pycache__/search_scope.cpython-38.pyc | Bin 0 -> 3250 bytes .../selection_prefs.cpython-38.pyc | Bin 0 -> 1593 bytes .../__pycache__/target_python.cpython-38.pyc | Bin 0 -> 3216 bytes .../models/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 3179 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 -> 209 bytes .../network/__pycache__/auth.cpython-38.pyc | Bin 0 -> 6975 bytes .../network/__pycache__/cache.cpython-38.pyc | Bin 0 -> 2688 bytes .../__pycache__/download.cpython-38.pyc | Bin 0 -> 4367 bytes .../__pycache__/session.cpython-38.pyc | Bin 0 -> 8848 bytes .../network/__pycache__/utils.cpython-38.pyc | Bin 0 -> 703 bytes .../network/__pycache__/xmlrpc.cpython-38.pyc | Bin 0 -> 1571 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 -> 157 bytes .../__pycache__/check.cpython-38.pyc | Bin 0 -> 3653 bytes .../__pycache__/freeze.cpython-38.pyc | Bin 0 -> 5800 bytes .../__pycache__/prepare.cpython-38.pyc | Bin 0 -> 11159 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 163 bytes .../build/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 1205 bytes .../metadata_legacy.cpython-38.pyc | Bin 0 -> 3265 bytes .../build/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1303 bytes .../__pycache__/wheel_legacy.cpython-38.pyc | Bin 0 -> 2564 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 -> 221 bytes .../editable_legacy.cpython-38.pyc | Bin 0 -> 1299 bytes .../install/__pycache__/legacy.cpython-38.pyc | Bin 0 -> 3043 bytes .../install/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 14579 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 -> 2191 bytes .../__pycache__/constructors.cpython-38.pyc | Bin 0 -> 10360 bytes .../req/__pycache__/req_file.cpython-38.pyc | Bin 0 -> 12699 bytes .../__pycache__/req_install.cpython-38.pyc | Bin 0 -> 21335 bytes .../req/__pycache__/req_set.cpython-38.pyc | Bin 0 -> 6018 bytes .../__pycache__/req_tracker.cpython-38.pyc | Bin 0 -> 4038 bytes .../__pycache__/req_uninstall.cpython-38.pyc | Bin 0 -> 17424 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 -> 152 bytes .../utils/__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 1336 bytes .../utils/__pycache__/compat.cpython-38.pyc | Bin 0 -> 6117 bytes .../__pycache__/deprecation.cpython-38.pyc | Bin 0 -> 2823 bytes .../__pycache__/distutils_args.cpython-38.pyc | Bin 0 -> 1136 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 0 -> 1244 bytes .../__pycache__/entrypoints.cpython-38.pyc | Bin 0 -> 1296 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 0 -> 4032 bytes .../__pycache__/filetypes.cpython-38.pyc | Bin 0 -> 553 bytes .../utils/__pycache__/glibc.cpython-38.pyc | Bin 0 -> 1705 bytes .../utils/__pycache__/hashes.cpython-38.pyc | Bin 0 -> 4141 bytes .../inject_securetransport.cpython-38.pyc | Bin 0 -> 929 bytes .../utils/__pycache__/logging.cpython-38.pyc | Bin 0 -> 9156 bytes .../__pycache__/marker_files.cpython-38.pyc | Bin 0 -> 925 bytes .../utils/__pycache__/misc.cpython-38.pyc | Bin 0 -> 23226 bytes .../utils/__pycache__/models.cpython-38.pyc | Bin 0 -> 1921 bytes .../__pycache__/packaging.cpython-38.pyc | Bin 0 -> 2605 bytes .../__pycache__/pkg_resources.cpython-38.pyc | Bin 0 -> 1819 bytes .../setuptools_build.cpython-38.pyc | Bin 0 -> 2924 bytes .../__pycache__/subprocess.cpython-38.pyc | Bin 0 -> 5595 bytes .../utils/__pycache__/temp_dir.cpython-38.pyc | Bin 0 -> 6708 bytes .../utils/__pycache__/typing.cpython-38.pyc | Bin 0 -> 1434 bytes .../utils/__pycache__/ui.cpython-38.pyc | Bin 0 -> 11799 bytes .../__pycache__/unpacking.cpython-38.pyc | Bin 0 -> 6072 bytes .../utils/__pycache__/urls.cpython-38.pyc | Bin 0 -> 1462 bytes .../__pycache__/virtualenv.cpython-38.pyc | Bin 0 -> 3277 bytes .../utils/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 6322 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 | 886 ++ .../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 -> 445 bytes .../vcs/__pycache__/bazaar.cpython-38.pyc | Bin 0 -> 3744 bytes .../vcs/__pycache__/git.cpython-38.pyc | Bin 0 -> 9495 bytes .../vcs/__pycache__/mercurial.cpython-38.pyc | Bin 0 -> 4885 bytes .../vcs/__pycache__/subversion.cpython-38.pyc | Bin 0 -> 8484 bytes .../__pycache__/versioncontrol.cpython-38.pyc | Bin 0 -> 19213 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 | 109 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2826 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 21373 bytes .../__pycache__/contextlib2.cpython-38.pyc | Bin 0 -> 15487 bytes .../_vendor/__pycache__/distro.cpython-38.pyc | Bin 0 -> 36538 bytes .../__pycache__/ipaddress.cpython-38.pyc | Bin 0 -> 64785 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 240338 bytes .../__pycache__/retrying.cpython-38.pyc | Bin 0 -> 8003 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 26861 bytes .../site-packages/pip/_vendor/appdirs.py | 639 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 510 bytes .../__pycache__/_cmd.cpython-38.pyc | Bin 0 -> 1537 bytes .../__pycache__/adapter.cpython-38.pyc | Bin 0 -> 3044 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 1743 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 717 bytes .../__pycache__/controller.cpython-38.pyc | Bin 0 -> 7748 bytes .../__pycache__/filewrapper.cpython-38.pyc | Bin 0 -> 2136 bytes .../__pycache__/heuristics.cpython-38.pyc | Bin 0 -> 4695 bytes .../__pycache__/serialize.cpython-38.pyc | Bin 0 -> 4197 bytes .../__pycache__/wrapper.cpython-38.pyc | Bin 0 -> 634 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 254 bytes .../__pycache__/file_cache.cpython-38.pyc | Bin 0 -> 3228 bytes .../__pycache__/redis_cache.cpython-38.pyc | Bin 0 -> 1526 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 376 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 188 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 217 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 0 -> 220 bytes .../certifi/__pycache__/core.cpython-38.pyc | Bin 0 -> 433 bytes .../pip/_vendor/certifi/cacert.pem | 4602 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 15 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 810 bytes .../__pycache__/big5freq.cpython-38.pyc | Bin 0 -> 27139 bytes .../__pycache__/big5prober.cpython-38.pyc | Bin 0 -> 1094 bytes .../chardistribution.cpython-38.pyc | Bin 0 -> 6180 bytes .../charsetgroupprober.cpython-38.pyc | Bin 0 -> 2211 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 0 -> 3443 bytes .../codingstatemachine.cpython-38.pyc | Bin 0 -> 2870 bytes .../chardet/__pycache__/compat.cpython-38.pyc | Bin 0 -> 315 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 0 -> 1101 bytes .../chardet/__pycache__/enums.cpython-38.pyc | Bin 0 -> 2608 bytes .../__pycache__/escprober.cpython-38.pyc | Bin 0 -> 2593 bytes .../chardet/__pycache__/escsm.cpython-38.pyc | Bin 0 -> 7434 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 0 -> 2411 bytes .../__pycache__/euckrfreq.cpython-38.pyc | Bin 0 -> 12023 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 0 -> 1102 bytes .../__pycache__/euctwfreq.cpython-38.pyc | Bin 0 -> 27143 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 0 -> 1102 bytes .../__pycache__/gb2312freq.cpython-38.pyc | Bin 0 -> 19067 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 0 -> 1110 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 0 -> 2983 bytes .../__pycache__/jisfreq.cpython-38.pyc | Bin 0 -> 22095 bytes .../chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 0 -> 37568 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 0 -> 23592 bytes .../langcyrillicmodel.cpython-38.pyc | Bin 0 -> 29056 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 0 -> 23550 bytes .../langhebrewmodel.cpython-38.pyc | Bin 0 -> 22177 bytes .../langhungarianmodel.cpython-38.pyc | Bin 0 -> 23581 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 0 -> 22156 bytes .../langturkishmodel.cpython-38.pyc | Bin 0 -> 22179 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 0 -> 3363 bytes .../mbcharsetprober.cpython-38.pyc | Bin 0 -> 2226 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 0 -> 1091 bytes .../chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 0 -> 16714 bytes .../sbcharsetprober.cpython-38.pyc | Bin 0 -> 2979 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 0 -> 1589 bytes .../__pycache__/sjisprober.cpython-38.pyc | Bin 0 -> 2447 bytes .../universaldetector.cpython-38.pyc | Bin 0 -> 5791 bytes .../__pycache__/utf8prober.cpython-38.pyc | Bin 0 -> 1952 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 399 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 156 bytes .../cli/__pycache__/chardetect.cpython-38.pyc | Bin 0 -> 2657 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 404 bytes .../colorama/__pycache__/ansi.cpython-38.pyc | Bin 0 -> 3189 bytes .../__pycache__/ansitowin32.cpython-38.pyc | Bin 0 -> 7698 bytes .../__pycache__/initialise.cpython-38.pyc | Bin 0 -> 1665 bytes .../colorama/__pycache__/win32.cpython-38.pyc | Bin 0 -> 3941 bytes .../__pycache__/winterm.cpython-38.pyc | Bin 0 -> 4625 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../site-packages/pip/_vendor/contextlib2.py | 518 ++ .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1019 bytes .../distlib/__pycache__/compat.cpython-38.pyc | Bin 0 -> 32168 bytes .../__pycache__/database.cpython-38.pyc | Bin 0 -> 42081 bytes .../distlib/__pycache__/index.cpython-38.pyc | Bin 0 -> 17372 bytes .../__pycache__/locators.cpython-38.pyc | Bin 0 -> 38374 bytes .../__pycache__/manifest.cpython-38.pyc | Bin 0 -> 10194 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 4458 bytes .../__pycache__/metadata.cpython-38.pyc | Bin 0 -> 26605 bytes .../__pycache__/resources.cpython-38.pyc | Bin 0 -> 10969 bytes .../__pycache__/scripts.cpython-38.pyc | Bin 0 -> 10834 bytes .../distlib/__pycache__/util.cpython-38.pyc | Bin 0 -> 48122 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 20328 bytes .../distlib/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 25526 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 444 bytes .../_backport/__pycache__/misc.cpython-38.pyc | Bin 0 -> 1055 bytes .../__pycache__/shutil.cpython-38.pyc | Bin 0 -> 21448 bytes .../__pycache__/sysconfig.cpython-38.pyc | Bin 0 -> 15875 bytes .../__pycache__/tarfile.cpython-38.pyc | Bin 0 -> 62704 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 786 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/index.py | 516 ++ .../pip/_vendor/distlib/locators.py | 1302 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1096 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 416 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/util.py | 1761 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1004 ++ .../site-packages/pip/_vendor/distro.py | 1216 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1277 bytes .../__pycache__/_ihatexml.cpython-38.pyc | Bin 0 -> 13749 bytes .../__pycache__/_inputstream.cpython-38.pyc | Bin 0 -> 21901 bytes .../__pycache__/_tokenizer.cpython-38.pyc | Bin 0 -> 39619 bytes .../__pycache__/_utils.cpython-38.pyc | Bin 0 -> 3307 bytes .../__pycache__/constants.cpython-38.pyc | Bin 0 -> 66314 bytes .../__pycache__/html5parser.cpython-38.pyc | Bin 0 -> 95136 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 0 -> 10785 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1721 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 386 bytes .../_trie/__pycache__/_base.cpython-38.pyc | Bin 0 -> 1565 bytes .../_trie/__pycache__/datrie.cpython-38.pyc | Bin 0 -> 1998 bytes .../_trie/__pycache__/py.cpython-38.pyc | Bin 0 -> 2222 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 161 bytes .../alphabeticalattributes.cpython-38.pyc | Bin 0 -> 1283 bytes .../filters/__pycache__/base.cpython-38.pyc | Bin 0 -> 831 bytes .../inject_meta_charset.cpython-38.pyc | Bin 0 -> 1837 bytes .../filters/__pycache__/lint.cpython-38.pyc | Bin 0 -> 2595 bytes .../__pycache__/optionaltags.cpython-38.pyc | Bin 0 -> 2724 bytes .../__pycache__/sanitizer.cpython-38.pyc | Bin 0 -> 16266 bytes .../__pycache__/whitespace.cpython-38.pyc | Bin 0 -> 1329 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 900 bytes .../__pycache__/genshi.cpython-38.pyc | Bin 0 -> 1506 bytes .../__pycache__/sax.cpython-38.pyc | Bin 0 -> 1441 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3285 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 11311 bytes .../__pycache__/dom.cpython-38.pyc | Bin 0 -> 9418 bytes .../__pycache__/etree.cpython-38.pyc | Bin 0 -> 11805 bytes .../__pycache__/etree_lxml.cpython-38.pyc | Bin 0 -> 11773 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3966 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 6966 bytes .../__pycache__/dom.cpython-38.pyc | Bin 0 -> 1695 bytes .../__pycache__/etree.cpython-38.pyc | Bin 0 -> 3480 bytes .../__pycache__/etree_lxml.cpython-38.pyc | Bin 0 -> 6579 bytes .../__pycache__/genshi.cpython-38.pyc | Bin 0 -> 1853 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 218 bytes .../idna/__pycache__/codec.cpython-38.pyc | Bin 0 -> 2872 bytes .../idna/__pycache__/compat.cpython-38.pyc | Bin 0 -> 590 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 0 -> 9006 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 0 -> 21342 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 0 -> 1770 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 0 -> 172 bytes .../idna/__pycache__/uts46data.cpython-38.pyc | Bin 0 -> 174145 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 396 + .../pip/_vendor/idna/idnadata.py | 1979 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8205 +++++++++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2420 +++++ .../pip/_vendor/msgpack/__init__.py | 65 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1915 bytes .../__pycache__/_version.cpython-38.pyc | Bin 0 -> 179 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 1813 bytes .../__pycache__/fallback.cpython-38.pyc | Bin 0 -> 26270 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../pip/_vendor/msgpack/fallback.py | 1027 +++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 694 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 532 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1109 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2858 bytes .../__pycache__/_typing.cpython-38.pyc | Bin 0 -> 1449 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 9289 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 4064 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 20287 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 16537 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1526 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 13301 bytes .../pip/_vendor/packaging/_compat.py | 38 + .../pip/_vendor/packaging/_structures.py | 86 + .../pip/_vendor/packaging/_typing.py | 39 + .../pip/_vendor/packaging/markers.py | 328 + .../pip/_vendor/packaging/requirements.py | 145 + .../pip/_vendor/packaging/specifiers.py | 849 ++ .../pip/_vendor/packaging/tags.py | 730 ++ .../pip/_vendor/packaging/utils.py | 62 + .../pip/_vendor/packaging/version.py | 535 ++ .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 243 bytes .../__pycache__/_in_process.cpython-38.pyc | Bin 0 -> 7426 bytes .../pep517/__pycache__/build.cpython-38.pyc | Bin 0 -> 3331 bytes .../pep517/__pycache__/check.cpython-38.pyc | Bin 0 -> 4765 bytes .../__pycache__/colorlog.cpython-38.pyc | Bin 0 -> 2913 bytes .../pep517/__pycache__/compat.cpython-38.pyc | Bin 0 -> 1010 bytes .../__pycache__/dirtools.cpython-38.pyc | Bin 0 -> 1292 bytes .../__pycache__/envbuild.cpython-38.pyc | Bin 0 -> 4383 bytes .../pep517/__pycache__/meta.cpython-38.pyc | Bin 0 -> 2819 bytes .../__pycache__/wrappers.cpython-38.pyc | Bin 0 -> 10139 bytes .../pip/_vendor/pep517/_in_process.py | 257 + .../site-packages/pip/_vendor/pep517/build.py | 124 + .../site-packages/pip/_vendor/pep517/check.py | 203 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 34 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 167 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 298 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 100311 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 0 -> 609 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 5578 bytes .../progress/__pycache__/bar.cpython-38.pyc | Bin 0 -> 2602 bytes .../__pycache__/counter.cpython-38.pyc | Bin 0 -> 1434 bytes .../__pycache__/spinner.cpython-38.pyc | Bin 0 -> 1361 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 7090 ++++++++++++++ .../pip/_vendor/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 337 bytes .../pytoml/__pycache__/core.cpython-38.pyc | Bin 0 -> 914 bytes .../pytoml/__pycache__/parser.cpython-38.pyc | Bin 0 -> 10079 bytes .../pytoml/__pycache__/test.cpython-38.pyc | Bin 0 -> 1216 bytes .../pytoml/__pycache__/utils.cpython-38.pyc | Bin 0 -> 2126 bytes .../pytoml/__pycache__/writer.cpython-38.pyc | Bin 0 -> 3702 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 342 + .../site-packages/pip/_vendor/pytoml/test.py | 30 + .../site-packages/pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 114 + .../pip/_vendor/requests/__init__.py | 133 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3464 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 0 -> 511 bytes .../_internal_utils.cpython-38.pyc | Bin 0 -> 1281 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 0 -> 16944 bytes .../requests/__pycache__/api.cpython-38.pyc | Bin 0 -> 6468 bytes .../requests/__pycache__/auth.cpython-38.pyc | Bin 0 -> 8290 bytes .../requests/__pycache__/certs.cpython-38.pyc | Bin 0 -> 594 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 1573 bytes .../__pycache__/cookies.cpython-38.pyc | Bin 0 -> 18795 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 5205 bytes .../requests/__pycache__/help.cpython-38.pyc | Bin 0 -> 2691 bytes .../requests/__pycache__/hooks.cpython-38.pyc | Bin 0 -> 953 bytes .../__pycache__/models.cpython-38.pyc | Bin 0 -> 23889 bytes .../__pycache__/packages.cpython-38.pyc | Bin 0 -> 463 bytes .../__pycache__/sessions.cpython-38.pyc | Bin 0 -> 19503 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 4149 bytes .../__pycache__/structures.cpython-38.pyc | Bin 0 -> 4391 bytes .../requests/__pycache__/utils.cpython-38.pyc | Bin 0 -> 22160 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../site-packages/pip/_vendor/requests/api.py | 158 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 74 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 953 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 770 ++ .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 977 ++ .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/six.py | 980 ++ .../pip/_vendor/urllib3/__init__.py | 86 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2082 bytes .../__pycache__/_collections.cpython-38.pyc | Bin 0 -> 10636 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 10542 bytes .../__pycache__/connectionpool.cpython-38.pyc | Bin 0 -> 24043 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 10025 bytes .../urllib3/__pycache__/fields.cpython-38.pyc | Bin 0 -> 8096 bytes .../__pycache__/filepost.cpython-38.pyc | Bin 0 -> 2731 bytes .../__pycache__/poolmanager.cpython-38.pyc | Bin 0 -> 12901 bytes .../__pycache__/request.cpython-38.pyc | Bin 0 -> 5619 bytes .../__pycache__/response.cpython-38.pyc | Bin 0 -> 20332 bytes .../pip/_vendor/urllib3/_collections.py | 336 + .../pip/_vendor/urllib3/connection.py | 448 + .../pip/_vendor/urllib3/connectionpool.py | 1051 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 160 bytes .../_appengine_environ.cpython-38.pyc | Bin 0 -> 1362 bytes .../__pycache__/appengine.cpython-38.pyc | Bin 0 -> 8233 bytes .../__pycache__/ntlmpool.cpython-38.pyc | Bin 0 -> 3241 bytes .../__pycache__/pyopenssl.cpython-38.pyc | Bin 0 -> 14930 bytes .../securetransport.cpython-38.pyc | Bin 0 -> 19792 bytes .../contrib/__pycache__/socks.cpython-38.pyc | Bin 0 -> 5544 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 177 bytes .../__pycache__/bindings.cpython-38.pyc | Bin 0 -> 10196 bytes .../__pycache__/low_level.cpython-38.pyc | Bin 0 -> 7517 bytes .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/low_level.py | 328 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 121 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 498 + .../urllib3/contrib/securetransport.py | 859 ++ .../pip/_vendor/urllib3/contrib/socks.py | 210 + .../pip/_vendor/urllib3/exceptions.py | 255 + .../pip/_vendor/urllib3/fields.py | 273 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 274 bytes .../packages/__pycache__/six.cpython-38.pyc | Bin 0 -> 26486 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 171 bytes .../__pycache__/makefile.cpython-38.pyc | Bin 0 -> 1275 bytes .../urllib3/packages/backports/makefile.py | 52 + .../pip/_vendor/urllib3/packages/six.py | 1021 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 515 bytes .../_implementation.cpython-38.pyc | Bin 0 -> 3296 bytes .../ssl_match_hostname/_implementation.py | 160 + .../pip/_vendor/urllib3/poolmanager.py | 470 + .../pip/_vendor/urllib3/request.py | 171 + .../pip/_vendor/urllib3/response.py | 809 ++ .../pip/_vendor/urllib3/util/__init__.py | 46 + .../util/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 980 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 3153 bytes .../util/__pycache__/queue.cpython-38.pyc | Bin 0 -> 1025 bytes .../util/__pycache__/request.cpython-38.pyc | Bin 0 -> 3319 bytes .../util/__pycache__/response.cpython-38.pyc | Bin 0 -> 1946 bytes .../util/__pycache__/retry.cpython-38.pyc | Bin 0 -> 12942 bytes .../util/__pycache__/ssl_.cpython-38.pyc | Bin 0 -> 9818 bytes .../util/__pycache__/timeout.cpython-38.pyc | Bin 0 -> 8840 bytes .../util/__pycache__/url.cpython-38.pyc | Bin 0 -> 10624 bytes .../util/__pycache__/wait.cpython-38.pyc | Bin 0 -> 3074 bytes .../pip/_vendor/urllib3/util/connection.py | 138 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 135 + .../pip/_vendor/urllib3/util/response.py | 86 + .../pip/_vendor/urllib3/util/retry.py | 450 + .../pip/_vendor/urllib3/util/ssl_.py | 407 + .../pip/_vendor/urllib3/util/timeout.py | 258 + .../pip/_vendor/urllib3/util/url.py | 436 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 9700 bytes .../__pycache__/labels.cpython-38.pyc | Bin 0 -> 3798 bytes .../__pycache__/mklabels.cpython-38.pyc | Bin 0 -> 1894 bytes .../__pycache__/tests.cpython-38.pyc | Bin 0 -> 5060 bytes .../__pycache__/x_user_defined.cpython-38.pyc | Bin 0 -> 2628 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3299 +++++++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 100400 bytes .../__pycache__/py2_warn.cpython-38.pyc | Bin 0 -> 935 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 0 -> 604 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 161 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20514 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 201638 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24434 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 711 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 549 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 985 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2767 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 8923 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 3882 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19791 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 470 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 10638 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 -> 2410 bytes .../site-packages/pkg_resources/py2_warn.py | 22 + .../site-packages/pkg_resources/py31compat.py | 23 + .../site-packages/pygments/__init__.py | 90 + .../site-packages/pygments/__main__.py | 18 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3088 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 0 -> 540 bytes .../__pycache__/cmdline.cpython-38.pyc | Bin 0 -> 12670 bytes .../__pycache__/console.cpython-38.pyc | Bin 0 -> 1866 bytes .../__pycache__/filter.cpython-38.pyc | Bin 0 -> 2659 bytes .../__pycache__/formatter.cpython-38.pyc | Bin 0 -> 2969 bytes .../pygments/__pycache__/lexer.cpython-38.pyc | Bin 0 -> 24467 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 -> 3515 bytes .../__pycache__/sphinxext.cpython-38.pyc | Bin 0 -> 4523 bytes .../pygments/__pycache__/style.cpython-38.pyc | Bin 0 -> 4262 bytes .../pygments/__pycache__/token.cpython-38.pyc | Bin 0 -> 4465 bytes .../__pycache__/unistring.cpython-38.pyc | Bin 0 -> 32141 bytes .../pygments/__pycache__/util.cpython-38.pyc | Bin 0 -> 10669 bytes .../site-packages/pygments/cmdline.py | 573 ++ .../site-packages/pygments/console.py | 71 + .../site-packages/pygments/filter.py | 74 + .../pygments/filters/__init__.py | 350 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 11426 bytes .../site-packages/pygments/formatter.py | 95 + .../pygments/formatters/__init__.py | 154 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 4545 bytes .../__pycache__/_mapping.cpython-38.pyc | Bin 0 -> 5037 bytes .../__pycache__/bbcode.cpython-38.pyc | Bin 0 -> 2989 bytes .../__pycache__/html.cpython-38.pyc | Bin 0 -> 26609 bytes .../formatters/__pycache__/img.cpython-38.pyc | Bin 0 -> 16515 bytes .../formatters/__pycache__/irc.cpython-38.pyc | Bin 0 -> 4381 bytes .../__pycache__/latex.cpython-38.pyc | Bin 0 -> 12503 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 -> 5276 bytes .../__pycache__/terminal.cpython-38.pyc | Bin 0 -> 4003 bytes .../__pycache__/terminal256.cpython-38.pyc | Bin 0 -> 8575 bytes .../pygments/formatters/_mapping.py | 85 + .../pygments/formatters/bbcode.py | 109 + .../site-packages/pygments/formatters/html.py | 880 ++ .../site-packages/pygments/formatters/img.py | 602 ++ .../site-packages/pygments/formatters/irc.py | 182 + .../pygments/formatters/latex.py | 482 + .../pygments/formatters/other.py | 164 + .../site-packages/pygments/formatters/rtf.py | 147 + .../site-packages/pygments/formatters/svg.py | 153 + .../pygments/formatters/terminal.py | 136 + .../pygments/formatters/terminal256.py | 315 + .../python3.8/site-packages/pygments/lexer.py | 881 ++ .../site-packages/pygments/lexers/__init__.py | 343 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 9046 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 -> 42538 bytes .../_csound_builtins.cpython-38.pyc | Bin 0 -> 15248 bytes .../_lasso_builtins.cpython-38.pyc | Bin 0 -> 76798 bytes .../__pycache__/_lua_builtins.cpython-38.pyc | Bin 0 -> 6612 bytes .../__pycache__/_mapping.cpython-38.pyc | Bin 0 -> 43592 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 -> 89025 bytes .../_postgres_builtins.cpython-38.pyc | Bin 0 -> 7567 bytes .../_scilab_builtins.cpython-38.pyc | Bin 0 -> 34106 bytes .../_sourcemod_builtins.cpython-38.pyc | Bin 0 -> 20731 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 .../_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 -> 20117 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 -> 18349 bytes .../lexers/__pycache__/c_cpp.cpython-38.pyc | Bin 0 -> 7516 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 -> 2710 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 -> 21966 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 -> 20802 bytes .../lexers/__pycache__/d.cpython-38.pyc | Bin 0 -> 5789 bytes .../lexers/__pycache__/dalvik.cpython-38.pyc | Bin 0 -> 3320 bytes .../lexers/__pycache__/data.cpython-38.pyc | Bin 0 -> 10513 bytes .../lexers/__pycache__/diff.cpython-38.pyc | Bin 0 -> 3673 bytes .../lexers/__pycache__/dotnet.cpython-38.pyc | Bin 0 -> 18983 bytes .../lexers/__pycache__/dsls.cpython-38.pyc | Bin 0 -> 23753 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 -> 12670 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 -> 4674 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 -> 18687 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 -> 34010 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 -> 18398 bytes .../lexers/__pycache__/mime.cpython-38.pyc | Bin 0 -> 6355 bytes .../lexers/__pycache__/ml.cpython-38.pyc | Bin 0 -> 11119 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__/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 -> 21421 bytes .../lexers/__pycache__/pawn.cpython-38.pyc | Bin 0 -> 5560 bytes .../lexers/__pycache__/perl.cpython-38.pyc | Bin 0 -> 20965 bytes .../lexers/__pycache__/php.cpython-38.pyc | Bin 0 -> 8034 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 -> 29019 bytes .../lexers/__pycache__/qvt.cpython-38.pyc | Bin 0 -> 4135 bytes .../lexers/__pycache__/r.cpython-38.pyc | Bin 0 -> 4293 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__/rnc.cpython-38.pyc | Bin 0 -> 1513 bytes .../__pycache__/roboconf.cpython-38.pyc | Bin 0 -> 1906 bytes .../__pycache__/robotframework.cpython-38.pyc | Bin 0 -> 19284 bytes .../lexers/__pycache__/ruby.cpython-38.pyc | Bin 0 -> 13119 bytes .../lexers/__pycache__/rust.cpython-38.pyc | Bin 0 -> 4282 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 -> 48262 bytes .../lexers/__pycache__/sgf.cpython-38.pyc | Bin 0 -> 1782 bytes .../lexers/__pycache__/shell.cpython-38.pyc | Bin 0 -> 22250 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 -> 2167 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 -> 3231 bytes .../lexers/__pycache__/sql.cpython-38.pyc | Bin 0 -> 22808 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 -> 59366 bytes .../__pycache__/teraterm.cpython-38.pyc | Bin 0 -> 4529 bytes .../lexers/__pycache__/testing.cpython-38.pyc | Bin 0 -> 7910 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 -> 9462 bytes .../lexers/__pycache__/theorem.cpython-38.pyc | Bin 0 -> 12549 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__/varnish.cpython-38.pyc | Bin 0 -> 5026 bytes .../__pycache__/verification.cpython-38.pyc | Bin 0 -> 2819 bytes .../lexers/__pycache__/web.cpython-38.pyc | Bin 0 -> 1226 bytes .../lexers/__pycache__/webmisc.cpython-38.pyc | Bin 0 -> 24365 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 | 73 + .../pygments/lexers/_csound_builtins.py | 1680 ++++ .../pygments/lexers/_lasso_builtins.py | 5327 +++++++++++ .../pygments/lexers/_lua_builtins.py | 295 + .../site-packages/pygments/lexers/_mapping.py | 529 ++ .../pygments/lexers/_mql_builtins.py | 1172 +++ .../pygments/lexers/_openedge_builtins.py | 2547 +++++ .../pygments/lexers/_php_builtins.py | 4756 ++++++++++ .../pygments/lexers/_postgres_builtins.py | 621 ++ .../pygments/lexers/_scilab_builtins.py | 3094 +++++++ .../pygments/lexers/_sourcemod_builtins.py | 1163 +++ .../pygments/lexers/_stan_builtins.py | 558 ++ .../pygments/lexers/_stata_builtins.py | 421 + .../pygments/lexers/_tsql_builtins.py | 1004 ++ .../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 | 776 ++ .../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 | 252 + .../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 | 940 ++ .../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 | 692 ++ .../site-packages/pygments/lexers/d.py | 251 + .../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 | 213 + .../site-packages/pygments/lexers/graph.py | 85 + .../site-packages/pygments/lexers/graphics.py | 781 ++ .../site-packages/pygments/lexers/haskell.py | 869 ++ .../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 | 691 ++ .../site-packages/pygments/lexers/mime.py | 226 + .../site-packages/pygments/lexers/ml.py | 769 ++ .../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/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 | 620 ++ .../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 | 1062 +++ .../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/rnc.py | 67 + .../site-packages/pygments/lexers/roboconf.py | 82 + .../pygments/lexers/robotframework.py | 560 ++ .../site-packages/pygments/lexers/ruby.py | 519 ++ .../site-packages/pygments/lexers/rust.py | 220 + .../site-packages/pygments/lexers/sas.py | 228 + .../site-packages/pygments/lexers/scdoc.py | 70 + .../pygments/lexers/scripting.py | 1222 +++ .../site-packages/pygments/lexers/sgf.py | 61 + .../site-packages/pygments/lexers/shell.py | 849 ++ .../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 | 104 + .../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 | 2282 +++++ .../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 | 382 + .../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/varnish.py | 190 + .../pygments/lexers/verification.py | 111 + .../site-packages/pygments/lexers/web.py | 24 + .../site-packages/pygments/lexers/webmisc.py | 989 ++ .../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 | 158 + .../python3.8/site-packages/pygments/style.py | 182 + .../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 + .../python3.8/site-packages/pygments/token.py | 213 + .../site-packages/pygments/unistring.py | 221 + .../python3.8/site-packages/pygments/util.py | 388 + .../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 + .../pytz-2019.3.dist-info/DESCRIPTION.rst | 584 ++ .../pytz-2019.3.dist-info/INSTALLER | 1 + .../pytz-2019.3.dist-info/LICENSE.txt | 19 + .../pytz-2019.3.dist-info/METADATA | 618 ++ .../pytz-2019.3.dist-info/RECORD | 620 ++ .../site-packages/pytz-2019.3.dist-info/WHEEL | 6 + .../pytz-2019.3.dist-info/metadata.json | 1 + .../pytz-2019.3.dist-info/top_level.txt | 1 + .../pytz-2019.3.dist-info/zip-safe | 1 + .../python3.8/site-packages/pytz/__init__.py | 1551 ++++ .../pytz/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 29439 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 1799 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 | 48 + .../lib/python3.8/site-packages/pytz/lazy.py | 172 + .../python3.8/site-packages/pytz/reference.py | 140 + .../python3.8/site-packages/pytz/tzfile.py | 134 + .../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 -> 2084 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 .../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 -> 2084 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 -> 533 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 0 -> 533 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 -> 533 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 -> 533 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 .../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 -> 2084 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 .../python3.8/site-packages/pytz/zoneinfo/EET | Bin 0 -> 1908 bytes .../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 .../python3.8/site-packages/pytz/zoneinfo/GB | Bin 0 -> 3648 bytes .../site-packages/pytz/zoneinfo/GB-Eire | Bin 0 -> 3648 bytes .../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 .../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 .../python3.8/site-packages/pytz/zoneinfo/MET | Bin 0 -> 2094 bytes .../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 .../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 .../python3.8/site-packages/pytz/zoneinfo/PRC | Bin 0 -> 533 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 .../python3.8/site-packages/pytz/zoneinfo/ROC | Bin 0 -> 761 bytes .../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 .../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 .../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 .../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 | 72 + .../site-packages/pytz/zoneinfo/posixrules | Bin 0 -> 3536 bytes .../site-packages/pytz/zoneinfo/tzdata.zi | 4405 +++++++++ .../site-packages/pytz/zoneinfo/zone.tab | 452 + .../site-packages/pytz/zoneinfo/zone1970.tab | 384 + .../setuptools-45.2.0.dist-info/INSTALLER | 1 + .../setuptools-45.2.0.dist-info/LICENSE | 19 + .../setuptools-45.2.0.dist-info/METADATA | 102 + .../setuptools-45.2.0.dist-info/RECORD | 196 + .../setuptools-45.2.0.dist-info/WHEEL | 5 + .../dependency_links.txt | 2 + .../entry_points.txt | 69 + .../setuptools-45.2.0.dist-info/top_level.txt | 3 + .../setuptools-45.2.0.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 7757 bytes .../_deprecation_warning.cpython-38.pyc | Bin 0 -> 520 bytes .../__pycache__/_imp.cpython-38.pyc | Bin 0 -> 2059 bytes .../__pycache__/archive_util.cpython-38.pyc | Bin 0 -> 5140 bytes .../__pycache__/build_meta.cpython-38.pyc | Bin 0 -> 8578 bytes .../__pycache__/config.cpython-38.pyc | Bin 0 -> 17900 bytes .../__pycache__/dep_util.cpython-38.pyc | Bin 0 -> 827 bytes .../__pycache__/depends.cpython-38.pyc | Bin 0 -> 5220 bytes .../__pycache__/dist.cpython-38.pyc | Bin 0 -> 42321 bytes .../__pycache__/errors.cpython-38.pyc | Bin 0 -> 820 bytes .../__pycache__/extension.cpython-38.pyc | Bin 0 -> 1965 bytes .../__pycache__/glob.cpython-38.pyc | Bin 0 -> 3737 bytes .../__pycache__/installer.cpython-38.pyc | Bin 0 -> 4106 bytes .../__pycache__/launch.cpython-38.pyc | Bin 0 -> 828 bytes .../__pycache__/lib2to3_ex.cpython-38.pyc | Bin 0 -> 2415 bytes .../__pycache__/monkey.cpython-38.pyc | Bin 0 -> 4648 bytes .../__pycache__/msvc.cpython-38.pyc | Bin 0 -> 39653 bytes .../__pycache__/namespaces.cpython-38.pyc | Bin 0 -> 3620 bytes .../__pycache__/package_index.cpython-38.pyc | Bin 0 -> 32984 bytes .../__pycache__/py27compat.cpython-38.pyc | Bin 0 -> 1753 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 0 -> 1195 bytes .../__pycache__/py33compat.cpython-38.pyc | Bin 0 -> 1412 bytes .../__pycache__/py34compat.cpython-38.pyc | Bin 0 -> 454 bytes .../__pycache__/sandbox.cpython-38.pyc | Bin 0 -> 15540 bytes .../__pycache__/site-patch.cpython-38.pyc | Bin 0 -> 1486 bytes .../__pycache__/ssl_support.cpython-38.pyc | Bin 0 -> 6877 bytes .../__pycache__/unicode_utils.cpython-38.pyc | Bin 0 -> 1155 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 296 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 7391 bytes .../windows_support.cpython-38.pyc | Bin 0 -> 993 bytes .../setuptools/_deprecation_warning.py | 7 + .../site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 158 bytes .../__pycache__/ordered_set.cpython-38.pyc | Bin 0 -> 16416 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 201635 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24431 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 -> 708 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 546 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 982 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2764 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 8931 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 3999 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19738 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 10815 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1439 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 12069 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 | 175 + .../site-packages/setuptools/build_meta.py | 272 + .../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 -> 716 bytes .../command/__pycache__/alias.cpython-38.pyc | Bin 0 -> 2396 bytes .../__pycache__/bdist_egg.cpython-38.pyc | Bin 0 -> 14186 bytes .../__pycache__/bdist_rpm.cpython-38.pyc | Bin 0 -> 1788 bytes .../__pycache__/bdist_wininst.cpython-38.pyc | Bin 0 -> 958 bytes .../__pycache__/build_clib.cpython-38.pyc | Bin 0 -> 2438 bytes .../__pycache__/build_ext.cpython-38.pyc | Bin 0 -> 9902 bytes .../__pycache__/build_py.cpython-38.pyc | Bin 0 -> 8645 bytes .../__pycache__/develop.cpython-38.pyc | Bin 0 -> 6505 bytes .../__pycache__/dist_info.cpython-38.pyc | Bin 0 -> 1365 bytes .../__pycache__/easy_install.cpython-38.pyc | Bin 0 -> 65284 bytes .../__pycache__/egg_info.cpython-38.pyc | Bin 0 -> 21722 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 4020 bytes .../install_egg_info.cpython-38.pyc | Bin 0 -> 2407 bytes .../__pycache__/install_lib.cpython-38.pyc | Bin 0 -> 4134 bytes .../install_scripts.cpython-38.pyc | Bin 0 -> 2328 bytes .../__pycache__/py36compat.cpython-38.pyc | Bin 0 -> 4614 bytes .../__pycache__/register.cpython-38.pyc | Bin 0 -> 815 bytes .../command/__pycache__/rotate.cpython-38.pyc | Bin 0 -> 2524 bytes .../__pycache__/saveopts.cpython-38.pyc | Bin 0 -> 893 bytes .../command/__pycache__/sdist.cpython-38.pyc | Bin 0 -> 7863 bytes .../command/__pycache__/setopt.cpython-38.pyc | Bin 0 -> 4541 bytes .../command/__pycache__/test.cpython-38.pyc | Bin 0 -> 8489 bytes .../command/__pycache__/upload.cpython-38.pyc | Bin 0 -> 788 bytes .../__pycache__/upload_docs.cpython-38.pyc | Bin 0 -> 6141 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 | 101 + .../setuptools/command/build_ext.py | 330 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2349 +++++ .../setuptools/command/egg_info.py | 721 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 68 + .../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 | 280 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 659 ++ .../site-packages/setuptools/dep_util.py | 25 + .../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 -> 2424 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 | 1682 ++++ .../site-packages/setuptools/namespaces.py | 111 + .../site-packages/setuptools/package_index.py | 1138 +++ .../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 | 492 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 76 + .../site-packages/setuptools/ssl_support.py | 265 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 221 + .../setuptools/windows_support.py | 29 + .../six-1.14.0.dist-info/INSTALLER | 1 + .../six-1.14.0.dist-info/LICENSE | 18 + .../six-1.14.0.dist-info/METADATA | 49 + .../site-packages/six-1.14.0.dist-info/RECORD | 8 + .../site-packages/six-1.14.0.dist-info/WHEEL | 6 + .../six-1.14.0.dist-info/top_level.txt | 1 + .../venv/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 .../python3.8/site-packages/unidecode/util.py | 58 + .../python3.8/site-packages/unidecode/x000.py | 165 + .../python3.8/site-packages/unidecode/x001.py | 258 + .../python3.8/site-packages/unidecode/x002.py | 257 + .../python3.8/site-packages/unidecode/x003.py | 257 + .../python3.8/site-packages/unidecode/x004.py | 257 + .../python3.8/site-packages/unidecode/x005.py | 257 + .../python3.8/site-packages/unidecode/x006.py | 257 + .../python3.8/site-packages/unidecode/x007.py | 257 + .../python3.8/site-packages/unidecode/x009.py | 257 + .../python3.8/site-packages/unidecode/x00a.py | 257 + .../python3.8/site-packages/unidecode/x00b.py | 257 + .../python3.8/site-packages/unidecode/x00c.py | 257 + .../python3.8/site-packages/unidecode/x00d.py | 257 + .../python3.8/site-packages/unidecode/x00e.py | 257 + .../python3.8/site-packages/unidecode/x00f.py | 257 + .../python3.8/site-packages/unidecode/x010.py | 257 + .../python3.8/site-packages/unidecode/x011.py | 257 + .../python3.8/site-packages/unidecode/x012.py | 258 + .../python3.8/site-packages/unidecode/x013.py | 257 + .../python3.8/site-packages/unidecode/x014.py | 258 + .../python3.8/site-packages/unidecode/x015.py | 258 + .../python3.8/site-packages/unidecode/x016.py | 257 + .../python3.8/site-packages/unidecode/x017.py | 257 + .../python3.8/site-packages/unidecode/x018.py | 257 + .../python3.8/site-packages/unidecode/x01d.py | 257 + .../python3.8/site-packages/unidecode/x01e.py | 257 + .../python3.8/site-packages/unidecode/x01f.py | 257 + .../python3.8/site-packages/unidecode/x020.py | 257 + .../python3.8/site-packages/unidecode/x021.py | 257 + .../python3.8/site-packages/unidecode/x022.py | 257 + .../python3.8/site-packages/unidecode/x023.py | 257 + .../python3.8/site-packages/unidecode/x024.py | 258 + .../python3.8/site-packages/unidecode/x025.py | 257 + .../python3.8/site-packages/unidecode/x026.py | 257 + .../python3.8/site-packages/unidecode/x027.py | 257 + .../python3.8/site-packages/unidecode/x028.py | 258 + .../python3.8/site-packages/unidecode/x029.py | 257 + .../python3.8/site-packages/unidecode/x02a.py | 257 + .../python3.8/site-packages/unidecode/x02c.py | 257 + .../python3.8/site-packages/unidecode/x02e.py | 257 + .../python3.8/site-packages/unidecode/x02f.py | 257 + .../python3.8/site-packages/unidecode/x030.py | 257 + .../python3.8/site-packages/unidecode/x031.py | 257 + .../python3.8/site-packages/unidecode/x032.py | 257 + .../python3.8/site-packages/unidecode/x033.py | 258 + .../python3.8/site-packages/unidecode/x04d.py | 257 + .../python3.8/site-packages/unidecode/x04e.py | 258 + .../python3.8/site-packages/unidecode/x04f.py | 258 + .../python3.8/site-packages/unidecode/x050.py | 258 + .../python3.8/site-packages/unidecode/x051.py | 258 + .../python3.8/site-packages/unidecode/x052.py | 258 + .../python3.8/site-packages/unidecode/x053.py | 258 + .../python3.8/site-packages/unidecode/x054.py | 258 + .../python3.8/site-packages/unidecode/x055.py | 258 + .../python3.8/site-packages/unidecode/x056.py | 258 + .../python3.8/site-packages/unidecode/x057.py | 258 + .../python3.8/site-packages/unidecode/x058.py | 258 + .../python3.8/site-packages/unidecode/x059.py | 258 + .../python3.8/site-packages/unidecode/x05a.py | 258 + .../python3.8/site-packages/unidecode/x05b.py | 258 + .../python3.8/site-packages/unidecode/x05c.py | 258 + .../python3.8/site-packages/unidecode/x05d.py | 258 + .../python3.8/site-packages/unidecode/x05e.py | 258 + .../python3.8/site-packages/unidecode/x05f.py | 258 + .../python3.8/site-packages/unidecode/x060.py | 258 + .../python3.8/site-packages/unidecode/x061.py | 258 + .../python3.8/site-packages/unidecode/x062.py | 258 + .../python3.8/site-packages/unidecode/x063.py | 258 + .../python3.8/site-packages/unidecode/x064.py | 258 + .../python3.8/site-packages/unidecode/x065.py | 258 + .../python3.8/site-packages/unidecode/x066.py | 258 + .../python3.8/site-packages/unidecode/x067.py | 258 + .../python3.8/site-packages/unidecode/x068.py | 258 + .../python3.8/site-packages/unidecode/x069.py | 258 + .../python3.8/site-packages/unidecode/x06a.py | 258 + .../python3.8/site-packages/unidecode/x06b.py | 258 + .../python3.8/site-packages/unidecode/x06c.py | 258 + .../python3.8/site-packages/unidecode/x06d.py | 258 + .../python3.8/site-packages/unidecode/x06e.py | 258 + .../python3.8/site-packages/unidecode/x06f.py | 258 + .../python3.8/site-packages/unidecode/x070.py | 258 + .../python3.8/site-packages/unidecode/x071.py | 258 + .../python3.8/site-packages/unidecode/x072.py | 258 + .../python3.8/site-packages/unidecode/x073.py | 258 + .../python3.8/site-packages/unidecode/x074.py | 258 + .../python3.8/site-packages/unidecode/x075.py | 258 + .../python3.8/site-packages/unidecode/x076.py | 258 + .../python3.8/site-packages/unidecode/x077.py | 258 + .../python3.8/site-packages/unidecode/x078.py | 258 + .../python3.8/site-packages/unidecode/x079.py | 258 + .../python3.8/site-packages/unidecode/x07a.py | 258 + .../python3.8/site-packages/unidecode/x07b.py | 258 + .../python3.8/site-packages/unidecode/x07c.py | 258 + .../python3.8/site-packages/unidecode/x07d.py | 258 + .../python3.8/site-packages/unidecode/x07e.py | 258 + .../python3.8/site-packages/unidecode/x07f.py | 258 + .../python3.8/site-packages/unidecode/x080.py | 258 + .../python3.8/site-packages/unidecode/x081.py | 258 + .../python3.8/site-packages/unidecode/x082.py | 258 + .../python3.8/site-packages/unidecode/x083.py | 258 + .../python3.8/site-packages/unidecode/x084.py | 258 + .../python3.8/site-packages/unidecode/x085.py | 258 + .../python3.8/site-packages/unidecode/x086.py | 258 + .../python3.8/site-packages/unidecode/x087.py | 258 + .../python3.8/site-packages/unidecode/x088.py | 258 + .../python3.8/site-packages/unidecode/x089.py | 258 + .../python3.8/site-packages/unidecode/x08a.py | 258 + .../python3.8/site-packages/unidecode/x08b.py | 258 + .../python3.8/site-packages/unidecode/x08c.py | 258 + .../python3.8/site-packages/unidecode/x08d.py | 258 + .../python3.8/site-packages/unidecode/x08e.py | 258 + .../python3.8/site-packages/unidecode/x08f.py | 258 + .../python3.8/site-packages/unidecode/x090.py | 258 + .../python3.8/site-packages/unidecode/x091.py | 258 + .../python3.8/site-packages/unidecode/x092.py | 258 + .../python3.8/site-packages/unidecode/x093.py | 258 + .../python3.8/site-packages/unidecode/x094.py | 258 + .../python3.8/site-packages/unidecode/x095.py | 258 + .../python3.8/site-packages/unidecode/x096.py | 258 + .../python3.8/site-packages/unidecode/x097.py | 258 + .../python3.8/site-packages/unidecode/x098.py | 258 + .../python3.8/site-packages/unidecode/x099.py | 258 + .../python3.8/site-packages/unidecode/x09a.py | 258 + .../python3.8/site-packages/unidecode/x09b.py | 258 + .../python3.8/site-packages/unidecode/x09c.py | 258 + .../python3.8/site-packages/unidecode/x09d.py | 258 + .../python3.8/site-packages/unidecode/x09e.py | 258 + .../python3.8/site-packages/unidecode/x09f.py | 257 + .../python3.8/site-packages/unidecode/x0a0.py | 258 + .../python3.8/site-packages/unidecode/x0a1.py | 258 + .../python3.8/site-packages/unidecode/x0a2.py | 258 + .../python3.8/site-packages/unidecode/x0a3.py | 258 + .../python3.8/site-packages/unidecode/x0a4.py | 257 + .../python3.8/site-packages/unidecode/x0ac.py | 258 + .../python3.8/site-packages/unidecode/x0ad.py | 258 + .../python3.8/site-packages/unidecode/x0ae.py | 258 + .../python3.8/site-packages/unidecode/x0af.py | 258 + .../python3.8/site-packages/unidecode/x0b0.py | 258 + .../python3.8/site-packages/unidecode/x0b1.py | 258 + .../python3.8/site-packages/unidecode/x0b2.py | 258 + .../python3.8/site-packages/unidecode/x0b3.py | 258 + .../python3.8/site-packages/unidecode/x0b4.py | 258 + .../python3.8/site-packages/unidecode/x0b5.py | 258 + .../python3.8/site-packages/unidecode/x0b6.py | 258 + .../python3.8/site-packages/unidecode/x0b7.py | 258 + .../python3.8/site-packages/unidecode/x0b8.py | 258 + .../python3.8/site-packages/unidecode/x0b9.py | 258 + .../python3.8/site-packages/unidecode/x0ba.py | 258 + .../python3.8/site-packages/unidecode/x0bb.py | 258 + .../python3.8/site-packages/unidecode/x0bc.py | 258 + .../python3.8/site-packages/unidecode/x0bd.py | 258 + .../python3.8/site-packages/unidecode/x0be.py | 258 + .../python3.8/site-packages/unidecode/x0bf.py | 258 + .../python3.8/site-packages/unidecode/x0c0.py | 258 + .../python3.8/site-packages/unidecode/x0c1.py | 258 + .../python3.8/site-packages/unidecode/x0c2.py | 258 + .../python3.8/site-packages/unidecode/x0c3.py | 258 + .../python3.8/site-packages/unidecode/x0c4.py | 258 + .../python3.8/site-packages/unidecode/x0c5.py | 258 + .../python3.8/site-packages/unidecode/x0c6.py | 258 + .../python3.8/site-packages/unidecode/x0c7.py | 258 + .../python3.8/site-packages/unidecode/x0c8.py | 258 + .../python3.8/site-packages/unidecode/x0c9.py | 258 + .../python3.8/site-packages/unidecode/x0ca.py | 258 + .../python3.8/site-packages/unidecode/x0cb.py | 258 + .../python3.8/site-packages/unidecode/x0cc.py | 258 + .../python3.8/site-packages/unidecode/x0cd.py | 258 + .../python3.8/site-packages/unidecode/x0ce.py | 258 + .../python3.8/site-packages/unidecode/x0cf.py | 258 + .../python3.8/site-packages/unidecode/x0d0.py | 258 + .../python3.8/site-packages/unidecode/x0d1.py | 258 + .../python3.8/site-packages/unidecode/x0d2.py | 258 + .../python3.8/site-packages/unidecode/x0d3.py | 258 + .../python3.8/site-packages/unidecode/x0d4.py | 258 + .../python3.8/site-packages/unidecode/x0d5.py | 258 + .../python3.8/site-packages/unidecode/x0d6.py | 258 + .../python3.8/site-packages/unidecode/x0d7.py | 257 + .../python3.8/site-packages/unidecode/x0f9.py | 258 + .../python3.8/site-packages/unidecode/x0fa.py | 257 + .../python3.8/site-packages/unidecode/x0fb.py | 258 + .../python3.8/site-packages/unidecode/x0fc.py | 258 + .../python3.8/site-packages/unidecode/x0fd.py | 257 + .../python3.8/site-packages/unidecode/x0fe.py | 258 + .../python3.8/site-packages/unidecode/x0ff.py | 258 + .../python3.8/site-packages/unidecode/x1d4.py | 258 + .../python3.8/site-packages/unidecode/x1d5.py | 258 + .../python3.8/site-packages/unidecode/x1d6.py | 258 + .../python3.8/site-packages/unidecode/x1d7.py | 258 + .../python3.8/site-packages/unidecode/x1f1.py | 258 + .../wheel-0.34.2.dist-info/INSTALLER | 1 + .../wheel-0.34.2.dist-info/LICENSE.txt | 22 + .../wheel-0.34.2.dist-info/METADATA | 66 + .../wheel-0.34.2.dist-info/RECORD | 38 + .../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 + .../python3.8/site-packages/wheel/__init__.py | 1 + .../python3.8/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 162 bytes .../wheel/__pycache__/__main__.cpython-38.pyc | Bin 0 -> 559 bytes .../wheel/__pycache__/_version.cpython-38.pyc | Bin 0 -> 174 bytes .../__pycache__/bdist_wheel.cpython-38.pyc | Bin 0 -> 10868 bytes .../__pycache__/macosx_libfile.cpython-38.pyc | Bin 0 -> 7089 bytes .../wheel/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 3698 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 7586 bytes .../wheel/__pycache__/pkginfo.cpython-38.pyc | Bin 0 -> 1523 bytes .../wheel/__pycache__/util.cpython-38.pyc | Bin 0 -> 1276 bytes .../__pycache__/wheelfile.cpython-38.pyc | Bin 0 -> 5494 bytes .../python3.8/site-packages/wheel/_version.py | 4 + .../site-packages/wheel/bdist_wheel.py | 403 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3046 bytes .../cli/__pycache__/convert.cpython-38.pyc | Bin 0 -> 6176 bytes .../cli/__pycache__/install.cpython-38.pyc | Bin 0 -> 143 bytes .../wheel/cli/__pycache__/pack.cpython-38.pyc | Bin 0 -> 2811 bytes .../cli/__pycache__/unpack.cpython-38.pyc | Bin 0 -> 911 bytes .../site-packages/wheel/cli/convert.py | 269 + .../site-packages/wheel/cli/install.py | 0 .../python3.8/site-packages/wheel/cli/pack.py | 79 + .../site-packages/wheel/cli/unpack.py | 25 + .../site-packages/wheel/macosx_libfile.py | 341 + .../python3.8/site-packages/wheel/metadata.py | 138 + .../site-packages/wheel/pep425tags.py | 261 + .../python3.8/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.8/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + blog-generator/venv/lib/python3.8/site.py | 833 ++ .../venv/lib/python3.8/sre_compile.py | 1 + .../venv/lib/python3.8/sre_constants.py | 1 + .../venv/lib/python3.8/sre_parse.py | 1 + blog-generator/venv/lib/python3.8/stat.py | 1 + blog-generator/venv/lib/python3.8/struct.py | 1 + blog-generator/venv/lib/python3.8/tarfile.py | 1 + blog-generator/venv/lib/python3.8/tempfile.py | 1 + blog-generator/venv/lib/python3.8/token.py | 1 + blog-generator/venv/lib/python3.8/tokenize.py | 1 + blog-generator/venv/lib/python3.8/types.py | 1 + blog-generator/venv/lib/python3.8/warnings.py | 1 + blog-generator/venv/lib/python3.8/weakref.py | 1 + 3250 files changed, 399831 insertions(+) create mode 100644 .gitignore create mode 100644 blog-generator/Makefile create mode 100644 blog-generator/__pycache__/pelicanconf.cpython-38.pyc create mode 100644 blog-generator/content/test.md create mode 100644 blog-generator/output/archives.html create mode 100644 blog-generator/output/authors.html create mode 100644 blog-generator/output/categories.html create mode 100644 blog-generator/output/index.html create mode 100644 blog-generator/output/tags.html create mode 100644 blog-generator/output/theme/css/fonts.css create mode 100644 blog-generator/output/theme/css/main.css create mode 100644 blog-generator/output/theme/css/pygment.css create mode 100644 blog-generator/output/theme/css/reset.css create mode 100644 blog-generator/output/theme/css/typogrify.css create mode 100644 blog-generator/output/theme/css/wide.css create mode 100644 blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.eot create mode 100644 blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.svg create mode 100644 blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.ttf create mode 100644 blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.woff create mode 100644 blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.woff2 create mode 100644 blog-generator/output/theme/fonts/font.css create mode 100644 blog-generator/output/theme/images/icons/aboutme.png create mode 100644 blog-generator/output/theme/images/icons/bitbucket.png create mode 100644 blog-generator/output/theme/images/icons/delicious.png create mode 100644 blog-generator/output/theme/images/icons/facebook.png create mode 100644 blog-generator/output/theme/images/icons/github.png create mode 100644 blog-generator/output/theme/images/icons/gitorious.png create mode 100644 blog-generator/output/theme/images/icons/gittip.png create mode 100644 blog-generator/output/theme/images/icons/google-groups.png create mode 100644 blog-generator/output/theme/images/icons/google-plus.png create mode 100644 blog-generator/output/theme/images/icons/hackernews.png create mode 100644 blog-generator/output/theme/images/icons/lastfm.png create mode 100644 blog-generator/output/theme/images/icons/linkedin.png create mode 100644 blog-generator/output/theme/images/icons/reddit.png create mode 100644 blog-generator/output/theme/images/icons/rss.png create mode 100644 blog-generator/output/theme/images/icons/slideshare.png create mode 100644 blog-generator/output/theme/images/icons/speakerdeck.png create mode 100644 blog-generator/output/theme/images/icons/stackoverflow.png create mode 100644 blog-generator/output/theme/images/icons/twitter.png create mode 100644 blog-generator/output/theme/images/icons/vimeo.png create mode 100644 blog-generator/output/theme/images/icons/youtube.png create mode 100644 blog-generator/pelicanconf.py create mode 100644 blog-generator/publishconf.py create mode 100644 blog-generator/tasks.py create mode 100644 blog-generator/venv/bin/__pycache__/rst2html.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2html4.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2html5.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2latex.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2man.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2odt.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2odt_prepstyles.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2pseudoxml.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2s5.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2xetex.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rst2xml.cpython-38.pyc create mode 100644 blog-generator/venv/bin/__pycache__/rstpep2html.cpython-38.pyc create mode 100644 blog-generator/venv/bin/activate create mode 100644 blog-generator/venv/bin/activate.csh create mode 100644 blog-generator/venv/bin/activate.fish create mode 100644 blog-generator/venv/bin/activate.ps1 create mode 100644 blog-generator/venv/bin/activate_this.py create mode 100755 blog-generator/venv/bin/easy_install create mode 100755 blog-generator/venv/bin/easy_install-3.8 create mode 100755 blog-generator/venv/bin/markdown_py create mode 100755 blog-generator/venv/bin/pelican create mode 100755 blog-generator/venv/bin/pelican-import create mode 100755 blog-generator/venv/bin/pelican-quickstart create mode 100755 blog-generator/venv/bin/pelican-themes create mode 100755 blog-generator/venv/bin/pip create mode 100755 blog-generator/venv/bin/pip3 create mode 100755 blog-generator/venv/bin/pip3.8 create mode 100755 blog-generator/venv/bin/pygmentize create mode 100755 blog-generator/venv/bin/python create mode 100755 blog-generator/venv/bin/python-config create mode 120000 blog-generator/venv/bin/python3 create mode 120000 blog-generator/venv/bin/python3.8 create mode 100755 blog-generator/venv/bin/rst2html.py create mode 100755 blog-generator/venv/bin/rst2html4.py create mode 100755 blog-generator/venv/bin/rst2html5.py create mode 100755 blog-generator/venv/bin/rst2latex.py create mode 100755 blog-generator/venv/bin/rst2man.py create mode 100755 blog-generator/venv/bin/rst2odt.py create mode 100755 blog-generator/venv/bin/rst2odt_prepstyles.py create mode 100755 blog-generator/venv/bin/rst2pseudoxml.py create mode 100755 blog-generator/venv/bin/rst2s5.py create mode 100755 blog-generator/venv/bin/rst2xetex.py create mode 100755 blog-generator/venv/bin/rst2xml.py create mode 100755 blog-generator/venv/bin/rstpep2html.py create mode 100755 blog-generator/venv/bin/unidecode create mode 100755 blog-generator/venv/bin/wheel create mode 120000 blog-generator/venv/include/python3.8 create mode 120000 blog-generator/venv/lib/python3.8/__future__.py create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/__future__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/_bootlocale.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/_collections_abc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/_weakrefset.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/abc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/base64.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/bisect.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/codecs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/copy.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/copyreg.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/enum.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/fnmatch.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/functools.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/genericpath.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/hashlib.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/heapq.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/hmac.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/imp.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/io.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/keyword.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/linecache.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/locale.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/ntpath.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/operator.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/os.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/posixpath.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/random.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/re.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/reprlib.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/shutil.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/site.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/sre_compile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/sre_constants.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/sre_parse.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/stat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/struct.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/tarfile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/tempfile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/token.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/tokenize.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/types.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/warnings.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/__pycache__/weakref.cpython-38.pyc create mode 120000 blog-generator/venv/lib/python3.8/_bootlocale.py create mode 120000 blog-generator/venv/lib/python3.8/_collections_abc.py create mode 120000 blog-generator/venv/lib/python3.8/_dummy_thread.py create mode 120000 blog-generator/venv/lib/python3.8/_weakrefset.py create mode 120000 blog-generator/venv/lib/python3.8/abc.py create mode 120000 blog-generator/venv/lib/python3.8/base64.py create mode 120000 blog-generator/venv/lib/python3.8/bisect.py create mode 120000 blog-generator/venv/lib/python3.8/codecs.py create mode 120000 blog-generator/venv/lib/python3.8/collections create mode 120000 blog-generator/venv/lib/python3.8/config-3.8-x86_64-linux-gnu create mode 120000 blog-generator/venv/lib/python3.8/copy.py create mode 120000 blog-generator/venv/lib/python3.8/copyreg.py create mode 100644 blog-generator/venv/lib/python3.8/distutils/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/distutils/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/distutils/distutils.cfg create mode 120000 blog-generator/venv/lib/python3.8/encodings create mode 120000 blog-generator/venv/lib/python3.8/enum.py create mode 120000 blog-generator/venv/lib/python3.8/fnmatch.py create mode 120000 blog-generator/venv/lib/python3.8/functools.py create mode 120000 blog-generator/venv/lib/python3.8/genericpath.py create mode 120000 blog-generator/venv/lib/python3.8/hashlib.py create mode 120000 blog-generator/venv/lib/python3.8/heapq.py create mode 120000 blog-generator/venv/lib/python3.8/hmac.py create mode 120000 blog-generator/venv/lib/python3.8/imp.py create mode 120000 blog-generator/venv/lib/python3.8/importlib create mode 120000 blog-generator/venv/lib/python3.8/io.py create mode 120000 blog-generator/venv/lib/python3.8/keyword.py create mode 120000 blog-generator/venv/lib/python3.8/lib-dynload create mode 120000 blog-generator/venv/lib/python3.8/linecache.py create mode 120000 blog-generator/venv/lib/python3.8/locale.py create mode 100644 blog-generator/venv/lib/python3.8/no-global-site-packages.txt create mode 120000 blog-generator/venv/lib/python3.8/ntpath.py create mode 120000 blog-generator/venv/lib/python3.8/operator.py create mode 100644 blog-generator/venv/lib/python3.8/orig-prefix.txt create mode 120000 blog-generator/venv/lib/python3.8/os.py create mode 120000 blog-generator/venv/lib/python3.8/posixpath.py create mode 120000 blog-generator/venv/lib/python3.8/random.py create mode 120000 blog-generator/venv/lib/python3.8/re.py create mode 120000 blog-generator/venv/lib/python3.8/reprlib.py create mode 120000 blog-generator/venv/lib/python3.8/rlcompleter.py create mode 120000 blog-generator/venv/lib/python3.8/shutil.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/LICENSE.rst create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/entry_points.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/LICENSE.md create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/entry_points.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/AUTHORS create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/LICENSE create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/entry_points.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/DESCRIPTION.rst create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/LICENSE.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/entry_points.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/metadata.json create mode 100644 blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/AUTHORS create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/LICENSE create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker/__pycache__/_saferef.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker/__pycache__/_utilities.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker/__pycache__/base.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker/_saferef.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker/_utilities.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/blinker/base.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/_common.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/_version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/easter.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/relativedelta.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/rrule.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/tzwin.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/_common.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/_version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/easter.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/isoparser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/_parser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/isoparser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/relativedelta.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/rrule.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/_factories.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/win.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/_common.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/_factories.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/tz.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/win.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/tzwin.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz create mode 100644 blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/rebuild.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/COPYING.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/core.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/examples.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/frontend.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/io.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/nodes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/statemachine.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/core.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/examples.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/frontend.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/io.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/af.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/ca.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/cs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/da.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/de.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/en.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/eo.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/es.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/fa.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/fi.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/fr.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/gl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/he.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/it.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/ja.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/ko.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/lt.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/lv.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/nl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/pl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/pt_br.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/ru.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/sk.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/sv.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/zh_cn.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/__pycache__/zh_tw.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/af.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/ca.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/cs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/da.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/de.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/en.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/eo.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/es.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/fa.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/fi.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/fr.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/gl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/he.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/it.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/ja.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/ko.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/lt.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/lv.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/nl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/pl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/pt_br.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/ru.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/sk.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/sv.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/zh_cn.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/languages/zh_tw.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/nodes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/__pycache__/null.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/null.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/__pycache__/roles.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/__pycache__/states.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/__pycache__/tableparser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/admonitions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/body.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/html.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/images.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/misc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/parts.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/references.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/__pycache__/tables.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/admonitions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/body.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/html.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/images.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/misc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/parts.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/references.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/directives/tables.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/README.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsa.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsb.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsc.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsn.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamso.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isoamsr.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isobox.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr1.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isocyr2.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isodia.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk1.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk2.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk3.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4-wide.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isogrk4.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isolat1.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isolat2.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk-wide.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isomfrk.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf-wide.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isomopf.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr-wide.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isomscr.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isonum.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isopub.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/isotech.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlalias.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra-wide.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/mmlextra.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/s5defs.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-lat1.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-special.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/include/xhtml1-symbol.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/af.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ca.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/cs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/da.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/de.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/en.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/eo.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/es.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fa.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fi.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/fr.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/gl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/he.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/it.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ja.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ko.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/lt.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/lv.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/nl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/pl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/pt_br.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/ru.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/sk.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/sv.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/zh_cn.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/__pycache__/zh_tw.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/af.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/ca.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/cs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/da.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/de.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/en.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/eo.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/es.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/fa.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/fi.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/fr.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/gl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/he.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/it.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/ja.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/ko.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/lt.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/lv.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/nl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/pl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/pt_br.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/ru.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/sk.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/sv.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_cn.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/languages/zh_tw.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/roles.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/states.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/parsers/rst/tableparser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/readers/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/readers/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/readers/__pycache__/doctree.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/readers/__pycache__/pep.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/readers/__pycache__/standalone.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/readers/doctree.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/readers/pep.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/readers/standalone.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/statemachine.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/components.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/frontmatter.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/misc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/parts.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/peps.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/references.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/universal.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/writer_aux.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/components.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/frontmatter.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/misc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/parts.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/peps.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/references.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/universal.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/writer_aux.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/code_analyzer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/error_reporting.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/punctuation_chars.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/roman.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/smartquotes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/urischemes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/code_analyzer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/error_reporting.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/latex2mathml.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/math2html.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/tex2mathml_extern.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/tex2unichar.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/unichar2tex.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/latex2mathml.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/math2html.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/tex2mathml_extern.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/tex2unichar.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/unichar2tex.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/punctuation_chars.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/roman.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/smartquotes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/utils/urischemes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/_html_base.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/docutils_xml.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/manpage.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/null.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/pseudoxml.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/_html_base.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/docutils_xml.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html4css1/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html4css1/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html4css1/html4css1.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html4css1/template.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html5_polyglot/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html5_polyglot/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html5_polyglot/math.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html5_polyglot/minimal.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html5_polyglot/plain.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/html5_polyglot/template.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/latex2e/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/latex2e/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/latex2e/default.tex create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/latex2e/titlepage.tex create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/latex2e/xelatex.tex create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/manpage.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/null.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/odf_odt/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/odf_odt/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/odf_odt/__pycache__/pygmentsformatter.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/odf_odt/pygmentsformatter.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/odf_odt/styles.odt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/pep_html/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/pep_html/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/pep_html/pep.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/pep_html/template.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/pseudoxml.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/README.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-black/__base__ create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-black/framing.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-black/pretty.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-white/framing.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/big-white/pretty.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/blank.gif create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/framing.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/iepngfix.htc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/opera.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/outline.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/pretty.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/print.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/s5-core.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/slides.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/default/slides.js create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/medium-black/__base__ create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/medium-black/pretty.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/medium-white/framing.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/medium-white/pretty.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/small-black/__base__ create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/small-black/pretty.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/small-white/framing.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/s5_html/themes/small-white/pretty.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/xetex/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/docutils/writers/xetex/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/easy_install.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/LICENSE create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator-1.9.1.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/datetime_safe.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/encoding.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/feedgenerator.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/functional.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/six.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/timezone.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/__pycache__/xmlutils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/datetime_safe.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/encoding.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/feedgenerator.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/functional.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/six.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/timezone.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/feedgenerator/django/utils/xmlutils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/_compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/_identifier.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/asyncfilters.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/asyncsupport.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/bccache.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/compiler.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/constants.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/debug.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/defaults.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/environment.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/exceptions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/ext.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/filters.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/idtracking.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/lexer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/loaders.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/meta.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/nativetypes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/nodes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/optimizer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/parser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/runtime.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/sandbox.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/tests.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/__pycache__/visitor.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/_compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/_identifier.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/asyncfilters.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/asyncsupport.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/bccache.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/compiler.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/constants.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/debug.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/defaults.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/environment.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/exceptions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/ext.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/filters.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/idtracking.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/lexer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/loaders.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/meta.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/nativetypes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/nodes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/optimizer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/parser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/runtime.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/sandbox.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/tests.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/jinja2/visitor.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__main__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__meta__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/__main__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/__meta__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/blockparser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/blockprocessors.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/core.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/inlinepatterns.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/pep562.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/postprocessors.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/preprocessors.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/serializers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/test_tools.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/treeprocessors.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/__pycache__/util.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/blockparser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/blockprocessors.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/core.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/abbr.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/admonition.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/attr_list.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/codehilite.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/def_list.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/extra.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/fenced_code.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/footnotes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/legacy_attrs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/legacy_em.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/md_in_html.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/meta.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/nl2br.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/sane_lists.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/smarty.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/tables.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/toc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/__pycache__/wikilinks.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/abbr.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/admonition.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/attr_list.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/codehilite.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/def_list.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/extra.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/fenced_code.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/footnotes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/legacy_attrs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/legacy_em.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/md_in_html.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/meta.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/nl2br.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/sane_lists.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/smarty.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/tables.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/toc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/extensions/wikilinks.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/inlinepatterns.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/pep562.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/postprocessors.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/preprocessors.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/serializers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/test_tools.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/treeprocessors.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markdown/util.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/__pycache__/_compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/__pycache__/_constants.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/__pycache__/_native.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/_compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/_constants.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/_native.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/markupsafe/_speedups.c create mode 100755 blog-generator/venv/lib/python3.8/site-packages/markupsafe/_speedups.cpython-38-x86_64-linux-gnu.so create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican-4.2.0.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican-4.2.0.dist-info/LICENSE create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican-4.2.0.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican-4.2.0.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican-4.2.0.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican-4.2.0.dist-info/entry_points.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican-4.2.0.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__main__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/__main__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/cache.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/contents.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/generators.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/log.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/paginator.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/readers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/rstdirectives.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/server.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/settings.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/signals.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/urlwrappers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/__pycache__/writers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/cache.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/contents.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/generators.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/log.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/paginator.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/readers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/rstdirectives.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/server.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/settings.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/signals.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/fonts.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/main.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/pygment.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/reset.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/typogrify.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/css/wide.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.eot create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.svg create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.ttf create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.woff create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/Yanone_Kaffeesatz_400.woff2 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/fonts/font.css create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/aboutme.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/bitbucket.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/delicious.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/facebook.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/github.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/gitorious.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/gittip.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/google-groups.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/google-plus.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/hackernews.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/lastfm.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/linkedin.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/reddit.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/rss.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/slideshare.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/speakerdeck.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/stackoverflow.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/twitter.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/vimeo.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/static/images/icons/youtube.png create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/analytics.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/archives.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/article.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/article_infos.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/author.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/authors.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/base.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/category.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/comments.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/disqus_script.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/github.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/index.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/page.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/period_archives.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/tag.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/taglist.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/tags.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/translations.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/notmyidea/templates/twitter.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/archives.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/article.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/author.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/authors.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/base.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/categories.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/category.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/gosquared.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/index.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/page.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/pagination.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/period_archives.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/tag.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/tags.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/themes/simple/templates/translations.html create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/__pycache__/pelican_import.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/__pycache__/pelican_quickstart.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/__pycache__/pelican_themes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/pelican_import.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/pelican_quickstart.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/pelican_themes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/templates/Makefile.jinja2 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/templates/pelicanconf.py.jinja2 create mode 100755 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/templates/publishconf.py.jinja2 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/tools/templates/tasks.py.jinja2 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/urlwrappers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pelican/writers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/LICENSE.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/entry_points.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/__main__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/__pycache__/__main__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/build_env.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/cache.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/configuration.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/exceptions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/locations.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/main.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/pep425tags.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/pyproject.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/build_env.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cache.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/parser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/base_command.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/command_context.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/main.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/parser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/req_command.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/cli/status_codes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/check.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/completion.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/debug.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/download.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/hash.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/help.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/install.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/list.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/search.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/show.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/check.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/completion.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/configuration.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/debug.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/download.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/freeze.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/hash.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/help.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/install.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/list.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/search.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/show.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/commands/wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/configuration.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/base.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/base.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/installed.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/distributions/wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/exceptions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/index/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/collector.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/index/collector.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/index/package_finder.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/locations.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/main.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/candidate.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/format_control.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/index.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/link.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/scheme.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/target_python.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/candidate.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/format_control.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/index.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/link.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/scheme.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/search_scope.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/target_python.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/models/wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/auth.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/cache.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/download.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/session.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/auth.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/cache.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/download.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/session.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/check.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/check.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/freeze.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/operations/prepare.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/pep425tags.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/pyproject.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/constructors.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_file.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_install.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_set.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/constructors.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/req_file.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/req_install.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/req_set.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/req_tracker.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/self_outdated_check.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/logging.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/misc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/models.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/typing.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/ui.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/urls.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/appdirs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/deprecation.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/encoding.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/filetypes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/glibc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/hashes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/logging.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/marker_files.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/misc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/models.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/packaging.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/subprocess.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/typing.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/ui.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/unpacking.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/urls.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/utils/wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/git.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/git.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/subversion.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_internal/wheel_builder.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/appdirs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/contextlib2.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/distro.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/retrying.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/appdirs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/certifi/core.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/enums.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/chardet/version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/win32.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/contextlib2.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/database.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/index.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/locators.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/markers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/resources.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/util.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/distro.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/core.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/codec.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/core.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/intranges.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/package_data.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/ipaddress.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/_typing.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/_typing.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/markers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/tags.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/packaging/version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/build.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/check.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/meta.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/progress/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/progress/bar.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/progress/counter.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/progress/spinner.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pyparsing.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/core.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/test.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/api.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/help.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/models.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/__version__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/adapters.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/api.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/auth.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/certs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/cookies.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/help.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/hooks.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/models.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/packages.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/sessions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/structures.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/requests/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/retrying.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/six.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/request.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/response.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/__pycache__/py2_warn.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/__pycache__/py31compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/_vendor/six.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/extern/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/py2_warn.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pkg_resources/py31compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__main__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/__main__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/cmdline.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/console.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/filter.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/formatter.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/lexer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/modeline.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/plugin.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/regexopt.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/scanner.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/sphinxext.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/style.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/token.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/unistring.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/__pycache__/util.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/cmdline.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/console.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/filter.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/filters/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/filters/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatter.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/_mapping.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/bbcode.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/html.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/img.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/irc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/latex.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/other.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/rtf.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/svg.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/terminal.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/__pycache__/terminal256.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/_mapping.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/bbcode.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/html.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/img.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/irc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/latex.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/other.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/rtf.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/svg.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/terminal.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/formatters/terminal256.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_mapping.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/actionscript.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/agile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/algebra.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/ambient.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/ampl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/apl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/archetype.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/asm.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/automation.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/basic.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/bibtex.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/boa.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/business.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/c_like.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/capnproto.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/chapel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/clean.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/compiled.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/configs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/console.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/crystal.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/csound.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/css.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/dalvik.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/data.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/diff.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/dotnet.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/dsls.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/dylan.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/ecl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/eiffel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/elm.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/email.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/erlang.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/esoteric.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/ezhil.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/factor.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/fantom.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/felix.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/floscript.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/forth.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/fortran.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/foxpro.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/freefem.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/functional.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/go.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/graph.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/graphics.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/haskell.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/haxe.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/hdl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/hexdump.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/html.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/idl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/igor.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/inferno.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/installers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/iolang.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/j.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/javascript.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/julia.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/jvm.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/lisp.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/make.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/markup.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/math.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/matlab.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/mime.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/ml.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/modeling.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/modula2.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/monte.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/ncl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/nimrod.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/nit.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/nix.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/oberon.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/objective.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/ooc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/other.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/parasail.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/parsers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/pascal.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/pawn.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/perl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/php.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/pony.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/praat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/prolog.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/python.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/qvt.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/r.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/rdf.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/rebol.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/resource.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/rnc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/roboconf.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/robotframework.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/ruby.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/rust.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/sas.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/scdoc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/scripting.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/sgf.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/shell.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/slash.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/smv.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/snobol.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/solidity.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/special.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/sql.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/stata.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/supercollider.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/tcl.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/templates.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/teraterm.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/testing.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/text.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/textedit.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/textfmts.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/theorem.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/typoscript.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/unicon.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/urbi.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/varnish.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/verification.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/web.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/webmisc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/whiley.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/x10.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/xorg.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/__pycache__/zig.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_asy_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_cl_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_cocoa_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_csound_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_lasso_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_lua_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_mapping.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_mql_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_openedge_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_php_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_postgres_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_scilab_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_sourcemod_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_stan_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_stata_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_tsql_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_vbscript_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/_vim_builtins.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/actionscript.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/agile.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/algebra.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/ambient.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/ampl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/apl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/archetype.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/asm.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/automation.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/basic.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/bibtex.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/boa.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/business.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/c_cpp.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/c_like.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/capnproto.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/chapel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/clean.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/compiled.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/configs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/console.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/crystal.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/csound.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/css.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/dalvik.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/data.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/diff.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/dotnet.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/dsls.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/dylan.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/ecl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/eiffel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/elm.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/email.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/erlang.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/esoteric.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/ezhil.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/factor.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/fantom.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/felix.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/floscript.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/forth.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/fortran.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/foxpro.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/freefem.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/functional.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/go.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/grammar_notation.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/graph.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/graphics.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/haskell.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/haxe.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/hdl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/hexdump.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/html.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/idl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/igor.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/inferno.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/installers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/int_fiction.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/iolang.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/j.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/javascript.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/julia.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/jvm.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/lisp.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/make.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/markup.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/math.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/matlab.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/mime.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/ml.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/modeling.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/modula2.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/monte.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/ncl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/nimrod.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/nit.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/nix.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/oberon.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/objective.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/ooc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/other.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/parasail.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/parsers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/pascal.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/pawn.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/perl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/php.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/pony.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/praat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/prolog.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/python.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/qvt.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/r.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/rdf.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/rebol.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/resource.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/rnc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/roboconf.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/robotframework.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/ruby.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/rust.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/sas.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/scdoc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/scripting.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/sgf.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/shell.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/slash.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/smalltalk.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/smv.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/snobol.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/solidity.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/special.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/sql.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/stata.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/supercollider.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/tcl.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/templates.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/teraterm.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/testing.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/text.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/textedit.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/textfmts.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/theorem.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/trafficscript.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/typoscript.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/unicon.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/urbi.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/varnish.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/verification.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/web.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/webmisc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/whiley.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/x10.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/xorg.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/lexers/zig.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/modeline.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/plugin.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/regexopt.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/scanner.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/sphinxext.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/style.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/abap.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/algol.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/algol_nu.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/arduino.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/autumn.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/borland.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/bw.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/colorful.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/default.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/emacs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/friendly.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/fruity.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/igor.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/inkpot.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/lovelace.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/manni.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/monokai.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/murphy.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/native.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/pastie.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/perldoc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/rrt.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/sas.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/solarized.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/stata_dark.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/stata_light.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/tango.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/trac.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/vim.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/vs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/__pycache__/xcode.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/abap.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/algol.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/algol_nu.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/arduino.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/autumn.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/borland.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/bw.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/colorful.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/default.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/emacs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/friendly.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/fruity.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/igor.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/inkpot.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/lovelace.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/manni.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/monokai.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/murphy.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/native.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/paraiso_dark.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/paraiso_light.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/pastie.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/perldoc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/rainbow_dash.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/rrt.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/sas.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/solarized.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/stata_dark.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/stata_light.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/tango.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/trac.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/vim.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/vs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/styles/xcode.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/token.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/unistring.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pygments/util.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/LICENSE create mode 100644 blog-generator/venv/lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/python_dateutil-2.8.1.dist-info/zip-safe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/DESCRIPTION.rst create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/LICENSE.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/metadata.json create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz-2019.3.dist-info/zip-safe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/__pycache__/exceptions.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/__pycache__/lazy.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/__pycache__/reference.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/__pycache__/tzfile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/__pycache__/tzinfo.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/exceptions.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/lazy.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/reference.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/tzfile.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/tzinfo.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Abidjan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Accra create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Addis_Ababa create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Algiers create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Asmara create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Asmera create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Bamako create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Bangui create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Banjul create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Bissau create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Blantyre create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Brazzaville create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Bujumbura create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Cairo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Casablanca create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Ceuta create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Conakry create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Dakar create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Djibouti create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Douala create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/El_Aaiun create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Freetown create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Gaborone create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Harare create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Johannesburg create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Juba create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Kampala create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Khartoum create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Kigali create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Kinshasa create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Lagos create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Libreville create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Lome create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Luanda create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Lubumbashi create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Lusaka create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Malabo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Maputo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Maseru create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Mbabane create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Mogadishu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Monrovia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Nairobi create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Ndjamena create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Niamey create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Nouakchott create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Ouagadougou create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Porto-Novo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Sao_Tome create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Timbuktu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Tripoli create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Tunis create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Africa/Windhoek create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Adak create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Anchorage create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Anguilla create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Antigua create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Araguaina create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Catamarca create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Cordoba create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Jujuy create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Mendoza create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Salta create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/San_Juan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/San_Luis create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Tucuman create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Aruba create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Asuncion create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Atikokan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Atka create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Bahia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Bahia_Banderas create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Barbados create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Belem create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Belize create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Blanc-Sablon create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Boa_Vista create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Bogota create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Boise create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Buenos_Aires create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Cambridge_Bay create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Campo_Grande create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Cancun create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Caracas create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Catamarca create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Cayenne create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Cayman create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Chicago create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Chihuahua create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Coral_Harbour create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Cordoba create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Costa_Rica create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Creston create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Cuiaba create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Curacao create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Danmarkshavn create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Dawson create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Dawson_Creek create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Denver create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Detroit create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Dominica create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Edmonton create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Eirunepe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/El_Salvador create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Ensenada create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Fort_Nelson create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Fort_Wayne create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Fortaleza create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Glace_Bay create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Godthab create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Goose_Bay create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Grand_Turk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Grenada create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Guadeloupe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Guatemala create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Guayaquil create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Guyana create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Halifax create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Havana create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Hermosillo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Knox create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Marengo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Petersburg create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Tell_City create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Vevay create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Vincennes create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indiana/Winamac create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Indianapolis create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Inuvik create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Iqaluit create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Jamaica create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Jujuy create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Juneau create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Kentucky/Louisville create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Kentucky/Monticello create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Knox_IN create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Kralendijk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/La_Paz create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Lima create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Los_Angeles create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Louisville create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Lower_Princes create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Maceio create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Managua create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Manaus create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Marigot create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Martinique create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Matamoros create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Mazatlan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Mendoza create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Menominee create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Merida create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Metlakatla create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Mexico_City create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Miquelon create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Moncton create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Monterrey create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Montevideo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Montreal create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Montserrat create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Nassau create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/New_York create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Nipigon create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Nome create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Noronha create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/North_Dakota/Center create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Ojinaga create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Panama create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Pangnirtung create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Paramaribo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Phoenix create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Port-au-Prince create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Port_of_Spain create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Porto_Acre create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Porto_Velho create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Puerto_Rico create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Punta_Arenas create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Rainy_River create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Rankin_Inlet create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Recife create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Regina create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Resolute create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Rio_Branco create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Rosario create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Santa_Isabel create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Santarem create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Santiago create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Santo_Domingo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Sao_Paulo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Scoresbysund create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Shiprock create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Sitka create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/St_Barthelemy create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/St_Johns create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/St_Kitts create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/St_Lucia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/St_Thomas create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/St_Vincent create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Swift_Current create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Tegucigalpa create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Thule create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Thunder_Bay create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Tijuana create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Toronto create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Tortola create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Vancouver create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Virgin create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Whitehorse create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Winnipeg create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Yakutat create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/America/Yellowknife create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Casey create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Davis create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Macquarie create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Mawson create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/McMurdo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Palmer create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Rothera create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/South_Pole create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Syowa create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Troll create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Antarctica/Vostok create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Arctic/Longyearbyen create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Aden create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Almaty create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Amman create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Anadyr create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Aqtau create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Aqtobe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ashgabat create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ashkhabad create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Atyrau create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Baghdad create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Bahrain create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Baku create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Bangkok create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Barnaul create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Beirut create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Bishkek create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Brunei create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Calcutta create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Chita create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Choibalsan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Chongqing create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Chungking create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Colombo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dacca create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Damascus create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dhaka create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dili create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dubai create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Dushanbe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Famagusta create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Gaza create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Harbin create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Hebron create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Hong_Kong create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Hovd create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Irkutsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Istanbul create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Jakarta create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Jayapura create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Jerusalem create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kabul create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kamchatka create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Karachi create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kashgar create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kathmandu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Katmandu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Khandyga create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kolkata create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kuching create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Kuwait create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Macao create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Macau create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Magadan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Makassar create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Manila create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Muscat create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Nicosia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Novokuznetsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Novosibirsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Omsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Oral create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Phnom_Penh create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Pontianak create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Pyongyang create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Qatar create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Qostanay create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Qyzylorda create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Rangoon create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Riyadh create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Saigon create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Sakhalin create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Samarkand create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Seoul create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Shanghai create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Singapore create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Srednekolymsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Taipei create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tashkent create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tbilisi create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tehran create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tel_Aviv create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Thimbu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Thimphu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tokyo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Tomsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ulan_Bator create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Urumqi create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Ust-Nera create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Vientiane create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Vladivostok create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Yakutsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Yangon create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Yekaterinburg create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Asia/Yerevan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Azores create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Bermuda create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Canary create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Faeroe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Faroe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Madeira create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Reykjavik create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/South_Georgia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/St_Helena create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Atlantic/Stanley create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/ACT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Adelaide create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Brisbane create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Broken_Hill create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Canberra create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Currie create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Darwin create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Eucla create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Hobart create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/LHI create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Lindeman create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Lord_Howe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Melbourne create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/NSW create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/North create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Perth create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Queensland create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/South create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Sydney create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Tasmania create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Victoria create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/West create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Australia/Yancowinna create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Brazil/Acre create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Brazil/DeNoronha create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Brazil/East create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Brazil/West create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/CET create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/CST6CDT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Canada/Atlantic create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Canada/Central create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Canada/Eastern create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Canada/Mountain create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Canada/Newfoundland create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Canada/Pacific create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Canada/Saskatchewan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Canada/Yukon create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Chile/Continental create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Chile/EasterIsland create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Cuba create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/EET create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/EST create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/EST5EDT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Egypt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Eire create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+0 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+1 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+10 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+11 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+12 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+2 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+3 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+4 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+5 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+6 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+7 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+8 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT+9 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-0 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-1 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-10 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-11 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-12 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-13 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-14 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-2 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-3 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-4 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-5 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-6 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-7 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-8 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT-9 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/GMT0 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/Greenwich create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/UCT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/UTC create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/Universal create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Etc/Zulu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Amsterdam create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Andorra create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Astrakhan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Athens create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Belfast create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Belgrade create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Berlin create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Bratislava create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Brussels create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Bucharest create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Budapest create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Busingen create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Chisinau create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Copenhagen create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Dublin create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Gibraltar create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Guernsey create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Helsinki create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Isle_of_Man create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Istanbul create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Jersey create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Kaliningrad create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Kiev create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Kirov create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Lisbon create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Ljubljana create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/London create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Luxembourg create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Madrid create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Malta create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Mariehamn create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Minsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Monaco create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Moscow create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Nicosia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Oslo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Paris create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Podgorica create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Prague create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Riga create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Rome create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Samara create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/San_Marino create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Sarajevo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Saratov create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Simferopol create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Skopje create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Sofia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Stockholm create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Tallinn create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Tirane create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Tiraspol create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Ulyanovsk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Uzhgorod create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Vaduz create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Vatican create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Vienna create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Vilnius create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Volgograd create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Warsaw create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Zagreb create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Zaporozhye create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Europe/Zurich create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Factory create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/GB create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/GB-Eire create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/GMT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/GMT+0 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/GMT-0 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/GMT0 create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Greenwich create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/HST create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Hongkong create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Iceland create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Antananarivo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Chagos create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Christmas create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Cocos create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Comoro create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Kerguelen create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Mahe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Maldives create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Mauritius create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Mayotte create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Indian/Reunion create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Iran create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Israel create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Jamaica create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Japan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Kwajalein create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Libya create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/MET create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/MST create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/MST7MDT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Mexico/BajaNorte create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Mexico/BajaSur create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Mexico/General create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/NZ create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/NZ-CHAT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Navajo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/PRC create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/PST8PDT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Apia create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Auckland create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Bougainville create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Chatham create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Chuuk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Easter create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Efate create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Enderbury create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Fakaofo create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Fiji create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Funafuti create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Galapagos create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Gambier create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Guadalcanal create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Guam create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Honolulu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Johnston create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Kiritimati create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Kosrae create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Kwajalein create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Majuro create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Marquesas create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Midway create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Nauru create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Niue create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Norfolk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Noumea create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Pago_Pago create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Palau create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Pitcairn create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Pohnpei create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Ponape create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Port_Moresby create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Rarotonga create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Saipan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Samoa create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Tahiti create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Tarawa create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Tongatapu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Truk create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Wake create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Wallis create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Pacific/Yap create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Poland create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Portugal create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/ROC create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/ROK create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Singapore create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Turkey create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/UCT create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Alaska create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Aleutian create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Arizona create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Central create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/East-Indiana create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Eastern create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Hawaii create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Indiana-Starke create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Michigan create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Mountain create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Pacific create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/US/Samoa create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/UTC create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Universal create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/W-SU create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/WET create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/Zulu create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/iso3166.tab create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/leapseconds create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/posixrules create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/tzdata.zi create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/zone.tab create mode 100644 blog-generator/venv/lib/python3.8/site-packages/pytz/zoneinfo/zone1970.tab create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/LICENSE create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/dependency_links.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/entry_points.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools-45.2.0.dist-info/zip-safe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/_imp.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/archive_util.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/build_meta.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/config.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/dep_util.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/depends.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/dist.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/errors.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/extension.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/glob.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/installer.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/launch.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/monkey.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/msvc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/namespaces.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/package_index.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/py27compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/py31compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/py33compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/py34compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/sandbox.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/site-patch.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/ssl_support.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/unicode_utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/__pycache__/windows_support.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_deprecation_warning.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_imp.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/_vendor/six.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/archive_util.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/build_meta.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/cli-32.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/cli-64.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/cli.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/alias.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/build_clib.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/build_ext.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/build_py.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/develop.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/dist_info.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/easy_install.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/egg_info.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_lib.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_scripts.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/py36compat.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/register.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/rotate.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/saveopts.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/sdist.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/setopt.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/test.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/upload.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/upload_docs.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/alias.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/bdist_egg.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/bdist_rpm.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/bdist_wininst.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/build_clib.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/build_ext.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/build_py.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/develop.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/dist_info.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/easy_install.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/egg_info.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/install.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/install_egg_info.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/install_lib.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/install_scripts.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/launcher manifest.xml create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/py36compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/register.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/rotate.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/saveopts.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/sdist.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/setopt.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/test.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/upload.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/command/upload_docs.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/config.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/dep_util.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/depends.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/dist.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/errors.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/extension.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/extern/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/glob.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/gui-32.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/gui-64.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/gui.exe create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/installer.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/launch.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/lib2to3_ex.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/monkey.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/msvc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/namespaces.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/package_index.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/py27compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/py31compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/py33compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/py34compat.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/sandbox.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/script (dev).tmpl create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/script.tmpl create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/site-patch.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/ssl_support.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/unicode_utils.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/setuptools/windows_support.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/LICENSE create mode 100644 blog-generator/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/six.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__main__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/__main__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/util.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x000.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x001.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x002.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x003.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x004.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x005.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x006.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x007.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x009.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x00a.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x00b.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x00c.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x00d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x00e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x00f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x010.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x011.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x012.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x013.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x014.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x015.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x016.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x017.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x018.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x01d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x01e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x01f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x020.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x021.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x022.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x023.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x024.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x025.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x026.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x027.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x028.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x029.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x02a.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x02c.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x02e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x02f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x030.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x031.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x032.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x033.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x04d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x04e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x04f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x050.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x051.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x052.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x053.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x054.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x055.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x056.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x057.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x058.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x059.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x05a.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x05b.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x05c.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x05d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x05e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x05f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x060.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x061.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x062.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x063.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x064.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x065.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x066.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x067.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x068.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x069.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x06a.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x06b.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x06c.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x06d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x06e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x06f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x070.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x071.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x072.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x073.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x074.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x075.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x076.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x077.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x078.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x079.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x07a.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x07b.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x07c.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x07d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x07e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x07f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x080.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x081.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x082.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x083.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x084.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x085.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x086.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x087.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x088.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x089.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x08a.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x08b.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x08c.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x08d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x08e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x08f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x090.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x091.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x092.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x093.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x094.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x095.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x096.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x097.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x098.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x099.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x09a.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x09b.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x09c.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x09d.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x09e.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x09f.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0a0.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0a1.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0a2.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0a3.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0a4.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0ac.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0ad.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0ae.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0af.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b0.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b1.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b2.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b3.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b4.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b5.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b6.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b7.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b8.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0b9.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0ba.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0bb.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0bc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0bd.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0be.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0bf.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c0.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c1.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c2.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c3.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c4.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c5.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c6.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c7.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c8.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0c9.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0ca.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0cb.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0cc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0cd.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0ce.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0cf.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0d0.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0d1.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0d2.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0d3.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0d4.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0d5.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0d6.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0d7.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0f9.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0fa.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0fb.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0fc.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0fd.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0fe.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x0ff.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x1d4.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x1d5.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x1d6.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x1d7.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/__pycache__/x1f1.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/util.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x000.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x001.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x002.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x003.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x004.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x005.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x006.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x007.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x009.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x00a.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x00b.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x00c.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x00d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x00e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x00f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x010.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x011.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x012.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x013.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x014.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x015.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x016.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x017.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x018.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x01d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x01e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x01f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x020.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x021.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x022.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x023.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x024.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x025.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x026.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x027.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x028.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x029.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x02a.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x02c.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x02e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x02f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x030.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x031.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x032.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x033.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x04d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x04e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x04f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x050.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x051.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x052.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x053.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x054.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x055.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x056.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x057.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x058.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x059.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x05a.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x05b.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x05c.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x05d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x05e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x05f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x060.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x061.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x062.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x063.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x064.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x065.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x066.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x067.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x068.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x069.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x06a.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x06b.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x06c.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x06d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x06e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x06f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x070.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x071.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x072.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x073.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x074.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x075.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x076.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x077.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x078.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x079.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x07a.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x07b.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x07c.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x07d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x07e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x07f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x080.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x081.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x082.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x083.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x084.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x085.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x086.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x087.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x088.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x089.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x08a.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x08b.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x08c.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x08d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x08e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x08f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x090.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x091.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x092.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x093.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x094.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x095.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x096.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x097.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x098.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x099.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x09a.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x09b.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x09c.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x09d.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x09e.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x09f.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0a0.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0a1.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0a2.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0a3.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0a4.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0ac.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0ad.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0ae.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0af.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b0.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b1.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b2.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b3.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b4.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b5.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b6.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b7.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b8.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0b9.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0ba.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0bb.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0bc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0bd.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0be.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0bf.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c0.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c1.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c2.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c3.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c4.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c5.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c6.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c7.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c8.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0c9.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0ca.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0cb.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0cc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0cd.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0ce.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0cf.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0d0.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0d1.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0d2.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0d3.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0d4.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0d5.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0d6.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0d7.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0f9.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0fa.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0fb.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0fc.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0fd.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0fe.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x0ff.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x1d4.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x1d5.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x1d6.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x1d7.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/unidecode/x1f1.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/INSTALLER create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/LICENSE.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/METADATA create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/RECORD create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/WHEEL create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/entry_points.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/top_level.txt create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__main__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/__main__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/_version.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/bdist_wheel.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/macosx_libfile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/metadata.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/pep425tags.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/pkginfo.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/util.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/__pycache__/wheelfile.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/_version.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/bdist_wheel.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/__init__.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/__pycache__/convert.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/__pycache__/install.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/__pycache__/pack.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/__pycache__/unpack.cpython-38.pyc create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/convert.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/install.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/pack.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/cli/unpack.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/macosx_libfile.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/metadata.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/pep425tags.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/pkginfo.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/util.py create mode 100644 blog-generator/venv/lib/python3.8/site-packages/wheel/wheelfile.py create mode 100644 blog-generator/venv/lib/python3.8/site.py create mode 120000 blog-generator/venv/lib/python3.8/sre_compile.py create mode 120000 blog-generator/venv/lib/python3.8/sre_constants.py create mode 120000 blog-generator/venv/lib/python3.8/sre_parse.py create mode 120000 blog-generator/venv/lib/python3.8/stat.py create mode 120000 blog-generator/venv/lib/python3.8/struct.py create mode 120000 blog-generator/venv/lib/python3.8/tarfile.py create mode 120000 blog-generator/venv/lib/python3.8/tempfile.py create mode 120000 blog-generator/venv/lib/python3.8/token.py create mode 120000 blog-generator/venv/lib/python3.8/tokenize.py create mode 120000 blog-generator/venv/lib/python3.8/types.py create mode 120000 blog-generator/venv/lib/python3.8/warnings.py create mode 120000 blog-generator/venv/lib/python3.8/weakref.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c286f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +public/blog + diff --git a/blog-generator/Makefile b/blog-generator/Makefile new file mode 100644 index 0000000..09f2acb --- /dev/null +++ b/blog-generator/Makefile @@ -0,0 +1,75 @@ +PY?=python3 +PELICAN?=pelican +PELICANOPTS= + +BASEDIR=$(CURDIR) +INPUTDIR=$(BASEDIR)/content +OUTPUTDIR=$(BASEDIR)../public/blog +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 diff --git a/blog-generator/__pycache__/pelicanconf.cpython-38.pyc b/blog-generator/__pycache__/pelicanconf.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6e94860ad158f23fbbede58d955a89b5181b3c8 GIT binary patch literal 665 zcmZuuU2mH(6y+-krO>9GHffqPA?+y-3GdZZ%}t$@jX(sX()=()v6He9jQCJh{?UHY z{JN+8g+9#?P0GV;oh#qt>vQenjbUg4A4`1y?Uy77zq{mka8CHdQ8_$d0gIWi7m+9m zSV9t(k&G3j-~k%oAsXTl8etWw948za$0>)7PmqB%bcRpSIo8n_tAQ{v{%}QMBC>Il zrwPR*%F>#YaaOh3XAJBmc^d_Ub_T6J$7uA(zeeWugu40yx+Ir|V&t@~L zs^dCM4!I7Sk`}~T$7NbEX55yj)w4bWf}_ zdycJLTKE3<_D`S4L+561`E*Be{)IIyt%77}66Xocx3l7zsUPxn%X82VGJ` RKBa!j{kqF#WuPdE{1;=kybu5Y literal 0 HcmV?d00001 diff --git a/blog-generator/content/test.md b/blog-generator/content/test.md new file mode 100644 index 0000000..216a693 --- /dev/null +++ b/blog-generator/content/test.md @@ -0,0 +1,6 @@ +Title: My First Review +Date: 2010-12-03 10:20 +Category: Review + +Following is a review +lol diff --git a/blog-generator/output/archives.html b/blog-generator/output/archives.html new file mode 100644 index 0000000..10a880e --- /dev/null +++ b/blog-generator/output/archives.html @@ -0,0 +1,46 @@ + + + + + Le Jean-Blog + + + + + +
+

Archives for Le Jean-Blog

+ +
+
+
+
+
+

links

+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog-generator/output/authors.html b/blog-generator/output/authors.html new file mode 100644 index 0000000..f100428 --- /dev/null +++ b/blog-generator/output/authors.html @@ -0,0 +1,47 @@ + + + + + Le Jean-Blog - Authors + + + + + + +
+

Authors on Le Jean-Blog

+
    +
+
+ +
+
+

links

+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog-generator/output/categories.html b/blog-generator/output/categories.html new file mode 100644 index 0000000..cc69b38 --- /dev/null +++ b/blog-generator/output/categories.html @@ -0,0 +1,43 @@ + + + + + Le Jean-Blog - Categories + + + + + +

Categories on Le Jean-Blog

+
    +
+
+
+

links

+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog-generator/output/index.html b/blog-generator/output/index.html new file mode 100644 index 0000000..48ffdf9 --- /dev/null +++ b/blog-generator/output/index.html @@ -0,0 +1,43 @@ + + + + + Le Jean-Blog + + + + + +
+

Pages

+
+
+
+

links

+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog-generator/output/tags.html b/blog-generator/output/tags.html new file mode 100644 index 0000000..f227fd2 --- /dev/null +++ b/blog-generator/output/tags.html @@ -0,0 +1,47 @@ + + + + + Le Jean-Blog - Tags + + + + + + +
+

Tags for Le Jean-Blog

+
    +
+
+ +
+
+

links

+ +
+ +
+ + + + + \ No newline at end of file diff --git a/blog-generator/output/theme/css/fonts.css b/blog-generator/output/theme/css/fonts.css new file mode 100644 index 0000000..5601507 --- /dev/null +++ b/blog-generator/output/theme/css/fonts.css @@ -0,0 +1,12 @@ +@font-face { + font-family: 'Yanone Kaffeesatz'; + font-style: normal; + font-weight: 400; + src: + local('Yanone Kaffeesatz Regular'), + local('YanoneKaffeesatz-Regular'), + /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ + url('../fonts/Yanone_Kaffeesatz_400.woff') format('woff'), + /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ + url('../fonts/Yanone_Kaffeesatz_400.woff2') format('woff2'); +} diff --git a/blog-generator/output/theme/css/main.css b/blog-generator/output/theme/css/main.css new file mode 100644 index 0000000..2b9d96e --- /dev/null +++ b/blog-generator/output/theme/css/main.css @@ -0,0 +1,467 @@ +/* + Name: Smashing HTML5 + Date: July 2009 + Description: Sample layout for HTML5 and CSS3 goodness. + Version: 1.0 + License: MIT + Licensed by: Smashing Media GmbH + Original author: Enrique Ramírez +*/ + +/* Imports */ +@import url("reset.css"); +@import url("pygment.css"); +@import url("typogrify.css"); +@import url("fonts.css"); + +/***** Global *****/ +/* Body */ +body { + background: #F5F4EF; + 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: #C74350; + padding: 0 1px; + text-decoration: underline; +} +a:hover, a:active { + background-color: #C74350; + color: #fff; + text-decoration: none; + text-shadow: 1px 1px 1px #333; +} + +h1 a:hover { + background-color: inherit +} + +/* 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; + margin-bottom: 1em; } + +.post-info { + float:right; + margin:10px; + padding:5px; +} + +.post-info p{ + margin-top: 1px; + margin-bottom: 1px; +} + +.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, div.figure.align-right { + float: right; + margin: 0 0 2em 2em; +} +img.left, figure.left, div.figure.align-left { + float: left; + margin: 0 2em 2em 0; +} + +/* .rst support */ +div.figure img, figure img { /* to fill figure exactly */ + width: 100%; +} +div.figure p.caption, figure p.caption { /* margin provided by figure */ + margin-top: 0; + margin-bottom: 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: #C74350; + 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: #C74451; + 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; + } + +/* + 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: #C74451; 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; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +/* + Extras +*****************/ +#extras {margin: 0 auto 3em auto; overflow: hidden;} + +#extras ul {list-style: none; margin: 0;} +#extras li {border-bottom: 1px solid #fff;} +#extras h2 { + color: #C74350; + font-size: 1.429em; + margin-bottom: .25em; + padding: 0 3px; +} + +#extras a:link, #extras a:visited { + color: #444; + display: block; + border-bottom: 1px solid #F4E3E3; + text-decoration: none; + padding: .3em .25em; +} + +#extras a:hover, #extras a:active {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 */ + .social a[href*='about.me'] {background-image: url('../images/icons/aboutme.png');} + .social a[href*='bitbucket.org'] {background-image: url('../images/icons/bitbucket.png');} + .social a[href*='delicious.com'] {background-image: url('../images/icons/delicious.png');} + .social a[href*='digg.com'] {background-image: url('../images/icons/digg.png');} + .social a[href*='facebook.com'] {background-image: url('../images/icons/facebook.png');} + .social a[href*='gitorious.org'] {background-image: url('../images/icons/gitorious.png');} + .social a[href*='github.com'], + .social a[href*='git.io'] { + background-image: url('../images/icons/github.png'); + background-size: 16px 16px; + } + .social a[href*='gittip.com'] {background-image: url('../images/icons/gittip.png');} + .social a[href*='plus.google.com'] {background-image: url('../images/icons/google-plus.png');} + .social a[href*='groups.google.com'] {background-image: url('../images/icons/google-groups.png');} + .social a[href*='news.ycombinator.com'], + .social a[href*='hackernewsers.com'] {background-image: url('../images/icons/hackernews.png');} + .social a[href*='last.fm'], .social a[href*='lastfm.'] {background-image: url('../images/icons/lastfm.png');} + .social a[href*='linkedin.com'] {background-image: url('../images/icons/linkedin.png');} + .social a[href*='reddit.com'] {background-image: url('../images/icons/reddit.png');} + .social a[type$='atom+xml'], .social a[type$='rss+xml'] {background-image: url('../images/icons/rss.png');} + .social a[href*='slideshare.net'] {background-image: url('../images/icons/slideshare.png');} + .social a[href*='speakerdeck.com'] {background-image: url('../images/icons/speakerdeck.png');} + .social a[href*='stackoverflow.com'] {background-image: url('../images/icons/stackoverflow.png');} + .social a[href*='twitter.com'] {background-image: url('../images/icons/twitter.png');} + .social a[href*='vimeo.com'] {background-image: url('../images/icons/vimeo.png');} + .social a[href*='youtube.com'] {background-image: url('../images/icons/youtube.png');} + +/* + About +*****************/ +#about { + background: #fff; + font-style: normal; + margin-bottom: 2em; + overflow: hidden; + padding: 20px; + text-align: left; + width: 760px; + + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +#about .primary {float: left; width: 165px;} +#about .primary strong {color: #C64350; display: block; font-size: 1.286em;} +#about .photo {float: left; margin: 5px 20px;} + +#about .url:link, #about .url:visited {text-decoration: none;} + +#about .bio {float: right; width: 500px;} + +/* + Footer +*****************/ +#contentinfo {padding-bottom: 2em; text-align: right;} + +/***** 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 { + left: 10px; + position: relative; + float: left; + top: 0.5em; + width: 190px; + } + + /* 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/blog-generator/output/theme/css/pygment.css b/blog-generator/output/theme/css/pygment.css new file mode 100644 index 0000000..fdd056f --- /dev/null +++ b/blog-generator/output/theme/css/pygment.css @@ -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/blog-generator/output/theme/css/reset.css b/blog-generator/output/theme/css/reset.css new file mode 100644 index 0000000..1e21756 --- /dev/null +++ b/blog-generator/output/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/blog-generator/output/theme/css/typogrify.css b/blog-generator/output/theme/css/typogrify.css new file mode 100644 index 0000000..3bae497 --- /dev/null +++ b/blog-generator/output/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/blog-generator/output/theme/css/wide.css b/blog-generator/output/theme/css/wide.css new file mode 100644 index 0000000..88fd59c --- /dev/null +++ b/blog-generator/output/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/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.eot b/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.eot new file mode 100644 index 0000000000000000000000000000000000000000..b3b90dbc3ef34775a8689ab6a4494810c14c5a59 GIT binary patch literal 20932 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 mb?#}R*%4j(VLYH*AKF5oS rn0PZ0T66rs0j%h=b^w~umnB; literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.svg b/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.svg new file mode 100644 index 0000000..a69669b --- /dev/null +++ b/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.svg @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.ttf b/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6f4feb02d14c849ba1fb7dc112243386b2ad8f2f GIT binary patch literal 39168 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 literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.woff2 b/blog-generator/output/theme/fonts/Yanone_Kaffeesatz_400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7b18f7ea49098fff3aac28a1feb0cecc429bb2ec GIT binary patch literal 18320 zcmV)KK)SzoPew8T0RR9107sAj5dZ)H0GaFn07okT0RR9100000000000000000000 z0000Qb{n549D+OsU;ufwyW4gH`|mHUcCAhbROf1%m(wg)Iz$ zBO9BBHSCy4;dTI2MCvzL6m?;f3q4^J3 zn?jvX8Rux$3dW)$94I=8FC$C<0{zJt^8&Yqj6l~elaNO@3y$q?#~9ZE+u6q*p|MYL zf5Ov$cS+$@+Ol@U=cvx=0DaJi{b#Dq%>RFP@4%qMoF1M5(#};1>mX%R&?y)?ce#cG zSr#tM^WTp>`?b$|h$V*TmQ*7{bWP&f8;Ne+HJT=AgaQfvzdt#({>=aaMWO(KKroS@ zkS*C8=IqU}yB~|{H_dHVc`vqGUfcZ|1cw343AOGTl8RZj_jmhCrPifv_QdTNK{9zl zq3Cy?M?46Hu0mS+A7CKh|LH7e68^uHG=}A~`3OL=ldjvXuQlMIfEJiXQt0&=pt(ga z`WBIlv5k$5TC-qH#fZ^TWzY&%V`JwlHtM%oujog#{cB5sYljsWKnB#25u~8@ z&UT$LMVY6rn!g4F6J-{iAx`^%Fwrs^BDA$R_4m9$NNmtEp(PsJS(4;yvUN z(DQybYGpe}V66h|&qwpGsuXe$<;ihL!Qdqe5Fo@#EJBtQ za(=gc$Fg_!*BzYb*E6X)l0X9O)*cW5zWm=&OpL^X2#6qJa)^>O#K;BWt|z3o-Vk5m zkVsJwlLSbTEJ%(#NP!ASjao>(7D$^mNQXWU1b{0LV6uz$$cFHdP+}viA3tP`4aPki@r?ivh4s98t zxJ7X@FcXP(9moBGC`LD-1tVMm3lSWBGC9&$dy-&0>k=@4N@0RU3TOs?8qrm_6`7X> z=yp8mYUv;0eGrX22~1-Qb``}YQc-b@jp)5nmar#QOwyVWa-^WvTnK}(ETwx96N40A zNfJwQSdNP=-tRfFCO@O^M>c&7BPjq_@+XDxcq1UL#_47dFG+%GCKfhg)a2X~flG`- zf`^Z>gMxsNXzdm-XCy8e9v(eFoKZlO5Wp-m7AQ84fGroz9RiqVK+NkyL-5uUsh8du zeE5*?<%cOiIITztlu~5U$X7_ktOB%32R$)p0dw!PBY@Uwg7&sSaHP zX75*MfraE22P`cO$SvEi$OuqB0 zA>G-;^rvGevK5pW3@bR5Al`4iP_dB&MgJ<^tnYBgsAwNntx∾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 literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/fonts/font.css b/blog-generator/output/theme/fonts/font.css new file mode 100644 index 0000000..a9eb87e --- /dev/null +++ b/blog-generator/output/theme/fonts/font.css @@ -0,0 +1,12 @@ +@font-face { + font-family: 'Yanone Kaffeesatz'; + font-style: normal; + font-weight: 400; + src: + local('Yanone Kaffeesatz Regular'), + local('YanoneKaffeesatz-Regular'), + /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLRTHiN2BPBirwIkMLKUspj4.woff */ + url('Yanone_Kaffeesatz_400.woff') format('woff'), + /* from https://fonts.gstatic.com/s/yanonekaffeesatz/v8/YDAoLskQQ5MOAgvHUQCcLfGwxTS8d1Q9KiDNCMKLFUM.woff2 */ + url('Yanone_Kaffeesatz_400.woff2') format('woff2'); +} diff --git a/blog-generator/output/theme/images/icons/aboutme.png b/blog-generator/output/theme/images/icons/aboutme.png new file mode 100644 index 0000000000000000000000000000000000000000..600110f2f63811ebea40af1b943fded0275b6a39 GIT binary patch literal 411 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 FV1ku*k$3ca`voa6f0k zeB{69k@N|?Km7UBZZ))YUHu=w|Mw?(E)O$?WixY_FPL7s$Pm-8fstds@^ATL%bUet yZgfGChJzsUtA%$MR;8+S88GxaEa+z7`Ew3v5re0zpUXO@geCxdur~kz literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/github.png b/blog-generator/output/theme/images/icons/github.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9109deab2b3669c845845515f4d53ab5d6daa6 GIT binary patch literal 606 zcmV-k0-^nhP)3g@6&i?1|w)NXSf84|8m&o+0 zUbR{k48>ZU#v6!wqi1V1r%EE$MYAT@gfEZ`ebJgG`3x?P75EOx(Rb}pK9^g49TLfP zG|6;$SGbAH zWw$>tFUyCTTU=}VL5$UQcykD>ruLPAMktgpS2)vHd2`;>>D~O#r0q^piwN%{Eu7xl ze_3-g6EyPr+mZ( z$~zD9`4D^$F>WOyU!f<&c%QI`>dHS@;3~xO7I+5=MISM;>bsLPrcC8T?Gyg2EhYt{Z#{?9|afq=U$pRKgVkaa6A5hOW zm~E0;qoMsELHiVUdq+qHW_!=pLlCuB&nsXkrlThcr&yqB2Ez}bh}WQodCMG=62#-T(jq literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/gitorious.png b/blog-generator/output/theme/images/icons/gitorious.png new file mode 100644 index 0000000000000000000000000000000000000000..a6705d0f462b505be4d9a5a372743d206c141a11 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!O@L2`D?^o)dRwqYcev@q#DMvQ z*(*AHH`kW0om8=NO8&uVRmbKn*uQ@5(H+Zf?%R0x*ww37FTJ_{>eZ{eAD{pK|9`68 zWgnn9ah@)YAr*|ZCyp{U2QWBn{C>Cgf8^^ph2sKmrZ@0Db>47eliif`GZN3kOR|4E zp1HSr>(=i-J2K=SnYPGB*}QnjI%8UJ(Sx8gTe~DWM4fr0!yB literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/gittip.png b/blog-generator/output/theme/images/icons/gittip.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f67aaa32a0acd166d7271b3dbf9113717d3f00 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfoB*E?S0J6}W0T-*4J5$~5D8`b z*u=V-n;Wh0%9W86%yoICmD^QXBJ+TuMeduj_mynB29_Kl1X*A2_&{r~^}-@kve zdYW2FGLG%r8Ru!aX~lxyzki)LushDvqC7Rcx2`zG-R$h~L;wH%fBfKXl#6k)zx}VD zKk}k|sxxDHYKs!Qtrkt~nbKapYTmR2Z<_=!t4|TTzXRRJSrX(I%%C#k)~^Ns|6P3T zwz~@CcuyC{kP61s^QK8h9R!*aGdC-5mQ6dy==6QR=MEp?G>PQz`~2?eFFMS(r+K1g zp!&qb32C!ZG_9s->U*tRla<=$@$cY?|5H+adAMETx@7!MusHjBPl?KXziQ+6?1D=V ze?2)-gt;N$>Wd8<>nsYyl^Lt{Fxgl%o_?@o{T-$+24C7lzi+*sf1s9QvY5Z$XS=Iy lUyMDUTPOc|vvcNeU4iM^B0ctPia>WVc)I$ztaD0e0syFMv7G<_ literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/google-groups.png b/blog-generator/output/theme/images/icons/google-groups.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd0a0fd41295e94081103efe82742a5c6411765 GIT binary patch literal 420 zcmV;V0bBlwP)wr?kW++e@xB+qT~SFYEF=HvR&ieDr#i-_xj} zRHo4+e;!+Noelr;cc?77Y;{c*CNr6Zes7m1^J^+M9sV--D^!{k1_1#;6aW?Y?FKU> z$wUFckfr-O)R-Be!K8BMN$?ljo<0akOpD)OEKI~9+x!b$boZC|3lK-`{C{xHEuU!d zCn!ydf)v}GF)B$#1SpIDL5ep&8ms%oIbw(Zf<>Eu zV{!X$x!~%@{^9sNR&mx%AN_fQnat#ZJ3j~K-$A9Q{GPt1rQRSFm;ow5sT2?@^QR4r zg$anDgeCx$iqb6h2iG6)ockYoL!0v;mgd!$p2~_@_rOO_1Na`l%Wwj6hQdz( O0000oJ)blrcs(C@6ijHhGjL zrFRi_0z}#gh+z_?jx?ulJ6ZEDq_MICdrx(I>4q_hBh(7t5P3nx z6N?eUwA{x^#MIz^w4#;vg#Q`{-|sTaZm+z|gUicmu%q_q_{S4K=37O~-YZFy$l zCeshS!0W4y4-;Rs{O>veK>w%APq})#_~VzlN~kv#Z!>>U^FI6esN%Y~QuIs1d#~iY zS5C<<$DO!3cexVMKA`VP&KrXDnvg`iD8?-qH)mw8u{$e0Ls5IrFnpzz@8B4^@ijQjs{a4Z+iYWeG zt$5N5AMVx+R~iI;l~A9E$d3ce%4xvm2W_r2NEe$slb&w_>f!(Z002ovPDHLkV1lnz B@09=m literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/hackernews.png b/blog-generator/output/theme/images/icons/hackernews.png new file mode 100644 index 0000000000000000000000000000000000000000..8e05e3ee207e114a96f3811f46f68d17d52fe80b GIT binary patch literal 2771 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 Z0sz-j0)=#JDs2D&002ovPDHLkV1kM1SuX$p literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/lastfm.png b/blog-generator/output/theme/images/icons/lastfm.png new file mode 100644 index 0000000000000000000000000000000000000000..2eedd2daa1429ba026c0b3c81f200c7df55d199a GIT binary patch literal 840 zcmV-O1GoH%P)KCJu$;;6i zN)?b2a3_#VfTsWs$6EHV5TGNlK%}w4u2N|o9mJtskW6u)FfMY|?6HLq0N~tSmCYiQ z2itn^l^G`qTae2D0xESFZh|%tXmDcRU;!-yQXzzdgu?j^sE-_`#F)I#a0AjAIORAv z?nua{5j_L2Xf^mv7?p>M&VsISuyh@C_u_&8Tdjpsq*G;#gR3rt3(wqpYJX|(pqnm- zVi_(t9gaQ}dWUeQ9S7b0nAMvJMjCC()%*h2T()P6`Q<<4KoQZ3;E)b@mqq9E^qzbJ^&kHt zb@z3sXYQl9ZY#2oD@eP!I~#uc8*V^AwupI;L7D|Jvi|(8qu0 z2LL$zBz)6?fx+w8bl#l{x;rm&{_hjrZqU60&R?r z_q^a%r%rJ@Z+x)Fd-;e{U-Iff*T}z9(5p5g3wcDXPJR3rG$+nsWZfoYCWAb*gT_Bo z7fg}|L9J&75r5f0ZeI>gIn5MAw<$RbKrq)K4wK5le| zR(k=@SlVyBWV*`avXNJ2NP$f#q_(8G+6X;MtJy>;4`+;2 znIjMBZmisPo~Hw3I)yO?atTx+i^wMNq>KkRoaf=R#1u=&Mhm*)MMoa?yQ=3?Z|U=o zU9OHh!itfmFwG$0g0M5@al}`~v399M8f%oORSV+K_KnG|j?V;kMf)2sF5LyF&y{nJ Sd8X6=0000 literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/linkedin.png b/blog-generator/output/theme/images/icons/linkedin.png new file mode 100644 index 0000000000000000000000000000000000000000..06a88016f191d1f7596e5d159eb9e3ef276b6ad4 GIT binary patch literal 625 zcmV-%0*?KOP)NJD$VFG5yq%r(;8zR}7Ydty&~ue@oPv z!go{cG`vvH)n(hYdJfur_4kM7-}`N$BLW71f|-O65QELNn>4;$_2zi#L7VQdUf*VG zc0B*xR8@Sfo>nmHN}+MDnqn5J#;f9g$TZW=OS!!C<4lU-jh|=cs;0XYW~;nhJEE0r zdMWpJ#bDNMT&}cGH>t7P-yM4W=hFCXaLv`alDWtkCwY0;!z58#z z#&T71?c1;2yXPjW|3Lt-K|fa>vgM24P7nS%my|*-?u{?k1z4y`Q@qLr7+I)}xOVW2 zJ3sxy0Crrjx2{T+o3K*EU*7;Otu&GVZhd>`xi2Rl`h0wRu?9M0pr|e$T%t()-9X(G zM?fxx1SUyc#XyCAwXc5_{TIPFaU$>TzBm6pmt%Vs1;7F00000 LNkvXXu0mjfHfAMI literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/reddit.png b/blog-generator/output/theme/images/icons/reddit.png new file mode 100644 index 0000000000000000000000000000000000000000..d826d3e746a18b712db7a68746c0c523af802fe0 GIT binary patch literal 458 zcmV;*0X6=KP)rn|{qWNU7Dgl~R~ zWNK}Sjg6(Fp|rEIpPrq2fPh0AJ zxy#GTfq{X3etxmY-Bn&^YHMt-t*g_~&)L`2qqxp^h?r+{fMacVpMN&`0001qNklWKP}*}Is^$| zQ}1hfWmjT2av-PYqbE!!n)oua2c5|Qn7a$5l#p|w6z7}`F{d?z0T5WQglfOLER+{E--Hu?5@wDUpV?F@=Mkg+ zN{1=uqDlzrnkbYp)J3q!I?Vn|_~M zVqi53FAJQ^xo7*4+R80OflZT^0WscTaBuO7ca6A_aA-H9M3Y@{DSLGBL)| zTym{{me}!*Z3962jmy>w<<#@)IsY9R%I3sYbB>~@mM@C5Ks~s4nX-}TW8S>D*g7F! hew!yYJnD{z;D0NLV2ni3qF(?2002ovPDHLkV1k{La&G_t literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/slideshare.png b/blog-generator/output/theme/images/icons/slideshare.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbe8588e24976076e5fc3898fa97856122f6fa2 GIT binary patch literal 435 zcmV;k0ZjghP)YNn`_&)?H$|J+jM18jcAeNE5840mI#38{rmUny@9DE z#Xg@8y@9DE0*}W7yWQR+m>Mc@yWPA^!~YvlZXQ7Ti(&Z??RignZicC$0;ki-+teNz zN*Qw@h$6fTDiChi(;mQdV>IdC=QLyP(`3?fGmSD0E706p2ko0(Fn89&YPG`Qa4@$> zdhWPhszyk06L$T`#EcuEoIB7dp?k0q>OF&bXs#{9!Ot=1fBXlJ={G`9+@@d!27`fI z*^>PO`g==w@1W}FBwRnS8UK$h$DgmS5K-O+o6QEJ(Z~waYBd=2dOa)_3-qUlQ$o(J zM$*}Z*m~g-OePa_IvoOeR-jNQz{PlZ6lKDV2#PRA1rmt_T+Fw|P-fhVCCq=C0AY>_ z#9}czIyxxk)H|>~8V7Uy1sn}2#;nIlxE)_f_XF?+t*xyTxm-@(N8ncJn41xc#e6|8 dAc8(0=Pod^EtOP(ARYh!002ovPDHLkV1k4J!&(3U literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/speakerdeck.png b/blog-generator/output/theme/images/icons/speakerdeck.png new file mode 100644 index 0000000000000000000000000000000000000000..7281ec48b41095180a83d71eaf0b00c85116965b GIT binary patch literal 580 zcmV-K0=xZ*P)K92#E{?_PJ+8Tth@W(+a>28uk~_0`h`<(yY|`h z@3?AaV0?I7E@5C8LL5^B7?_#m1O5GLKL6{LaQ3ZN%$$19RhM^ilM4(QGb91Pk}#td z%#5L?Rn9&W7zkqrdeL$z%L))wjb8cZK2wtEL}mE*O&6H3%~&#zdHx68i}xJQZ+34dIdgm^E12V4($L!Sax!Q)0op z%%0y@llS*=IU_?ugf;+>a;DdHv`xcYwwSu^B5bgwWG8rbaUIq4<$P}6+C9-V(ZSGy!i4XI zBkkxgITji#coxBn7F*@>CvnH5Im-dI=x{a@nz|+mZz(oB8CqTLuD=F=p|2qrpWMi5G S=mtXo0000YRoeQcY09>#1xxKwS5F z8mlP6JGx3wQgxp~4T-?1`Rz0oPN3$iK>QzwU%sBkR`YrWi#XVjbZs+WxcmSb0KzU< z4R|<_pXuFnCY5*7ncLn>WBm*@=rz!g=9fLZ0#9?*eV!!i{{b4*NYE=UCUZ&x4QhHf zjrr}HsjUBBPiJ}aY9eRTvkFsE%bi<+hJ_q$)(X1QD;kN@ z$%`wz`8QVB1Z}9WYXRb&Kzt8~{{vn2e{DI?z%r-*E6ZK%Ff``oJb76HYP@>p``(Y0Zs!*!BjN>0I%aNVnQ8)X9Pc^Y zIsS936mToi>>TyPEkcc+2 z`5!z^ZFZ_O#v*`YvS&^RN+0_pGFvTxh}Lp2wqGagAdVyz;6#9udAenJvhWwC3QjN} ztg*<~69%xm!G(wSxK?V6H7%K70|sCIX&%<6rLrHmSw|10dx_{@95hn1(i_a}5^hC>VT?7YQHpjC*P~ez&J%_J0000< KMNUMnLSTY<*|#qM literal 0 HcmV?d00001 diff --git a/blog-generator/output/theme/images/icons/vimeo.png b/blog-generator/output/theme/images/icons/vimeo.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9d72127c574237090a2f5f2f7eb7be94a2b62e GIT binary patch literal 349 zcmV-j0iyniP)K~#7FV*mo~S^J1YP}SCZ?(wd@Mi2p&f%E_|kV7PbYe1Nxz5O|y=nOth{(bt=TS6pPua;?J=e5) zBGkM)Pk5GtRBXBib(QPnRVW%@oC6PDyoRVi_QQr_=YS?+52c0sPeBv`1LxxFPe2CH z8{$R%ID<81>CXSCz@?@iUpz?mZ$MU^)He_47^%Sg0P#sgK~#7Fl~6T81W^oq2cX(5aX1R@6<62}xdAmT6>b%79aG~T97?pp zUBiU8?wcQZ@ytL(4yKyhs>_L_h@KZq&4RGqy&kuUuOC&N_n)+)st0x|+@BHFkRd@&PPEwb z&tB6>xX7cYComKsCfH0jmXR=>tbysq2Gd0WOmZB{y88Z3Wj9^}w-Gbm)y>{S4W9T7 zfp3d!a2x}~TiXWa<}BOO6S3ho2QJ^`nhs+IjSU!vHHb*~-y}#B5s^RLsrl%w&%5IQ O0000aMiF+@wGYPFsdb`Bx=qroJMZ8- z=+T$)0dn=^D|pd_RoDvosDi5RtFK-x7Bdv%$J>{04hcd(Q*kkhSnS8|HW37B(e9SO zf+*Z#z+VaA51Gim5sY3Ta~Y%bUL!+}QS8c9t|#q87j1!&m_Tt8wIxhM0i`Iv#2G=3 zP&M7{&km@TMry9;iS3Q2US!?Dr4=-F zo*ThcZ-81j@^aRYltQsg)iqGh9QMUy!P%p=2zQGZqTf zcU(cZ)>IhuiYA3-cn zw*YF%9#{>Z_RgCBRLi^dy}ep+&zp1SuCdPFPaD_6S(rZ5@rnu_m66unh>+(5Pw_Qe N;DTJu2qu5>>@W5OoWcMA literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/__pycache__/rst2html4.cpython-38.pyc b/blog-generator/venv/bin/__pycache__/rst2html4.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1797251caab8639885c6b70dcf526a67f147f45 GIT binary patch literal 667 zcmY*XO^(wr6t>eQDH$pdAR)2xaw5^Rh0&}KVg%C6q9CLxP_iJH_;niaPq1G!)82tQ zz>*uVb7{CNBF&G&$ipIvZyL_T=rmz#SK zBqy6Yf{H-WoC5tE0Da#Ry)OYJuZX@%NjF~;9W01v^<`g$d8nd1qC|uc-6nYqp@<+B z@h5*r1ji&DY`!H2OjWv4T(YG#8X0K8&@fy9dt%B4E9uzt=AEqE3hZ50TO*pX(kE

3<}) z3uh(N$h;UUrE#4hs2bM{`H4%j%J~b|l24>+HZBt@nLCoO{nKO+o!DWo);R==9OM`sp z)K&<#&|E>gbIB_mv~f{*^`dAaX-Y1kz2X4>ZKK)a;$Sw*hn;`d->ftiY|j^D`yGTH zz7pI0jxGE?8l$SmbybfVUGwq-h|%c^K#q$0R>8;p_4q<+G|8s>nc&FB=cT)`b$D-^ la#pX~!2{*rPr}34i@RGM`f)%9^ahP+6kP8GH2Bl+{RJpR#)SX? literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/__pycache__/rst2html5.cpython-38.pyc b/blog-generator/venv/bin/__pycache__/rst2html5.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43efa4b10cc0769f792b14760af5e84cfb7d3886 GIT binary patch literal 663 zcmZWn&2G~`5Z-kh+jWVE0D;75k3=F)3$!PMs3@X`fRGxX_)xQWCynX;nAx@3HEI<*?lz_q{Q3zcdw66LPCCY$z@A?^4MQ{?42Mv zS=|;?1d`?y=;r|Fho0zt2`G6(^v#g?JUmVD0VUmeOLTBVJU*0t73GnN^OzFRhxiuB z6Np3viHJXWwg?W%C|P|?_n4}5rMP5sG}VS&c?C zWu;Hp!R+~z?J(g%3beCXn$A4QG_GzOhDM}?|rJ=npV9p!q3IVpns_rPO z{b!)T)4~4NXE&!})^RPkG#VJfp~I$h4T6}#xntHeSbApLUpOUqMnS%LhLr;>G*{4W zUMe)&Xyc;rO&3KQNmFtO?S=*SH;krFioNNy?LS2{m=C&TbsNn}gMd9h6#73vF!Jsj z!7E+dxnBnpr|L;v)#FCjygUUlK3f3Dad96NeB515{z;9uvhCeWaK|SXZcW>Q! iRxjJ+q4F;#;nC3R+8f@5aX=G#jSguP3tMVbYwDk_j*Q6WSJ7_uOk_;l*QmtZ@Z%RBH6 zu;gWUfNWW@V$TYv8I6#zOu(3Zu7E%1=)BO(3#0#&o5rUZz#0+eTkq>f zdES9_rDlDGjj<<~Y4qKJ%NvI_m!XdHZ0nU=Ksevs(58_xpl{Hkt}rWxJ5d@H`#Tg{ zYNoK=4=|M#bqAA<+EG~s*RpIAX(}eM-E-)#rpf9_xm>M^=`~PgEZXobh>b(|PV8Pc z@4}zwxmR^wi+a}RnpK~W&(5}pa#lXH3O^rST$eSwm)$?iIP)y;NnCE7f6$jyU$o=7 b3ePHWF$%u!W(aW{(J{S66PiQ^Q9Sw!`-0E2 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/__pycache__/rst2man.cpython-38.pyc b/blog-generator/venv/bin/__pycache__/rst2man.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1aa2bd52327463984d743313dc0d464a2003a705 GIT binary patch literal 633 zcmYjO&2AGh5VoDf*=!q8g#%X~$srqlq@DnQkl+$H&_ZDkEM`3=277n$4{h@bh<9j@ zybKSpS5CYFC&mq+j^$7D^XZ!z`{i_+6SN=iUcG(B2>F?UtHv>Sh}SCwMM|QmVuqG< zGXr|gfPNgP!3Cq_h%~#Dr1OR}>~-P|&Crg@k>w?)DIS@z&B_dY4*UiwCoqESJij0? zQR8o@q1XYLXPd9Nl}*u|<@YZw&kxty3)`w_Kyku8NLpTk>x6##5Q3r+Ba5Gc;KbM-q{wRZY(RUxsedT!cU8t5k;!e5uK9#@Z6t8$v8f;PUW zTL*4{1G^zYx%a=Y758qGYGZ_+A6>q~cjBfgm*Dr4Ww70{)7>KC0`(_Qi<32gSyXqO zh0ptE%YTB4TgC1DLdhVP+s*yb`EUnU!*A=ed)vQykUIGp!Z6Dyqch4WXM1#)W$X{& C=((~0 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/__pycache__/rst2odt.cpython-38.pyc b/blog-generator/venv/bin/__pycache__/rst2odt.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cee543b9589bd738df4c79921d7a7b2bd9c2376a GIT binary patch literal 706 zcmYk3zmL-}6vu5Rb<(tj3I={mUMtZA4(TR@IB_}{DvCJZAV`E<{7M6f9c)KOyE5}X zz{o$tACQ%am67GJTj0)5{>oqbSs%aWXQNSs?D+oX`RiWrg;hY(pE0fi9^VZejWUV4F(Lo^B352HP{P*NBMf-@tTSpwUaMQh4Rv&Zdm zRq7?E8>~^1w?!%5vUvkyzF3q6Fm4lT5Jtz*Pg@Ck)S(IKt~J|hSyA(<6p$I29hV|k ztL`#~Mc!5>1sM=sUda}h1&cEhj7i5_&EXz7iuXIN% zS>zRTeGTUClFsgDd$U3}KiCpx=EU{nYNPeghuvBwl#ubMOKDzza|P3OrE8dufSyswI!dp7G3h=I43PY6S?!AKyKE z^t+4DUuJW0Sg`pLrc^*EiV($=WH=`g!G^aoE4L%N=IzXh95}NxH*#ThGB5Wd|6JCH z8nrBl0_swa`oEB9g*IsL6N;L2g*IVru{LcT5>c|&8G?KEF6y?YKLlIpNtlGkT+m)A z_=ri#MQ@K4OeBiYP^#06$u&+@IOZaR^;o2eiEtv>AlwwZ49jGXg)*J8K$dKjj?+=1 zQeMb#EO`FHz)7BkX%X(;|7Lp_Z{67*8k1|mGk7}cV%;u9TBvwDDMscloH$Gg#&&@7 z@0!Z3OT4l9^6{HIsNq2E}Y1$H|D(& z&r68>amLK$F40bHNs}=jVH4;1Xu#^hybV+S2}GeeuFwL{aE0fDV&I6f=5|GZvnuPr zp+vdVdP+9Yw;#^z%0BRbyEbzwXYNxQWKIWN1q))`$SUV^bhLhSLp9FO%r(|kFkh)$ z>UI$I7KC~V9W)o#%maU|1p-^^Gr#f=+7v^Df33XvrOJm0UaPDHUI3boeq5fJ_>A6# z)5{A$1Dw~Zx-x$q{P-ON?=dJufRe_}G&qL=BzStQ-(P0f)V-G_r+lIebV?>v$|Mvl zsH;;Z0H&$^{dGAL0DmM*4mCc0X4dYi_NHk$PBW&xC@r@PV+)p0VZMb940fafQ0zs{ z36y1D2Rj>I4|nfw+#c>~H&GyatRb#MD0!T!ePNq>giGy?sX>KqMtAPUo5QW`jr+q* z?We_Iwl%00T?xABYO%d(KdXO{5K>*xcT?JzRJsfnU=jt0f{+ew0FGESk{X_7CAdw zKkXY3gG1T7xpr%PjV3DT%aKS+CHq3EkKnh&rC{ZGA<9$Tc)5KCJjf4#AQIpJri;mQ zvtGeX;^I|oKew$W4)7|uN_^~N@gC@o%!L<&0AmtZWBL&=fG`X_1^rAqXoeK2&>8Fx zE%BAIlnqkA^ix2HvZz(-+6KWF&e0tD)B*#xpx1y6tN^WNu&*)Y>QZtiuYkJOuJvgz`Usjr05vIWkZagI-ul`fsg+M1*X6a literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/__pycache__/rst2pseudoxml.cpython-38.pyc b/blog-generator/venv/bin/__pycache__/rst2pseudoxml.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e0b692aa222c720a50fbf3b6fe8005d17050ed5 GIT binary patch literal 551 zcmYjO$&S=85Vf7HX=s54BqUBg5{V=%(wxwU5eP0}5d+MS10mSebihmSB4+v@_y;)h zGkidRXG030=FeT`#I z1a2_kuLSUih)3TDM#o59z-T(Jks>E3uwoI*q)BAjq!{r8(yOS+Ac2ghUvPLKM<~zM z59fze_Nteipi85bqo6o-nz|Lx2by`;3rnB*ccQl|FgNI6H217m@9AK{b6uP~uFLta zpbtG6QBKB-!5yEaY5YYC}V^+X(Sy&=zc7QkvuO{7#>IHfC+hHEY{36`FMd#&Z_j zKR2!Kw}*AzECORQY00z!6NO<+JV6rRJ2KNRZQyrZIXP5AKNMaK9s3Bp_`CuTMSI6c z__Tjk{V!GAEN|_XymMW(9otsMy4%~Wok~#-XXEUy4BHfNkc9^JN`N>fc!u|Iic@ka JBAEP%qrVWlpVj~X literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/__pycache__/rst2s5.cpython-38.pyc b/blog-generator/venv/bin/__pycache__/rst2s5.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ec4bd346abf5b7ee5f5af17fffa3d792203212a GIT binary patch literal 590 zcmYk3&5qMB5XWujt8}SAfP}=!Mu5#f{{b-;#wN1YsF8THJ*bJ+*|I~z#rPC^HL#y-n~;2*WhmO)>+Xt(wy=qtEUT&N(w;U zVK^BNImWZ7r(vE=^%vH>-fjzE@#z|$_^X9#hb`9n>t4$@ELh3V?HauBE%1>a) zib_B{{)K$xSxX|?UaNN{c~J@_HShe z6s|EKPGIYptr}Bc;i@udR@PE+Co9c1(ycqzQ!PEjlyA5J=9xZoBe@s<3yG!3+*!x$ z1#ofcJKKrR*)0Jp-YCbUMHnG<#E^(>jP%Snl$ikQr0%T$ORpLi#f&Wg*lg`weUv1= zK|jEF=Ya5M5NmM$hfNv_Cc!>n8?Rld=3R4s?yE*A9Ki|<=mO$wumwztf^5G-F}da? zwEGBC7+L!{M8kHN=ct7DrQVJx`g$&SP(#=3hQZCszXqgjcM ZMZtWCy7oGTem|fidV_{E3=V?+=nrZ!?F0Y- literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/__pycache__/rst2xml.cpython-38.pyc b/blog-generator/venv/bin/__pycache__/rst2xml.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0352b033019b2ca3c7b358f2bb226692f56febd5 GIT binary patch literal 553 zcmYjO%Wl*#6t$g9GR!an0TL1`Z$}~t52-7Js6afV0aa>&k_E=tw~WD$U^}#(f8ZZr z$A;PV`afKzI7rT7@Mq+}t=dIm{PtT5=fP*mkk3aLKjI7W^D!Uc$NeUnuIW@)^|s^U9mwi% z4WKJ_(;Ildb=>@ws;<@7w`$2FZ%(X-#)o(#4P1A}!}OL(uc_g7nN-821bI&I6kosv NF39G)Kza?8Lr7T4hA?EK zPjRS52PoUxoQ(I0=ZX6N}Lz+JcRPGdt)Z3GfZse!_p@*VDO|W^TBdwaU=?1F+d?10ZJAT`S>acRl|{ zHM^DH-pv{Hbbi(YH@D6Q2X}f0xmkCkJsD;o;QlbsyXyf4NrXpu8>cvpuEY_Jeh=a_ F;2)xJv&8@a literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/activate b/blog-generator/venv/bin/activate new file mode 100644 index 0000000..60b8a6f --- /dev/null +++ b/blog-generator/venv/bin/activate @@ -0,0 +1,78 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/home/ilya/git/jeancloud-website/blog/venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="$PS1" + if [ "x" != x ] ; then + PS1="$PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/blog-generator/venv/bin/activate.csh b/blog-generator/venv/bin/activate.csh new file mode 100644 index 0000000..8e62816 --- /dev/null +++ b/blog-generator/venv/bin/activate.csh @@ -0,0 +1,42 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/ilya/git/jeancloud-website/blog/venv" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = "$VIRTUAL_ENV:t:q" +endif + +# Could be in a non-interactive environment, +# in which case, $prompt is undefined and we wouldn't +# care about the prompt anyway. +if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" +if ( "$prompt:q" =~ *"$newline:q"* ) then + : +else + set prompt = "[$env_name:q] $prompt:q" +endif +endif + +unset env_name + +alias pydoc python -m pydoc + +rehash diff --git a/blog-generator/venv/bin/activate.fish b/blog-generator/venv/bin/activate.fish new file mode 100644 index 0000000..489f36e --- /dev/null +++ b/blog-generator/venv/bin/activate.fish @@ -0,0 +1,76 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/ilya/git/jeancloud-website/blog/venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/blog-generator/venv/bin/activate.ps1 b/blog-generator/venv/bin/activate.ps1 new file mode 100644 index 0000000..89dbec6 --- /dev/null +++ b/blog-generator/venv/bin/activate.ps1 @@ -0,0 +1,150 @@ +# This file must be dot sourced from PoSh; you cannot run it +# directly. Do this: . ./activate.ps1 + +# FIXME: clean up unused vars. +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent +$script:DIR_NAME = split-path $BASE_DIR -Leaf + +function global:deactivate ( [switch] $NonDestructive ){ + + if ( test-path variable:_OLD_VIRTUAL_PATH ) { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + remove-variable "_OLD_VIRTUAL_PATH" -scope global + } + + if ( test-path function:_old_virtual_prompt ) { + $function:prompt = $function:_old_virtual_prompt + remove-item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) { + $old_env = split-path $env:VIRTUAL_ENV -leaf + remove-item env:VIRTUAL_ENV -erroraction silentlycontinue + } + + if ( !$NonDestructive ) { + # Self destruct! + remove-item function:deactivate + } +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +$global:_OLD_VIRTUAL_PATH = $env:PATH +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (! $env:VIRTUAL_ENV_DISABLE_PROMPT) { + function global:_old_virtual_prompt { "" } + $function:_old_virtual_prompt = $function:prompt + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + write-host "($(split-path $env:VIRTUAL_ENV -leaf)) " -nonewline + & $function:_old_virtual_prompt + } +} + +# SIG # Begin signature block +# MIISeAYJKoZIhvcNAQcCoIISaTCCEmUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB +# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUS5reBwSg3zOUwhXf2jPChZzf +# yPmggg6tMIIGcDCCBFigAwIBAgIBJDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQG +# EwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp +# Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2Vy +# dGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjIwMTQ2WhcNMTcxMDI0MjIw +# MTQ2WjCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzAp +# BgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNV +# BAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgT2JqZWN0 +# IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyiOLIjUemqAbPJ1J +# 0D8MlzgWKbr4fYlbRVjvhHDtfhFN6RQxq0PjTQxRgWzwFQNKJCdU5ftKoM5N4YSj +# Id6ZNavcSa6/McVnhDAQm+8H3HWoD030NVOxbjgD/Ih3HaV3/z9159nnvyxQEckR +# ZfpJB2Kfk6aHqW3JnSvRe+XVZSufDVCe/vtxGSEwKCaNrsLc9pboUoYIC3oyzWoU +# TZ65+c0H4paR8c8eK/mC914mBo6N0dQ512/bkSdaeY9YaQpGtW/h/W/FkbQRT3sC +# pttLVlIjnkuY4r9+zvqhToPjxcfDYEf+XD8VGkAqle8Aa8hQ+M1qGdQjAye8OzbV +# uUOw7wIDAQABo4IB6TCCAeUwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +# AQYwHQYDVR0OBBYEFNBOD0CZbLhLGW87KLjg44gHNKq3MB8GA1UdIwQYMBaAFE4L +# 7xqkQFulF2mHMMo0aEPQQa7yMD0GCCsGAQUFBwEBBDEwLzAtBggrBgEFBQcwAoYh +# aHR0cDovL3d3dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6Al +# oCOGIWh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0 +# cDovL2NybC5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysG +# AQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +# L3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +# L2ludGVybWVkaWF0ZS5wZGYwEQYJYIZIAYb4QgEBBAQDAgABMFAGCWCGSAGG+EIB +# DQRDFkFTdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIE9iamVj +# dCBTaWduaW5nIENlcnRpZmljYXRlczANBgkqhkiG9w0BAQUFAAOCAgEAcnMLA3Va +# N4OIE9l4QT5OEtZy5PByBit3oHiqQpgVEQo7DHRsjXD5H/IyTivpMikaaeRxIv95 +# baRd4hoUcMwDj4JIjC3WA9FoNFV31SMljEZa66G8RQECdMSSufgfDYu1XQ+cUKxh +# D3EtLGGcFGjjML7EQv2Iol741rEsycXwIXcryxeiMbU2TPi7X3elbwQMc4JFlJ4B +# y9FhBzuZB1DV2sN2irGVbC3G/1+S2doPDjL1CaElwRa/T0qkq2vvPxUgryAoCppU +# FKViw5yoGYC+z1GaesWWiP1eFKAL0wI7IgSvLzU3y1Vp7vsYaxOVBqZtebFTWRHt +# XjCsFrrQBngt0d33QbQRI5mwgzEp7XJ9xu5d6RVWM4TPRUsd+DDZpBHm9mszvi9g +# VFb2ZG7qRRXCSqys4+u/NLBPbXi/m/lU00cODQTlC/euwjk9HQtRrXQ/zqsBJS6U +# J+eLGw1qOfj+HVBl/ZQpfoLk7IoWlRQvRL1s7oirEaqPZUIWY/grXq9r6jDKAp3L +# ZdKQpPOnnogtqlU4f7/kLjEJhrrc98mrOWmVMK/BuFRAfQ5oDUMnVmCzAzLMjKfG +# cVW/iMew41yfhgKbwpfzm3LBr1Zv+pEBgcgW6onRLSAn3XHM0eNtz+AkxH6rRf6B +# 2mYhLEEGLapH8R1AMAo4BbVFOZR5kXcMCwowggg1MIIHHaADAgECAgIEuDANBgkq +# hkiG9w0BAQUFADCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0 +# ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcx +# ODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUg +# T2JqZWN0IENBMB4XDTExMTIwMzE1MzQxOVoXDTEzMTIwMzE0NTgwN1owgYwxIDAe +# BgNVBA0TFzU4MTc5Ni1HaDd4Zkp4a3hRU0lPNEUwMQswCQYDVQQGEwJERTEPMA0G +# A1UECBMGQmVybGluMQ8wDQYDVQQHEwZCZXJsaW4xFjAUBgNVBAMTDUphbm5pcyBM +# ZWlkZWwxITAfBgkqhkiG9w0BCQEWEmphbm5pc0BsZWlkZWwuaW5mbzCCAiIwDQYJ +# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMcPeABYdN7nPq/AkZ/EkyUBGx/l2Yui +# Lfm8ZdLG0ulMb/kQL3fRY7sUjYPyn9S6PhqqlFnNoGHJvbbReCdUC9SIQYmOEjEA +# raHfb7MZU10NjO4U2DdGucj2zuO5tYxKizizOJF0e4yRQZVxpUGdvkW/+GLjCNK5 +# L7mIv3Z1dagxDKHYZT74HXiS4VFUwHF1k36CwfM2vsetdm46bdgSwV+BCMmZICYT +# IJAS9UQHD7kP4rik3bFWjUx08NtYYFAVOd/HwBnemUmJe4j3IhZHr0k1+eDG8hDH +# KVvPgLJIoEjC4iMFk5GWsg5z2ngk0LLu3JZMtckHsnnmBPHQK8a3opUNd8hdMNJx +# gOwKjQt2JZSGUdIEFCKVDqj0FmdnDMPfwy+FNRtpBMl1sz78dUFhSrnM0D8NXrqa +# 4rG+2FoOXlmm1rb6AFtpjAKksHRpYcPk2DPGWp/1sWB+dUQkS3gOmwFzyqeTuXpT +# 0juqd3iAxOGx1VRFQ1VHLLf3AzV4wljBau26I+tu7iXxesVucSdsdQu293jwc2kN +# xK2JyHCoZH+RyytrwS0qw8t7rMOukU9gwP8mn3X6mgWlVUODMcHTULjSiCEtvyZ/ +# aafcwjUbt4ReEcnmuZtWIha86MTCX7U7e+cnpWG4sIHPnvVTaz9rm8RyBkIxtFCB +# nQ3FnoQgyxeJAgMBAAGjggOdMIIDmTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIH +# gDAuBgNVHSUBAf8EJDAiBggrBgEFBQcDAwYKKwYBBAGCNwIBFQYKKwYBBAGCNwoD +# DTAdBgNVHQ4EFgQUWyCgrIWo8Ifvvm1/YTQIeMU9nc8wHwYDVR0jBBgwFoAU0E4P +# QJlsuEsZbzsouODjiAc0qrcwggIhBgNVHSAEggIYMIICFDCCAhAGCysGAQQBgbU3 +# AQICMIIB/zAuBggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9s +# aWN5LnBkZjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50 +# ZXJtZWRpYXRlLnBkZjCB9wYIKwYBBQUHAgIwgeowJxYgU3RhcnRDb20gQ2VydGlm +# aWNhdGlvbiBBdXRob3JpdHkwAwIBARqBvlRoaXMgY2VydGlmaWNhdGUgd2FzIGlz +# c3VlZCBhY2NvcmRpbmcgdG8gdGhlIENsYXNzIDIgVmFsaWRhdGlvbiByZXF1aXJl +# bWVudHMgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeSwgcmVsaWFuY2Ugb25seSBm +# b3IgdGhlIGludGVuZGVkIHB1cnBvc2UgaW4gY29tcGxpYW5jZSBvZiB0aGUgcmVs +# eWluZyBwYXJ0eSBvYmxpZ2F0aW9ucy4wgZwGCCsGAQUFBwICMIGPMCcWIFN0YXJ0 +# Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMCAQIaZExpYWJpbGl0eSBhbmQg +# d2FycmFudGllcyBhcmUgbGltaXRlZCEgU2VlIHNlY3Rpb24gIkxlZ2FsIGFuZCBM +# aW1pdGF0aW9ucyIgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeS4wNgYDVR0fBC8w +# LTAroCmgJ4YlaHR0cDovL2NybC5zdGFydHNzbC5jb20vY3J0YzItY3JsLmNybDCB +# iQYIKwYBBQUHAQEEfTB7MDcGCCsGAQUFBzABhitodHRwOi8vb2NzcC5zdGFydHNz +# bC5jb20vc3ViL2NsYXNzMi9jb2RlL2NhMEAGCCsGAQUFBzAChjRodHRwOi8vYWlh +# LnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIuY2xhc3MyLmNvZGUuY2EuY3J0MCMGA1Ud +# EgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzANBgkqhkiG9w0BAQUFAAOC +# AQEAhrzEV6zwoEtKjnFRhCsjwiPykVpo5Eiye77Ve801rQDiRKgSCCiW6g3HqedL +# OtaSs65Sj2pm3Viea4KR0TECLcbCTgsdaHqw2x1yXwWBQWZEaV6EB05lIwfr94P1 +# SFpV43zkuc+bbmA3+CRK45LOcCNH5Tqq7VGTCAK5iM7tvHwFlbQRl+I6VEL2mjpF +# NsuRjDOVrv/9qw/a22YJ9R7Y1D0vUSs3IqZx2KMUaYDP7H2mSRxJO2nADQZBtriF +# gTyfD3lYV12MlIi5CQwe3QC6DrrfSMP33i5Wa/OFJiQ27WPxmScYVhiqozpImFT4 +# PU9goiBv9RKXdgTmZE1PN0NQ5jGCAzUwggMxAgEBMIGTMIGMMQswCQYDVQQGEwJJ +# TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0 +# YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg +# MiBQcmltYXJ5IEludGVybWVkaWF0ZSBPYmplY3QgQ0ECAgS4MAkGBSsOAwIaBQCg +# eDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEE +# AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJ +# BDEWBBRVGw0FDSiaIi38dWteRUAg/9Pr6DANBgkqhkiG9w0BAQEFAASCAgCInvOZ +# FdaNFzbf6trmFDZKMojyx3UjKMCqNjHVBbuKY0qXwFC/ElYDV1ShJ2CBZbdurydO +# OQ6cIQ0KREOCwmX/xB49IlLHHUxNhEkVv7HGU3EKAFf9IBt9Yr7jikiR9cjIsfHK +# 4cjkoKJL7g28yEpLLkHt1eo37f1Ga9lDWEa5Zq3U5yX+IwXhrUBm1h8Xr033FhTR +# VEpuSz6LHtbrL/zgJnCzJ2ahjtJoYevdcWiNXffosJHFaSfYDDbiNsPRDH/1avmb +# 5j/7BhP8BcBaR6Fp8tFbNGIcWHHGcjqLMnTc4w13b7b4pDhypqElBa4+lCmwdvv9 +# GydYtRgPz8GHeoBoKj30YBlMzRIfFYaIFGIC4Ai3UEXkuH9TxYohVbGm/W0Kl4Lb +# RJ1FwiVcLcTOJdgNId2vQvKc+jtNrjcg5SP9h2v/C4aTx8tyc6tE3TOPh2f9b8DL +# S+SbVArJpuJqrPTxDDoO1QNjTgLcdVYeZDE+r/NjaGZ6cMSd8db3EaG3ijD/0bud +# SItbm/OlNVbQOFRR76D+ZNgPcU5iNZ3bmvQQIg6aSB9MHUpIE/SeCkNl9YeVk1/1 +# GFULgNMRmIYP4KLvu9ylh5Gu3hvD5VNhH6+FlXANwFy07uXks5uF8mfZVxVCnodG +# xkNCx+6PsrA5Z7WP4pXcmYnMn97npP/Q9EHJWw== +# SIG # End signature block diff --git a/blog-generator/venv/bin/activate_this.py b/blog-generator/venv/bin/activate_this.py new file mode 100644 index 0000000..444d3fd --- /dev/null +++ b/blog-generator/venv/bin/activate_this.py @@ -0,0 +1,36 @@ +"""By using execfile(this_file, dict(__file__=this_file)) you will +activate this virtualenv environment. + +This can be used when you must use an existing Python interpreter, not +the virtualenv bin/python +""" + +try: + __file__ +except NameError: + raise AssertionError( + "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))" + ) +import os +import site +import sys + +old_os_path = os.environ.get("PATH", "") +os.environ["PATH"] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path +base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if sys.platform == "win32": + site_packages = os.path.join(base, "Lib", "site-packages") +else: + site_packages = os.path.join(base, "lib", "python%s" % sys.version[:3], "site-packages") +prev_sys_path = list(sys.path) + +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base +# Move the added items to the front of the path: +new_sys_path = [] +for item in list(sys.path): + if item not in prev_sys_path: + new_sys_path.append(item) + sys.path.remove(item) +sys.path[:0] = new_sys_path diff --git a/blog-generator/venv/bin/easy_install b/blog-generator/venv/bin/easy_install new file mode 100755 index 0000000..85e938c --- /dev/null +++ b/blog-generator/venv/bin/easy_install @@ -0,0 +1,11 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/easy_install-3.8 b/blog-generator/venv/bin/easy_install-3.8 new file mode 100755 index 0000000..85e938c --- /dev/null +++ b/blog-generator/venv/bin/easy_install-3.8 @@ -0,0 +1,11 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/markdown_py b/blog-generator/venv/bin/markdown_py new file mode 100755 index 0000000..3e2ec9e --- /dev/null +++ b/blog-generator/venv/bin/markdown_py @@ -0,0 +1,8 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/pelican b/blog-generator/venv/bin/pelican new file mode 100755 index 0000000..d16b46e --- /dev/null +++ b/blog-generator/venv/bin/pelican @@ -0,0 +1,8 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/pelican-import b/blog-generator/venv/bin/pelican-import new file mode 100755 index 0000000..fb2b4ba --- /dev/null +++ b/blog-generator/venv/bin/pelican-import @@ -0,0 +1,8 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/pelican-quickstart b/blog-generator/venv/bin/pelican-quickstart new file mode 100755 index 0000000..e514227 --- /dev/null +++ b/blog-generator/venv/bin/pelican-quickstart @@ -0,0 +1,8 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/pelican-themes b/blog-generator/venv/bin/pelican-themes new file mode 100755 index 0000000..debd452 --- /dev/null +++ b/blog-generator/venv/bin/pelican-themes @@ -0,0 +1,8 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/pip b/blog-generator/venv/bin/pip new file mode 100755 index 0000000..74d6c3d --- /dev/null +++ b/blog-generator/venv/bin/pip @@ -0,0 +1,11 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/pip3 b/blog-generator/venv/bin/pip3 new file mode 100755 index 0000000..74d6c3d --- /dev/null +++ b/blog-generator/venv/bin/pip3 @@ -0,0 +1,11 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/pip3.8 b/blog-generator/venv/bin/pip3.8 new file mode 100755 index 0000000..74d6c3d --- /dev/null +++ b/blog-generator/venv/bin/pip3.8 @@ -0,0 +1,11 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/pygmentize b/blog-generator/venv/bin/pygmentize new file mode 100755 index 0000000..8a712e8 --- /dev/null +++ b/blog-generator/venv/bin/pygmentize @@ -0,0 +1,8 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/python b/blog-generator/venv/bin/python new file mode 100755 index 0000000000000000000000000000000000000000..9340035911e64888fc701de9375b70b3fc97b241 GIT binary patch literal 14088 zcmeHOeQX@n5r1dL@rA@^6Kv{|2rmebBgGr%Qx1{g&UTWua3G-$RDxu6_O0zB_Fa0n zuIvbjs3xcAN|`w?$vcIS6q zFOI|?`KRg|Yw!2wH#6_OoqccZ_0B!8vu9UDET$lp>K4UXYhA!3#Sq^p4T7XeBWDR7fVll>ruO#HS6Jn3zTJZy7hKw9{DM?lb7NC;z;J7L_i5|t@ z$^byv%i|dwOk((-Wjre?FdWCZnP~|eX4)5Hvz&LUAmUi%xH*ZNlQ`fhnI{nW{C#q|NLfQZ{iaXioOD@gmDGTx=~(kSx>%IT^N!`Z%V zTQ&@5T86W^(Xp1XwrwrjwwT4dxye88dYTBYsol5lS4Vg3s%~k#_QH$HKh913@}~LP zeTOgdym=1XAN#PdKhl2{wR!2VozLs%`>v}poClj_IVt3M1=(1xpkt-qQfd`pjkLp% z5T%xo$KKp`?(>&#JAbNk=i8qhTG9E=dq4T{+TWjl{Qh%qo`0sM{-bAVZhms*p$DG6 zKio&OeT<0JQIhmK=rESxP2!gFPZDp?5tTzk7*Ue+COWQPg8wyft0@z>Uu+Pc-w|HP zSup|v>*je<>r}m}O9nhXUl3kJ`1gIj;XD3s3*Q*={}b{4e6FMhi4%Z&oRInFgs&3* zB|?Md6CHPl_#3it%WIw1;o)(2D4*MGw(;`YXtpZi`nkPL*>?X}+8)T}(!<#!4ykOi zi*CB$+9T;~j+nubd`=i!+1a0gTBuG8$a(Z zy>-wkePm7ib#`xW&t%nI^rx6LS@R*eSd;Cqdn64%qqx66M(PXP?_|~U4BO}21{&%h zw`r&q-gIr#QSNw3ko?De|E&dvb@Ntf);j>=8$eN-Or7_13&wPaSNP4&vVQKy6dk zLOjp!XgizL=;r;_MEh!PTBQqajrDN*)ueb0iauxhX^yW|t)gb^z|_L|O${uxYnzga z`}<^&d}V&Dr|#~VY=4QKh*NiUm)=S3?=F3t>P?mYv)`I*IZpJCde&X!oX$Ku?|Ihg zics#xmjQ({h zUl}5`=nUu#=nUu#=nUu#=nUu#=nUu#=nUu#=nQ<%48-UiO>9l&j%M=b_aJL$J?~z^ z^@Q|Tt=50#c`o5`!aor5dsdd%kvmmvtS+`@RdxI^dirOc-_=il>3RIbt-7lHH#y92 zq2na+;rAxocMl!Ep>h0obh{FDzo_U=G(K9nGhs|F+nH#7q^c{?`p|MK(Kb=NJCV#K z+ER(uRHC^fVRR%KI}&vriMap1=?UuREcFw9Uqh4@odKNzodKNzodKNzodKNzodKNz zoq_+$44~c)^>wJ7P%^+oFOP~Un&>h^vpX4Lhq5gqk<*NBe#K7KZ2f&JTg zFYoJ8l!s@xR%zf_@hP!$y)Dbv0hDWR8%4)?i0aq!a(hTR!nml@MjbEWfr$UN7tD|H z;fKt>6r&Ie-VEs#Mc;#^}>8YBdXazpB-AhU|etdc?7ZG86$V zh_KUzLV7%iK%2Ttk7WC4tUUD<^g(s5%IwdNj5s;>a^;U}!Fes9_ViNUXTW$^H_%ak zj`(Q({ta*x4S=MLh01K-_mQe)Rl#A@VtK|Gvn57X{V0zrq~7en-d`QG>s)f%`Rnui<+tQGe*bS17hN6p!C~vn@oDz%S4ibnt&917CZLkNZ2m z2XsoVAJzxra2@|lvFw8QlTxpKas!bhRsiKs!~@?TOE_L7#g%>ouwa}(TbMuezfgnw z!uWN`z)~mi7$;zZvCw9Gmku6Z+?nzP@$zQ}Xy2C=Nz3B7m%Ws_PCA?paoj{4=>G!C CASI^& literal 0 HcmV?d00001 diff --git a/blog-generator/venv/bin/python-config b/blog-generator/venv/bin/python-config new file mode 100755 index 0000000..dc4bba8 --- /dev/null +++ b/blog-generator/venv/bin/python-config @@ -0,0 +1,78 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/bin/python + +import sys +import getopt +import sysconfig + +valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'help'] + +if sys.version_info >= (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/blog-generator/venv/bin/python3 b/blog-generator/venv/bin/python3 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/blog-generator/venv/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/blog-generator/venv/bin/python3.8 b/blog-generator/venv/bin/python3.8 new file mode 120000 index 0000000..d8654aa --- /dev/null +++ b/blog-generator/venv/bin/python3.8 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/blog-generator/venv/bin/rst2html.py b/blog-generator/venv/bin/rst2html.py new file mode 100755 index 0000000..9069476 --- /dev/null +++ b/blog-generator/venv/bin/rst2html.py @@ -0,0 +1,23 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2html4.py b/blog-generator/venv/bin/rst2html4.py new file mode 100755 index 0000000..0f4487f --- /dev/null +++ b/blog-generator/venv/bin/rst2html4.py @@ -0,0 +1,26 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2html5.py b/blog-generator/venv/bin/rst2html5.py new file mode 100755 index 0000000..d49aa25 --- /dev/null +++ b/blog-generator/venv/bin/rst2html5.py @@ -0,0 +1,35 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2latex.py b/blog-generator/venv/bin/rst2latex.py new file mode 100755 index 0000000..f33284f --- /dev/null +++ b/blog-generator/venv/bin/rst2latex.py @@ -0,0 +1,26 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2man.py b/blog-generator/venv/bin/rst2man.py new file mode 100755 index 0000000..cb1f4d0 --- /dev/null +++ b/blog-generator/venv/bin/rst2man.py @@ -0,0 +1,26 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2odt.py b/blog-generator/venv/bin/rst2odt.py new file mode 100755 index 0000000..ad7a64e --- /dev/null +++ b/blog-generator/venv/bin/rst2odt.py @@ -0,0 +1,30 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2odt_prepstyles.py b/blog-generator/venv/bin/rst2odt_prepstyles.py new file mode 100755 index 0000000..2e9fb87 --- /dev/null +++ b/blog-generator/venv/bin/rst2odt_prepstyles.py @@ -0,0 +1,67 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2pseudoxml.py b/blog-generator/venv/bin/rst2pseudoxml.py new file mode 100755 index 0000000..81314eb --- /dev/null +++ b/blog-generator/venv/bin/rst2pseudoxml.py @@ -0,0 +1,23 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2s5.py b/blog-generator/venv/bin/rst2s5.py new file mode 100755 index 0000000..a1003c8 --- /dev/null +++ b/blog-generator/venv/bin/rst2s5.py @@ -0,0 +1,24 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2xetex.py b/blog-generator/venv/bin/rst2xetex.py new file mode 100755 index 0000000..f9799a1 --- /dev/null +++ b/blog-generator/venv/bin/rst2xetex.py @@ -0,0 +1,27 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rst2xml.py b/blog-generator/venv/bin/rst2xml.py new file mode 100755 index 0000000..86b8c64 --- /dev/null +++ b/blog-generator/venv/bin/rst2xml.py @@ -0,0 +1,23 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/rstpep2html.py b/blog-generator/venv/bin/rstpep2html.py new file mode 100755 index 0000000..ccc78dd --- /dev/null +++ b/blog-generator/venv/bin/rstpep2html.py @@ -0,0 +1,25 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/unidecode b/blog-generator/venv/bin/unidecode new file mode 100755 index 0000000..26ffe1d --- /dev/null +++ b/blog-generator/venv/bin/unidecode @@ -0,0 +1,8 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/bin/wheel b/blog-generator/venv/bin/wheel new file mode 100755 index 0000000..846c2b8 --- /dev/null +++ b/blog-generator/venv/bin/wheel @@ -0,0 +1,11 @@ +#!/home/ilya/git/jeancloud-website/blog/venv/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/blog-generator/venv/include/python3.8 b/blog-generator/venv/include/python3.8 new file mode 120000 index 0000000..137e766 --- /dev/null +++ b/blog-generator/venv/include/python3.8 @@ -0,0 +1 @@ +/usr/include/python3.8 \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/__future__.py b/blog-generator/venv/lib/python3.8/__future__.py new file mode 120000 index 0000000..8fcbda8 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/__future__.py @@ -0,0 +1 @@ +/usr/lib/python3.8/__future__.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/__pycache__/__future__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/__future__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f78f36ab424325d082d3e64af8ec43774f668fb GIT binary patch literal 4169 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 E4}LCa0RR91 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/_weakrefset.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/_weakrefset.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8223290b5142bf34c3c110eb65ac49afbf89b93d GIT binary patch literal 7638 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 Jn=2IT{|%iv`>_B3 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/bisect.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/bisect.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c11e727d6c0721631852ecb74455ed3c0a8c0dc2 GIT binary patch literal 2392 zcmd5-UvC>l5Z~Q9U!1d@R?rf`1KI~9V$|A2yr8O7s1-;-C?FdCxdLnLUHi6K-#rz4l_?)k()AvnSb1rR5na) zpL|Z@Yd%rIL1;gu1m7=7%)TIs^)?jk)g^mC+E-$74L|4n-7v4LIvwC zkksg*LJtCc4irz7u)|2nj@#aAv$8pG>Fm2;%AgAJ)Gw(h>AYknDOsdXiQR+*KDpP8 zl8NeSb0oTBopm265f4q0%bSO4kV4wJ1CxxqGZoLeMi08vqby3|w>ockD=(etQP~6+ zkip8KhuApKHn*s4!0Hl&2p=A~kH_{w6im_sVy|XIvJ?6pEj;NR)Gg0wK~CtxLvUgL zWBhIt>Ayl2K0rAfp^b^5`Gbu zZ^HP)5)NrVEuLu8lD^SquC2gD_l)mmxzX>-WZ3V!+s75ZMKU@YuvziCZ0t^^z}%|k u1eLOfw~IWd9+h>;wSAPE}&Be4I7FL4~e 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/copy.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/copy.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1725b11434785dc585d82e0ca61e2ff2299859db GIT binary patch literal 7001 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 I|Jk_uZb%7 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/copyreg.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/copyreg.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cc8fa5eecb7962cef3fd53cfcd77a550688a77a GIT binary patch literal 4356 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 OHD?}%_iVzw>;D49DdLR) literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/fnmatch.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/fnmatch.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..904cac2b60e61ea0fcf130ffb6ebc1df4b72c696 GIT binary patch literal 3370 zcma)8L2nz!72erhE|-)ntFj}^t+prJy(;&4jn{u~^Ep2M(mG^qpI_h(s5QR8EBMy=MegA{$L*(9 zV=??Av#ihJM5JL~1pQD)-8kJ1p2xZysIEwoU=V68WU5;AdM7muE1y07<)gI+zj|~# zc=BL<{n6)ZjdG_@K^R4u_*sEuwgP3*>QSP}+O><*Jq*2Rl~ z6iSgLK>%SR=!n2hwnkZh09WuSbMT5;1)WR=Y9IuE&4`&|u`=_96nY4ky;6HdQXLM0 z1%oV|x@ocv_N+YC0nc#mG}BXSf>^g2^%LO2S}VLxoZvQ!>f|blxygVWRn(?F5Rpy% zlOK&8v`^90d+4;a$ByjWI%WscF~gW?C%1BTNWfs>UjU4Cp>*)PE8rX%OmBU5*HgRe z^#H#o6PyI06u}p1{9=M1rALYQxa7G-jQANC;h5r?kRwfqGa~Mn)EPNUM}Yz{!PRs_ z8Adp|Vcbw+f9s4KVw`ahUO+Dyua%rrg;Pf3;0d2$e2`*WtYcsmkcu--Qf4QP%NxP< zN8o6g9Y4lu2E$mDcE&`!j_+$l{BPrE1?82ph zFB}m6WXUg(W4D|t;T1IEtE>PpMI(+7{1@w!UpK}}`h4vW7UB&=tG04b) zl|vNGUX4&N{=@&3z-}Yfqhx5(F@*>cJSC!aL|cIWFhG`~fxh`I@Qg3oTKevu-zL@)Y z<=8p!b01(JKdeChT3$UeB`)_#2Sp9&rB{6ZBUs^sYktOMEFmtwc;xaWe(9x^S0BR9 zD3+eC9C`dQe=GN($D5ps-|%pmfmxs|n>vPCg4a?O z><=@%occnC%~|c7;8ap-F02#tVYkM1>((i|U$E9G+c;&{PTAJj-rN}5&E_fFJheAB zPbeBsS@Xof_Z(J$-ZSEY~U!qLx+uX%DEAo9X%InnK zLf`IGvDt3;g@YHfY=B(2 zojB$4su}KOaVn|&p}Gur3Qwpg9Ee7(OoJ>gSSl&S6)Y;)Ub~|7u+wRKQFoa3RKa?$ z=S6bdFVNJN=qzu6xu%*>UZko*wZ&zZF)CYGX()FtAcwwdFBtj~=JRaHslyY#vp`g~ zghpJ8tTA6yx3_r~ZEu&!{cUI}&rmb(>?}(Zv4lwi7P{Y}mdN3@c{ZB@VA8jFSD1Qw n<`5>UnG)&W?Pq+LhRtX}gM{rZ0aGA?1L literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/functools.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/functools.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2524fa65be02d5578dde170325b3c158e4186ef GIT binary patch literal 27935 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 P|Dt#$ZpMr8QhedRyaC&% literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/hashlib.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/hashlib.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36f946af4572aa446e1f33a713034f2a7bc50e99 GIT binary patch literal 6765 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 E1}nGeg8%>k literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/heapq.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/heapq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bb7a874fd3b02a7e99fa3dc49881427ed3ce8f9 GIT binary patch literal 14108 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/hmac.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/hmac.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..380e98b62b0f18532820779d9e9c44d1bf4b5586 GIT binary patch literal 6426 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 Ow5R!LcpBBHJpVtorAvPR literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/imp.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/imp.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6c28a1913715cf5977a211250bee11c606775b4 GIT binary patch literal 9847 zcmb_iOK=-kcI|F7fW}AQN7UaQxBR0Z)1>_ONU}#VNy)S=NJC1I)ETGK#A}dEHX79H zhG@b-#${@1s**VNY_iINOePDhv&lM@s!U}$%g!#z##5E5tg`T8oO5qCK#-y{87Cn7 z;r;sk?!D)J9_}1DQdIEy)qhO>(YdOk{2LX9KL!d{@Pz-YDvD4nMW{ma)uv`?&5V_4 z>XzQjTG?jK$~E&=zG+xSvtSjPMXRVPol*48pm)hCsmfg?IH@acdA%s_sS5oG-74Kz z0_`4+n)Qz~D^{gBVvRIMtVqt;Q*=lzN1G3yxT4djno$2qV26V?R! z>i!Aq1b?5jPV)CD>lA;Vwodc+8S9LDX6-3aaGw@MQTif7?^{0*W$PJHv`lftIx8yH zvtq=0PK;X5i!tj3F>bvmj#`sqLL7UfSm(rXaRT2}aZ;SZ_j&QQI4#aRQmvQ7Q{rjV zOo<?1{--PWvWl%5sOq4XR|GblYTUO?#ucg8)oc41q$UJ*YOFN#Tw z^eS4#HYFl`u_btlA(USwh&8`5pKQsOmCffWQHmLtt}=mjghsAM|d zTTYie84f0Pd@tHETMyAc+S?N*`kFYoT8ImNtG;fpy1t0ZPW?gKlderwaap>)i&Z40 zu@yJ68?x1L1G}}n=GLQl%nSQ98%}-QS#jf%7kK?{aS`owGLaX=g+bqV)NXj6*!32^ zd^d2KZdHvdb?G{hYl|&Zc=cLUj}3c%anZi9bUn`6?k8>?Uw+FG@pyksn!9PI157O8 z@atG`7+%A$AEBo!F>s;j)K|U0m0Kw2?a1>xt3*beSf9K&VBzA3>sWv=y})cZ51En; z>IE|5TrZiS>+(@2JTZxPQerwpUbE4XrsGGh3{ZaPf;MjWwMHkb#>Ftg@%ZjT*Z&$o zp?sa8M5iQ6Nsf{{B?Ks67m(DcU;jgSdSw<*NQe|EJ8D_X(0y%WZ5vg7m)w%wGwG*t!o-n?fEBG7C9>imsQQg84x6{;E;Tm zkb{{mF4V!)u8lW_Rz`G?yu3Uu4~=|Ae2|)i`cmqgM}|I>Ctl)CZz4lXwX1yjyh=Gu zsJkk1nH{~Wbk$w$E?#&;`LVL7{Ef22-_T36m5j3sdK`B4*C7YV(Qi1>D#4^fXU<1H zWy(Fu^qW0k>VPOi?Am_`A_qt$mL=q+0o_l$FuIfgTS$krm5!TWb$?(8JX3fuIMCIv zw|y3P2PoTM4jIg|33*6m-xcXX78*c_<@SnAP%44H1kALS8nnR_y&n)-H`~DOWfxmr zZUNGrz;ptLR!D$ABF5|3@SQq9zroVh@ST-#y0sB`O|L^5fOrwJktFV?`}Bb9G$75J zOj~P33w;K0#k`bYZgh~2hdI*$zJU$qD2G9RJ~p#UT# z(lC}x%2*pR#sUy@I@!3g|3HR#k=Rg9BY7WBNMfo~ifU2iy8k`4Ie+r|u~vQhcQO}u z*w0%D2z+1WVsep28F0@KZ-GVYEhz2~CId5U+A*0DHUa3&OiG;1BN0bI!2_R~#NfB) zZ<(*X^7>nZ3{5ARGXKEw+ipVQP0#m<)lxcREFR(imv8!@IF`^p(YeeLk5xGXx*nwZ zE2#TJJP9h6B$exU2A>Ra1U|EP!plftdTNgt8|Rd5wWo+oTGqG>!!<2uxU3N%olv^k z2>?+w`%Ps(_Uz*>nuk>E63ulS$%@idKCblCt|~BNBl8RG0SrE9Gfgf-Q9o4ydM;ej2-#mhcWhwQ+2*J)f*r%rDL~0s- zhMozqXq}V$mNV3;R?X2iXe`@~i+1`h@@3n8&~|thl=8L>8{W3%hZt4fpk#0A0k6q< zYM^;ZjTxGrGjd$_1cT9j=@XLT+s9z}pDPVeQ|ONhmd<%F*(1Zs{#?-&i`dPGEB5D-tFz`)#F_Sk_7+Z)7*Y#~mP(K-poafQ9fkSvLZj`UjX&?FbhK7X#t zs$k$`PS@)F)zJzmPfrF&ss%|$m55^w9uh3HScl)^##t`KdTYZCVjcdQkfgR^gRoA3C90X^ z)CUJH@6b?t2mLXMe}N~QKmst#7-|kimw~@=EvG)EJ#p}Zp+V=otl=$rlagDM{FoA! z4H`H;lF}AVw%?~O&&{h~i*FJAeuk$nDw&EdsqP6;QBiq?I*uaQCo1ex#3yZX;1idA zpB!}F*jF@%#bRJA6Bx1_Bx>Ybb-MOgKXiAz{=I}ZVPi=h zU^Vu#x>>u>&92c?v`gJAfoBbJm80z-o>Au2B!>BkaKo)9_87?|MQPYOlrLgQaXxk8 z)hh<(h^d23(scko6%9fG(+ z{xOy^v@Dg%Tp1T%}|`%g0BUUi}mKd-O;srtMLzOcV>yvQOWWDA2>A z@K?xCgkwizBc?&j4)aF+nRbeVAluKMU<961K0Xg|q5e6TI$Ae#LfO@NI@jd8I?SM{ zuHI8sjfNOUA!S0~Q8Wu~lHZj6_kc(S!$RSY{fg z+xRDR2u&mkNQl30bqzWIIbF?Z73c%)+niP;Q@M>k`)mV>K9bsHk|G!cYv3oqv0k>9 z>t>-`vpYCU5XS_`vN-Y!5iA>!Je!av_)id1UpM5vZZ671`l^OL_e2&wa=U6TAF16u zkudlbwUZhr_1p!^Y(veWPDkBmK*r&^JnDW87SPuV^4ID3{}>gzn#gTyU!Lw65#guS zHMTR~q0Wtsh~!c23Uw|L>_xUJ(x5f zjdt^0MHpnc^Nm5F^OuJ?2p<7rO(%`FPMIql5%bu)XRJ;QVnl|PDK0j!a{)?EL~F^O zO~OkaLaS{ApeUF?R&$?uP3kg5(JUv}N(X>>O)<(?z4MLwQs;~pJj8_nt{;G&CRrM^ zHrFIssCA~3T6ScxGQJ8xSBfUF8)TlNI4~?9dZSlmi>7mat`$s1=6cZDG*|J!5K4Q0 z+B^8dGgwJ=jN{=l3O7BlGFjF#q~tOs?@&UDfw4wXTry5LJG~i@6kCXo-1_jkJ-2|M z_wAdD_nC>~!mRz?orRBXFVx~Pi^|~Y0p9Gj#hccAO;V6uUPl5u%%nUiG`Jo(4LUn3 zFWkuSeDXlqjhFYSox|UDoN0zDR*4SH6?}JbPy`dTmte=g;6-)>6r-pfhvJ(6fRZg% z=4X^slVvffM;l~SevbF{L2MZnB$F(Ue-3#h1rtF*gg=O2^zJ~$h(A;5dmgQ7gn-Gm z8f6>c?eM)Q2l=F4fX<{B!7U{8vj{xAt;%J1p&FcDJu(`Z2BZ*@MfIIQeKD;st(7Ts z0_gtho)#ThEALbwbp+cPk&Q;yMn&$F(m>ee<9B-hdX|(2zl@GP*)6S|+Qp6PDWzAuo5s5DDbx$H z&bOhxQn!SXj&gcZ)v_}Mk{l-bORPIsdins6iex|LhY)S6=|yzu1QAQZ$ce^D-(m)S z*$bx3T)7yYgWWsXGC}j64Lr z=b-cC^d!RQxc(Vl^*|AlgE>%(j5+}PKaj6S>=!lhIZ!3VN!T7_+=yYDgGl#jcamS=ETECyX29fAw5Ob9{|I|$(c#(H0Azurs z+;9Vc72JX9X}XN`0$juebr+W^k&Fv;kHrBJ#-CUxaEo=CB`z zWsi~~1i*}_weALp_s1iE9E5G`{!(Lu zTt6RImaz6sdVyw%v$*_`Th>^5uJ$0jAh)TK z4f?Z`d;axf?=Fe#GQ&}puvD3PIQc*Zpy zU{_X8qYp<`_C+I!Vi`QMc%Hn^+&oO07F{xLSmOt3W?^z1!bJWcEEn zT`uegqUuy1O31RsrdRvzbin{U%_7U@Dd%c14@PKzq!T5}&jDuWqTwCdDeXqdX&@^| zO10nZ23*>RK;ujYD z+XY|JswMA`;cT3W3~`Kje@4ZpDR~J=tkcb5JU*BHd;-DyyUEp}RbHCEx;Xnj{f6V_ z;*f1e7M(@+3ybsVZ3bf`qbmWcHNtlfbMyUn%UHN^%YOgn%@6s<0DQ~Nx7mD`$k$5= z!p_sGDB2`lN^DBlk|du!F(=8{VGApX_L3AcD>GGwWSnJyurM|*CvfvF2&#m{Sh_K# zYk<3oR@6?aW%jQK7SlffBPjjbTvms#b>J^!lnlej7LOVgqfj|oIWv(hR>rf%5o5x5 NuJ}4y%Q>|?^4}fYmM8!K literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/io.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/io.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6729118798ab1b8faf2dd7c7dbdd49a6f691faa8 GIT binary patch literal 3492 zcmbtXOK%&=5uV{&qxZvFzukT;Yyn#8kV}vVh9q0s2%D9>k`-lVk<2#PO|qqVaJz@% z(%0k~V1Gh#%+JUze;}8+=41r<13`e~tDYe#0qYzb5iCwucUON^^;J#lY<}Kz@b}k$ zKL73C<{jtnG`Rk^iop)P=E8Lx;rNbleOHu3SyV(-)I?o0#EkI7te6w?VnHm5C9y14 z#Hv{9uKFc$ORR@wzifXieg(gugypE}SEHI=i|T$oYWR(4#-E8i--~Ab*=Ww6i{}0L zXu)5I7X8I&$zO_={pD!IUvV8-zG(QX;w5McIte-j?kNID!j`OxBnMzoch(Rb>Unf^eNW)U7 z-;B~;5;GO2Qg?Wpv46-xmd zu!wPfOw;prQ+q_3^jXrekB3{wtf!>ry4@SmUV^||IFGke*5XF8cF2ukhsS#uG}&S5 z<>vFHSfSceu!NNtXq)UPN#!Q%B|~{7^(IVnd%lM6hQ*0zWS?tpQMY6|lyC!X3OLB% zC>v@8_qtR6&Ci*N`k{l$cp3>xv( ze8^g(G|%8PDhDc*hsS`@vXRB~^c1*Ikiml!6AqAT$EU1=od!tv2Az)7QWVf~P!>(g z&QQ?61U^A9=Ff}CNgI?&<4r+qva!{3gq_kg9-km3G^UhHbmwol(kwsD%h^eUK!TAG zn?>FVk$ehA{zThb2_mMY=}U0+N`|B6#FrDyC(+n@B(^YaX-o?*L=w^13uZ|lM| z*&f9iQAN%WY0Hwa)5wI1KZ|6P=uw^zssym1Cv`#VNisIsTlsyO$91#F_9V?RZYL9R z3YiZ)m>>I(d?hS}0o128bFO(G3_}<2( zlqA(rZChx0_LCT_w+*7$ZpeFTKQA_{4e}rsc`3Fe8yGxt!!G4$m}oqXw;=(7r~GH0 z_j>^w8h;JjU3rWj|{tsB{(EE`Y{_&cg>G`jVwN^8Btiq?O~! z8{Km=;SQOi7FSeSa|{;9^8Q67MeD;$YwQKkCM`M=$YC@wO@mgmfj&Z}`iU_Lyl#5$ z{_*)hp{ZOU&?nFiBDUQn%}(F;?`ERAFE`nj>Qb^_NiC9Cvh4_?CR!nlcDfN)VY8h? zw2bRZb}}$Vh9Q<=)YSQC=benPs5!XAvR&{C$k-c|>SVySO%kfUQD&!a70p;A_?(q=TE9e=Bm-aITOj%<5Hr~SArOnfO#- zV#CdrgL8$~>(IPPVl)?AQ#L-e`+ZP}4{$Nnpc3eU7fuk^(EDZHYU^7t^O2RI*J&@+ zfIo`@jf;0?p5bMhTOmRJujq%gs=mAT>Ps-mGE6@qJ!MuuB|(wZ&q$DWSwqXNGU#o7 z^^&f!`cu-*9!7Kvw5{yNn36TN^SXISb!Xl}RGwApo?CM4C;z=JozlN6^@iIh?Nn>! jTDjulQ@veYvmdY2a7+Jblom>J?t)t?mE0wKYNh`Ihx6Z; literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/keyword.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/keyword.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10215782b7d24409e42ffcb0e583af0aaa48f760 GIT binary patch literal 1036 zcmb_b&2H2%5YA?^+ihse|No!cLYGSI=D-C3LLekKP*q5jiw{KJ%w*SH$Bt~LOStk7 zJOfAGf@g@ti8C+2iAh-`#Hj}+@{C6_-~4zcZ&z32favRw;kz&0Ao$)Yf72!@Pw6-y z1_2MC1K}j(9q2*?J?O&{3}6{zI0Y-P3Ttp0&cInX2j}4eT!c$-8Lq%pxCYnZ2Hb>O za2pt`!v<`^9k@H$kOcB#eu~W1 z#n>pvq$YI{c!v!$7&32;J-jIyNQ;>_wq_=eTUc59snN`t%4QVEA~Kjb^|5qbvKTwH9;&`hz+!Gt}+`fYxPCj*~^^QCY|FGv(20dbT4} z^$x2|#WJDW>e;XmGh`O2!rcXAIEtHP=@wekpUstYzUjRX%3%}j8%_McR>-^b20Rpw z_l2XDJ?{xu>x{%)NYcg@#fmZ)HVyWcFODVQux+Y8l@rZ%Mip;@LPKG5@{Z&uQ@?L$cI z$VwX=d=BgiiDUNjc``KxCQ{WRnMj`;qR^Q#73|J&?4-wJtjr`iLVc7dn$luzMi2g) cS2K8A7^oCJX~VlcV$s^58+QJ~_buA`1qXX5V*mgE literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/linecache.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/linecache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52c44cdd14fb1fb5a6723cafee9f426d62e85ad2 GIT binary patch literal 3877 zcmZWs&5zs06`$dUL~*t9`lF6Fa2zH;W2>;W{XpBmSQ`!Eq|Kq*)?UNTB8kA&j3llo zQac=FD}g!`>w{4gsEhW{{rwVS|Dnp+%SPoVxU&R>U^`53Va0rho2Rv7nWw#Do2Rqm z2wOP99oRdrI45ete!_QZ5ew_0E}SQ9#}jM96Aip=i1Wf1E+k)E5G$eyX+^Ax7J4;> z^?0qm4lx%HGJx zJ+k!jav)Isecah?6q@BMw+^iZ?3{B4jU%q!);zZlIi&9=4rfU-w{!UA3R`Cn7+Fx@ z*|xWyb7&}7+bX!e|U+q9Y~aS!b)w3)j3e z%RN)HphA&Jui?&Ue&+PdgG5}^M)Q~nA4AAt^ifUSAk(k2g#}|E2 zid>;+^To>4s5kQ!D?gXxRLwq6DpkgIZCf>{>k4&sjs90nTu0Nlac37$FvsH_Z^E}0 z$`-G2MeRLu?DC>%NvW~>7Z7r|dE}|fnrVJy9kWBe;K?O;gTou|UR`<>kS#97!2XW=etIr>BAXZxLbOFKtyUOVQC`XiQHgTHF<*KaF- zLDL=hYQOU_ORUEX0af3tkL>IycOZH2eTQbdgC6EE+Vh9^qO2DxQToUjJp#%Y00@-~ z(y0#8en3tu9e862R)jJp{((i)2|!H(6QCxJ-)e6e2eli86Gxdg4l10HoMok(tTZc} zOozIt|Kfr1Pf^cwH;d-7@F0wJG?s18c&lhEV?0wAVP6cSZm#L0n)Jr&Pve+SK)r_Q zt1cxl`XTP@9Teo!mIb$34waQ_J#OLGGA{P{CH_)m(P<&@FdqI2zON$dn&xF}RZ(?~ zYIks}ALZ=G64o(Sw;|cWCTV~O$`Ob2HRD0FF6>9_8Bbm>efW&4Vd+Kma&*0nN%imf zg>n|*tg}P5aN+eU7~$z!--74=T#kXi@4?@$aB)ulwv1T#+QsTzB(nMwv>r8%**%=d z-0C}|b<+UzIuqV{73133^N&_?h82HxqNTa#!h z;5*CJ?0;RJ!1?8~yXDyLzIep;zdqUXJZzV)ubZnE%vze3W^K;2-m6JTr9{h$#FY12i`gBYPKdU$WSu zvGDUo?&sdAeR2U@{tHIc7GP~mUV)_Uo9 za(AD!k=h!w*!;~iaNF68Qv`o@7s9f)T0_t0|HGx;g4F)j8L0LV|4L^EkscNvSdWp^ zWppc}_zI+=5r^|xh2|d_;!~o9pH1S(@DTtB@t4AlvTzr?Ae-UMUK%AuV|zA{W%t&5 zTB~Sxs;j!E(~(RFMx1ma(Ur1_ahqDF1-wp+T{%q_in6X*R^jc2S;;sYU}9L*MWhS? zvHBB(M(Qf{eS-=@jj}N5`#h@mac7^PV6Mm4kWsF1$8rEZYxp^i59tDaHOsR-3pVC! z%=)kAtT|0UR@r*VJbh%OHN0zKM3Y~J?3=O$NzqI%VOR|>$ZH0}eg~n#u;3*Ov(!~X zyO8C9V(%IhbASY!2E|;GhymnWJr%W_^4ZgzA3359EVFQ|YTy~Rc5|C3@*#3pZlQ;x zp6c3B9T~_1X1KZAH@LZ3QaoZ5e)uKM?*mE1cgYq^;$I>^I4mgY%ghe6nfS!^DV>ee zP)Jqs-Cb~nYy^eGYe{LvxYHz_1qa~G!IDaXcN;~NxFi@erL|~0mLfvR11Bq|K_Ej5 z@*$YW2{!>xIbCl>O$_C(ICvOq3=x%z+a*-o4z|^_BJFg#LCrz*F+#}!;)Vv`JK$7t z2?Dg$lvZ#MWit2>aV9&#Hhm?OgMw^|>iR(&+krcO-1Y%8HJ+>PalqGg|(1_{48icCq4C`nrhov;S2!SI9a57nDEiz+}- z_}y;lz;3tjx?PGXNdDTvn}fkG z|Eop4+ZAcA+f{earfyMT@a=n$s1YX)jRe%?#%z*^VJeDM6U9dD86YtWBs3|!&Ci(MlhX3CG0lcWhn*aa+ literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/locale.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/locale.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..caaf2de57b67cdda516c44875e2c0862167cc142 GIT binary patch literal 34727 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/os.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/os.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9f6dc9333f1a8ff970dca95ef4dff853b33d2b0 GIT binary patch literal 31361 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Ð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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/re.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/re.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6440104a37e662134c54cdfce622becb66316530 GIT binary patch literal 14346 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 Dx>#ZN literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/reprlib.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/reprlib.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36d4fba8b3e4f2e3af85b1ce84a9860182aa48bc GIT binary patch literal 5341 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/shutil.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/shutil.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ddab7e14988c5378c2c35755e4bcd3b3e7cd3e7 GIT binary patch literal 36338 zcmd753!Gfnecw0lnVo%Nu>?Vg0!PaSc0q7Kff7wq6h#mZ5hS>P@F2mFsKM;s+1=U4 z%D$u|&#AWT%l`tZXZ$<2a6^rcUcP&P!DvN!@%>C!Ms8?6k4vHffur zZKBj-zQ6yucODBsmeYKi?0)9nbI(2R^FROhIrrl5a6ZQ0*Z;|ZPmll2SnMC^q4)1T z9-iYDd_EnEd9h;5i+hRHcrkAGL@{CaWHD*?R54}ubTMuBOfl0Ow@|j2{bbfl7IUx0 zYI{?$%D_tA|8zX2e=k+cy%wt_F2%yM`C|T)dD0H{r2XMe+QGiGL&c#_4v}`aC+%PC zq#X{^j?sqn>d4w?aWo$5N%@U1WuiFRlQOe9wzjLd%Tn%hZG9*14|US+a%n5^<#8{& zk|^%>5~)~mqIi$R@-e$sk9QJkoaRCe=x+@9|tjh<$`fm*`L7xz@|t;D^-8|0`j zRT9g4Z{6n&ZO6;|Dig$9RdxYmlD*JhU zfahs%FVB1JeSznL-hDjZXU`wt`BCo>&xh=JlIO>~8J=e<50d{Oo)3GE^Zd9yKkR+b zJMvbn_=xv}_aW{FDti{<-iN&>--;Kfy#Lty9&d!uwD*+vy}Ui>J?(vj`=j17-bc9~ z@{-=OUy6Gl^G4rF6dwzpp7X|dnz3;@$~YzbFNSZP_m1)Aa4qK@Clo6l4&zUFyNG{0 zd^+ik^Yp>+>EqsRo{o4gc$4IK!n@_2@?NA(AM#ROqH=_5Y9Z~txyrUy|Q5{64yr;`;1L z{GDWdj?l;WJ-3nxpOot8N~ZX{x9z>^?VEPD6w=A`#Y z?^DEm+oH1`+0l6RT=DeuePoHtL37rmeIJg-9NC2yhfqPMsh_m&ot)p+rAB}Z?5 zm$)i%%L~cMX>aA3SmmX~n73+AYdj5-=G&yHk*033>%7FXUhA*FC~hX=u67~Iq$RH z&BcVJT3$$1E?IvDdGj~CAM$=Ud{ehKQ7?Ye`=j2Egl~L%qn>=u`#g2N=KX2!ZSMoL zu4qvA4)dS(KUBH@)+fC$Y{%oVO8VBPydU-c*mk1$y7$K`uP=YP6!ZQB_Y(Ina=*;| z$Gk64R=M^N>pksXx=ZdKcd5Le_5P&yAT`c;?|OgAdzjF?_a*NqD8U0RD*P6nk9moO zg!hx)L%dz|66a&nKiB-Ri;e1PwQ;?$uvwdLRO_{%uu%64^Y!)X)!JgAT=NQLe}1WY zMNbRW)kS zd6L!rl>!yjiS-L>l}6bsH_C;2t?+Vrp5neK5;A+?AqNw&@6spfHw{y{h3$4|?iVFpe za-*Hn+jd&lBQ9FqY^T=hS1Rp{zh+PA6TV;f+hga~EA!Rz>PhNwF#{*ARpwoAXsx_b zDY+4>w0F~!=%K_2td$!<`(D4YSPdE#f5)5leVetry&6|Ro3-`w{7R>sJ)OjTFWP&1 zis^qd5VBoPUT)BwTEGA-)vwmt>8nfC`K9(QRmzLCYOTCl3aZUYd-!~L ztFO>1|y`k#L}r4*a!5`R?p1ryD9$zWcMd^d5}vxTPk_=`BJId zNf&xpDGFRp@cXxI>Nt6ut=^_Kd|TO#I%~5~F052(bA6#uU$6MC(NmR~#hC~LOw&Im zzfcYG1^#OFMj_Z-U$6TOx~?7;0tf!qy@JbIE@N%-1(pJ!|h=rBGo(ZqnlK&=!?-`rp1S?SXTZvS*9F`EXy01O-B% zmBM_vrtzaaK54&0Tc&8onQmKrJ^x{Wv^{*z@QQ!kHR_eVM$rNx9q@N|-mg|0O9rhS zgl|)>!E}g1Bp}RJg$^u~tE<6x=*2XxKG)L=J^!J5v8(iPhHi8HOzmVjXdD9}H#ftc zlp#fh0Gw4`Edb36<<-?W5Tc-RGqARnui8jYO&`AMgBhl#twSOPjw0F8U7*~@gz0-o zm%64hSs_7v#&Ug!jvl0Auk>_O&+|zx(O-sugrsBqf}iKooM^>v#kONx$yVI%DMX5c zsaPY9Q1fg&wv~>@nnR65D}5vWX8hIIhY^~#(r=_M#UjzAk-U{^C0nUhVmoPK#szYx z$^Dfu_mi#Ia;B9oWm|E(=UVCIfyTgcp5Ne7VkP6h6O~^hofm&IaeF-uS2ve5?hH1Q zzqwlW-BO>g*BX^tLqxnozUQuoL%&pATzU+QVnnVsUvUGkQP${BJuzJft_SnXSYc|d zJb&i=bU4VVnG5GHo}JFLQwxDV&(#ZHAQo23i$Ob8tu1)%bbYhIElJKEY$Yt* z-dz%usQF!f;*-1x_Hl`&67gJoC_Wb7mq^6Nx###FkLMHq)4ZJ*k%|6t1Uis#9QxRS zghU7l$sLf83LzoY0|}`&QXNRx(?~W_x6;4?^Xw&VB(~B{JZ)rwhFU0cCb!ZKavHhi z0WY-@^WSRZnf0{Ndzr0FbAnO^fv7|aXxL6|Whv!{fhkHs+ji7{`Xpl^lwtGmodS1oSJsGl3u2fTAtYE9>#WZ zb|60N=f=%Tu~s%r_vAbAjpt}%_IqMmnT?wUp}FRd8-yAQx!~8=zyU(C4qBlH>yNEg zSD?V27IhgUET%I8R)fu*09%MS$*Ch9SamRZVW}Dvf+Zs_SB;CU6;6xUEIj+s!jYLL zXP$V1>Q}Fa5DjDc8F8nv+-igpQuh3uFZSr<^gaHg-2Fqk2+-Tfweq!gq7M7DV9aPX zXc)KUKW1-PIPEM+i~&o+jQK(@{){e%b$MKu4{|By4C>Dud#OEEx_JIX>DbxQ`4h9p zPo6q`qL|^``LoB`>D8c8S!w6apE&VS>Da|{(>eb`D&WJqe2*?q>GHi?iUY7#^D9T*kZ0B^t&$`2&>{8||!?Y$CoVJ`&F-^Q@H=YiA-po?z`HhEgeA zHy!cMfy3UhFq5ORqy5f)9gb5Yaa-bMS``ECQ-19R6Km9p=b zulLS&I|JTbY%CRr)v{8jfV@y;$x10E)~>YUwPG?@yRviA?Wi&`!xwnX=sS!OjIOl}KrtaC4u+VEx#w%r+@*Wm@s=_%;;$e9Yl&{{@HnUqk3W4;+WNljMG* zIcB+Ytr)p_^R#y4Q5^%8Hs6X-e%!)QjB1RpNFqwjB6&lAg|1Gzpay++Rju1dnoa+vt8Med-*@}E^3)a zm|l!7)K^#QSEI6m4y8aI4YzJ(;58;f{`Fi0gBu5d+RUwNE3=&2j{9#m23qMxei>D_@59Ru)!>e| z(v4vc+`cEKdKx4CL3oV>JjX$Djcz434uU^^xiQw_z5mON{HAOs4s_ckognwq(JH+DMDHRwrCpSg6idB>`M5UoW7E z3#xOgP#|NcPA#C}>jNG%2u^!YX&6ycsYI0#1lH#2tJV2}K=cq1waQg1BLv~X)hc2F zLi0R$SXu`m6fkl`Rwe1FQCjzfYJ-+QK?Cr6*p%i2-}eE3%j$H2ojMug!u?SwzqPF$Uve!$R$UjX0{P)u{z9;nnd*Q7MzN4!H@LI5yRrBmlmo;rD^E#6Ip zdB+m9W$8=(f&S~&Q?tjW}(@js=@0v9JfImKSQ>R(n=0xa8Q z2Om;WyGSbXg#vzuU!Zzo*?fE~k%EUyAPbEoGRYyhyCMFCdG{ptB{IAjiSL(uWZ}FE zC&!SL?oaGb^r06q0+RR)z046{AwMM)!$N)vGL!%fLw*RSgl<3zM~F@H%Oqd|w^AF& zMfhq%jVy6F7YE}&ei(;TE8ZBmg#ffXxJ_Oxh$3Uj<~I!VHDPd70FlWOUHJcQfcuaD zT2lsW`xPm_-9ixHE*KO_I4}U`*;u>F)Nt8eU1pIH0z#ugW(oz?(&g3pC0Zr;REgy) z=qJjoHY>*I+)hgbnPw%hs6yV+tD~inu)`7wn+}g>CCyF`8K^nZB_iR^>vEBcL;{iF zO+^T@r3a>VBW~?1u>JCx<0t%8-avc$VW>EutR)!}ih0XrVZWiWc7TuM;QJvQ!3cp^ zZf{%wlt~Q18MOyi(N0|xd(a0J68}3y=j%K)#~Uz)kd}lO{~TlnLh>AhB!TD)Au*A4 z5>XWLvz+3W=9gJWu4MgZ-UM;K7W*>f;ykmz)gw~3k|I%%r$;C|OW6q5l%Cwm@SJPK zc}9F727&n1*v6%>zF!OLD}?n8^wpW7&R+PFBt4quAx-%02ZM$ zM7>63t)OA3&Y`~y0n)(>lB|JCIJ45up1D%-jZa76$@mE~cJub66GZJm&xZO?p#_y5 z0KRI*8&Gcq!aZg96^4IyI`1IpIu8y3O7Qfb;8K*%#cMTG2G;J%GMMC4;Ih3DywZe(N2|p6hxVotGe%Kf|UoK9q~M+4U)h(CUwL5!#R>*rfl=XJZTSAztRK+*YbKWKU>7 z^aRf&nE)QepEDg_(#w4gq*fb)_ZhgM#h@7UI>tSv#XTYUro24w0N!QzsO9`ZLOjIh z;Aa|x;>;`$Pt84~9JG{~C@$pAhFDa;-ph?NhLN9#;GA$rXznH7a9G1gPtI3Z9;3z) zoo0b#so_a)gavjG{%RP`3|@%*BdzT6SYwxaHhs{DxU-FC_>F|iCcc$@BOB?xOx7DM z{{sfr){RmBNDt|F5Q`UQfF5$K3VVWLSXli~VHIUwp*%ld3E&f|Yk<7Pfa9w0G|md* z;t{_M$C{qdk%JwpuW%+*{~R(QU+51701K(EXX(k+gvn@KTWQ@zIVtlI=)S`~IUA~2 znNYtqN)N)2DOacj6rpz4O#zF7T?24uq+uqZN}~sDIJ)P?&6vP`+9x{r2h%;vKFbPB z)BtKFsB+#_V7$(wlw9T(I0 z?2MA!CZDOU-Tcg?*>Rw=up&IC>3*uWlNvB1=CG0m-XN*G=>3hQbEL#zQ>FOBxT6 zw%E{EYF|8+7)cLh#QBafKI8GkdzsV-1PBf1V1^hGq;W{nesrCEghHS!Zub~JK&@)NY~SVs>g)S(_Zu6Am2e!U>B z7H)HLdZuu$(%AH!WG6IwAn3JWhxp(E$e`DnxCqCYBFQR>)`q@of2|9^l1u|+#zAoR2O z?&kdE$Sa2l1UXef<7Oi!Y^V}VcH!)5g(1OOQZafFz3SLfZHN(=0YAtbb~clpA;tdz z!j)-$5x)_e^BFbUnexftkgPqAHy7L#&F9|cI6E^M+ z-Vp8%6mEj(+b2VJEJn4A|5O>)rGjmhDZuQlQI-o5jD~aBfvEdHC7OtESkFR&=N=0h*WobW1T2xwk<}x~(<(u@s9c+0-2`QrAku+W^&-VjjW;?t zMPLyH{mmFm-5!|N#4RaF!C$T9HbzMdCpl+|iD+c1opIbyJG)TB1q#<9*?egVs@+Nh zrK-uJEedWAyZ(9RBNP;~VUtl#=Azbj$rM(u9Ue@7K~v#qmTV3a@#gf76g}jA#~Ujb zqWGt1hyNvAY?}Wgg^UQ?Pv{p^fyN`29!k$!O?u#Of?r2eeTq4UKaQ;o`1_@NkRu+ogwg#8e ztsKPuQyVXmPny!W;vf)1;d3H<9&Y9Rw_1Z}Ooz5cn!nK+yp`LIZH=}@{a+zv8hdcU z{}s{>Na8@27;B9=KLN#iX{CfmN5OJysD*R!)-EKJf6CKvYgcP{o0c|4S|hFDR&ppt zex!)n^VWjV)~@aNJMjR!8~M@lZoEj{W83t=f26U?<&ph{9%nz7As;Fk#Y!bpJJ?Bk z?hi_>~^^j*Zube<&>JU}JARLy8ZzrS z-l#Qul;`ecOH0L3$iR|=#;Tmq0@&kJ=d$9^=ikz$=0 zr2YW!#6QnG-i}{$Q5G-YZ4W%dQo~nj{n@`9fp7+;cJqFds)by-E2EQC4w$A{DAiYd zLH$XGF5~TCXk<|8yrW30&sVF+Ex1Td-{=205sv@N$s55*_RpEu(NOs zDiB0>j3HF#OUY!8fBv6P=rg*QK|NDmN41LI2Lh1e4=37L8MTq!x}+VpHdO0TqPa=7 zhlPesy(K4=_TCVGc;(t6`oG1F*~H&gU4N1bjna4o#UYSv2@XuvTrcK2p)4V>7sV{B znFTV$V7ByaOs-fNQZC|pD~r7UjxIK8t=7J4L<`jP>L3N63|n`@cvX z^P&mSU!?vpuJ$;wjo2;Fo;cNQ5JW@zTNdTpBbZ!Ltt?tu_H{%?clcW~PJ#;M;)K2p zRYgvOv0Q;wK8G`(A0WG~UN=(M%Y~XhvWd!mm#gh%T!97Wxg1i;KEQ>Wokx0u^+YU3 z{`F-hHU^O*MG>7tlI$R|N{WG&NL{Wug|2BCP`UxIvWs-8LLDF*@^z<{>k+X#B~As? zh59_*f>*5-P6$dwx*c!oxUMn=5>>Y#FM$9@?XUwoCG`kSoyblhXmXuWuWM$3FED=J zD1XRCYt2)1u(@h>9*Vg=eV+)R3?D(5w?Z(yblH4q4kGo18mwnyBb;#tCWc|f{U)lz zO6cg!Ltb+x(m^O^CnLF3TG&Y(^eWPbTLHGrIJ(6c4RW<+ zrF4eBTL=u8>I6wdozcoKtowCokiuzrt-fh&8fev0cQhw=Lkn(x7zoXebRyU5o7RG> z@);pMpxwf(lrv7o0j+B=GKE^3xrDmui6uyog@ zz8P1~I+W}#6Ym-s8Dk|SSlKi|xm}O6RIT+Ts2M7dqBu3H+baQx=V}{x(O{LMxK0Vak$|@!)!ByN(=8d8G*CO!Z0b`GhK%((EjVEFWh;!oi+vC#1 zF(2s7BJxqtIswG(RK|Lj@OTHPojZJJr}D#PB={%r_CW) z-;TS{i;-bKiup@sM|n3n8}f&_uIcdn@l)qarRRT@D%C+xc`?Z>F(oj znzzlzt?zIrjDp#jms8vE^%?7VVmZSoD4cC1mf5Kpj)8Wgp1gewrW3O#BO95xx1NDG zJ^NC3ApHMSFL(CW3BnD%>YscZ0Xn@E-F&jQyJFVV-ITifpOd+-yFg6W$Lt^v&5`c3 zhn#@;DV*eIuqOqX z={Ip1>UuR{10&vzz&xSpxC`&7OZ_{cy7-})?$c99t13R!YI%e@o9I)4YR7jba8;HY zAvWWP??jY4h$xq&`xvYA?=-I%+;FzrMwm09Jn3AiTS+t?U&I|TwVc7&mX+hP|4WFS zDT&wql?FSSozr&hP+00u_mrBEA+B340_nNXMO#9!c_nO|L(q)jmYsHj=*GFQoPXR? z4sZKQK|po+hSXCNP^Vlz#O^{*PTu$Cl=vz8Couc1hmX0vD#G6d2Wr|^QSPv8=B+b5 z>?Y}#7-au1=%RJ%kRO8Le982ECfI4&IUz=q*@fTDT2NkKPu*rsaNJJ&Yph-ns4}&) zxN+MayL^Z}OCUo-!U8)S|2J1{i`Y&8{8iqb5>Px&AZ8dqN>`!BoXIOlJ;*sDD1=xn zI35c?_nAyH7Wb9A&nZ=E94T)Nj%Fyg4~~++Q4%;}3r7zeJr~Z@90~z#=9onEPnX!P zAxHNz>N|tU7U+Sp=*Sy}=nzP+gI2K}L57%DUN9y>Eo_yKmJ-6r74AQDyYE>L6 zwy|U_xwpS18%yD8N@!bz{%uz8?JsX*N%?I(r6W2RZ)bq+(t_vz3g9%o_l~RQFt2P0 z`F~jXCe~7`N$c`EM|Bz4{%mvWi)w&|_yb4Nq715sKHLERRrt0Dh7hvTvC{lxN*pekkCT4A0O;S@Rs-tZ+9Y;ze?OM2%+#JfAd~fa#u|qHgNW~x|CihGY~`g<_;e(|Gy^k zPIdkHZe0#t?{Qf9&y&8rt0WEXg4Yq61M~20r?s;tFuV?X5_pw)IsY1hKBRgKr3+R2 ze^ZyQ>0$`?6AB4Y8)EZ+O(A2Z)EndCjW3x_JI*MyiqK*d$Y6U2U_cxnMYsS0RE`+V)$^UJPPPB;DeVzJjL&ZWO-1;!e8*HzfKa-YUs@w8_ z5p4n;I&WmC>XsVGFHAtD{3yfKi*a?vMWO86>Csd{+?~E$NG94kDHkajJ!Z^n1C(Is zBB-w6mTWq6VXup|>b1h;+LcKZM7AgYHm?Ke&O7BFaE0_}g1Sgv#r3>!Sgn)ORPY^@ zu$tK|)#>D%+9|?m>Y;5TsAAr>qN6^lKm9eCGRk({Nr@Kf@k11gBIoW+>{t1lk_sGY zh4i)#MuEdFseHzL8@8eRFsYAOyPWw z=ezX>&ns{o{V)wrWBQ1GJUuN1_1%*;U2m7>0a2RQ3t?aIu&HZ5NjJD`kpXSPvy zagE(HH&teP2XBJ2ND%N&a2bO7Z1bVxJtv&l`Z(}#a3ES6p^d9K6KW7bbkbd{mROry z8Qq|=x=>KW%mwiK&kMCn5jwrAOA(y^&FjQM37qehNkhWz{?F*LOP4OK?An1P*Wf1Z z76#z#Y``LikkRhG1yx(re%aL$_B{X3skj}&%qVfcBhvCDf!My3^lO+!Qy4&{YjdKE zGn1O`O~zCl&LN~+^N`uGe$AA~Ws=`9eu2nZ7t3!&VMru4eYPFyoivca5pm@Tv-KT1 z(DUZB(^J_SvkXQdT>cWO!^8%^leG$`k9=BJ&;UbDe?CkvCBkloO8_0w% z=TB))+|Sp$+Zch4R(Y1U4XEczE*L|S=kD7kUF37y$+N{)I-TWb$6h?;s3Y2ocu1d+ z-f)TXgpRPCC09G%i1`I# zl6VXiyc98b3;9QgNfUE~6DD%lUJ{P#pghX8*tWHWFOvUNdmfNiQt(y0hy*ZSX=QKaJ$Wj@ z^t4g|X<)KQ!IMkzHA{gK45n!4CQ9HRN;ZaX(uN<3eKz*l_-7NJO>$Tq2PWc?H{4>M zWpF>YW(2TM zE=+|!{<3ebtpkD(UG{6iFNwUly#>;?3MCuCU+7Di_r8Fht_IHT^|CVqWpF&5*4!Tbs=7i(5+j5rf(gOzKgT4}xH zIc)0%vT#7lI>x@vm_^C7=;?tClEMcHj}{7(Go+)-onc>J-E{1PYRBovudj1H1ImSH zEVV(zJQHoJ$kgP_qK0g8X0E9Lq_dMV3?j!jSQ{fWq|(BMY1#|{S%O*rzhkZV-{4YA zEH;r1H5Kh7#kCXHn$2T#Y+|*oO=c4APN~(^+bHKW>$cB!4&QpZ@O_VO`9N5#9iRDD zO1=Hops`!x86OUs69#&E(13*#)Q7v2Ss23{IVGRoL^x&zP22=Mmtr>|Kc)E1q{U6$ zMBpeTZX!;U2z8w~lVHqZnp2oKfF}uVX{XtivR0Xn7qiqW3jjx+{f?TMwh88(9qniF zf0rnSpdQxCp%RLl68VLJ>%vct+(=maJ<6S9sdPpE-n`A!)z-rS=As{? z*y&v;K8vSMJzwJRpR;GqT{v+Z+r#t4BR$WfrPIZikM>05U(tTE6S6$`RkckW(cE^q zl6IEGsBRhyVh0G-{V%IWLZ3z@Oe1R&emjZ#$@D14ZfF(TK$#=C7PL+mbl9Msg~^&j zX-nDu^^(uAegB)v`d`%o_KPeoR{Y{9Ey2CZs&qd(j?u+M4upXFt2OasqBEYVLJci+n-a}Y-O0IoXt2z^2_7wQzo z2Qn}_XcAz1{BKjjywn2GpQf~Z0};BmOoat>$HXNb3QxkqdC}bUp#Q(ol=>Mb3ztZJfy8LThU_My6w8y+O443@B#1|9I1*hW^icw|7909!# zx(A#E&S!Q9e;2Oeu#exbRjdZaGC4$%p4G||>lok8R8pvwy|JuVC%$MsPw{dctn`jzG0DK{W)vmu~D5}#1M~Kz6ErV6CO6~{PRPXzrGdH7 zg-(!uv4^9uV&HgjrC@Y zNqfR#_r(?xUoby#h@j*GL-uR}{0W6;xaeF7cl_f{2_gTC+>!lMZ(vLswH}Xj9rM zG3AB|;bC2E_{X6F>@wHz0DhUdTD*PtkChU_nQ@*7AhHdGPNESmUoT5IksD>CLnDDx z07i{-Xu1bhBf%kRhZ7zI%E%__x*HSc(HT_~tp{sY=-PV+Ktt&nS-xDov(5L57Cnq+ z${p#&&`H9GTG#wQ&mhz)70=pFL&|7R-CihL8O=v~(uHePovsv~E=!3^%1+yPJ7b$KftS8!KrB8lJ}vr_&P>HwxqB!<2-JD=YgugL;UZ7DZEaXWWQR*T+rlEk{Yf~L6t;?l zxG6m5I+k?~Z#zpKJU&b?*MUYk|I_lRV-Fer|6b}#i2i7b;Lq+u@JCZLiKZxz9p#Im z9c9qN9-{^BCEiSgI-@}^L+T+!_3V8h_}9n4jKf>no&+cMOl;$4(I(|s+J6V`Fz*dK zgGzvV{uwOxZ2WBCj9|oK z_22`@9%myj&J>_@k|agSLiErpw%!R#C~IfUA1ZL*N5FXs_ z=m;9;h&D!@^6T}6DJ*u{YI>2HwM!|x7LkxEw9bSrW{&|*#a9`H>+77(u&P}jORz+^ z^D{07x;4#J=rZEGG%hCg_Uk5SyBllrc1DG8Xx?%bd#W*YXgFLdMuz}7+q~M*Q$&Qt zG`f(?HPi>_br!ICF|M>TRO3W8`KT(L2@&o@2z#iOb-Q8On2y579hDF&bZl56OdMKv zqGGT2^Vxl*rZe{dQ#3<&(ESMU8I55q*x?e5BMeGcfzaoSZS5h4gRr}3bR5cV?hYLS zdQZfkZH~|5WU;7WcC(2s03NTyB{$!m)E(e!Ouq>U-xSXC2Zhx-;&StzPN{Yx zw7^6K4|Og0Cd#)n5S#g{s4Tq7+~%S)Fq?{;6OR~IA4_V?VNBDh{-0DeJ?2e~(4)XYr z)GVzeyNDl`9v@CPr{@;LGjc81cpRq)anuV92)XI$<*Jo#K6-4a!fC*`I>Dwg4BB+# zzGM;dj+iU#6BXDFZJ?VUfMJ6gMW*qd;-WMzmi9#JUce%sl&B9(i zsFAaQoTmH!xE|Tbi>AX^Ek_FjUo4A%FPGwO+a(6Rk*X|uEhf$8o5R1aH8|KWdc|4H z!Qu`^sm(#R>UcEk&i))csJYUl#ggo?v<0UnYG=K^C;gZ|Mg4u+Fo`e%B%3~|UpY1@ z5@VP~CvwO~*o9iD1IqY;Vk*Pb$AD27b4Z;Hu zquoZ`7q%wn(T7%o^}6#)2+5E`Wl?1jquZ%4VwmqP%!G{&Nfg42AfS`YXe=bUqU}ym z8u3Feo1-m=Kh*{&g&>5R+|=>h>xyLBtcL4BC<%mHIt%C6m1%lj>mLqrZhvRkn?9*Z zqZEo&;V4Ct1k}D4W&MXNSGhrpJ{fbnSOw`7l-jZig%@oEiFFr{zgLeB0j%!wutN87 z`LN($2Ey1bLH$s_e;AqWD458kn`j<9XC5Sui_k}HLJ)RFF~P0F2>$h%S#%n<=K)D9D2`b8r}bqHSMp{7%6Wo9??yB#PQOoBf-p+QW&8JrW%51yz6+A(IFs~U6L z_FmY%%hJ?c4xJx_nK~|QPQmyEsyE#tLo9>8i|rpryb8fcR3*mQaiwR}8=?3Zes@E0 zf0}{p+v6eL@(iPM2VR1G8)^<`f~s5~j<^=I2|sSkAZN3+!LGHK?~gnfN@KdX7@B@ph<%FEJP@eQVg|q*Q$r zAVVG520I1tHHNUT$tZVgtb4e+q$nxfbfDYD5tFs}poKG@+IfiC=A##lc$ma=S$ac< z$XNPrDbAaGaoLuhk(b%#grhIc$x4!zvVALlxS5!l@s}7J97||ytf&)`d9T<06!AX7 zsq@Ax=47$5J$i@r;(ySkJC|}jX{UpAKAB~6;s1TTKdZ~SE>gF$uTNRqgN89&Gp$<3 zr5ayhYJm)FHFUF`(ply0_|AjFv0R1gHEild0mDIxj$we&#uaVj*D3j&HpMyDcq+jA z$w5=`I%ypfjLrb+0~pHa?*F>PLj*8PQ3x{T>W;A8N^qE1-VYr!u+?|K$O+rz0EFCH zxx*Bunn%Maq@RcRVNbOi22i_SYjUF8cQvtxdndL>;SASsX9aY|3}ZGY#oUFm?~Hji z)mkJ)r-xy$|LQ8|&DcyI5(t<%P4j|YX$O|;P6w~m?5mm%Q_Dcz6f=;OH9itHuGz?a4nP02Jbl{)EkP{HzQA6#+Cd;(FvYi&EZpo|-pq z7!tN}3f=*Zu4iXY3vVC;(TC6nr2x=Rh5Dehm%tKe&LsNaNaW?}B}vaNJ+wRVg#`Qb z*c)^oTBFZ{3TiJjIBA02Ti{D;#g`f!g5!37h}Ctqxe_=@*y?tPqtPK{RWvhQxx`AkYR3h1Bo~PyM(R76BX%%6^rI%t8AG#B z$3X{ucA@Jopy+5DM1jBA=KC&&`U}_Ih_N|<@5TXtpVpNuG|l^?WKnp_{)V&r0sX-W&890-1U9gS;b~nc&taxE*m7s4 zirWjpLi6nM(i3C;1qIP3@Z8oLJO7}&55I80M(4nx!U3%>bHFlCR9Oc!T)cAM-IGer zmh>9XW~aYc)lUrb;gw76EXn`Yi_=Kb4?5jSU z##WkBVX&b!Yc_0Xuwp|2KWj{DgRw?or9|u&WP;l%bzmnTJxOJMOMsLoeJtZPq>uMY z1e(9j917r~IqYg|_DY+fhruCG9+|;;?*BJHzgO zgn^9C!}};<{~2BQK-_I>S3~}r8gdgBGO`c#QC%&W4&(5XJcLwtZ%Fsp*UQJlWE4d< zXrVX?-_Ll-tz>Nqy#r?|D9Z z^i6@0k$|i|)xh_PK>FG%=1{+UN22h%iEm2w`KI(!w9$%57y26827)%#%M`%CP2#LX&B!Er6q0w zz=dk0%E@Fb_VMt;;pCXQU zGOrk8N4Ki?kJ8CqG<*ySJ4X)kh1Vd;K5bw?k;mgm_y!($T^~lla z%p!;1w7aK0+*ffsJ6~VjT+>&oIXR>fOs9&uXefP7BZ~Pialz+^Rk;((spcHiFnEYS zY(o29^|{XQ&If69>c9kd;X2{IJ`D;IUYB!ugop0to%%y?G05GJ!-T?azw35}K+?83p(VIXod32iYMZ+}Oo;Q1Tta7j_+GW%NIj<|487;i($_wEKSUns z1;J0T;H$iKjl2me^!GQCICyIx={}ti?}5r1shgZtfTj-GZxp&gdXALk%mlj9k&YX7 z9u0d>k;#RUv4w$9`IrRgl&RN0`35^kIT5r}I>*Iw>IeHUk}}4}O>xH91&2kB&nWlM9OP|@mYq*tN$x_NIY%#gl`G&MIq&u{gw{&|ku;m%iLHH<0 ziGBRyjn-gSJ%iuw8~k3;xJ?h+Iqn~a!@vM;$Q1024+xve9m7&CoIQHs1tb-HyWtQ7 zp>vYEm?9@bL>NgTr6CU?H-~=gOn8iIicvwG4I+}0g%piAgiMK*BhfmR&p^4cP#gSt8a7>9Xx;Hh1MA8z1)QM>MrDV9>) z|G#vRwjZaFS5%zgWC_8=0jO%po%1075IdB731t!A>t%7s&9%a(+LEZzidlWX(gMJ| z-uAd{+gR8z$o=A34Z{Tjv0>@&VY>0?a1Pi~EsrOL(u%{|0}l`B{)gC#p(ngRl6xRi zBWXT(l$c0mh?i%Gj_*}|xpQMPqoHUyPEIFI&Y~9j22U1cm)Ti9dfM~I0bsT?rn9rN zJ<+6!UL-6mTih`Uo?h|~s6d-Kjj^3_=YNq<8)tk@1~n6YV4vVLQ)B`wC!LAx{@k zSo;cueTKw+7C@BOoo#);LcgfX2p4^}gioV6#Aj#Zb&vIMhklp^>8~jLuPOa#v_)Lz zK%Ln1ORf~R1B~ytc>YZ#{%>>{<5JvHzEZDxosWN(&^TdC4eT5Ye^kk|U)RZq|4^ZC z>tbI0<`yakY+q>4moun&9r+UNoKaX-USB3wXZez4$yqrbROpB<(jfYOnoB!x%%gLP zl@`M{^@V9JOot(Tg)eE-e?S*4^L9$Kqn#4n@U<#0qc$4{Z(WP61BcOhMSe|i^B{Hs)c zEXjW=yry##x#xy<=ZACSxnwRm^5K!)9G$Y4&~qc>BfE0LvG?*v-PViz%t$IXkRQlp za;e+{xetxoC(3kcWB&IO>HM?o9?uLtl^e(n<%U4+`Xg_igDvy#rBd1r$AR1&hZTm{ z$YC+bTt0tKE*a)fo~LqyxpAJ~%kQD4Ol~qaiYfWq8T{+96LP%w&U-GKpOS4+8$kF^ T;r?vgCNC+MA0KkB)BrLkf_JW6puEa5^W0Pk<>|ETV5@;2fzZ0 z-9^uUBvuQ@Im(uNiCuEyToRY#0F~60b+IqGt33S2#pSdAO3F!GXJ4vra!L7;RLZ)# z${$yisubhc`Tf40UF?F8%c%poy*)ks{QB$f-TU&$h-cyNo!5W;Q?IRB)_>ze|6dLd zAHgU5fo)mJDp|@_PTelq^6iwIc3yI+lKYC)IP6+MdfC&bZHxcpjaza*ZZ(`&t#&TR z*cNK}sFg*n`ChG5J-0Gc!dp`_aF#rLh8LVtUOAN!d`9sZ3&sOSxyrelYJFMq>AQ}~ zEW4#W!35r9?>eQuXtz%}D)(9Ekfnx}ozerr1Nytc{=mL#mkuaT4ZmrX4ywEw!S^9G zs>bmBpc+?u@codQPE~qIrjqk@*QO)4{gX#(OB)+HAN%a)Ir`6Ny8GIMjv+7syJ)@peAHw$&>XdpO z-%qO3>R0i7GB|mcdvHd57*9_HPpgkCJMY-~`@vIE?%c2n=PGYu`_HyoK|}c~O|@1J z{4l8K>Z0GOM2n$6-_(AzSkr2{RngHpN~_D2g&_2!rXQ|{Mb;{M-s6A8Kksq>=3*`E zP64^fTGU*rM73(AUSIcXE3KxE0zh_6*BT3ctx=0=m3pm>8qG%0fBdgL1MhOf$I9!q zK>N1>9irdRZ_fMI)}zH{!#}as;+mfIM4*UitgFXZF)#5ym zt!cm7R6)`A&jr;A2QcN^!17FQQ{1!A$NxstuQwYDSW_dY24Psy>;8$kwMaUWDf_C4 z?W{$97}e@^?{-r!hXrh@?8j{s`4xj6gNrfffpv0<_hSy`c(viZ+^F4|GJOMkLjQIx zS~O^*gZbJWzXGfy76o^LYPn^~PSoaoRhyp&3>r~^RXj6+(686#W?Hfxr;{BzGb6L= zVPyql1e~&|Y+g!>qIWs+EA4@SYt(DYL4Cb|3Eaf&br7!ABOVA<(?KRJ#=2bkKrAKbyDr~HZz5)c~9 z?4Db^0sI9fwFa@22aE@vdrOea*A~{aoG^dBRu4j8#igs){R}-7}#m=1lHav?rhVy z;Q)KGxydkCV+3L%V|g;x8yIFPTm*bJ?!&9W{r0@G?*|oGxWLE1z1YN=Y*bbPe-Ri+ z{32#}rxUz6Q*1?x&jTAmLN@}a05cqQOc3O(*#JoTVRoX~2>cdMtX^vb1rHFKle&Yu z2vnGDHl}5-cVL2lqN%+GUiS5h6D7n22Z-Yi_VqmJMYl4jE~b}M@p}8b(nNdEI-Hb7 zRcKMY(pZ)`qB;m04IYSWOs54#6LS9;XNt=-=)?{rBQ3Gf#Xm* zA%gi8EN-P0aiuF2MQI@smi$V>mOT$10Q6vAs9*{ zqG-3!033PD-=p3!Td?EQjUbA%E0sGTrdrA%1O8A?@iqQjE8f#uZ>^UT8K7Ki%s1b2 z@uuW1Rc=+PQY%RuX<%6|;5)p8B(j$5C8uM3(b}-1lzzMeMP}Ivk9O=$C>C2bOFH&E zgk#p+On2-pdjlo%l;IQK6;iYDNV#0CSHh4RQ!dA2<#KDiub_~Pon{!jd>y+>%~~V& z%C)e(B;rWy3F!+-P~vQ5PI@Wj0E(4rB@7BqoMyu?PJzh0Yw2-J{oY4r79k$a)avV% znT1+3vlLVs)p~PHP2UdYxKlH8_2$A1B$-=%9Q3K;b3(<6t@Sv!Qdthz@uvt6(fsVZ zz2D9u)e|VY4|r)5o@eFjNCXJZmUY2;?c9b1@Ewlajuk-*(_WP6K;J{|#Htr%k#|(; zZi=8&spXtLgVNm6(56QacC7O7s;5!_q}zTLyN$zDPtbMJFPAB8l*`0zU4#51SWR4? z3!8O53QWCnx!wfIYXCpjZ8KZQ$0@J|ppR%XVVt>Dsjmg09>)A*uNI0J0L~SAFG-D? z>#ZQpf?spAIJ*!;%xLPpdWgvglYL0ADfUWi&&y_*WDkntVa%&L{yYl8Q6!c#Y9CBF zfNRcnY<&bJ1F$8&@*}XlhRlKmh+21vmOxNIcxuCmQXS{6{YhuT*+_L#9eX*e$2-=h z+X1557Em_bNinyIQnrG=ZGYA|jW>X-)Bc!$Jy>bp3ZON$>d>SBIh;Ali2l58t{4^y zWB~M`BN(9#2tuX}nzI6~;rC!ZTgU*gL8KqRTn%7|FLA~Q=Wz-|qu|E&m3Vl$(Y)O# z3;OCY*2w~giPbv+H>zcNn4MG(Q8#3#R@${Qw&xOd9w0bs>tiS#fFBQb1|NZ62^q09 zSS$7hb>7q_j`&?*=#snT0HWzArCi`<5!jgi6~Z{Pl--c9^g+>T zL3aHY)@rKhpPDXc*jFqNzdSIo-0iwOu|3`!8`E!`Dn7MQ8b^(&30W3OM76orh}ya7 z*18Jj))wCTIsRq~!=+KmuWQig!Xi_B9G%A*()o(n!Z@3dPyHZX^`Se7g6tUChW7DP za7=SM+_{0n*mRj7R`)h)hIu4bD({SA-*Wb0TTkJ6VBbboLD5w}Te?h}`xE$wzR3OW4&OtKH_Nf_dEEyR+AV(Ld&FhnvUtgeuXZ6$cG zA7e{W?ml8M3U*b)2IJU~Z+#hW4bD5jcuRgv`5)K4W$;MPi}s#UYF8`S?W@wdVh@aa0nBzeGApYlSr&o4iq%wxS*X5KBK~g zNKG9%nGT*u?R~(qamTY={L>#st178#_m9-IhizZMgNRBAwr#))yx|D8IT84|oKdUC zrJjqNr4-IEXsT@i|FGB0Z_q}3kodR6v-_z*4D7g@IbuY|1s?hvX<*0@YI@2&fVR3G z4Flgu4^qIwddJbf1*`$h2G*q8H;FZq2~4R$ES_laMGyrN4bXWy@ zrzl`z-vAvKoauEltDnTW1vN@3=w^ky!3Z*`K9b<`QRqUp4zde`jMD+d-q;OcX^L~O zu8O2r0yacp&=O!5GWrx7a_9AFB&FeG`s5|0G!Y=w&-3jL8p0hMi0e*^SIpN!n4v~rd+;YXv4em$uRdZgT~)PlW{e#dD%5oPtA-W%}dr2L??O)oq8 zCmm3J^Szl^;H&ihEz@siDe&s_WFTMU*)%4%r@OP+ABp_e~SYa=HbeCcH`@) z<*5+X68SE!!kygM9?9-pBLmhWH!yM}E*_==hf}&(QS(fzmnN<%d=p_TV0&YfFfvz0c z$jK;s$&1kP$I(7;F6%BJ_Kvgq?^csK9~4J*=d?bdyS>NM#g*mdj7|7QPGcrvzQwI59=SkIt-T7VXwDQ>qg962p=?Y$v+Pr3Wv z$be}!wokT)O^GbHJ#JuBobLj#*0 z81Axzb&Tx*{GVXdkj4PZnEDGWG*~m{tP36ZutNkR0s|7b15vy@hg0k>F1kR3@nhFEC^Uw#Z4&-ONfo z$QGzqXFWB9GwxNUa1hQf2GwP{T;QP5a;SSYO)-Fnm3gt^LpG?^*XR|b-PO2X=GPik z+O+&A2w}>nItRU(;wkKO#t`n$*DDMD32Ce-cqAJyvdOKAE=);pE#0Jd&WADx%Z~Dc z)ipQ+AiD%`gkcQm@X0IK$v8Yr{=q5#LM^Pouxq?FAAVGa(Mo(GOz_jsD~v zv|VQ(G*4hIQ%5hMrvX|=iMFSELeKJ38Vi z8Q^ualHhmGipz?M$&KCUN-L(A*p=Rf#G^nRIFN+Q)Cccy*RTahkIO1PyQ$ zgWfCn4rwkl$is9As`wY7!rZXlwPy?NHs6W8;7$vtjB^zp1pAK*)#W}zOOEzq*1AA^ z7cI?h9|J9C8P|3{Bki_`okmp3p1pSM!r7Z=@7bT$oS^X5_t=l7WxSm!3V+ofWy!~w zTt))Jj}+Ww!OJWdF>@!w&}Al6PvW88&Kbj?$2W4+g;ko@+?#m(;_TUTS1y)&yVb}0 zGQ#^xP?m0$=V&c#uy2>yl5qGk7#z9V5Em`9r;knuiP*afM4lnUPM|AmWYo!JJ#Zsf z7s0uXLp$cTFV-p-oXQ8!g5Bj7>JDseS4I+EbscY$t%Y?_Xh({cTga)YL$FXmauuyq zr4L#9S=eY{3#atifRst=<7wz2My@h#@C=Sr$W|_5qBnu{S8vRm^e?{jDnv~ki6hyN zXD|e4k3oYxs25AZpcDAB@P7@A0EXUZU2qjg^TL%Yh)Ey~Ut!n*fF_5kh;rku?)6rX zqh-PwdWG=zlhJTSfV=pG`XYm1o(U9AsqsmJo6(bu;0hdD+CdpMf!gxylDM5D zP{i0*;6Hj9mCs##;qvU2%jd40z4@Z)0!uReh;v*X5S;=~v2>NhyzDZmgpTM-*dqNB zl2X3E^LzI5dJ?6xFzN~CAulkZpCIcTABoy=I)uGEN{pYStg4HcTY`2!M|pQA+Ks_z z(?1ZIjxmMiCV*~G$DN$5*U|F;TA`Luj1<1ZYe5gG!80xD5#GU`6m|m0@sELy}7?4@foKZd^d14Z;X$O{1kYnx-Rp za&@g1!AJt!n1p>Qn(Xa0_JcqVu|w2xV8?1KkQfuoYJf@w-a#Lh%Lv|of3bO6WEAv} zfc~C+s+~T+qNacCp8d)8#Q8|qr%MQtSqtHcpf$F=N6IchBq}0!;NsOwg#nlV3KrqP zzwmJ+frU^*t0YVsVQeW`JsEYb1ePmsuuD)8vD%^bL2Lw<1}%aCCQv7S4Nvf)4j8t0 zocR%zhqMYFKdX%3MkqPUcr4gL)}Yn6VNjpn)dT~Flh|>~f1P{H-YmQQ$oman?A9I- zN4opJ7mdYdr0h-X<&yojwMA2?Guz(J1M znfRuJ7-EVVI!d|x<}W!#Q+xJ4SW#>eSaD1k^Dx6rI041PkncAvz+DAn{cm8ux{!2@ zK9#0Xtf8Mp``9yz?nNLCmcgmVE~DCZ9x6;QVX7oPaW$pwVYI6@mj+wNySOK9ATX z#?ka!i!h|2EG5)|{x8~JoRfoxbEiMgZhsRAQ0#5yw+A!hBnT979KN&C9+r!b1KD=m zv-KBHw(EiU2wsE)@b-ZzL5IR289~Hs8u6-WIV><6(1wPilucq`b1DyH8wISc;k4th zv|(DuSH9l%%KXN1l|J9frtb=gV`X6j?9Bj7xCaWwTTU4 zgK86sbZucVVn75M7vDR8X$vT-v_y3OnCHPdk570Mi8-c_ysfegZ>UvvU@NrBDTPB* zcDIo(9glXGVz$5knc^IL^~q9=+ZOuyb^#=eu)l(YGZoT;sYcv!rH{0ji~(QN-+{Y= zQeWwzt)Q%+?Vj#1yAuSin20Vb{wh~&ErCICWePq^k_O29uhSDI9^xzT^gsrI7Z}g3Qy*>P+8-y-Nx2J;2MI)qfZ5+mFyy=pPF~)ajf+C>c)$T|Ow3W29G6 z57esk8d`AVJt!2uN8q{Q_vk|Eu8X!~i6}gE17QG@J?@i;zg5JZ!H6+Q z>qNPnaB9d1L%oV|HmTG8@JGeOY+~)e0ueh2tp_GG9^mAi3T_2;c!qe~ldVCY+YbqIaEtC`=P5C8^?VoRID32y`n?int;VIA;!YPsfY|9VZe-FU_=Qt(qatlNF;&w2iYW<{$R_QW5uUJ81bcEaWPt{ zw}-D>K7Voc#>HZE2WE=oVYVxBe%1U9e#rNBHmd(GbLr^PsQ24gX_exR2V5;i3l}9~?mZgC(4dgx>Rv zz5l2B8>lmY_0kB*NAQs@2Bk5Tg4_jK1$oS(JO-|i#Zi1Qr~_fzA5U~OVpCUF^CuVa zvZtRh)Dn`Ee_J!`3ULpb8aAwNILt-X1k&-2Ma7S9Lk{CT4r0v!b?3?C=RD`=B4PXo zm5mpLF|il0CZa~a7|3EFpYq;FgQk`YTbXO(o`NYZ8tA?sJNiq4H_@2JleO>8hd8+u zKJ>7NNe$K(t1eLnOOQ=E&KJ$hyOcXEaEP(P^%l%*)GhQ1lGt6otwQ~~eBMFPNNoQX zC&aP9A03DTFQR#%F{Lgg&Fr9_`s?iJGfddNuTSY+NaZ*2;xE{-Q5W2FE~Qyk#b@BJ zC*qQ(GLR>-%V3IK4a&4K=>JbqW4FQLA)qf89q9kF4P5 zv+isNMXoby6H$g+uv8raheqTM6l~a!qxL8y!d?tkY$h%Xo+CZH2CJN8VyV!wT4C+ zuL)w9Ve`VuVU$4CO8s_a9jD_KqLAsd;4Pq|D|6NGD2aPOyS11FV0U;4VX$&C(0B!= zF{zH;aiy#x@gb1Rwws1)Xeu-`D8^~HYo9tPC}+Y$N=~&EyBr7MA!0~+6`%!|rwJm6 zGgNM?p+xN|vqba8gbbltb9t>54_}dQBR357U;wRbts&u0aR&GZ7YL$-ImsXdhW~R6 zr2hpH=>CnW{uUnx5j-A}+MM0bi5jGl7MyeAP9BnQ5*mcO{sWW`APZ{C;X9A-kj@(j ze-H#=pGxWdk+lgFp;=Q&G<5s7$XrRdjLE3CiN=neut;17BQO{(UJuA#4CfFdqwGck zAJVwVN?5JcCUK<#bOr9Y_2wF5D`{C2%@eM%JHYoEyP4u!8tx6T1B+ZBTGT@9mUKg5 zh&vNc;GiUfbU_T0J50_7<#qyZ7}dM)_TZq(VYXa1pL6tg(BFLk>zyv@AIZ&F#PvcF z-iNbdLz?xwk}xAN65vf;Uqb+?#O50hZG4_(Rh7W7&j=b|`i3k*&IZNG>7z_Q45X($yu_@Af`*Q$gUO6o=+3=9W? z&`vcWvt^09HCKkKYSY^ivan$zxY-Yj z)gJUWjusBWept3A3Hv#Wz9&o=&pY<&;dkuDe%4eIay|Dq`o;t_`kwXzHVpCnNnaVR zDWmOP%tqFUKskn5fdp^Qudnw0`)hAdjON@Bq=|L^G}?#sFJ<*9lwqxKc5=QF#Mz#R zFrGRPP7cs<2cQF|>o#JJ#>kp^|z%p z^3wX-XzgqsGGXlrcjW@M{K)~AtRwbhoRzIfYXFH!X*R< zLD$ZgQmc7}0Tt{*sy!^TNJ5t+SY~>qQf)sZ#mF&EXWCqm?m8y>BZovjN5M6WS<35x z_nB@5j9iH`#z?z^a_Q@+x!k2y8PKYX<@~JuBw}bH7;>R_%hk>@)hdKmCzo`4PJr#0 zqQZmvX>`@6Indswx7CNghex=7Bz{*o#xR4Nl2{yLyb>jZ`bV7azk#GFUFlCUA^$hA zK|XT@CZAx!$Ol-WS9occm+bXxEI@p32&;g2-c(^&Kg_}u0?kSXa5q(vWh$6ywxJa2 zQB;9q(^|(2#OGQXBJ3rsyhKEL_Gy!cH@Ui4%0$Z&7c{orpWL|E0p|GOUkp%gz&u8_ z><7j40K-J`y&w7zJ*ysKFDC4xU?oTFd}>@w787_ninyS>?W49t4P_h~jxmTG$5G;? zj45Lj_dT$+(6JaZH0tR8fRP4R5fPS97FNXbMpi@*ES+E`YDmb1kBD@}lS4!S{+Z+q^ z<{Uk-CVq?32d#LBfPt3_7y6C26Lk^6B|nbfSL6;K;}*JziLOG3vm!1f07rLFwQoXX zky&)j1N6KF{?R(-gL~s^8pfwEIGSAh#yfcB`Z{H0X};ZQS0-Mmgv)+1^=^wPI0b<| zGKBH{LVT9?MypJ8$9TA01^_T;1hpBWN18TU$O<|exe5X+!mVL(2uuV3bs0U!-P{}G-B z2pmP&9==fWHTNWFxn+F1vcF*5Y!H`T$6E;0>_TGIj3EDSSZbRH?HzLUf$mY+5m5Iw zC&oc(ebzt3_xqzTsT!|+;UnRe!s(!H$&JLvfVPg@NPGfH7s9Z~p;kvBRrTc~xI)Aq zC)Z^ljhicVch4&MsR0ql&2=NccQtVvHG#b5G8lAyW4b?zOGQ#gwn2X1P zEey%<`;ZLurWdAz%VoxytTR}hCV!cQ0aWxN*>ph-pYQ%15^w>bWnOQ3;jXxm$InId zs(gVk=6*mF2MO|k0C^A-!23ri8-O=a;IA%}GvLJk<%Dup?TOd=yBHn_^vC$xiR~hc z57hoDmo*@a|Hs{ygIb0HP9Q_-hnO{p-b4kn{goP4eNp1}{H{ht-wVyobjkJotOK0* z{YD;RpvJ}GIYS6EF7YEOS$=Y*B6vebcF#As2$i*5Hrst!exZc1hi054(gR8v13@5? z$nUrCMQbXG z_AH5kwLGLhsc`3WIio-MHtu}V7DKUI@`z2uZGb%TP`$(@Pfe44lh1W~rKXAZh<}yf zlK&A6EqR-WDMXrA5bITL3*jd1QPdeh=mGjm^i}rq{r+Cwvfje=XEmg}H)-dwaHC6N z_eD@1o;BRz>sYqP#S$+=>w0@Hu4^g(Q6yrmRB7TiVq}9Z?#NB!c+VxE4SqY|5{;?G z0yB0k&~jI(*^mM`z3)1uY=UVL{4SVo&h;KlCmtE-`-i>bEOwTORQtS%UDfq24D@!O zN*BK&=$R9={c51s!WgdH!q<-Qq?lt4_w^>^M!0fm6vpo`D8tfUChSYNYFkk_ySRGD zGZJU7-jH>b9)##phJ~EJw$pZhaeyB41I@PZ!3oG{;T^?xPWo0O&Tb7>ij^*hl6 zGQxgI4@i1Y()7|Hm4)3Vhgv^~9+a|&Bt0zY!;+5azle@V?gLR8QD~077o}hKg*14x z_&I}SSi2+fcctu0=5Bubp+=DA-gtl?lM>Wc%5ijICf>I1Eqa0T)BGg?3FSjVawOfp8wd{7vR6& zfom>h{~r^*PNO#qw=4MXI6e$l@R2f7l}=weh8fOaYCx~*%A1`^HH5XxZxA1K3bL+l4KvUl9?8z#4b`0J`XZvAESR}rm(JD)67BU19aQj%dw z$AxJs2R+YQ8pf?TcMI_V=qIaxwB1+ZWRz8-h$Z-ml!?#`-*Q%t!%wAbjD0mc$&X9^ z3EUsF>LV}=IUU@mqbvoO3?H&M(!2vBl^KaM-oqAx)DyFn-vyXu33vclg;7aif}cDV!jUK)Gx`p!mp^zT{=&Y=QyNMhIr~#m-}j&Jr$tEG z<%*1O^a}suKQcSQ4J})uN@(e$)jXsjPz{W zCq6_#{2CV9h)u4Y?`i12>VKj=#20ToqBo}Q*{|KFM5b_P#7cG$8PT^8VgPf(I9;bS z;tN6`AnHSS-yRwGeW3xv*EHUP$?T&2O4B14$oLq*`CO-cplpn2+p+){Kdu_J_x1Mu zl+4;c@y13WDJ6LsDBT%zf670mg|4=T`}V!}z+Jy&Oq`^tL z|2YRkl&Dw^%M2QQ#&~x{_TidKuz&QzLX02wyC^n43-OOw0a3zHsLAt<$)m!;+_mc$ zFI|2W1YUq5;1NL42578-bgG#^1~C}Yt{A%!g2VJ7zM*>8$LJ^)ncL^Qsjn|EsWMq& za*N3}v-%r+{2~)!Ti;|(c-J2=_Z=qRV?q;~F?#%vxgRkRF7{{4k%0(=jQ@Lk8zd(( zT<)|{^v-}1THzcL_bgab;!R?(1dVwU2$prR8Lso7XzSRPR4$hrLFiB(sqY<}IG;O| nE9Um({PDB71LI>kH#dQ|x!gx{P literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/sre_compile.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/sre_compile.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87c0962fcba404955e0c475c496e48e3128524e7 GIT binary patch literal 15180 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 Ybu9HnDwaB$`H1lmL*c7ClTTgxzY>8}CIA2c literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/stat.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/stat.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72db129b06b4d2d9964e2b0f38557be8b3c77862 GIT binary patch literal 4410 zcmb7HOLN;s5(XfMqV=%k_uGbKI}&A!^doWniX(~yCD-Sx+Wi6f0ekQs^DlDT-+&852#FqUe*f$|#Yy#yJ%9AMHg1hWC++$O4pQX``4BB%C?YoP%-b0)3 z?u58-@w=G89Zd)@{{mrMd7F5G13uuf^-<3 zA{~NnkRFF;NKe4GE6PeAPr)>nGM|KORNmsFGg8!Z6lPHG7UZzLhflTj(rvvAA8YH4 zMS7XG-rcs|y|&(cegpOLIMNN!k=~E>R{GgA6kry8l|@@-&|f+9MILR_am@;7?=0Fk zhdwfJ{hp(ZFL3SV(HBMZYYBa7qCd*$$M4Vw*1JKFVXk32(t^}Ht4iE?)&G+s3bI7+ zlGIcdB`|C$_57We^O}B8YX*L1WusXSToknxPiSs4;G!jX;5Jt^!TpU!;A`HB=J{#V z4<=GttqCMGVlmy{Z*Q!wazEgpZTPiS{#aWP-nvH3n!DceM4(OfZ&P4z%S14krR^Rf zDv@3y2_k(&l0=Rnsgv@~Lp=4%;pdae7H)=V2~APn6)hfYh^7{-agAm}QwT7LD{h02 z``Wq(9A(5)uQj!0uK7IBmN)w~e9)5m8Y)br(vj@`Z&;FkmVTB)mAZ)moGc3+ z+6@g`4}_Ma(4)RH9oQ}&72ECZ*!<1)Wv}7ZwT9b#wHw!bsmnrQW1$1q<)gy7`3YDU zYCQNI54oaXo4JDlMUJA@=N*Wy9)yUpew6X)pa40__Sd^30nZcZLY&JE%4*T%dDFB? z9g|=C+{q`qPTtfwCjTHhgg%L(Y+8=hfkFFR4C7rfXm8i>B=Ru`bzC}|k*GvQh-gwMH$vI}C{Km* zawtP6*F(7#$|98ChO!;XKZJ4+%FeF5Og91gq9v!`Se4$(fs~j2{NTN^rC>SsC*^(5 zdv#0N>Y2vx6&?v&@&|cK{ijSfoY%?Mkqk1)ualsBP_~fA!0CDS1aCZVI9^6-yRQWv zR``LS>(0)t!4vD+_>_42L;M?0i%CQi;wa&8l}=H*8B~MXa)XD7TC2sI5USsMZZp*@ z=+e&A78mQRH_~7|%Wl9_IyLqlvB{mW{(+r*@~5Pza#9||w_i>ugR*#pbtyTNCrhbH z*jKHBSFcuCpY2rXBEb^K7$q|*^ZHAcM7cC?lwL$N6(b*&vsh9W+hBU6l68z?%oTs< za>PZ~k?5QiCvawQiU?g-#5p1th|rBdTtR|E;XbF$6mt~PI1kogY(>YephHd2u^}i+ z3rdHAl8>PME@wdmCW{FB-o{F*`6~ULHCI$WZ2n)F|Sv%j$;`!6$iO^RCZxceFu&+ zdzvtwjGWHS@2xg0J?EI#(!LhGl(Uw~4np5MRNK63dxkPfjy{WPxKyz5=DO=7eCJ~@6)N;Ijb^L&1aqLK6jXf0`3x>o!irkLdz`8FYO!7 z(#u)P)~jU`L9>f{y4i6f)$X&wUa}p%xX)Qwhx;XqZrr<6FAdA7pw+!q`ri-^7}0+y zT?nr;fkgjHqKkU+DW;>127iX>S@QplMD0`MeXp8KB#-T?#ax50n%w^;cIoXOE3Q!w o(NYs~$NN!9CNZaBK9du_De58owt6`^a>#gp%&#h#8As&*1O3tEGXMYp literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/struct.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/struct.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75b4c86d67ab4a16953499aa773a9f3c5bd50bdd GIT binary patch literal 368 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%0AfR}pScBy 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/token.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/token.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7af3ec75134e7303a5714314ecb41f985fa31762 GIT binary patch literal 2523 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 XAls9j&-P`9vwulDm(6Bh%j^FK0S$22 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/types.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/types.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..245ceb223153b6c55dad0a395fb6d51d333b4e6f GIT binary patch literal 9215 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/warnings.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/warnings.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..521c85b982d80f5254a5cc04fc6f45fd170ae1e3 GIT binary patch literal 13794 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 NE!&_t5dB}le*$HD0Mh^f literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/__pycache__/weakref.cpython-38.pyc b/blog-generator/venv/lib/python3.8/__pycache__/weakref.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b42f624774cba3867ce5311074c8f515a507ca2 GIT binary patch literal 19556 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/_bootlocale.py b/blog-generator/venv/lib/python3.8/_bootlocale.py new file mode 120000 index 0000000..c0da081 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/_bootlocale.py @@ -0,0 +1 @@ +/usr/lib/python3.8/_bootlocale.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/_collections_abc.py b/blog-generator/venv/lib/python3.8/_collections_abc.py new file mode 120000 index 0000000..0fa30e4 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/_collections_abc.py @@ -0,0 +1 @@ +/usr/lib/python3.8/_collections_abc.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/_dummy_thread.py b/blog-generator/venv/lib/python3.8/_dummy_thread.py new file mode 120000 index 0000000..954f9f1 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/_dummy_thread.py @@ -0,0 +1 @@ +/usr/lib/python3.8/_dummy_thread.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/_weakrefset.py b/blog-generator/venv/lib/python3.8/_weakrefset.py new file mode 120000 index 0000000..baa89b2 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/_weakrefset.py @@ -0,0 +1 @@ +/usr/lib/python3.8/_weakrefset.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/abc.py b/blog-generator/venv/lib/python3.8/abc.py new file mode 120000 index 0000000..d5777bb --- /dev/null +++ b/blog-generator/venv/lib/python3.8/abc.py @@ -0,0 +1 @@ +/usr/lib/python3.8/abc.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/base64.py b/blog-generator/venv/lib/python3.8/base64.py new file mode 120000 index 0000000..9e05451 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/base64.py @@ -0,0 +1 @@ +/usr/lib/python3.8/base64.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/bisect.py b/blog-generator/venv/lib/python3.8/bisect.py new file mode 120000 index 0000000..afbecf7 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/bisect.py @@ -0,0 +1 @@ +/usr/lib/python3.8/bisect.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/codecs.py b/blog-generator/venv/lib/python3.8/codecs.py new file mode 120000 index 0000000..c3e329d --- /dev/null +++ b/blog-generator/venv/lib/python3.8/codecs.py @@ -0,0 +1 @@ +/usr/lib/python3.8/codecs.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/collections b/blog-generator/venv/lib/python3.8/collections new file mode 120000 index 0000000..9b48d1f --- /dev/null +++ b/blog-generator/venv/lib/python3.8/collections @@ -0,0 +1 @@ +/usr/lib/python3.8/collections \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/config-3.8-x86_64-linux-gnu b/blog-generator/venv/lib/python3.8/config-3.8-x86_64-linux-gnu new file mode 120000 index 0000000..2597233 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/config-3.8-x86_64-linux-gnu @@ -0,0 +1 @@ +/usr/lib/python3.8/config-3.8-x86_64-linux-gnu \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/copy.py b/blog-generator/venv/lib/python3.8/copy.py new file mode 120000 index 0000000..3dbaac6 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/copy.py @@ -0,0 +1 @@ +/usr/lib/python3.8/copy.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/copyreg.py b/blog-generator/venv/lib/python3.8/copyreg.py new file mode 120000 index 0000000..9defd5b --- /dev/null +++ b/blog-generator/venv/lib/python3.8/copyreg.py @@ -0,0 +1 @@ +/usr/lib/python3.8/copyreg.py \ No newline at end of file diff --git a/blog-generator/venv/lib/python3.8/distutils/__init__.py b/blog-generator/venv/lib/python3.8/distutils/__init__.py new file mode 100644 index 0000000..59f55f1 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/distutils/__init__.py @@ -0,0 +1,116 @@ +import imp +import os +import sys +import warnings + +# opcode is not a virtualenv module, so we can use it to find the stdlib +# Important! To work on pypy, this must be a module that resides in the +# lib-python/modified-x.y.z directory +import opcode + +dirname = os.path.dirname + +distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") +if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): + warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") +else: + __path__.insert(0, distutils_path) # noqa: F821 + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig # isort:skip + +try: + basestring +except NameError: + basestring = str + +# patch build_ext (distutils doesn't know how to get the libs directory +# path on windows - it hardcodes the paths around the patched sys.prefix) + +if sys.platform == "win32": + from distutils.command.build_ext import build_ext as old_build_ext + + class build_ext(old_build_ext): + def finalize_options(self): + if self.library_dirs is None: + self.library_dirs = [] + elif isinstance(self.library_dirs, basestring): + self.library_dirs = self.library_dirs.split(os.pathsep) + + self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) + old_build_ext.finalize_options(self) + + from distutils.command import build_ext as build_ext_module + + build_ext_module.build_ext = build_ext + +# distutils.dist patches: + +old_find_config_files = dist.Distribution.find_config_files + + +def find_config_files(self): + found = old_find_config_files(self) + if os.name == "posix": + user_filename = ".pydistutils.cfg" + else: + user_filename = "pydistutils.cfg" + user_filename = os.path.join(sys.prefix, user_filename) + if os.path.isfile(user_filename): + for item in list(found): + if item.endswith("pydistutils.cfg"): + found.remove(item) + found.append(user_filename) + return found + + +dist.Distribution.find_config_files = find_config_files + +# distutils.sysconfig patches: + +old_get_python_inc = sysconfig.get_python_inc + + +def sysconfig_get_python_inc(plat_specific=0, prefix=None): + if prefix is None: + prefix = sys.real_prefix + return old_get_python_inc(plat_specific, prefix) + + +sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ +sysconfig.get_python_inc = sysconfig_get_python_inc + +old_get_python_lib = sysconfig.get_python_lib + + +def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + if standard_lib and prefix is None: + prefix = sys.real_prefix + return old_get_python_lib(plat_specific, standard_lib, prefix) + + +sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ +sysconfig.get_python_lib = sysconfig_get_python_lib + +old_get_config_vars = sysconfig.get_config_vars + + +def sysconfig_get_config_vars(*args): + real_vars = old_get_config_vars(*args) + if sys.platform == "win32": + lib_dir = os.path.join(sys.real_prefix, "libs") + if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: + real_vars["LIBDIR"] = lib_dir # asked for all + elif isinstance(real_vars, list) and "LIBDIR" in args: + real_vars = real_vars + [lib_dir] # asked for list + return real_vars + + +sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ +sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/blog-generator/venv/lib/python3.8/distutils/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/distutils/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b58b677137dabfe5b957afa880cb629202add971 GIT binary patch literal 2821 zcma)8&2t;K6$h}(<#PEUO0s0dmSZ}JW78jECb@Jv8P{!`@#JGvPm-n$rVYAWfYh#* zy9^eREzSBQpF8b8(4mgG_Rv2D*PeRmAJ9|ZTT(P5&vXI~un%|-zysdz{lMR~+W~>{ zw?BXT{XaT{{0lp)#fQ#gsKwtYA(BX%5Q(D0 zH}TJ@Wao@Gs*yl7&gnvjc7X!@IXz_BC}-A`&N-zd`&_kVZArkEQKHDKBV9>VL)K(X zkz{S;oV&bx8mMlv&ewlWvMVl88;61ZCnfm%j%4f)1hkuc6TI`%E0Zn0HQDCdl$`qN zDkU&y2j=X+od3+{sJHml#XOc=ll4RPSE}#9Y(Kp|+2uDVc}iqM2Cs+=)QvNT?^e3E zL3a~;+*LQluG&g^$u0hlY|7Rv!f&ZtI3jMT?c`nlp4^me*?C3zZS`LAzPc@-s%`Nu zXz%d5@`_xOUC{Q`UC{PH+Xw9((B9+s<+|K}6(6YkpnCwi2cWwr>DQ#c^>2*azHP|3 zFh?d%i__sZ2dZ}*YjYH)Dm(5iHN9yV9fo7o3r+8K(F>XM&DMJKYOqfN=2E(vWh0$>a$1bL6Y%I$QTc3vJpioomfu+*M zx;S9nB#$%ez)jhvR$(fpT8-itww=Q*E$_;9M{yRW@u?E|6r)nWRl0>rM?Vt11%CZ^ ze{hgb)F4hz!ofH;gG7NdX?`RhK3BscHfk_T^YP#qz%T&U2h$UCkY^w5{bI0;+(3vp zi;WO_(-XZ3i{6D=w4fn0pgwKUF1toguPwdWyX@3{-?hFF8Q@0<8wfGUqA{Ko5X1HA#$6AH^00aXeJfknEp$T9GNMuK{mn?Io^OC`s zGjk14QVAhl^y?r~EsbB&Gx~)5Y3HR=IyVJLlO)ED`Dh}eNBF(`+cW6 zm|h1nyMfm+Rz}Qm2SAH}Cfd_9G@_WQC?3U;z5$k(o!(h;$ffDez_{?BLEk;9`yfT= z+eJZn36-~@Q&PQA!kdNMQ2EQ|{+8?v$VI;oCjZxGNE^^&Qt%e$x(u}xNCQ9LZ?OI& z%wPE3Lci}rKZ3d}7k)p5k>Y!35aNF!D-h?#N!(ct;O!w>0kG>OH9qj$Bk7d%u&y7K z3?k!vjO>TH2Ix5G$f2isNlP}SS7F5kur*#I2fz&r?tS^$Z=QViRX?zs7a>~!_!!=a zIaGZN+bGwQ3eGD)#!zeg=YS7DWb{oC`;K)(JuY~oqBmTH*I_Fp&db4m>!-n9*%(v3 zz&x2FwM#bupIG$=xCg7q86k%xz34o&PCS{;eXLTo=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/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/RECORD b/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/RECORD new file mode 100644 index 0000000..13e7ee4 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/RECORD @@ -0,0 +1,61 @@ +Jinja2-2.11.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-2.11.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-2.11.1.dist-info/METADATA,sha256=7e9_tz7RirTbxIeiHTSq3e5g6ddCjoym3o5vdlRLuxU,3535 +Jinja2-2.11.1.dist-info/RECORD,, +Jinja2-2.11.1.dist-info/WHEEL,sha256=hq9T7ntHzQqUTLUmJ2UVhPL-W4tJi3Yb2Lh5lMfs2mk,110 +Jinja2-2.11.1.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61 +Jinja2-2.11.1.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=Nq1rzGErXYjIQnqc1pDCJht5LmInBRIZkeL2qkrYEyI,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=8uwjG1zgHTv3K4nEvsj4HXWkK4NsOlfx7-CcnCULDWw,4185 +jinja2/asyncsupport.py,sha256=ZBFsDLuq3Gtji3Ia87lcyuDbqaHZJRdtShZcqwpFnSQ,7209 +jinja2/bccache.py,sha256=3Pmp4jo65M9FQuIxdxoDBbEDFwe4acDMQf77nEJfrHA,12139 +jinja2/compiler.py,sha256=xCNpF7-xAduODbGKSVEyzU7XZGeLWHZr1cwcZTQob30,66236 +jinja2/constants.py,sha256=RR1sTzNzUmKco6aZicw4JpQpJGCuPuqm1h1YmCNUEFY,1458 +jinja2/debug.py,sha256=UmsW6OxNmbIGvIkwytOyM1NsZB6xJvl_nSz3VgNETUk,8597 +jinja2/defaults.py,sha256=85B6YUUCyWPSdrSeVhcqFVuu_bHUAQXeey--FIwSeVQ,1126 +jinja2/environment.py,sha256=XqCM_GmncAXPm--CxpRPVF6uV_sPKb0Q0jVa7Znry04,50605 +jinja2/exceptions.py,sha256=VjNLawcmf2ODffqVMCQK1cRmvFaUfQWF4u8ouP3QPcE,5425 +jinja2/ext.py,sha256=AtwL5O5enT_L3HR9-oBvhGyUTdGoyaqG_ICtnR_EVd4,26441 +jinja2/filters.py,sha256=4xEq1qfJ7burpHW5GyL6bkGomp0W47jOXg-HG5aLP-Y,41401 +jinja2/idtracking.py,sha256=J3O4VHsrbf3wzwiBc7Cro26kHb6_5kbULeIOzocchIU,9211 +jinja2/lexer.py,sha256=VeGdW_t82Le4H-jLy-hX6UeosLf7ApUq2kuUos8YF4Y,29942 +jinja2/loaders.py,sha256=UUy5ud3lNtGtnn8iorlF9o1FJ6UqZZKMxd0VGnnqMHI,20350 +jinja2/meta.py,sha256=QjyYhfNRD3QCXjBJpiPl9KgkEkGXJbAkCUq4-Ur10EQ,4131 +jinja2/nativetypes.py,sha256=Arb2_3IuM386vWZbGPY7DmxryrXg3WzXAEnaHJNdWa0,3576 +jinja2/nodes.py,sha256=YwErhE9plVWeoxTQPtMwl10wovsyBRY4x9eAVgtP6zg,31071 +jinja2/optimizer.py,sha256=gQLlMYzvQhluhzmAIFA1tXS0cwgWYOjprN-gTRcHVsc,1457 +jinja2/parser.py,sha256=fcfdqePNTNyvosIvczbytVA332qpsURvYnCGcjDHSkA,35660 +jinja2/runtime.py,sha256=94chnK20a1m1t5AaLWeuiTq6L3g3GLs6AxVPfbNXIHE,30582 +jinja2/sandbox.py,sha256=knayyUvXsZ-F0mk15mO2-ehK9gsw04UhB8td-iUOtLc,17127 +jinja2/tests.py,sha256=iO_Y-9Vo60zrVe1lMpSl5sKHqAxe2leZHC08OoZ8K24,4799 +jinja2/utils.py,sha256=26B9HI2lVWaHY8iOnQTJzAcCL4PYOLiA3V79dm3oOSE,22456 +jinja2/visitor.py,sha256=DUHupl0a4PGp7nxRtZFttUzAi1ccxzqc2hzetPYUz8U,3240 diff --git a/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/WHEEL b/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/WHEEL new file mode 100644 index 0000000..03bcde7 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/entry_points.txt b/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/entry_points.txt new file mode 100644 index 0000000..3619483 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract [i18n] + diff --git a/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/top_level.txt b/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Jinja2-2.11.1.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/INSTALLER b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/LICENSE.md b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/LICENSE.md new file mode 100644 index 0000000..2652d97 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.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/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/METADATA b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/METADATA new file mode 100644 index 0000000..b80bb75 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/METADATA @@ -0,0 +1,57 @@ +Metadata-Version: 2.1 +Name: Markdown +Version: 3.2.1 +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.1-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: setuptools (>=36) +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/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/RECORD b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/RECORD new file mode 100644 index 0000000..6584405 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/RECORD @@ -0,0 +1,74 @@ +../../../bin/markdown_py,sha256=FXxf9g5CXHurRxon-l_zpd6fdN0DvCysE4W0hBw3sBE,251 +Markdown-3.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Markdown-3.2.1.dist-info/LICENSE.md,sha256=bxGTy2NHGOZcOlN9biXr1hSCDsDvaTz8EiSBEmONZNo,1645 +Markdown-3.2.1.dist-info/METADATA,sha256=PK6UzXb9yL09qZJH7SCqZd6-mj8keovCmxQLt89NlEQ,2383 +Markdown-3.2.1.dist-info/RECORD,, +Markdown-3.2.1.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 +Markdown-3.2.1.dist-info/entry_points.txt,sha256=j4jiKg-iwZGImvi8OzotZePWoFbJJ4GrfzDqH03u3SQ,1103 +Markdown-3.2.1.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=xhmwLb0Eb6kfiapdM21pCb80lyVEl8hxv8Re_X6wsI0,1837 +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=JLR5hIMwWSeIHRQhTzAymB3QUD3gHCdITFvmuuCpIcA,15360 +markdown/extensions/__init__.py,sha256=6kUSgoqDT4gGUVsqf7F9oQD_jA0RJCbX5EK3JVo8iQE,3517 +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=rVZVOIjp2KEIZsnz90mX6E2_xnwVPQZpVVQVJMuMVU0,9834 +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=E-d3R4etcM_R2sQyTpKkejRv2NHrHPCvaXK9hUqfK58,13224 +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=zFHFzmtzjfMRroyyli3LY4SP8yLfLf4S7SsU3z7Z1SQ,6823 +markdown/treeprocessors.py,sha256=NBaYc9TEGP7TBaN6YRROIqE5Lj-AMoAqp0jN-coGW3Q,15401 +markdown/util.py,sha256=0ySktJgYplEV7g6TOOs8fatAS4Fi-6F7iv4D9Vw3g0c,15201 diff --git a/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/WHEEL b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/WHEEL new file mode 100644 index 0000000..78e6f69 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.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/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/entry_points.txt b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/entry_points.txt new file mode 100644 index 0000000..f49693d --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.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/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/top_level.txt b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/top_level.txt new file mode 100644 index 0000000..0918c97 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Markdown-3.2.1.dist-info/top_level.txt @@ -0,0 +1 @@ +markdown diff --git a/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER b/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt b/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/METADATA b/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..c50370d --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/RECORD b/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..95c3339 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL b/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..ae40efd --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt b/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/MarkupSafe-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/AUTHORS b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/AUTHORS new file mode 100644 index 0000000..f7a7aca --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/AUTHORS @@ -0,0 +1,228 @@ +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 lexer +* Frits van Bommel -- assembler lexers +* Pierre Bourdon -- bugfixes +* 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 +* Laurent Gautier -- R/S lexer +* Alex Gaynor -- PyPy log lexer +* Richard Gerkin -- Igor Pro lexer +* Alain Gilbert -- TypeScript lexer +* Alex Gilding -- BlitzBasic lexer +* Bertrand Goetzmann -- Groovy lexer +* Krzysiek Goj -- Scala 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 +* 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) +* 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 +* Rostyslav Golda -- FloScript lexer +* GitHub, Inc -- DASM16, Augeas, TOML, and Slash lexers +* Simon Garnotel -- FreeFem++ lexer + +Many thanks for all contributions! diff --git a/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/INSTALLER b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/LICENSE b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/LICENSE new file mode 100644 index 0000000..13d1c74 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.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/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/METADATA b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/METADATA new file mode 100644 index 0000000..4214b2f --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/METADATA @@ -0,0 +1,50 @@ +Metadata-Version: 2.1 +Name: Pygments +Version: 2.5.2 +Summary: Pygments is a syntax highlighting package written in Python. +Home-page: http://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 :: 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: Operating System :: OS Independent +Classifier: Topic :: Text Processing :: Filters +Classifier: Topic :: Utilities +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + + +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 300 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/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/RECORD b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/RECORD new file mode 100644 index 0000000..46a013b --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/RECORD @@ -0,0 +1,451 @@ +../../../bin/pygmentize,sha256=XMHS8cXaOIhesyj--ZEeQw_h8HVVbmHMjLyK0d1Vd2I,252 +Pygments-2.5.2.dist-info/AUTHORS,sha256=TF7aH1YpYbhTCI2skOIlbY17LFDFhFe72J0j4s0-A90,8343 +Pygments-2.5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Pygments-2.5.2.dist-info/LICENSE,sha256=RbiNNEnDeAZZR1i_PEhNnZixKx7MFj9lQx_gf-pgJfA,1331 +Pygments-2.5.2.dist-info/METADATA,sha256=HuyzWPJj16jDq4zqQNVwMkAhLB5d79yjk4Kh2e_WiK8,1975 +Pygments-2.5.2.dist-info/RECORD,, +Pygments-2.5.2.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110 +Pygments-2.5.2.dist-info/entry_points.txt,sha256=NXt9BRDRv6tAfDwqKM0bDHrrxaIt2f1nxH9CwjyjSKc,54 +Pygments-2.5.2.dist-info/top_level.txt,sha256=RjKKqrVIStoebLHdbs0yZ2Lk4rS7cxGguXsLCYvZ2Ak,9 +pygments/__init__.py,sha256=ClnXejMf3_glSTxF1L99Md0Mpf9365Sgrjsq7h3X4ZQ,3163 +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=Sr5RQ7uaxZe7gVGgOgypYUAF5xEcGh2Vvb3HYIX-7UQ,19525 +pygments/console.py,sha256=QF0bQHbGeFRSetc3g5JsmGziVHQqIZCprEwNlZFtiRg,1721 +pygments/filter.py,sha256=83wVChi33J4gW5GV-ooZSHoXWoqzInGBA74DhW239lE,2038 +pygments/filters/__init__.py,sha256=YcsNTHkr2izYgwenZeUKegrjMzFNzF9V-FGDmwtjSV4,11573 +pygments/filters/__pycache__/__init__.cpython-38.pyc,, +pygments/formatter.py,sha256=9ceInaU6dqybrzludvZZoqNEBmBvofYVFa63hFRUrJI,2948 +pygments/formatters/__init__.py,sha256=qUkhNBzgq_1RmRc5v4y22DqDPsMoJuo91rSsr5cV2FM,5128 +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=eFk9dOhQeV3W3bvC-8hQomqu0yd_txUFxI-jysNTlMM,6214 +pygments/formatters/bbcode.py,sha256=_K7UzwyT70snOYAiT3UkItbXRwQYVuTHpr1AZtRHL6Y,3314 +pygments/formatters/html.py,sha256=f0WJ1uuFLF0Dp2YalcMN4aq199nCfYnexiFip7FmQVQ,32687 +pygments/formatters/img.py,sha256=2j8uM6BsmF-8nfbNAUZR_Xa2PlVVPEacVSdtVL3VVu0,19838 +pygments/formatters/irc.py,sha256=nU9jSjARuRaZpCuCey7bnRwGTGKeCTEhm_yDDYxzKQ8,5869 +pygments/formatters/latex.py,sha256=GzaZW3aQLWIyx4AFh_9l9UjaTGCL_SXk-KbTKXaS0jI,17758 +pygments/formatters/other.py,sha256=Qfc5OixOxM7YEy0d0NJBT750ukj-uPyhxKtHGTm0Vlc,5140 +pygments/formatters/rtf.py,sha256=z8LTTuEXwx3hpLaG0qeJumZCkUfseLIBsxhZE-0tEKg,5050 +pygments/formatters/svg.py,sha256=TIKW5KJVOtjY1CO4Y9Kqid9w2IFpfkVR3JD1mEujRJY,5840 +pygments/formatters/terminal.py,sha256=XcyogF_qynLMFC10GvUen0tH9AH0zR8q85xil0rlpb0,4997 +pygments/formatters/terminal256.py,sha256=1d9m96FPG0xEaXEqX3j0ABGWUpEjZKxhVGLWk-8sm7o,11068 +pygments/lexer.py,sha256=NG6uRD_EjEdHzZh0IdzC2taAZtIV_PunZwtajy1q8DE,31698 +pygments/lexers/__init__.py,sha256=4b4C0upAO06vSKrssOmTTiIsqSTKJM4RbjprytoNjaA,11385 +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__/_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__/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__/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__/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__/varnish.cpython-38.pyc,, +pygments/lexers/__pycache__/verification.cpython-38.pyc,, +pygments/lexers/__pycache__/web.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=xa2yIFoOcQmYuv014JnBMYlHIrEnD1FMWjsYemJyVm0,40001 +pygments/lexers/_csound_builtins.py,sha256=dWlaJZAK66OZO_gsFNJOad9jWF3dp8HWiskIK5jaEag,17504 +pygments/lexers/_lasso_builtins.py,sha256=1jR-3eDhf1CUcPSSEXgbJMymAkQaJqpWIPjYM4rL6Sk,134534 +pygments/lexers/_lua_builtins.py,sha256=PrFIbnBC7CfaRzIjcTEZvl0gsNpbrzE92e1gSNV2YbU,8340 +pygments/lexers/_mapping.py,sha256=aXLeu68ne_gAAboufuMxiqYb1Y07cWQOl22_3HXD6tU,57717 +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=uH5hykXbyM4d6dXqs78WXEYkKwVgEwIwwOP3HXIb5Yw,154429 +pygments/lexers/_postgres_builtins.py,sha256=OI0j7i72gKoNGJomATjK_P00D7cVT6bpPqeeSB4k0aM,11210 +pygments/lexers/_scilab_builtins.py,sha256=5gjuC1Ny-kJzHi1ng-TI4TJKVuIut1oj4J3f2bPdLIk,52405 +pygments/lexers/_sourcemod_builtins.py,sha256=h79SYG76SHCsSk7qXI7ThqIEpHfg04-eQ2y9z4sqCDk,27113 +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/_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=kK84-in8Yb41iSVc8pBfTD7_43a0qfLth0gHh4WR5Dg,29855 +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=VXved88PH_Lg05WCN_Mb2bxXclZX6IYdE3KXZVXtUZI,27665 +pygments/lexers/c_cpp.py,sha256=6K3X-vogKt3KURQdKT_1X64CvdAn6vFJQvFVYfD9MMg,10512 +pygments/lexers/c_like.py,sha256=UusXq2S5d0v0CpGsxkmVludmu58WsLZQHWnsb0YwhK4,25080 +pygments/lexers/capnproto.py,sha256=pC3zXFSfYFHEIBq3OqLPGKl71K5HtdWnAEqMz6n8KFY,2194 +pygments/lexers/chapel.py,sha256=VBTixkCdwOebIKTdW0oxTAlS2zE99EYUGN5hiCdnGeA,3824 +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=v2YS0XcHucKi1yE1S1O5-yIOj3Oy-sX3Hqp0DhKX-6o,32135 +pygments/lexers/console.py,sha256=tj_ARAplXlqt2sGb2ycxsOy8xIL4NCAMOd3bZ0Zjojg,4120 +pygments/lexers/crystal.py,sha256=hTz20yWrjuam9JVG9Xxr6I7x50M_sIlfdBs0_gg5hKQ,16845 +pygments/lexers/csound.py,sha256=G4pXcEj6n1y49HMuB-XSljtzOf2zv2QyuQuXDqmVeTo,16739 +pygments/lexers/css.py,sha256=GFWC8OBDKDkICn2bRXH2ZmpExGFwV3Hc5jfxEQELyeg,31509 +pygments/lexers/d.py,sha256=E_Gj-5pLeC3V6gUzJteVH7JqZEghad9iup19PT9am4k,9530 +pygments/lexers/dalvik.py,sha256=tAoPPa_iRXhWG_MzslSvBE99NlGnkx0WKnwdDQ3XU9o,4420 +pygments/lexers/data.py,sha256=bp8iRknsEocR3BGye9-uNC3YRqh6yXmE0qIw4nnKAMw,19056 +pygments/lexers/diff.py,sha256=8jKEVtSA2YKprutpONqFvMKBhK1U_IFdxaScTuRNeU4,4873 +pygments/lexers/dotnet.py,sha256=Itf0sbtWeooWcI9eBYNtcEXkr0i3qCmWS3GAX_7VSVI,27599 +pygments/lexers/dsls.py,sha256=wZJNJpyqbmcqGu8pkLKgsYV7RYbnj81e5Zv_5scPqls,35836 +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=cV4ibgUrR9iiHJFH0nfzTTkseM-F2b71mljP3lE91Uo,18976 +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=j_289Tqa4umdEu8F5JzjvWPNiGcs-nkOB0TVWNyMo0E,6329 +pygments/lexers/graph.py,sha256=v013Gzn_RIuLrEz_DJuUah_vCpv6aVSMZpHGov19BMY,2756 +pygments/lexers/graphics.py,sha256=xfr7jZ_JF81kh-RFxIFSKOa06W4z0YxWzOxXAmrLwMA,38259 +pygments/lexers/haskell.py,sha256=2DwahPHxii04ZtduqmZYRCR5y8VRsPFtI6y7rMeUr0I,32072 +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=7FV6hoTtWwOXIZGGb_9NBq5RrkDlPi9qpOzhHMioW3Q,60240 +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=0BTRjVCE7WZsmdbt92Ln2WIlLMtsr-tbBbedt2Y5WHE,30344 +pygments/lexers/mime.py,sha256=hf-dShZ8AUSIzTELUEnlel7gnZLZpiOd-OFehEDSba0,7975 +pygments/lexers/ml.py,sha256=TfNYvefb7-eBlI6yimjd8uT3lTiN_4gERhpmRe6zmBA,27877 +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/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=MYqLrHPEpuJLp1uNN19MaNiW-L-FboQapFSTvSkHS5I,32621 +pygments/lexers/pawn.py,sha256=LN0m73AC00wHyvBlbTPU1k2ihBdmDkfIFq24uAWvsF0,8021 +pygments/lexers/perl.py,sha256=1i-mPqF6GxGcX28bW4VlJBpvpZn8FQqWRDjYHQj1-xo,32012 +pygments/lexers/php.py,sha256=OMO2MWHUIyc_zNDUQDajj1SJ1KDI4PBdtIwetBQgRe8,10821 +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=iMEg6aTP-NOg_UCDzEGYfTNGin5YTVvOE5AtAfruKdI,47399 +pygments/lexers/qvt.py,sha256=_lXPT5SdDEqhCmuq4TcO9JRrP703kIT3a1Y_ZW9NTCY,6097 +pygments/lexers/r.py,sha256=7oJ0Ihq6qdhgdzpKayeC-MciEKm6PWW3UWJIYnIK_iA,6279 +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/rnc.py,sha256=OxpGllFDAM6Vn_alGiaEKMzQDoqRCrl82ocOO4s6L_k,1990 +pygments/lexers/roboconf.py,sha256=9eZkX5xkajimTV1F5wr0Y8QHPfuEB659Lde8H5AzFfM,2070 +pygments/lexers/robotframework.py,sha256=KvbCkzDdowczT0UzGW0y-k7_FRKab21j6G_DOR3E0_0,18736 +pygments/lexers/ruby.py,sha256=rqBelW7OJZIP-J3MVPgQzhXTh3Ey41MjMmpbGQDv390,22168 +pygments/lexers/rust.py,sha256=hRhrSZiiLNlmQrWT2jEQSX6vCPgPe4AkMAW8GBx_FeQ,7738 +pygments/lexers/sas.py,sha256=guELd_4GLI1fhZr3Sxtn80Gt6s6ViYFf4jWnK23zzDc,9449 +pygments/lexers/scdoc.py,sha256=raoQeCR0E6sjvT56Lar0Wxc_1u6fB-gFjptjT0jE56g,1983 +pygments/lexers/scripting.py,sha256=lc9oDOpkwKA9nUcHJ3x2XXs94I-UsaiEi4p9U_C58M8,67764 +pygments/lexers/sgf.py,sha256=R5Zqd5oVOyUd-NewEXMmACaEO5RX_F7eYUZaJXGTY4g,2024 +pygments/lexers/shell.py,sha256=00dGjndFJ6ZWZzsfKW3nKjIKG-CBwTHH-VYQQs57700,33870 +pygments/lexers/slash.py,sha256=WN2f0VirklPe6djATJtbNMkFGRiuIykKZjqG19Rlgk8,8522 +pygments/lexers/smalltalk.py,sha256=xwRETRB2O_cKHZU9w18QXZpiz87WOw0lULDhMxc9xnA,7215 +pygments/lexers/smv.py,sha256=mWuqz0uYpiQLOU4INlxjfrfslOC1yp1BQM8Ule3gqWw,2802 +pygments/lexers/snobol.py,sha256=YFOOuPk4yBxg6stlIm6R3UiUgzkMjz06ac7dW3LRxNk,2756 +pygments/lexers/solidity.py,sha256=fW_aQc_HyRawyStUxllYhUn-NYJPCqzDH-ABWTeKcOI,3255 +pygments/lexers/special.py,sha256=hsAaqgRPHCANQNydjQfEhvE8mmlzxf-N7UMwHI8VC14,3152 +pygments/lexers/sql.py,sha256=50ufavADPsy9MMEJt3e9KpNRcIE6756lI0GI9-I5CEM,31782 +pygments/lexers/stata.py,sha256=9IjM-8_OSSY7_7Fdq1QlNEqeo1KZx5G7_N9NL46jnF4,6457 +pygments/lexers/supercollider.py,sha256=llVW-HUi7m4MNGy4wEp8bF2BJGTXdwF0oNfJfJ_sI8M,3516 +pygments/lexers/tcl.py,sha256=ORf0CBXHwC2MFBpZpcK2sPBCCTyJ3rcwcYOIhN9s0AI,5398 +pygments/lexers/templates.py,sha256=3L_BF-4A1tPZYJoEI3mBtQc4qkL9IM2GdFWl4A88vrs,73561 +pygments/lexers/teraterm.py,sha256=2DdFVGyKIF85efcB5QdqqQQNGjqRHoWzVc5psdhSD7c,6310 +pygments/lexers/testing.py,sha256=Ci9pU2zhD_unhXRoiMlaCzjga2XY1ecvIrp04-wvdfA,10752 +pygments/lexers/text.py,sha256=7cwhjV2GwLRH0CPjlOb7PLVa6XEiRQhDNFU1VO3KNjE,1030 +pygments/lexers/textedit.py,sha256=7F9f0-pAsorZpaFalHOZz5124fsdHCLTAWX_YuwA9XE,6092 +pygments/lexers/textfmts.py,sha256=_H9Ug-E7GKEXHl8TEyJ-bDyBROuAi9BhzF5AEtfgdQ4,13778 +pygments/lexers/theorem.py,sha256=83_RPTNc88LYm96E9SzNu_zv9--KsUaB3RafbYhIZnw,18902 +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/varnish.py,sha256=Y2t_JY7uVz6pH3UvlpIvuaxurH4gRiQrP4Esqw5jPnk,7265 +pygments/lexers/verification.py,sha256=qk9xhUQDcD2jPT0k9bQlo_5eKM3UmL7RCiXceYFUF8U,3705 +pygments/lexers/web.py,sha256=4thoq-m_kGixnDR2baWwN5eEqpFAeH3aRaOMK4J_GOE,918 +pygments/lexers/webmisc.py,sha256=ATqDw_kIhr8uc-hQTKJphKewrNXyXp2YjrRDtI9vfqc,39909 +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=_QI5jZlo4UoyY0B572ZHqWOvVLJTh9jIq31-iZr-EPs,3123 +pygments/sphinxext.py,sha256=eKh9KmLPgBj1kqPr-pduvPPDt3IEyNt4eloXgVM38Tc,4657 +pygments/style.py,sha256=U2hO7Cw7EogLs6IVxj1VprqlICAEh90B3Ayf6kTAATI,5758 +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=aQZ1Bo7UJKKhGsEIchluK5tpq7F9tjfp-AAyCvvNQKE,64749 +pygments/util.py,sha256=uNlo3O-lYReb1XXrPFOrGAfKLioEDDh2dbDoWGQzUkc,11900 diff --git a/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/WHEEL b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/WHEEL new file mode 100644 index 0000000..8b701e9 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.6) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/entry_points.txt b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/entry_points.txt new file mode 100644 index 0000000..756d801 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +pygmentize = pygments.cmdline:main + diff --git a/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/top_level.txt b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/top_level.txt new file mode 100644 index 0000000..a9f49e0 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Pygments-2.5.2.dist-info/top_level.txt @@ -0,0 +1 @@ +pygments diff --git a/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/DESCRIPTION.rst b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..4b318b2 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/INSTALLER b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/LICENSE.txt b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/METADATA b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/METADATA new file mode 100644 index 0000000..c73f056 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/RECORD b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/RECORD new file mode 100644 index 0000000..136073d --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/RECORD @@ -0,0 +1,394 @@ +../../../bin/unidecode,sha256=qd_J1CTNP2UjpvEysgIU5xflzbCokXrXR1wzpPbKvhU,250 +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/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/WHEEL b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/entry_points.txt b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/entry_points.txt new file mode 100644 index 0000000..3016afe --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/metadata.json b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/metadata.json new file mode 100644 index 0000000..64bbf15 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/top_level.txt b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..051b14c --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/Unidecode-1.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +unidecode diff --git a/blog-generator/venv/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b9361862ae8fc43f03c97159131fe6e58db39f9 GIT binary patch literal 285 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 z + +Blinker includes code from Louie, by Patrick K. O'Brien, Mike +C. Fletcher, and Matthew R. Scott. diff --git a/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/INSTALLER b/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/LICENSE b/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/LICENSE new file mode 100644 index 0000000..88f6e84 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/METADATA b/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/METADATA new file mode 100644 index 0000000..25cb9f2 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/RECORD b/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/RECORD new file mode 100644 index 0000000..517b8e9 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/WHEEL b/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/WHEEL new file mode 100644 index 0000000..b552003 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/top_level.txt b/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/top_level.txt new file mode 100644 index 0000000..1ff4ca5 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/blinker-1.4.dist-info/top_level.txt @@ -0,0 +1 @@ +blinker diff --git a/blog-generator/venv/lib/python3.8/site-packages/blinker/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/blinker/__init__.py new file mode 100644 index 0000000..3ea239c --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/blinker/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/blinker/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aae8fa21534f782091d02d8ec5427f1d761d0c96 GIT binary patch literal 414 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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/blog-generator/venv/lib/python3.8/site-packages/blinker/_utilities.py b/blog-generator/venv/lib/python3.8/site-packages/blinker/_utilities.py new file mode 100644 index 0000000..056270d --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/blinker/base.py b/blog-generator/venv/lib/python3.8/site-packages/blinker/base.py new file mode 100644 index 0000000..cc5880e --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/__init__.py new file mode 100644 index 0000000..0defb82 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c08055a336323e6a6fbce7144d3911ca69160f18 GIT binary patch literal 349 zcmYjLyG{c!5VW0K?zmGTN8jnko@cM9l|CaQ{wDcJ^vapWbo z3i%k7kwLE&C=(>l5IdtH3)`4=L7SErTW6KF3wJTiVj+G5k)?uIi9atytj-(nFq|Pe zjJXif7$IH=R_XGGK9B0q_}Xhf>#Udam4eykQ7JQ9w)3Y$v2ZoWp!(Wc2yJx`;=n)0 Z;<#~;zB=hU+esoucj<(dtfY*vuW#oqV8Z|a literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/_common.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/_common.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..548f5eee1012e58445aae415f00c40369a247449 GIT binary patch literal 1395 zcmZux&2G~`5Z+xoiDQxw1gZ*L0-}J0+FW|zfGVo0g$qFvhHkc0_Ha?D&q+!lr~FR5#af+$`Rw;)Qwg1sop!iK#hZix!)mZ*vv z>}A0KPCYH1N!b_Pc}l~Uk13`DZ3c4(rmn-1(1dW3FjygVn_SV>6;l*E3ga9jHMI;n z^P4N8is1OO*^CFn=CC(hAB98D?@O_M)|E0?Ki2-~ChtT|;l*+k_kt$(v)XJ7&r^%@ zUf7E{FT*o5R+rEs9oHv#H>PeMlTQcQ7@C1@fPtV-NS~=%0+18(9nUPGKY%@wP)O4; zG6rdxb3gF3<~$?eFjW9==F6DmO9}1}o$mz!=T$gqq)DhvO}2)p&EzK*)};O;fhIO*0jfgM7>}9cW|WG8(9j z7)lG!p|l-#0k9`!P0g;SyK{IB%`1xaS}rEWasCkQHP#1_nAH5cSk64;Mmc91#n&@| zQubM8+Soh?Qu`0}P;&kVTsjlb5@B>L5yp@i;iqsAnXc}WZ@5!^F9Fg5bcLr5TLA#5 zF6fU_a@o80F55qF+2JniZ(X+c!Da1jmw%)HzkLP^Ct*6 zuaFI|!?NJ=5QnxL8wDDA1K^R`oaY}Euq&LOj=W&v0ln)Wic#JBa_ zjs-MX=kN{4nu;flf3T>g`kg3}3MaV0?dF^Gc<7=auIATH(r5-AK(3@MDk44O<;tVVhkdWL?QjJMd! zQj3Z+^Yd0R6fptSfQetG`X#vq`URNBY%~Ch=+c`YDMe hsih^EIr{NX{dxtJw>WHa^HWN5QteoPCVd8C1^^NTC#C=Z literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/easter.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/easter.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80fb71df04c9dddf71ba5b5bc68aa916002506c5 GIT binary patch literal 2166 zcmZ`)Uvtw&5Z6iapEwSrB_ttGdXwRSbR3)fq0=xx@jwctC22{3jvs1Yd}mu&I*HRM zjv4u-^r25oKSKN1&(d$8*FO0x^r^d&orGa3jaGMiyT9Gr+ueIHH&-&?`MdS<=NLx+ z;N<*c!{h;c;WiL%Gz?C->5>NF7Ponh=eu^pA-u$`Ur8g+%>!d? z_U%dOu;+x-^LgY7>UTOqg_O~*kU}|aDp;t6qHW&`BJId7^@Q&EoOXOgnH(V5KHn{bU{6b=5WX2}97mbm{b0a&3AodOQJGWzN!QlBNgBM^e7o${h z#aJ@p9Pnm&hSN$n&C^ZzMT4hWf68UDsdCIE5I!vcQmWXAEvfq^Bn;?o6^!d@}~s} zb(NJND@zofEU&V38L*HBzS06RNBJJrJwXS)>QnAZL63&?@iSUiI;^CczNFd@AQ@A+ z)1*PUhc1gkdgx0I=_$JvI_Np=9tHeV^N59D!jUv!N>juELuUYhxF2y$JDJoRaE0VppU2E~aE~b_o)BkRK(TkQ!nZcRr1eMX(&l;4%pSxU z$~IMiULcP}dXx~8$4X#Hvop|-?WOG@q#L)t+QKky-`d$p?QDUa=i=DGBb%B5zfU1? zL;vSGcAO6(;V9`qxb8I0A{5hLQKke{B2d7Sc+QYWm>95=P&28g(foq8S|79_h|xW| z(Q2jco?D%EC0O13cy-dEPtx3_`p}Sd^uAjD7dbg)_aHm!q3`L;PmkAjr zq?-_t5GNt86VgsdFCjrfctX6t47Cop|8CW^7t{hLSdV1D+I_*-2R$L&^={aHv)%0Y zH8cQM=vj=03NJ0(QHV|&Hx@~;Y?C5^&zvUN5!;4U1{8SDJqNmQCBURuf#k<*Ue;*}6ye;iq(JX^Cc&+~cqv%5@ literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/relativedelta.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/relativedelta.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f64cf664123949fa3e6bfecf180abd257dd8b400 GIT binary patch literal 14873 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 B+cE$E literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/rrule.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/rrule.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fbbf0d8932dd520cfa847238d468ef9abaccd6a GIT binary patch literal 43478 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 TDPsn|*1yAeyD(6dun+t{Po*){ literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/tzwin.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/tzwin.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef43aef2365236b98cf00f56714feaa10a33f626 GIT binary patch literal 164 zcmWIL<>g`kg3}3Man?ZkF^Gc(44TX@8G%BYjJFuI z{4^P(*h;GO$}{s;G88cbg~7xxBmI)x0{w!_0^QQQg2d$P)D+$FjMUT|-Spz*LX-Hk meEpQflGM_Y%pCoaDxhY)g34PQHo5sJr8%i~Ae%n}F#`b1C?=Tz literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/utils.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..502227c00b32bed16eee4c9845bf366ffb3f68df GIT binary patch literal 2226 zcmbVO%WfMt6rG1;D`Pt`&`mc92)95yZ6wQXiWWj^q%gYmqPDxxq7psiNQ_4_3dyl! zLtZu8{6h>BDDo}+gV}b~U+AjmQZGAjgQA2*@lu!f#d8mRvau0)7=QGC{^j>o&-;^v z+arYV0w1%FNqAjP_#(*sQP2&1T8CLU3cKN`)~!Ka6Lqoj#_!g}s%X6Nx+~&=i158C zYDZqYer2NLp)zb#h%%F`NK>f|8^~O0p0T9J&tv}z9D=lH?4N`7XtTUzuGKwl@vnuV3hos zIH($P167U8940;~&qjc6l*Bv0$82G;-aCKd-T2o&R>8!77v6ZbCa@=hx4}(-6hr<5 zCL)IMleDEq(42L~mz^Zz#&r5~e|@IqSW6>wOUc-wWJ#$tL?-wp@+>ljoJ@Pe430?Di(3*mASN;TxiT4sHKYO4bPP`+M{0Z>?)<43oyYAnh?y@?P z*0}oi`_sJoedaEWiqDFi+B+!CUrxvFLImt+RE%GI>V8 zvja~0h_<`Xxw4QcFEiVlR{YK>k-B~M{UU_ztsjq$x1O=)?zioBJHDemMv`{>uDNX& z%J$Q}_U`j$dl!FfcdzqRo1GjVJdK~RnTL33=|jyd20%+*nRzPP}A{ z8su0lD$(x?ixyES$O>dn-2fqGfGb+THOs%T(}G!Z#xJNb?h9w0ZGTEShq{h-o^#3S zEN#g2{5gVg)H0pcu~$93i-yP8Gekt* z6aQ21I-CS+-XyF+>C7)ap9E)Mkihf7E3tnybcH!tG60AW_;ZiL1t@$$8;geLESCek zkf)#tq39{4m(!U+!B6p^;K>ACXb^^cRq||F2)u+LKQ(c!8w$Hi(_U2D(^YP7nGqZMZMuSeEkXJ*guRL)oQN?e(3e8sMkwNynnLS(?qI{;vJnk(sk8y g=WaP7YS*sxjqj%aA?(vpLpM}gSr0bDXtVLzKZpTjdH?_b literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/_common.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/_common.py new file mode 100644 index 0000000..4eb2659 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/_version.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/_version.py new file mode 100644 index 0000000..eac1209 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/easter.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/easter.py new file mode 100644 index 0000000..53b7c78 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__init__.py new file mode 100644 index 0000000..d174b0e --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72cf90deaa3a7e474c8b3e857e9a5d48ef52f735 GIT binary patch literal 2047 zcmb_dOK%)S5bo}o*`4)1ZHJHq0mI|KLTn?%1<8sM6vG8sQ5=Ib2b%GAuQT>MHr=x} zS=J|8+Vz2)_yKVAAK*{$5BiFPl)r$4L{-nO?d5SmVn$t$?wabV>aTiso6RKx&oAG6 z`SouVLViW%`cnnvJ`DXc5J3b@NJ>MRvXG@t=%jAwQk-Wn?}c7k2`g52K(B^XE4v{3 zp>Jg`sin2BmM(=$pjSjy_@XA3L|ruYt6^OW^?qZ7G$jE;G%CTc17H{o=`^2ak8Q9-H<|eG--vU21ObW`|jRoIQzCIm$EnRiv^w z+lQ4Z=OXWM4sL3(&S#tXmm-5;l!L@YQb&S^pgbf#kRHZ6f6x*Qk?T)^2x_ZMPbk!b z3X-sMCY*CRr3cQG9Js>$o}SY&osv^JArm@beMfkra^|1X6EK*fq>=N#(=sB#pRrZjmCrQ1keL2?I(x&5!3qm6C>A+$k#=CT&6&=pr-T_25<&-s><8$b(1BFg#F@B|3iQ~SAG#AT4?Rf08GU%I zu6%x`HuS4QU6@`dDVFjQ+i!z1b*`{oK#|7elpQ!@I%Y4hugMNk9Wd*ah0T-iB{%fA= zm*G^@8@S^V=V>m6382+9IDa;bk`lYBHs8`TXHoWKl0c-0;S1N$o{d?(i*|_rE>-WK zY-7dQ4`A3>eOh7G4jKY26}F(=AHM0LZ2JNa`R{$Pcz)S0psMOxzB&Wq9fZs%4gM%&#Lxc=B?|wk_MR{6VefwY z3*et4vgN>zv;ip0SKURjh6InQOw49yiS2rSvn=^N+*M;nw`hkpSc7$-$r)i3-ap*B N-}YBKw8MOg@1KP~{YL-* literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75a9fbf2b5be071ae2edb3f854ebacd9716629bf GIT binary patch literal 40422 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 Kq@V^pnEQYKO9VCm literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/isoparser.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/__pycache__/isoparser.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65c224a211d0f4541c72eda37e35e8f38fb1af2d GIT binary patch literal 11154 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/_parser.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/_parser.py new file mode 100644 index 0000000..458aa6a --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/_parser.py @@ -0,0 +1,1609 @@ +# -*- coding: utf-8 -*- +""" +This module offers a generic date/time string parser which is able to parse +most known formats to represent a date and/or time. + +This module attempts to be forgiving with regards to unlikely input formats, +returning a datetime object even for dates which are ambiguous. If an element +of a date/time stamp is omitted, the following rules are applied: + +- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour + on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is + specified. +- If a time zone is omitted, a timezone-naive datetime is returned. + +If any other elements are missing, they are taken from the +:class:`datetime.datetime` object passed to the parameter ``default``. If this +results in a day number exceeding the valid number of days per month, the +value falls back to the end of the month. + +Additional resources about date/time string formats can be found below: + +- `A summary of the international standard date and time notation + `_ +- `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/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/isoparser.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/parser/isoparser.py new file mode 100644 index 0000000..48f86a3 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/relativedelta.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/relativedelta.py new file mode 100644 index 0000000..a9e85f7 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/rrule.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/rrule.py new file mode 100644 index 0000000..6bf0ea9 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__init__.py new file mode 100644 index 0000000..af1352c --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08edc69c846f589e4a82ca2b83b618a052a7e942 GIT binary patch literal 680 zcmY*Wy^ho{5Vn*33AtTvZ-IgarCp@GG!$1LbOHnox`sWFTwqMb2^Nl>vmK603opYv z@CLj=S}I-v2?;w{9Wa*1^W&Lse$JQ66nXmo_SKtj7@;3Q`IlB+IrZ1R@C*=OiFV#C6wIb1T1h-)Q1;LufpJOtC+b_}P&QFhr zHn_+4J)2Vsx}cOyUDvvzPh6+V(sD=Uu9Lc8lFVFJ3dw`PFjevJ)jAXGBKW;}DHKVE zXAGHE+_{d-xGJ>-vIge36E&x-ekZC{x0W1U+xRD8oh3(xTP;6wDr!~<#mrS7pYNXZ zcc1dc@WN++UH43znz`4^D50vt_wgTv#!mgUVR{@942VR4Neq#1JT^0L?jG->GsA@C zkX^p#DhtJBomSjt%kO{pvvNSU$7h>KpHQlp?}+v(rL~4u26;j0Ma$&q zF|o({icHw_z*2ZFR<^i!Kuev6skBbW+;usnLJ3FdadS14 ze&F-i$g>2WZKi$X_Yn}n4w;l5eZFsP`281lltOf$JRD1X6w=sxL#{=X;t1`}D2@F0 GWcCL+gt-m? literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fb8d20faa83df3465409de0647d04d6bc148bfd GIT binary patch literal 10723 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 DnFxmb literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/_factories.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/_factories.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3138898f93f6ae3d08aaffceb77abe6c34c26267 GIT binary patch literal 2834 zcmb_eOLH4V5T4mxtyZrf$O9*VAP7Ze0oy>5B1NSj6qLD8c7a1e>A&lS`Rxpv8w5vo>%vDe_w0AYc#3^p1*#4@IwW9 zf1@)0c%a;ariLIm;WQ!8=IUgOR-2^-JADha8n=%g>WNOiOcT5U^mAqD?3 zi8ZKYrgx=?c#MnZANN>MH=rX(n{v{2o{|pblsiv?wrl$?_n_}RB_3&)z-YgMrK3SC zOi7J~Ldp^xVgejbG-F4uapP1OFOoaT_`N-RAHn?@i_=IcSV8{zWL@`%>%(NYIvNb4 zxF`7P-mVbo>W+#Z-C~_=okv=Xbds*?@jB~7vCd>7)Y@=gR=^xKg^4B9r{jzB{;d^` zEZiC+P~2R#K*>oLZr%&zmEz_T_s~WHXSRv-VNvMGGQ4DfqPS)pr72?}l{FkahoXt% zWfZS~Xh2iAozN<6o_6o}03TyEi28ytQ)R55@llHXI%AJUQ97Nmx3#C5#&G~+f%d01 ztzqkewT>>LuQoIRt$Wt#7+slv98m5-Qx`xKpt67>ZI`th2 z6rL)P({p#k>zSZfihe7+1#!mbXO6BF^8i|T9%dyjlowH4Mq$G>6E85Y(B%xh80uZ6H!l!jyeAjIuD|BB(RDk*&vep=IXNb8DEve*A84HQrGYw!u7DJL5yn3cKJ-{kw<J#gd-R;-D0NIK4AcMzb4J>aoB@p6}wL+7!VdzS5A+tE@E zvlAaz9>Nc1Nw@s_9g0;Um{efaJA`W34RZG`(N*jnKvKH3o+p1nty@RB{0dd_A-PSy zA>WekN$x?K+|3Or=N=R~9X3ogQ3WI=Cfzi2rlXW80j%IkzJX)zj?ktGaN(j8jZ!^@ z>UEfsEjvHVhQ>|BK)#7;8Pr6Jeps>v$aq*NjGtM=8Mi0)m$80Qm~g+s1YqpXIe~Ky zG7!+}zn&M+3vQFHoSltn!P-13Et3lKF{SH_RJLbLq9vr=aWx9c5=UZa3lApw9yE0g z#3^o-Iq>QU1$Ozst^lea{IO~IKT=Cx1-oHIz78*mKA4pS8>a|_6q~ug*aCZ6FPNNB zN4|x25c%^5S^mA4K6hZ>B7N+i^GQHXxU&&sT#ILcJUNWckp$|`5=m|W#L2|5B(a|Z zCnWKXNm2sx6eIyM0ZGcRr({VI07(X@bt`9+M7|9UgjM+wyyOiOAqrceZ)5K!ig!`G zhvF8B_dyhpr>b2aW-9raO;In`am7-FKSBLxFsUwqAb@p1{W9WD1@IW|A>EK4;K65M z`$L%c7}^ZmI1<)PfFCaSsb>jqL1k)jmZrj%=xGgZSHStTe)f}4wvx&fw1Y{qe?OKd h5)VAfwh8V|zZE{kj~a#l{&l!h-Ko3HTGMY{`w!%xbshi! literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1053e803c56312c19888ce67912e2941d8f20d4 GIT binary patch literal 44848 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 wj~3H=ZcU6#yh-}1Fnk7kQVYE{?&1G)@xga7~l literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/win.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/__pycache__/win.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f981b4681154e6143fa39a9b8f4cac30355e7701 GIT binary patch literal 11228 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/_common.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/_common.py new file mode 100644 index 0000000..e6ac118 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/_factories.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/_factories.py new file mode 100644 index 0000000..f8a6589 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/tz.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/tz.py new file mode 100644 index 0000000..af81e88 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/win.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tz/win.py new file mode 100644 index 0000000..cde07ba --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/tzwin.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/tzwin.py new file mode 100644 index 0000000..cebc673 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/utils.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/utils.py new file mode 100644 index 0000000..44d9c99 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/__init__.py new file mode 100644 index 0000000..34f11ad --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb0978b7f676f3f59e733046875a169c131201b2 GIT binary patch literal 5662 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 Dq4M%7 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..89e83517b562451622cea7cbe1dbfac5c3d2513e GIT binary patch literal 153315 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%0D!KtMVr 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

yja~WxFc`yfrj%BE^ zgT@-#KyX5_A7&&ff8<&bkbgToHR_9n62`GWGwRDXOZXVQZ%ttQWOz(DyDUVt6~{kO zTO;5$fof{IioMIfHEgCF20xs(mb*8>s9d6j?ar=5VxOmsJyIEvc@@&X-GYd8{Yb_c!>+W$Ctey={ zrn^rhvqb~i2C;Y3Cpd3k5*Xm=II2UsGy{;`kqHb4v@k5}(V0Ry=R)u$(jL1baz{c; zeyQyCcLp*^3@;P&Hk-3zvbfkJb$E9BsIzA_^AD{F6|2H`wLLISv6!2Ls@88h1CNl< zPqA5C0;b7a($dn+u-sH!Mh+~kW71gFTt?!-0x>;UsQ9n&0W9o-g$130-PGg@B7^rl zFx${I)QZG(vzB#^CKcO=!DR*>*z!TnZt6#F>zMn(pmei}*@dl(?vq*JwS z*%erZjDAY+S)U^%@>hB4Qr};#k!#bhOuK&71^6yqNoNnKX_toHTO3Vh%yxYSob{at zIjZQHf>?S!#pSA3ifU%-g-!@#^gJl1B!rZy!~K1zyA4hk;P z;`ma(nySAiYS9|5FG_59qvJ|roa0K3Oy6ssY*A?nb7p9`w$iH27}m;Z&dI;iToKC9 zxV{GkKP%%(-Du-W?cG8&u3JC>tG28r8(72l60OAgnz`hV92AH`e`s7EG8L3gjVF|@ zW+|2mf=LmFd^K{K-?Qj6pEY<(4#njPO6koLOR?lYbb8QSJ_yG4wV?DdvBh$Vxa3ew zZO&GYMsuZ8yws~DO~ch+w$!Ttq`vVQuG(BBhig)5GozygrPv!B3ebX5Q7YHbLU9n{ zzvk2>hh+aXr`3E;2-3L50(;p2QtN1qYX;PkLu8T?>qL+zwN#s-0b!KWY5~z<4p8GUy;D4)0R*Q*Pzv05vS2qOinUsq0?;Z5idZrqrIJ~-(LOcZESpF3*<B!fY`%-VM73 z*T+(3OD^$k(=IO9B=F*tQn*ud_=db6;l|;a>ymRM*UQrh1c~G>19X9kQNl9^H3X+qAQ2 zS#A8Zuxh^auE*~fm~GL{TYP}A2f1Gf1~!_7funBQVZK{U{nQQm3BIy^qeut(iuc_@ zk9YfSSn+L*aE-15$K_nwP4QuPO!2d&_xRLg%>MPtNt;`}`#(R=x{~pX)0os_`@;4s zsM9~v$-lHp6?8Y)W!5BAS%j#(_mg-`{Jryk#?h{LOEucJaNqhGE+np&B{t7}nF$PB z;aD%6|EMWvZhAIs7-D+%#-PUHY>nLcYZ!WC7Bcb|rBEI=c~i23SeWAtpH{<|&xGQO7li z-{TE=_t|TPQ7EL{7S{h$`x7l#1mV!M+ESTm4V50RX-#I^k!ltLaF%?4-BgOSNiTkC{?P#cHFz72>T4(vzW1n zK6oZJ;V^_x5mlOfW(YJpeOdgLzeIiitGTqPo9Jijb(^UlJ8gA7ACZa>= zcl`vG3xW>W&w5^;tZQ80Y!-0X82e0u(VJ7~tH<@nZj!HU~(F9e&HK(};80=2J)DIY1csNsKM{8}y;kPxtSc;r9&SobweBsEy_5|SO2&v zR#sfe4~cD7y>{{1lIIzXW^0jCjLGKmJ{4x-dA?(+ooh9gAJuBN;Wc;mx>{gM)yELb zZOp9FvawjMXgs~noGt7kZErwxJWkG%0qQ!|%r61be>yJlFM z)SHGEU0dDS>-~G6ZJTTUp?8)-DC>)rKEknp`>UN)KlL#>EWWo-bL6?_sQ{6wsFi?^y#oW)*t=v`%|}8Y72rHL|wX@P1N$-4P7>~*a!7av}>=)*}is{Ank@n zemsyfHk^2G;dMA@b8EvGbm{ta!+X&@zp$u~dGarbPhQb&M(M9T%0x~H!VE4K(H}KJ zH6yzEMu~++B$inXrWM@JDyahAmU-MXuwgJmtd84;@k_2 zuM86mMbyTiW{YHp+e&bUdpm=%Xrok80F#8mxDxXwJk6O*q%a+V5tFoao-QeXbv2T- z#jc%4_FbE2$VoPd0cH{-Er6wb2uhV`EaG$2V;_=WT0TVJ_oH4RV#dCvuS~=ww(#w-3jgpVGjMYNl6%$bn|+reyj;k)jBsQv_!{vt!|W@=I&a>|*(b}UQU67xX5 zl^4JY)^@D@KgRv@|1quq(}2vR$CH1H3Ez!n)VE#ABpg6FmD9^g{;(G<4?qT}4gtf` z#kE18at&H$uE?DIOeqeBH=Y6ha0f7#!TzDr8eD8~g)V9a!0-jwWGj8nYdzHXbSn{`(NqdI99b=^u%r zpr8m|b$~H|IR>9D3C5>olsn)Q`3+Vnz>v;*Mq04Dr$B(d8pY%E88w1c89C#F1##a{ zBIX$=Q&y#On5?D|3}eq`-eB)iYHb1vm2rcr#GW9iy2rM zhksmUw^QtRXAI8+?gplz8Hc*Y1V`9EEv#{b)ote|O}(aJ%wBb=CJq|;t@BNPt-QBx zuJ8K^Tgw!c>KZ&xZGQ1S_s;CrSEMi6?kMw0SjyzyAFnhJI4K7Iz*QpEBd$a%_x827 znp#g?Upci4a`($R+`9SQMSokocp7DH)nQS#XaaEYuHiGyz-H-}o-9R5(AdIw0m%%U zI06WIl-H+MBsy!B|6&LOk^CA%nr?7D2_F%Eg4!~D8+ja^I8f)?xNzv;2rjXk9?Re( zZef_2sTfWnRbc!wZSS($2+n$ikWh4t5NtF`M@OaFM?PIQ;q0_dCZ=-%3U(AgeGihT0i+}maUcw@n3 zX3Wd=A925F{+Pk?oj~)krvHkR&E1g-*cT`8g;DzL7BbUaeGmgZ2R#c8}o6d0|4XiKZodk+W?F?VmXxbKnVw5Sa-A2Pum#9M56Rs25flRhEh3az@;(Yu^X^C5+J^N2o4 z&OYV@g|vV*)B*Z5PB6a-DbC;^=Jl8L*D4k44*t#|o-dP_MwsFZ?gyovf8~ogTkuf? zrBF3HFN!(ul!BKF(qOV#(t5uT>R_^vyrUUK@b-{u@^*wdRdbCdUGrsB^!AW^^0s^p zNE1H{;!jFD_k{w`b8cGgtWL9Yep>BK2>I>q4A8ac73X= zCeVOZZ4-THamVbuaIyD!(#iOCIVAgoO55z;Eue&PaEnP6PzG?Q+2gqG+?DGUYTw^W z(I#zz!Ds+)1^9Q7Ps0q(8ngKQ0`o?q`c0Ri`3TR@Xz<%b%H2{KmNx+U9P2_+}9J=2~UseI1$@JDsOS3}8m_j={N zGXa4gRwxiWjp`NeYT)w;iYBDh{s$p}1kbL+L&b1+t^C|hEzuTS?SS`7^Kx5uX)tU&j^-&#`yGw+aD2z!&m$@{Kat=9K=kT6vBlc%UX!XVP5zpN2@xs~ z3ojF8TYbczcRL6*ClwJyR2Jh1l1(#3vB#q+mL$FG;!^qjpZ0ssFU7?;?5sdjWYD}2 zN*@{s;DHr^@6)CFd!1jo`o(|R;QwjS{--5~z@HdEz?P_fAy=r=Wf1Z|CD#9x6reKH z=Ul9=P7bt!tNMRdWb%HEit(HGOgTnO z>wOGb=YKx^PaAEDtRsvrOxlMg?S#jq)2aU3|C84G0fQF%r$U{8+BRkuI}x1|3rc%7 zIJ;|l8x4T1>~E^FGX(s+hbqC1;ZJ}RF-eESl)Kd(*63>PWwey4$-RpJ81?{I-LCV_iE zG!zhp7(M0g0ae7dIdqIBYRwnWFVCp-05oh10KF{*A=3qH_cEWrpCLcNgVq0&o^1mb zctB;9(UZwG@cdpUktKX50U*S2CIzrDUOU}D8I$9KJo>j&t0QT5{&P(ZOSJBFL@#pc2Nlm?>$?t#fjMlW1 zEBAUvv>)t`-`$d$X!iD@G(&Y9EW|A7JadXF-+tWp7PyforyFZhk9o{R674;ry}GHt z&%OVcnlg94(Oj11z6Oh3uJQN0#(dhx$4%pNXZUe{wZqYVlvEwAC9vunpMW!?uf(5H zLhJQ76z(0$pfx90bNy3kC|I3vJ3JEgN-kz`gvot7aqe)0lyBo#$YUyD`%qD#EoAkU zD0|g`%-Jl!mi6<)Z1RIiq%x%`(DIR) zqll{5tvkC1#D}HF+xmDS2W{qMC5&pF97?u%ItL_0rXol%J6}nO^hh)6@v6noRZV*B z{RzECyGUo{ydWw2^rxQ+xAGtw#-1KNclV*!rk&oeN1FE{{b#Sk{407RmxMb^(t}=` zu=UO`dZXHO8l&1+koto(fZj*~*&pF`ug&gougxrDug!1Hi*zXvd9~Mp=u_C--P;Zm zS!yHo?{}CI7#Hd2ptkGI*PmjOhum|Mho1~buGi+qsnL}kI3 zD$;*;i$DFbd~-n>%D>5z20Hqe+FxXor$7QBq}S#x-X;(Jn`rxEY-$d=9?^(h=wyOz znug#M@H`Dgd&RM;0`M(!x+e7L0?pj_l&wJc;Oz9jsO{dGc0j!QP*puGiHKKS1cxM*gNF8r;yz40{@w6&_~6aB7drdiSL zGeaoc<>31UB_N9Jq4P1Nl`7Mzvuh?4Cp4_QG-6Q$fA4buPZyzCEZ@z}K2{jeG^P^0DHv-*h0*%|I|Dzp zvdM}q|EKSl^Dmq6kD7gD8uxx+w2u;vozRa+e1*=?I)~q}z!7}q*Qq2cYTtRXouCWgF^D~r_FFtFr}Dg!|}>J-o%<9sMeWA9PC<2 zsY)H>{lB>D=i^J%XXN9@+VDv;K_F`XsQyY$2ANFvBw_wdP7i!lg6byr{kMEw}X`Xqi5kCYLfj zCbQiBp<T)2hs|= z&Jp;gdM3d^aU5-wd4+_Az89AE^;n2eqMYrt)Bg%ga>O7QBW3yMUgZe4THrxIpF?Ce zK(BHX?(F74M4v;>2&}OQQWRgf?h5(j7VVfDXGmXnthb?r<<>S)V-xyOaNf0tocwr^ zI@xj#TRGHFqTuhb;Jak3g2UdqV(!*L@N5KNr{&W&bMfam7pZlVaKM7L^Cf$yV8h6B z2M&>s{!_NE^8?`g570z2=JVU7hSxscB6zF9u@lu;k&&~T)aZ#%7Zd2bE0Nn@q)?c= zc6OYU&;MNAj{US$r_N^I-HUe9*7#m)dHlAuT2!!Y_UCzarakcr3lH@|f>!?>Huvfe z;0xXp_zPes8~{^kgs!^B=K-f&oEfwGFv?!-8s%eyLB)o${K8`&clj?J+0L)(fwn=7FHeF2+3uZ2jeGAl;+@Wxj_OD84sUfV9aL^T>rFBa zZbAwFYQ|dAoKSdgO-mQGERuGRmh#?P2M=B~_ghcZ8!8z6#jjuZ6g0?QRx=^=E1^UR zCX{QjcBWWPLXNNZ-T7t~YLCBY@W=dCyv9hz^x)|D&V=Pvb2ch@(k0S;vw!p3zn)81Oq|BSyx zJZY-sAF^^vJ*&y>ds0u~J)1;K*qq_0pOGn@T-npBk0@#9R^A1-tqt2~R6m+{1GZA+ z6L9yb&Nn62wxbe-UDQRvT{h#3--E~1zb;Jws`;EOFQtrOsadX7s;oU17#O?jKLy`M zIt{%sGbqn{Z$1)mB?T2&U$3HG5TnhOrp*@ngr5Ip&ejQqv+s9?5h6MgxQy9)*>n_z z*S_2`h?E(_v5I{FoGw5`4NOi|{D*g#utV`Vzf{5;qh@R86FeP@vfgpre;=CTGcvpXJ8M=ATje}WzMHv zb=JS$6?3!;6nJBh0f~7z_db zEZ?%QCPW%TofAw&>aNGy4R$OK5_p&Ck;?S~9qToVi+s~;7nypzn6Fi)dfzA)<0ce| zd3L)*0dDaFvNGR$jP>+p*w>Byb!pRzfZ=7C%GAt*seZnv@6s@t@mdzjR(Q~ zNfJnJD~=1<60EJ+2I{fOT3UrAD%uV_+rYIqE>AVz+D-$%oyM0qc?sK)X+y34Z}pAM ze04RvSlMhWUn*?6_yNDd>6f(HRwRXU;+AK^-s-UPRBWug(U~7TpMJ9@r}^wg`nVBe zJ<+!S8-Wd)wqz&Kxt2L5uMCtkr`41Hza=;;x;?eW)^{3V{S9T`{jXLFT9#{mCA8(2 zv3@wf5lL->!{BRIOKRYJBj+^$SI>j51&!7b(i*onGbm#k?4T4=U2T5Fej$cZuH=n_ zAUM!TVqqAYIrQwDIHOChh~Y&K#f;g4bMB*p;-mF*sl=l=Vq zF(8p%FHuH@o}R8C#q)`eVZY(75}a|;Rhulh}O$YCN&=7WB1Q`IbE6@QwX_c0l7C6ywHy7W$jvsglK=1>oYK zFH)-e;WA^s^o?5fj*4%^k@j1(nYAZd1 zbC+CxZ(BBzx67(OO#Nr^GT7XT+*#G``MM}HZq2b64?#hxu2- zNyU8>p9L>Pk6|}G&xcx-qy-|!%8bNH!#6`jiX*vElUC6LUW&X!M3`?G%(z#?i1Te2 zT#^h~hKPhK)cW^TkSwBjaX`%+s9}4Z#6c1UbEIQ5`<4{IDZPa}M08!F+HZvlGVVkS zX5T2`kB-TVW_9UcZ7$mZm3e%b(C!LBPCU1r_}r>8WsJTEfb8@I$kR{Mv<6^=th}i^ zuAt(AxT6pwwtgIVHBX)wG9q}l*7Ng|bmyto)qg_K`}v6<5$l!URupgCtfGBYC*AClT6&+%E@;G-tmvGUQqG6OPV%3aor%Uid! zpObf}9B^#-nzft)BPsxe-9cYX189^Eit><5>?TSY{~xqPz<)btaSFb(NZ@JiMeSNS zg@yqq*T&IfcTlM`;E14KHA4)t8)UXJno@S_W?%%w=gZX|piQCm^d25nPog zFRKW|k8%aPn7w5fJ7ZhEF(jvVaHHT4uW=Da-$TOYr^gUeT0=$| z!({m=TICpHwea8S8mZwiLgq{^J-1cJ#xkSG12u~D=Pi;aHXg-_Em4a)t3g@$5*)ZF z5n7#bBp|8x_b<3Tm<1rpOUFZPH!@upwSC9g4lb&TTe<|Ef8HDKfb%uz#zcSFo<`VG z9zCWb<#=bX|37rSV|1L|_dgsoO{2zYY+DT{c4J%9pivt(n%HP;+qTs-wr$&*`Op3P zzIa|eYt5d0ZGHAR*Q}X2>zwQCV*_-Ux>45e_t<2J(b~utdO5`#+}+bFoc2kdabI)(a#>jz8SR0@2!trYHj=4}*mzbxAh ze{>L&UnSFH5<&dJc<$Q5c+O{_CeQ(n-)TPzy;;gw4>x`Z3CDm$?*MMt$^NwYp`Uf6 zqJODL;p2VhBP0GZh-jQS7{aSt5J=j1MRLoTs6-ZY8v_!QMDjFmnECBQS2)^X51p#a z3b!^;C|u2m_If1MOuTxc^^!a#OZ<0L?iEv(&7jH>bFF%)d_A2AILPl_8+;Ua{<7&g z4tf$Xw$(Jt@(#XyeUL9S{>8~Aa$7J1x|$vFE%*R5k&VMzrIRPTvofZs3W&ja49P*Y zo(dql8K)YV+FZHm=LKsM`t(GRnU;^ntT`r;@tkV=+~u+TzCD8P0RANeDlR@g*HU$> z?4+~oVhdEO{?!C2%h{IEhZQH&?^YKvE*PpOBFUI1hBRWkZG@=Q5wAX%9-=eN&hb4R8{2Eu zC41+M>D)R159SsVbtfm(ko7G!+SM8M)V%A$E)K5~W)b2y5J(u^aJ`G-SXdj6-aV?4 z0gI%$`#Wkn2HVvr-D^KTnCIg2hHuBP$MyDEeMF)9!W?N+!(KOCH;slT{Z)rx-^8>a zAZYqCp0v=21Mi8dPkn66O?s41!X_##eK#SpiVqjHF9NqOf}}5khA)DJFM@Lp@DnTw zJuHeWEQ%E@N+>K!2`tJ#Sd=4JluzO^gDM~J{(Qij`hbUlfTx0h_Xh!QDkzBpl{p8M zMdAww(aAeXC_G9DJjy?Klp}bQPaja|KcL7C5L$h{2O~&QUWXTNbo(mS_$t--s?_+Z zHK3N7z*brjn)Slj^uqn>h4biz^Y4WV?}dx&g-h#&%j<xHYEmf&;_KnM&#NXQ4u zBBEHyyrSJ_e4GnF*b6|o3qU}J!Rvt0x%yzzOXQ0X0~P+;>}=92=!<|3i`Vf%=L*N9 zS3d_x3eW70Rs*PN^rHA7D1X4~z|^^tB?vY%Dy1jBH}Rwm4SaUHMmL8P zpj03ckzv1?XzKJRgY9v{AyLipr3~hDT9HpN92hr{w^uz*7HqYQw`%5#ZXRzlYZu)% z{r7D0hv%esvI(%m{wTzOIlUQr&KgI^>NuhH_%(a;2guVP+45DDp_YJ8c$V&|^1(D>3^ zJ;~R#WN7y*uW{VTn5prYu8OzXWq$5E6R3`mQxJLF^0KKh^ao`_hU3cAh`XlM`l*vd z`p2OUm#z*(9k;g{WX+anBCRs>u9nmiuPplWpI@_UpR06AMVdsG5BP57G~LA-p6ONs zeH&o(P3Ex0r+Qv^^W8cyh_BjN1{y;!PIMn5>GVQ4ShAJy+1 z?D=D6zS60KqEVa?utfW~@O&do9~~34QTOPp38tnwYx04&ObiThL_~G=<*Px{~FraerfAYr!{W1QWHM7rfKs+ZbtJHka)WHmd6$3qCgknFa z{WH}5`#<}KeLN>h`sNg>-rs)w*idaQRI7vl)iOi1PGYTt#HhoSo7V)yXd}!Awo{xT z62DIQggy>I8IjOOM9E)2ut@``C|eteV|poK*F4A|kgXJ1dzOB4M-?bSy!a?FE;O(df`%A80VVWb0rC`A8+d#t=>h#Ym-lnK`l&Ce#@DU)!NZVrnQd zwW>XbOc)edq2aJ3n&IoW2G9SPa>JzxiMnGR)RjsKio*bPRe`z|heKVppp9tFgWexJ zC|VtT^Oyfzo2*j%rJ(nbRqwzZ`hgurB=MU-{gCq4^u$~gdkOQ`(&V6=A%E?Ql#3!t zrcp z56>W)q>tU&BTst`Gf&a4{~(`uUyL^)%Y3FIEeX)U5w*f_^*8=YNaO3~YFd_&>P0sw zbZY=axCt$xZ(f-c{tE&x4&9#|c?mjuN{~xx2>%IzhmV|iHU9eu_$<&(SF9cS>VT60 z?zX*z;GDMHO>YyHmeK$|Tr@!>K6Tl>)AelXLh6NfA@eP#l^bL%Z)Y5rCuT9Y{67-4 zdD}_^m~sVkDlsGo?S(A7Q?`DpxGYHJJtvSxpg+<1uVeIsaqt3XwV^_Sd!{ijM}&Q{?p2K*C<7e5lVCm8;r z6|d{I1;1J32uwhGZJyE>W4Z#6F0gA|obOVoRl@c!cP!Ib^{(`9Twi8T*Jw)m<)pCy zKPulx1A~$bJBn7L0E@?psMA7ivR&sJq!5r~NLu3<*3$=sLrI42rf02j9EJ+;D9N9h z4Mf6kl3r*A*2gCdNzkp|=y)k&ry-IGaT+)EXNIpJ=oBL%j;-?pgh?3!+J)yltXWw< z_4bf?13grIATKL>1z=c6PW_ZoA>tWaHw`vrP{+aiHYN8{*_(>T7h;32N>Cf%bIKgo@S);JSi!nGfNfbLof z^EwFgdJyv(t)>yh9UHa$MH+{d$r6%^u*{=rk&E@ZD0Mn|0V(C9e+79&y(>GX?fv@s z7qHzu87JV)v$64fx2~4#_OjG|kv8lm$ltRB-4oO`#FQB+e7M&8gAAQp+9ER6If*Rt zWni`NpQ%h#@YRA^f_(%>+XW2+?OBcR!Rchd5=#16^EpVr?Y&}t<466#W^KRO<@=IR z*W?Y3r-41krrQO#d3WyZ^Han2U$8LOb0GMmd7s0iY}oo`9bHxi3mWpmDq<(6SljK; z_lI7li|zQ0MZ$Q?n8T2cg}JYH7a|?k!w{~G`EnLO#g@eGm6pp>0;U6jI;+=U40i>4 z^xKHcm-X-I-gjMW1swReGKSAhbM;&p!Ny@|TFt zg>6Tj>xE#}zxe7n%r5E}KzmKN?Gi~S<8gJ+W=uFvH2;=RjZRRXbwUdyd+if(@qlNr zycK*{!>pqgYMKxkcNDMNV{JI(S!LWuAFn$!7Mf6wVc=AP?BRB?TZGp-F2=u&0pcU; zwI;SMpKC&XK4fsbb*|3+<;S)^ywrawul>vSVOhBO?fa$oYq18;uuUG5gSkvEU2Q$N zS%}zxQa~sPBBmfZr7OAQnPlivEJiIC$EyG5pwLWYOhG(KS60b0lhCDMjM{t(GfRnq z&qEjjB$Tc~l4o9_OR$)=*py~6k^|5xtRz^Nf;3d$j#5IG_%Uk(>aGz57${vef~Ryb zYx_9^l_Ek(k|~^xB+q(6m%=b>si@2>r3XGog=T)i6y&9JwU<2Gf~HATm5{Oglu3dq zC?s)o7rJy!D1Im-2`?&1B`PT)Drqh%86YZ|ZxV$T>=*jiFZ82-sI-4*uz%=Z|Im;9 z7?B?_(LyK)&?&!QNU&2%a#Krk(@JvFOL8+xax+VEvr2NaOLB8ca&t>^^Gb4m4K{HO zwQ@)8eZrWAA@s+j%%h;p9Sl??1Zz|u+o%KW5wlSwh`5*X1z z2C3e1NN`U)V9CvDOF`dTK=!-w>gwWF{`6uMh0{SNVO8T@HFp(+2)v(-FO)`^-T%vl zDF1CN?AI)ZVZrwRfzfgEfC9YC(@~0Zfm;?$z({V_{qvMDd{E7#&z?RBM9k`afun0& zK_*CFt9#%_k<+i$SF*#^s3!w^0I=S<+%$V_dty*+==g3*Qz%HMT==NB?vdc5NY~~RUEmWp z_Gb5?Ges^)DEn&FgTMAwlHqz!;wERSYbHm#ZeI{&%Z6rDt0L%i&As_7~ZVJ0np`ZI0VagkfDR>sw@ofN_g74I~*3hLX4>M(v_n}&GX?H4- zU0JqXgGauNj@l^p{nJ^m1@-3P}2vIO#TpW%<7R8aK3Wn~84+N~*@&qD_4_J*C^6F>Gxq(_$B zrxA&8oAVCm<3XG>7^n5A#Sq>*p#Jkq4HCOEDo3q=Db8ACf|cPo|3HZ0AqERTcq;0g z{WGn^tJsMD>Ka8FI;n~H87|%*0Wo!PNhdQWPZPCJE3Hr~y-+KoP%AT3pc<8xO{kT9 zsMW7fE7wpfk5DV0P%HmXtKd+p@KCGhP^-95t0dbz97Sx*acs*?lxeJ#X>7L_y@9E2=-jC^!d2&>Fx>R}ATrNll;~0t=r3&m$!6qk) zK>ybG5d-o+BZ}K{z%&H4R8^tUv0k{+F^nvY@4kv2jr<52mDZ38_HQ92pIe| z4hYrKMR5x_Nf;oagaw@1@&%kAELmVUR;gmUD5F!HBxC#of|LM7qTH)LW#yld45dO9 zKO!!A)l$!C)KXEPnSVkvGy7?L7ldZw^o(?tWUMb1WxV|X z6{#45knbcJZ~35{TZ*xsB2nB!kFK8=>};`a+W^ z_Ym$Z&*+5V=@l?zL;g1PC+Cdrc>5V}n*gVdW(V^V_Y|U60m+#IRSZ5%HtrqldCI*n zhSEzEba8{RPrD2Bf7u+MsH|)*gP&WMH_Ra)X~4x=t03wmFl$Pd{dL^KqIA+q_jH0y zmaUTJSvT$KrtL8MBF3N*0z^jY80WQm{DCaddO~?}tZ}cNyOzK$DqC(^7bBSksLZm4$+a zcd0AP7b*#MSv@gXE2DjNJ7)D@Uy%ekQ!YS4?vA65u* zb2G?lWx-m1XsxXg7{nx)WZxSb{4LC?LxR6C$!bJMmOkgsz2ziQ7aky1Qvc372ytN1 zwxE>mT0H!6U8m1ql-@NVQ}_Z978G=o){6dp)0hoYQUT`s2d;Yo=;7xcfzVGti#bWq z5+X_MZGnzezd@ioVy3rc>#Vhbj3RphTFl^Q*pq|WOjGyEg3s2;L!R+Gm?iVLZ7INsjGix4E!&%YOD2C1HAZI8+eIyc?JRv46v9 zq2TcnFW!=^=JW5$=C615_47{&(jDcCCZ{#WT{~A=>y->tT{!AsYbz4#CAR3dvUCsU zbT*SGn;cT7YZ80g+6vOgVF7|FrIMjby-)pfTK5Bqy6i&Bl|=|B19I!eO-0{R1{=2M zDvrYf2Jgs<^||`mBM4=r^~Yh+q;CJNR;YJ@rN%sL5(HK^V1iS1TqeE~1}C#OUM(Tn zr)?WI(zr39(q)(3hKLOA8+VvwlHS&ReUFc+45CmD4QhAQw*>PWW;Fh4yw5_HiKssm zvg&kOwcE)+I$n59YQ#F-TJn8Wn|qNXnMf`F^jNWn{V~yDQ@k}CI zY#T0Rn-)oqB;mPF7052n=!6wXjc8%WEl>RC^S!{9s{|TL#IV|`Aw)bDop5d;bA1Jn zQfq=I8SI}7EwF9>8Xf}ajjcobg@X9){JR|I(x2kOQ+N=@x@^zRAj#{)|#R2D7OGZ$VV3dO!%i@(BPi zG|sQGfF1hEsN;{M;|pp1e8hl3>b$r;JK=47NAubx=`o*RUUztJ zT+p=kW*n#n>8*c>aUztB$bdh-$-#TOnYG-*C9|s&(SIv**>^2>nO`eh2)HlOMF(-| zc<%+_E#&{$nIB4$EIUVcRv~NV*3Krtveb0m9nT~3K6UR$;#7{}UYD2n5cT+^$T`D} zxdFtr2qMXzZ}6R%#6X3?jDo>L^V1B6H#bS#=^@9MrpK6O$C&<#F)fNQEsHU&f-$YL z6iG!8nWuw0SVq44t1%LtfE{w*YL*P-nR z{p;ILmAu^H=P`QX9BGDYvhXymxrV%=&g?9>Z9mrpg(sOnbxF_kKqdN`J>+BI9|jO9 zBGma3Nbamm0GNyZrMhXQ`%;6sHu-zn3GBNAd%`M&Mh(Ao0OY9#K@_xiw{F+Y_T7K4-pH|Lf9I%cgA-Ha}zm- zf|2?StZ$W4r*vMmM?t=g5k^newo}0l2P_^OZ?`%4=oZW?PrG|L-%dZWta#lWOX=e| z8{W+**x_|DqoR5Mhih^w|FVizAB^kYrSZ}q-6x!jt$qRHGzeEYPCsOyiwTMsv8-Hg zqer-c?+vEXSEE^1Tn_rB+LP^c8xF^>BQ_Wf>Z~r?BqAQNh(M34`L{vdkLTDMVT26- z?dV2tX#9ux+HI?`z=Q(`u}jezLpGzBLlcr{_1{M?d!ed z-q@X8`n@SS9#k{jrFHT6Bt$!n4tqX>UsJACKHKO0VQtrdJRQe^%U>kNd#QV7w~kaN zXu$9EOIOt8NRdkdDPT%q11YF7AEuO?vX-2(m7KDdoN~BEc*oZY zBi0rp))6DtS!WoBoK%vUELc=DR8~AxRua`O5+n8xMr;B`Yzjtf21aZSMr;8_Yzane z1x9QQMr;E{Yzszg2S#iU0bCdbWh}=BP6S;tV>U!k(jsD5V{ zu~!(ecNnox7_n~{u`tUoIDc~LL<-&K!euJm=SD=I0H}eBj~=PBkWsnOMje}?H@Cu5 zz)R?_SCI6N#3wf87Z5m_$eex1h3XEXbT2&003LU#i&l5hf@CY3^qtK}5#(s#=0nd; zkoF)+{G%4ERJ|vou>`9Mnh5jQN0K}X4gaj+oRbG%y*)B=FG?WqrS|QpyTdDjfoV2j z7xuk)R*GO`9CDiY0?L{LWpFvd$si9kdPvBMgUbi+qsIHPH)e(QN}7UBWDO#^y_*8P zhR&^jFXW&J3ppq+P0*;7I+0yiJU7b_0~?FVH7FO<))JjT|U@5Y*uRvHGy2c9zP zCh9a6HfzN=<8rDkew|+7G zI_s}i%DnF%?M5(G5}}IK{}jf&Xoz--vyKYXamMKK)ZI5UamL43!_~1+k__9^j+DG9 zua~@G(x80SG^TvU{l^$)noa(U%lhXHId@z*7gSS?_VQ`C%Bi80?hZH3u-!^s`G||U z-S$73B+gKfB;8}?AZ{r})^$8V&NVFhoA3~(csJ#;RJwv0S)5|zSQnn!0F{_|28?PI5~W)_~uYxq-_r#!YDn1Tnt|WrhfMCQVhA!>qGEY z!&fb{lbbF#Z9$KV8pp!-9(oF!f2hd}u_;MB*Ox>9Fw&dxvcYh$p^ZOeP!cItGox(hO!Ac&i@%5(SQK zY&upEbjtD_z!Yf@%rgr~tT zB{%2Qnh&7s63Ag2WEXYFg&ld|(F;v2sCKp-zjn!b(6U|0n-?&Ykpp76>|de|Zl$mp zV$31KMq+&Q^djB&i=d>B>Tj#K)HEfNCbJf2`%QjZnZu^d^a1as<;SOron3m7=$+lU zxELpr+ju@1=7b}FLKA;+uu=ZZGsMcU^%>NO1+AU;u008Sf8rQ&G3SMVaCu;2x*u@d z%sUq6JDq`n=8mN*)*71 zUHN`hWp<-)ECL^WV9Qnj{H!IRa@uI}CWqd~w*%MxnUdLOs0vJ(scjVm zl~Xw?iU(C3@4D&t2-5_qp$GvMpQOV=gNJu)dcR^$ixT?Ba(ID__8 z+w}Yi1UnvXj&4v3+99P9W#KMOrqOB=T@-3=N`W`B79 zGPuGGAtn%F1uRjwMe@x5dDj|p;Yt{``^aKi2Y6j_Yh;8>cy-^p^dPyQQiEV`{-EgiJjN56n{A!0i> zIiJO)M0(2dK{j@8PB$m~f`L53Uq*je(hLsHsEJnn*3P|VoP3hyN)&f)S~UP zT`X(b&xgGa@iIv;7MjxDc)AeyJ=^wh^L*NgFY0 zzN1KU)oAfsv)zxUa=X<+HrrK@2+(u)J%mS4Os{dO$#c0pO?b4Q z+X0t#{%o9irbF1H=(}-tR+F3AU+ag>hopm^qenZ$iMe``j{3r)jLA5z-jfP=_g_CV zz7$I&die4wbfW%}*OfT)<_BrguFW_qyraISy)HHZ5+gdA6YaCbhAa_&|CKo&8cPK>KRx6IP? zWEVkjGiX!0KTKnGw2B^XD#+I_YagKM#SyuM-gA_RNagk=a)rudfD|U*g*$RC(*;z~g8p8?}u473nAFLu(nCpKB?>ul4|U`Z?xuLL)J+!Ho++>-=N+|y6g=^oh~ zXlb9|zXiesMDZ&oj*2z`)3I|^4s@k)4R;SB&F~8Ntp;g7P-5LTxB-n0f+|mK`w8_{x#+mdAI}=QURPJegMOMQ zeeWS`Vq{_3S%JZhmi=xWQq{^%0dIMIQ2a$)XYkf+< zg&VZHo=J!!O6Ydj!>Gf0&$gTxmYuu~1TSjiKoF4ipnndtkgC<{F-HUS_iQ}%mPe87 zza%eIVS*iQUyF|}iKIb`2Nz_8?Y>hVJOW`oF_b+t@rW@2< z4(rp-yddR|xpX+v?_u}nls{4I zVBFrNM}kOCb(695kGtz$90$AG>=VH7=1yzh>vJXOVR~+1Zf8fd4_VdtugnhQf4|w& zK4h*Yo+e*~5M<+_nlH+jiN8&*K_ke{3aqt8h*V$;8;+Uq zyFU8))9N$&u8N=gV#)GO&6(=X)e(}JyjsQAJgJPYb^0k^Z(>|`j-b!p{Cx^D_dyS; z-T(1(trTRUSPH*8Ovj$&g|PdNltAKh&(lw(jJZPu0zTI;>t-R;-Jow76?$~v8+=5^ zo?LTNo*mMxL{ey!p51*@8bx%+HnNe;#gsV?pFa@5e+lb*bKC-x_PpNv-p=erebhObYL=g|$ zC!r0OgjhV{i06>Ut=~$;t?yNllf<4C!J=A+Sv(q24qw<)4%>IiLLWPaQYw^~UO}?D z)a|-WH2JJ?>i{R}cDGRK_82G!?8&-zi+@Uxu6vb>ws=H_k^&TfpLqCU2#S1mYT_(Y z=h-A%=a~Q{f7v=gE$U?wy128?R38|rm&fI~IpwLBzb&)NMk%_&3&)*R^~aup1F4qZ zab@b#UAUxEsoN*RsN0RVWL+<@hbhkE&MtbPy+ekR?WJz-rjvrxP^=RarC#<9_cG1_#;sTXq;5xt z!X-mFUpRGpGnB}%p{Z!%&a|xBksAzIv-aCEa9vM8Eu+KS^JA!vz!v~q)#%ZGgY0dd zYqHz59l#3nPIC4J5I_KsZ?Wyn)}LR9=Q=D^4zg>=%BoTIeo>cu7u#uHKzF^=Jn`7@ zz5Q#y8;FSaeDcfSy&q^9Yj_w}&7E(cn-Kit&!g8Oxx?+7x&Cs+uc^scW_ft#fIJ@8 zT9S?_@v1U$bRG1FE*KQEX?znY<`+2TFbW-Ps3OAbla|ypraZWSGoo_L%=4VNY4tbVR*H3byG$Z#a6YJ)I%XbHZ3SUl!_vW4-AxBEylhT` z!w%%|)Oo$INv%K<4HR`=;OaW?E(>_mXNcz9<&cvRSRWS(yI){Sman>quuuq{KJ- zcGywz`&zW=`))fOclrX_v~AOPgPm^9d`H88eY@Iv@p+Vt`g-v#@w~TyVEBnhr}K2@ z#cTzr^kUX*M%HEA!NP;KIa`+ z*jTQXip3o`r#CgtzJnX{UVK3RBGMk&7HYkhc2&niK*FW`v!YWO&tSyyMID(^bnPzoyCh8y;iSQ?pmjL7P{3e2dqY=%_S@K7k)yc4=nn zURy-uu4Q_bnQ`%?npc88jpvfaZFhX>bPhQW3=D~?Y7}J_ms%a)f1>x7Zkct1`wbt3 zZ%PlkY-!f~v(8F({d~p(K1Q2<66(Jp_5DGAxosExkDvJx);(lj80N92196K?3lsTk zsAeD>sTpprZ-kB%{T5Z(r@4 zdURy?2Hh&DsnV=)ZCpLtW@uk%VZ+wfg<$U5^4PAXn(B8U1(c^cE1z{yZ9)g-@BTXY z44t;WKy@}hm=M)2LYN&XGhw(fihT_4sP1gYK8=p6>i(kr`JIoRP0-uyVlQmCC_`@% zgnJAM5Gy`{=-ENM)F%r3ZL6;#c~m*?>d4HxJbUqs=a&m$x4w|_T89_L1xP+6E~J}x z6;#8pnqfXM44p`@>3nyYZu@l)K#d&%S7+TpuC0zl^LNvLs|MrX>LJU?KhXgGWWe>5 z^zJZ6wcH|Y_iW=vGgb3#gZx?DC0p(3!sUSdpyl9&GBKX#n78^_YPZ~6Q6(1DUotq$ z!`~Cwt(gpRh6sw%K4qRCLs8?KU#pg%x^ws2 z8nh$yZ!SrWP2ET?V@P$`3})NVVyp_77JsNLz}b999}sYPe|taqFjZQn?eXztMwi63 z;sq&kh@R*|_ZJ+^^REV+s_&62bHC9umS>*T4;z(#914StEhc)0mAZ(}vc}W5>Kx)% z?R&Kiv`eO_OGx|uxbav&7WMYE_Xz1M;iUXaY(P$nbhD1(yhrc(u+A;hcuGQliZ zqJTVVy@yM0```P6t~Mn;%sg+R7&d2Nx8aguwgGAtjyT-vr?@t0 zt!D91Fn8TX1V+_#K|}KVzm^o2r}Pr?ouS9nfar!fOoPP7hTiv=P|Sl?H_qrceVUS| zPM_Vkqe<)nH*N(#c_%rEukFF)Uao2V>JGdW_d1bk1%*h6i+50?Uv1J;H*GS}f$yq> zN|b7aj*dWkg54=>=o@#T8P4vNf8MOBGUDday3s$RJE^WLvP3k8mv;ET!jebnAds3k zZoR-t8>mHxQSlCW9&!;t!ny-&qm_KLD`D+pMQ5V#^s`TzNk(IQAE^BFHf8&6kA+4)f)Yut2L(hD=%%@ZC%Ar-U)$+Ua5hHR8WvcD2PESv|`0W z=Wp{(v@-<2`MTjS_G9!lU^s)1VbSxZ8%+Sd3i8E?q` za!ytmwO|hJHg^iYvo%Oj(q8F4SOM_SjYpgTIOVGcKyx;)_&7z%nF;zP!zJ$ze3E|k z+C}eFXqe%ULorCT-)`{GY4quV)1vK~+&yICA5)h;ov{8}1N1aB9h!4&+y9%QGG1P| zvtq8!1Zv?ET_k6xPYu0zAqI4?LQ5icMZ~;`_i&xy`-J20dd2s@ANKR~MIc75{dHR$ zPG2}~8E?w%OG5b8nvC~-m<>hm8do7!MHMa7F1ah`3&tftk%#=Vj}i~L7K?K=Y^<&% z5BbX-vo`#W381pbphNxwugv%>^@Im>qUmLB>tW&lXVq4#FnSxU74mKHcN%P2_{0kV zQ;#^3LB#gL#qdw?YZZ>?l<2v{53Q)o$2-)w29DQpljPTM8|vu32-U*X%crM=O#ZI7 zaNQtke{2j{>I)idl4*b_BhLG6gNo`MdK@a#6O3d(Ew`_&PA?)kvDOu=YzXiP=DNlo zT~tKls+U~7Hw29s*XznOCN`1)j-nPx8N~MG?7Kf8MGMMkV9uG zEod-kBZ}Z=psThYXXT0F=uSV0<}l-+%Hm*#;b0CYxG0coNEQYb)`^!@{PFnNivaZP zXoH>cL;(uCbz7*X4Q6ObRI8>!ilZ3YA@LhI5gKm*^cT=Q37^mc^ryCph-uSZ#t0a( zZ@a+$`~H1-=OZLLl}&piBz-XP#W8BI^Ab$nE$kuG>|jFndvlKcICIGhEV}x0$8VD? z5&a#E1bP~_zKLx{yp^#l4l@7Ie(QSevi%f*_Kf{D+czxNeO0`3fhl6cCHivo_Ei_x zOH%FKEllNdXk2Zp)GHSpt)(^v>f77e(dp`yfQ*D!yPCh+_~6bxTvs}pAgd$}I4_?3 zKAr(Yq+Gcy+?O5_OUYL)%l0?6tnoy1&`6Aye0XFWqru!vd^N%S!fA8IuUgHyiGY^& ztYtDc)(qGGy$hFs?>4Nb$Iv@}#5-5lV6aQY{DC0M*DL;-_?&S*L|9tQLqfM5e+uC`gjuoMN3UYRl{F5 zC9lbbb>2FQjPlhWY;Cshe4Qflx{%uf$e~{TGs1)mq&fuVn_m_{$}uU#x&UXqq4XDZ<;=pL9+ zj8t9CZuHJ|wQ}$C>Zv+@#}$_3;?DN1njU<}<*5(itFb!3@z;!3Uy}c2?6~^RCt7O) zZ>?u$xlfgsrN+>8`-n5KHx?7%VEZm;qbsbvpx#SI@jyo3p&)-w?S9Hy>61v>&| z9fE`js-y*)q{U~+zohQu0b8)leO+QESdtdlk`_3U7PyiYc#;~xqq!4&Lh z>LxwBW4ddjvT+g%rW2Ix=uUWk-YH)2AI&BxYcQZfSW5jT+kp%z6Y2wII3^BD%oMqw zc(|6TKk+(;bURw52?kL*MwS&DeE0&YGyiO5XnJsHWr)8NfEhYeI|(_?ax-Mr{*{@X?4 zYfrcT2&~_Ix$8#+KS#^`3O&+}7fKi!NI6OL!LT+n+*S#(CRX*1dZv*mjq=8+B#kof zKue;KpOI=IjQA15SoL+?4BbSedg0g#MC<$c-`YqbVdZ&#@ZmvrsJFAKv1_27>v>v>=}WQ*RisZ(!2D<}z& zdIKXsTmF@JPbcR-L@@z!>!<2-Eoz)}3D5GDL^Yf5PsG7<4>h)w=`NQ%1C z?HFxLL$`>Yb`v;6M6dh|vLgrC-27>taM|+N$6h+!j`{Fpm*(LGR4gaf{y@ZVc*5n` z-)h>?W>V6rdeZH+yB$|6_e-I))Tg>u_qF-y;9GbU%Spw){u}QmbkRYmYkyeL{AiWX zYiXj@wG5YkS*ei{aivtt0$*@G9JQ`qFV+;WEVuwsMSiSyK!phZxxCwt`8&E8^#83a zwCxSLzLRJ%)OlvDPpwcg_*_GD$npi+D_;#~u>)U3X^R_iT18b+qt|(KYQ+}c36_sM zbvGOOy2ibvk2aapMpIwl-!q;$rxsJ$;NLU72rW-0EnRPbeM{zNkg;S~B9kuECD><9 z7MdI2gWCGH8l)RwxOF4EZGczmv-Az{;CgS=;>&RI@YZm0>JK{Ozq)Qtb^pPvkNZJk zu%KaWOT)=O7uHeh;@Ngf+L2rby$EYqZh$4M^eY6nz@CW|HudwqO9l5EAadm1sI3`@ z>^#iAi8z)7Sirt=G^)tays&#A2W41(bY&aQ(l+@m^C0;-(XA{dIrL!lA&t&Km5N_wSrIyQ<@6X0e&1@|#HW&H$ zc2e*MOP_@uf9~>id;M~B`U2S~a5is!PCyhWIbR4`v@*U*B5#2gvn3k1+7t}eoIq39 z7&f%`kxa!eJ;~a#-KO#_OnfapVh$@~WUBQiGFZhX?&29c*AIw0Ur1(9iOBapm{SZ@ zMOF#D6`_rG9UROSsPOti>WVH1_&O zK;QCFr?UwBzts+ZtYJEc46v(hF{r6#vYFeZ+ouqY&a$ys*aWnOF&tJ{p+^O-a#TXG53L7rVez zFYr9N5RSv26gfVA74j|rkEO4Ui{ktK20=nWO1irwC8fK&q!lD3q@-CwUw}@AX^;mLYfPxKY4-h%0Z!xDkY#WKmcbnDW6!;D0?( z{!4m!eCbMDj?sD%(!=b-kYhD`Wrj`sI%M+ave60>wTY25FnuZ+z8c_EOrwgb`(3P=lS0GRz-XrIYv|08>F59sNJ%h>t<)4=-OQY-cwUM2LQ(v zAoUMuoj>_|&|+M@YtwHMdqABXDbrc(Kd9&WbS|-l407*+d;4{H=Db3VI>2u&wTGV6l6&VYT(yIa5b&l#2+uZZJj~6Km%~{1A zUD*C<3l63nwH;k=O^J7|SiwT)B2|I628fLKpJ3sh+Jmcmlq#4u)pHZD)*a!v9ysCN zbK}2jBF&5B>pEG%(uaMj4+<)KadmRamPZJYr&@=_=(xa))E}Ipg-XT^rt^PJsQZTK zap13c=cWAr;q_sOvoTvCEu}H(dZ7QXFDpcbVVw@JOHz$}M?(_585BCjUUJwNKYS~Z zLM=bBe!?JSn^RY{q}oEcc+4aHRZS$X-1#-zzwaKUDfFyiZ<%L)_2}{N(9nE;jOqBn zOliIg##8Kz>x5Ygro>rqw$dF97U3Kc+e_*3+izUj2MB@B zvqmOdiLzjtB(5j;=I;#GGf_{jux_xsK=1PlE+VBlC)Jbbd(!mHu5W96b2sp(1t$}@ z1t;-11t-4XQ557|AN{-U2V0KdzxzV4rGhO}@L!-FTd>akBU^0dU~7(qt`olGuHwQ+ zhaU<~0zt*C$I~~inA113m|6O}V0%WW3U5wQgXfW}!mU%(;Pk|*@ELvdkGj)0fp*h3 zC&L9NvAExRle+RiI}pVxRk$s?y+QY6qQ+%c^GACn_`)^99n3VLt@5mw;zy}a;@KU* zdcMa2bTokFmI<~*)$)eqNK{%s)ymOE0-Sm08W3yZQf@Q8hj<4SL|f>6sXh+8Sq>b{ zAzye2snW|%BO(`AvoA)(fFD?c*$KYE8EhrpLC`j@lsSQq zhqY%=Y5nBwyX&H;CjELhnWb#eKg>TmQmnFwU?}kC}v@nUrFp0Dt6OBcdn(Irq3^WIdjFi?iEn$df^6 z(D+7Kb1s}Sv21lTv8>Ufz?s~uz?ptsb&lBm`{%^6!XNvN&IQgt#q}F=#Pl1}HRj5{ z*VVkKiWxQvm+0j7iD$(^+|8J}UC+RqFTKyis;2&Jch-#Rt6(njL2L7}JS^+=u^(4! zccQA6GCq{+ZJz&YkA>&)z=!gO5$(?8Ww0KkIJcI0(}}2$`H8K!+U?pj)^CQf=Glty))|Eroqc zeS{Z`IL1e`UbXBP{p&<(j4VJ#WLW$guBl_6F5+yxCW?C-?@@K9I~9@oS55~0N*d*Z z@!`6;DrS5njW_&dOBm2tW`QZsoitQAI8s>d>C%<{e)qv?$j0U6P5yUIBwm7sf`#uT8JK+@&XBy3ZPPlK1oI zxiDR62eI=8lc*)9BHded=;d9=G=#XDpG zO{$rv4i3+R_O=3nds?dh)EHX!xUJ=$?h9qm4>}!T^v81{sov);keBMroqzspl>*j3V9&09;Ncrc+*fmazi8$hv ziRE;a8}FHkjPPVvyc!EuFpP}g?I&y_trX)hVjlcgVl{_zc&)i@1+%m+<@6{#gBaT@ zSFwtYy}W=;I@|pQpg1{#sK6nF_1_k^2+e?+HKF&dV)1j_gqZ@7oqMz}t+g`{$=be-hBg1xUtj{OrCr&|JxNQxKI-~hN<+)V*+(gy7Hemg+r$??2Koy5e8nC9_> z%owq?S@cXEhU;knMm*1u8qnYIYfI}KDxm<@!h+;~W1*%zY2skZ3 zxgWNOo5-AI?R==B2#EE#>X1mUyj9|^&aoJz4?4>@UCZFzaqd}e^!3v_Zf;LA5xTcq z03P-cv4V;nhT!3G~B)e!akg#(8S%2!zb=yP=n3r&-|Rq@(Ne z;?MlM_Sv4(DQB?VWk>~QZ<6%T`z0AJeej)$Rr?X&wwb4c-MD5o@;ZK2Iei599A|tE zkt_uwXhlWzHe0$#i&sS&EXw;`CE&}aUzWcCQ=)M4DpOSad#h8@n+JUxUuQ>JwC350 zH!5QRWwJ|#GtK8nq3T^sNZ3(#X|04v7w)@9b?DiZ&ZG8KSrR95R#D=R{f_I_e*btN z9kW=wxbnO!yXxZgTrFM}9I{;7dSq64u-oLwX_7UdGICaRd#|ovULA1H$2zT?c>;6W zy(h&o+&y!r10XJ8{ok_wNrB(|a)Wb-^A>-W{#f!@snq*(;nRDl2u0Zxs!eqT7|TaM z8s|~LkK>Pk%2+6rgBmD~)t?6>J5hU*0Ujv}gfS?<27t7@On$IQGLCdtvsyBu@;upl zNPy5c;pY&&pk%jBIo@nP?Zr}^K5b!;F5I$m>f@0)V?H3$VCMUCt7kott_-;ol(B~t z34OdFd1x8CK(sHoC;pa6>(SvbW6~O>?YqdlO>%NH37PIr)OVhEBVB0_m$J6*5aRih z=wVytK!Xydc#%o}z>yi>yj|Q8qB*?e88%^cmn1ZICy@7Y%Y)NoaqQ^>S;$gGeG;o1 zZXWr4QA+jD-cz%xq#`fo+kcQ%zOe)w#IJb$!puPVThnEdfAoj~+;;TkHTAVHlHAuue^7s=j+PyjBZ*V)jIai?pN5T?it-(n;UbBv? z%uJVNEd%D53&QdQ&4bR3_yI}cz8xcsHq?wZ5&{I6OELZolUAb`VIsCTN53VB93_4~ zo(vf!*(fCzXkxxl+$;f)>=%k|-_`pTtMK^rs&Jb4E)=B;L3VtUB&^9k7pFn=LNR|V zll{@rxMU)enMU8WL#`@YC993ho7_QJkVkb(CW6blLXqMAOp~G%D7F5cns|O4%sX6A zvHCyaDM(EGN8p3R$$ta^NDv6c294Q;-&naQccB~5`)~kX7<9w7%#b231 zwawWUow@AX#)p<~F|KGf+DE?O;kBk(&FLl-fwh<&EvolQcK)n?@Oc3HQ@bGc(~$kz z8fgRr3p-o;R~lRh7YlC6V-Ac=T3qwAs% zXp_It@;fQ9(Tb7m8RzFSJZpjgJ#E-6jOZ+L_t1O5oI1tilVE4=}=d4 zrvu=~7vhHxh(?>!zT0MnovbdM_t9TZb~;>t%E@$bZ?xabogV=v7I(u^1KnEp6n?V3 zSFu?3aHm+t4-u(C9&yJtf9&L|Qdp$19k?rM`AY6*i?})S$m#m#dJ+U!dRUGVH24bt z+e)bAUf~}~-^#Va>&+35CKVy)fIePPUvo zGl=ge)HIqkxoSo)Ly-sgJDW0BSW19@Eb_kf4)~&Scl7TceS81+hJA}RA&~^nHFd40P}muDnytxR zQi7-h=7yaE7{?WTXFuvdY(TF8U<9O(YJyK|*vNk1hM(OEY#E5B#g{ps`dDB)^7|P# zqg&_CPICJb^|w`LBD0G#-tP-@#R6#UeD8sP8isz<`yteo2`W{rI8%CNyHHB6xjEs7 zG$K2`RX8c$A4wzAq9^KfS`-yDy>^0lr(x|hnAQ6*IT@UE7N*s4cCuIa*7QWJcYL(2 zxFD#vxI;jRit?6M<~)h zzpRm8|KbjSE>y5@mXt;484V~exD62zNqJX@F^6_JxKs!(u7z$v?c>$ds;mr&nG zhX+6^iHgH^leu`w6>aU=4Uoh<@G8YYu?0GxlD5 zU+4Ch=hyZ{_Mj=&Jdu^cv!8ZuPNL%uvSI5IKhaH!w>TJOUk^W~k>sI-VAtPcdj`-`h zKA_T99m*Jl4@DU9f2zhHf)Oh|m=XRfFWovY*}e1)5q;WZd_n!B?>+{@BIjC$UzA<6 zouR#(60ZtmbRNKz7VB&?)AKnd# zDQZ^z&RDF~is*6}e`=uBQ0y+}&oJFelV|V54_28|SgyDiA#S<-h6=c7sefQ{^p?ip z>N{YHocSRvS3y!#$;)E?ubPCtb?4R3p5syUb|INjimMOG-(J!$E({Q`UlJ#Od)BG3 zYeZ#0V<=FxwxP8}-z$17 z&)pT`6ND5vOjtwK^_pBzR{i`OOMIXAHp^yMTXfH_8^v7$VBw+NRkOiUYyh{TJeMr} zH$zu=fQoWzHt_b&dIM6u4oS5|70aV!KC1i(HQfJ&luZ>mJ8$q$EwDc4g&tK3 zA6pEfAc5(kHj?V4Nb@4ng1t;hBH;T=is3y7_;cd9KCx)T4f>TKG}&qv=#F=1RWGPv z{Qhdm8OdXYu1)pYCN=#w+Xer1^$~4gwpDqHyRaj$+dx^ADSSZ%ejwywDEe^#UsP*M znDg3t>qw^0@D1m>Zt1GMVOay?k!|*6TjmX(3vr9>KDRYCbAY)e@cSoX=r48G&nuy zq_IDwYjX{a;Ugyhj|4B^{` z?tQY@fHGtNDaBvJ`OL9$5-)5BhHi6whadBZ4$mA^rW6BL8IoHa9ONNFTDiB!EdKM? z8|PAdaQ0CvW}F*d0bDOS3bqx8&*U@@>n1zrixXs5QL-1T z4I%M5B?_9lL$p%a&uwmqG+%#c$Z_@Q(#slg*6VxytjqL)F{B-DgIc-IostOVr1;PT zZZW3P=T1um^H+ShCaQf*SW8M+%Su=)OjxT#Az#j5Gs0kVz+m%~(T1DRMuXAjJ)=!5 zqfI%Z%?P8-0eAyrvf*a3(GXM!pI7W7v%{&3f%3#c!I2kF9JDeH%JT(U`31`J6u>tde1K`R(}!nN*wJ=18bJJ`p@OnWE~PXRRgiulBuYmY^s5W{&SDK*{to z^%l0|3b-T}?*iU>;L0E$RKaIqi3i}xIlyPRe~md~WvqgxId=|xdkiyt-s1Hl`_g@u zps;PMd0R)6=l+rGucgJc)zqMFs#=IwNZF9fnd(Ec^bZT<1dbgbT3rh%o)eM17ri_w z=Bk~&l@mi68$xH?<3Bg7y7;={X}3DrmR%J)wN+zlp!cPJVE)7n!>b}3xcsX3dIM4q ztc=nycG?s3a9sg-Q($!7V8-%)KMEBrW1#s50zO^BMTmve-T*l14UP0FTu6Jn_z|zQ zlHLZ2CgEj~ms1@a2(o^v?d%%&MJTGz!T0dLK`opCakd_XGl29Mh&zKd%4vi7nTQyk zTasiio`3$y_VXX_4}SRUTtf`5A*c30{1zGNvyA7edNGwJUxtV;b-Ab8@h;QNH%OZ| zwrI2EvfKVxfb%3OI`c*AZL2t?u)u=xpF8(YB0nr1s%-!(TcA=b9YJsv`!V3pbbXMR~VeNNHi4KEXXX|G~D>CE91Y zb|lC?*uwe3Of0bBNk)T_l^8Rv|Agz=8KR-vF zI09Mb4((Y;YY%|k4q1J@B-5YbG%gxgg!D-SXOE!M+_%LW)? zndnz7F?V^)O{pbGPkFu>N&#`rmrAr>%YF2l=1P6du~7F+#tv7-paUr4n&^y~|5Lo4y!OKGPrp5@NY-n2 z&cU+Mg_g3ryebqV$X@PCr$j$sYkkIHkT!5G!#xQJs061Q%z(-ktUJCwEud2OGEe15 zMq>Hfp71rjo$fr)v4pawLBf_{&QiYpu#!c{(I0?9z37q*Nlsa5aB1yI6TER@uKCB_ zK&MK1S!U@?iSqqHV+LTWi-3_W!`y>n91dmli}~_^LNL4N>MEQBfR^H@Ws1I+1jyD(oG%>>s=w+ zU8rmSPn-6Tk=EG?@tG(7rqvLdt(-e+FpyjfY?@WS8Z^pyXRq<-pT$^ z;w)pa^HiyJU}UB*_a{ARqefIL(bhoBt5~^N_>@K*&Ahx&gB!E5(gUk9a^$nX+p*RR zue{jWgYnqrqZRhGkX^imgVu=_iM7R{tK1urg}uyF3yV813ph5M@SgR>`lf*i6d71S zO0u~J#dyH>`h4Usa27AT((O*ShZW49-hLsAE{eDsvY2kuvpAm)TS<6ayD~{>DfW|J zz9W{N;n_>&*xs#IpE;M(HgUA_#p*U5du$id_vy(%UVKGemWb^xx_KNP^K7=b?zOZp z&~NtV z0_G^~Mp)c2r#Bi<8kx~)#;V$pKezre)yp96)}p>(ccApn9f_6d-SL&~BW+k2 z(yDGw%tkG!yZyc$X!#Yd=(gKF(_*^J?s3!c02K=yqd8k+ZQcBa?RO?UVretfwdM2B zvA*4+a{abB#6C8jxqJ4Cs?h=d3FRj$8EJo9X3NCka*+jJcuJ%d$(ZqU*#Sp0iZKJf z+zG2F0=gRkW$TNX52xIqSNh-LqkLFw{e+`Wh_qrEGsu~;C=~c#DhdgU$UWJO!p@?h zbNuL+|8FB~HyS&OfzC0?FQ0QWY!`~1#iGEkAvq~@CVQc%NMeU$9|J8KCLARt(jp@o zBO}rxCmJIs(xM;`vQ-qaQxtNLoGdt#t^bXomCcwTO6RzV7hmiD*nS_cXXQ*bc>rUK zj!281XpEkS6OG6zRN$2^I@2^dll~*7=|@cZ7);X`O!}A#`M4r`c!oWMe;*NXMvO^e zxYo2fM_*=95)5 zUkOdN$ycm)++9qz0Z4GnqlOSA^pj?uvW3%w9|6^KoKGHZ-{>KYsEj6~txLmCE{ud1 zKg!O1_?6CeRYz_J{=b+A^9H@1D;Ntfnwc^%(&CdYaHe}{IQNjf7c0MHPZ~+X!S&=y zjrWPAXd%a8eXdd^84GD+NV%R~cINw7H`6xDLduubC6#_{C6+MZvg=)IqvodU@_qil zDP=!T-WmDrEf{VLXqUZOFfZB<;;1Ycxiu}T8u?1@BXMS^cM~l^dga$zQ{oU3uHOF6 zMX%4#AaQ)UTos}cq_HzC$5+BVyNJO;5E!sFO>n3` zY(1XqcF)zrzgvGhmxFCzjs=r8N^Nip=koujJD2d-qwM=jCPU?o;~(va?H_M{uPOCz z1&|dw3M(-SeTh*n3yxK`x~p`YovA2FwXXslkQ%D6nq@DZp zW5JN*=|U-D)Q)TBZ)BMohC`{oZJnW0&arV}G)p;~DA$YOQvq_j2f-$ei~1g=-L1}; zqK>&vj)OuGr9b7=WLlP^NSQ#BN90DGNItGtKmIuKGW^(j0$q2(D|zuV6dJlVYoUMf zRbG~1h0xog%)eFd)h04c4{o z7NElRzDTxW(aaq7uNQEg{7hDV#GdMn{{UZ&IBhxTiUs%3UREt?F5%OsIh}qIgCRe{ z`E0QwUu>Q3Wk0&@2*)%2EY4>cMfqa+$(fsIwv_$oIi%0Ay}5phF%Yq4Q1qkIf-;CS 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 a$1xo%1ox9%9ceNF__ldZ2ky8&yz@WAsp(Gu literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/rebuild.py b/blog-generator/venv/lib/python3.8/site-packages/dateutil/zoneinfo/rebuild.py new file mode 100644 index 0000000..78f0d1a --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/COPYING.txt b/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/COPYING.txt new file mode 100644 index 0000000..bfc8937 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/INSTALLER b/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/METADATA b/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/METADATA new file mode 100644 index 0000000..bac2ed6 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/RECORD b/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/RECORD new file mode 100644 index 0000000..5b6e2f5 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/WHEEL b/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/WHEEL new file mode 100644 index 0000000..78e6f69 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/top_level.txt b/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/top_level.txt new file mode 100644 index 0000000..5492d76 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils-0.16.dist-info/top_level.txt @@ -0,0 +1 @@ +docutils diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/__init__.py new file mode 100644 index 0000000..5bb6504 --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec71a66483a8f9dbc6e4c5ab056340ac4c859829 GIT binary patch literal 3952 zcmb7H%X8dF8J9Gg@p$~m#K~qUc7dii;Gt&5OHu5>yb|Jta#iBEVrQ2UwaBu%$D>#y zDcvnQo(fe|C0DMT;g}+zHZIK-lf=;-974-`g{Jqhn{V0bR1lN zJ^A=IPrm6m|DeV4)yCpJhWZ00?gS2ZxtF?ui{D1-O&USNb+{k+ycsk_gSYs~YcFVt z7M`~;Rxvt!?f0!~p7>kX{$ z@Vi*w1=UTg-r@JKx+gZo=4(H=#l0h^_iprQ({Vb-<3ut1>#<;ad0grwRc!n4N{{o* zY)nL^Bb{LN49^ms2-Ran6rV?DV%X^%+BIOgLslD7Uz>9&%lbEMoO?ajg%6q&&11E6o&hJE6R9>Eo8kAQjv5?Hp=D1 zND8qApeV(49;D*Q$zge#CTc9?$%$pdKoI+d-4DOF-J>UYb|JDvWU&CVQJKXggff&z z5>ktd8|qKXOeYh;l+ZfK&R{#JG6Bg!nq&e}X(2~ZEc!%pl$@2)8grDuAU)77WF8Bp zaJJ8&!9p>^W&l2xYmys&hcdrNxKJ!&WtNc2?7`u_Ihp2{gH&9I6kLl^8@=*UB&aaPlwHQV6zV5O-^MbuM7nRAc#p6kD-|%^ni`Xnb4k|u=){G zg@}_VO{RjAU{F$uvoek3K)fs@DVt{l@-t^zywo6)!b+s(QF&TJ%Yr41va=FEQ@iX@ zeLFDJM@bBJMPW>yk3dIGteuKTDiGUcM_0hs%f;)~DE2X%SVS@ye8$kIC`H80X+kDs zyLo&J&!%{RU5=A@3>VPbnh-?j;*pM^t;$Oo3uAvE0pi11mapNVWt1uM9E7YRgOy~A z(<>Ot@Hb~KB}@xeIwx_H(G}Y}JOcUJO;%kKuuFktLH<+}xx`^0SzReOja^1EgRzz% zKS@+9Qdn5zr2<)^WWxKVFnv}_(l=r)#D_NanA#~NsEx&>M%X;ABNN%FFz7JuV(`{^ zmR};DJl$sz=LQhj8QINHU|9q*q&4sw%fy8LlCnDp^6`?!^WZc=U;@`>1Tdmkfmofy zQ3_PsLVGi&{)g4t$M7`*V;^~J zI+#Sy0nJI0nK_m@kdX?6j16!g904}l`>YE-RTHrorN_Ni)ikH^L&xa{=d1N)0#(aW zs8;G-xdsw3$-8{HSlq`@>zIUt`sD;3cTqjOs{5cQQrMO9;zv^E^5AWwYKI}I8irLT z3~h|zemx9dlu>G*ymjPlP&3oNez>D2#ZHkFgEFHy6ntNmk zc9!afByoOCa(S5Aj#+;t;aB$%sa9&aF_UH?m)xSgJD5Jjm~o-?|K_rdrwbDW4ep`5 zH-aWc3->GdZDXwR2F&MI>qm9LI6|_V{tlRA>_#oIc@&w>R*XeqG;zn+G6kl}Q&S;X ze)?R*0P-xOoXjjZoY$=SFhN-W?d)L*9$j5kyq57C!InU8?o;Tz+ z_t0;;zja@^fAqMo8-Ma#NBi{rHKO>;fr8EHkLL6hGRliGk+v3TY7GsjhKxO_eTm*; zEFiJ zaocXo^ZxBOI_~uSxn;=p!|R9YkXgAAGV&dek>8-{T};7yWoF7px;)QYOCUlk5UF$9Vbuvio4&$+F(f0F=ot^{Wb75OSV;Q1sM}$r7SnB_qSnRQ zif1E=&Y)7S&PDBc@_lGmwd`9%ALm!ragog~*khI(D8oX5vw0YH9oTsVHq)L*Hf(?_t ztp+H>Yhg&RL#TwIY~Y2eyV#)*C?xtjiybatzEt7h>PNHhFjH$yX{=hd)R-)5&}k(4 yA_c1Uk8LyXQ+#sT9OZw|cGnxwWX*Fu$NP`pz_0!D@cYl!y5H)0-9~qRbNFA-ZHVgt literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/core.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/core.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f08713c10a09963f9d311be85180e343253e861 GIT binary patch literal 21680 zcmeHP+mjsES?}(-_sq^-B+HU-Y0H*(N9>N0a0_ciIEkgiBv}bdPQt{_OlwZh?yTnK z(>;=QndK5Wgi9QfK*0+|t$+taQ9SWPQ9MyR@W3C?4?I9og$v%OqQGFA-}jxj`tsFJi^D>-ib#3vxcxm`3*yqy+`k4 z8Ye}iaY`&S9urwn#di_kC4AN2vdDU;yvI6Ku_BJWVKyEY&xl9F3Dlkt&x%LINz|T1 zpYrZge8tfbj^o->;xY95NZc>#rS5UOQx=blC(y$YXT+1@Db$|EXi={tv*B@0cb3FQ zgoD1%h^NKrH;l%!B74=SJ?DNMfVMy5_IlmHwiE1lPOCKH@!jE z8?-&AGaj^q?r`8cYeVUD2Y%oVg036Tm9E{oqAv4f%NbtZ_1Zzrxz!DJFhqYe9C(Ak z8MuAV$H`vLk)A*91sKE;UdKh%zV7X~H@ibwcbrQYzCHGXVc&_)I%~cc@ST$3h9jO$ zZQW^0&ka0VUz6&=^YEQcSNg%a;|_!~a(&-9i-q>jI>FGMTJ5>i8ZeEk9-wgzAbD}v z9tYi??<7lX)@{39cbfB?H=Ugz7;TJ3+r^zePk) zGsEggb_YQ-f^=g^dRGHEZUWnEfBI9z!3+5Me~!X48YYO@5+(@PQh#1{HzzEVd0};m zA|tXu&VtB^Jdm>}3ZjVLk|+rqzqWWzltl$S%3@V4h$?Co5Z@Bo7Q~uZ7ArVY6*X~8 z97kZg< z;PvY~%2vAs*hC-Vi+OxMgRdW;5az^a8WSqbiG|XdWKaTtFB-3{AC!V@kee8j(j6kf#dXCAdN)gxJW6{~Kv|v?QC5P5I|hEM!o*^; z`+vuCqgB2%=z_X?4hU~N0y(^dl??W1K`n(jt#zk0VoX5|B->JW)N)+uIfG#kkK_Xj zyPd8l)|tb!hZ5uuo*;;Gv|6}9vtF-*+w{F)XDA$hXE^Q&(7w|KWAX&^k$5zBhNC!Z zJc6DRP1on!sHr(FIF8rr)fCWaVMIfD)jiCsUSVF%egAvJA8<#X(b_qE#y?FX@GrW8 zfq_zQDF;~S%MlUUtpbkkRGN06JdMjS6<3IK#x*PNhvc0RAI)oY7k zkuK?jg-Q~Ta+!)16rtVq6(4SUVPPBe9|SVYVDe%0Q&@*22FWxV=KbMVqE|)zHrqWc zG%O3x2Ui9D4hP|K>Oi*_0Zrn%zFeT&6`FnkmLY3)nDxD0XJ$I`Bu(rT6^~KzI2BKz z2um?fzGp}WXWstUxu8EfH|mZy#)FaDzTt_DTRWcD+i3nUn9b`ywiolxa|%p*VX@il z0wzIYgbVpQHizx*i|oZfOfr3J;J-|do17TTeYkt!fq^KKbopl zK{J6?EhnEsm$0mx30rtq!?MCh#-B!I>S_m9Fzh6)KeUN#REM9&u}{pyuxztp?jKK9 zopfqj)Ion}&GEWV;2>VNHL;iXj05)-rmLx`h_ms7!Tp z&~0`}s>7Gj;`2^nNwW)5U8XjYy3%IyMt%*IiLna>@lumXKvNeDvr79E(}@2nT74pQ!?evMd@J~~@wb0+dTWzQ+O+!UL(;c^@8|LL zTPP-3d47`dtATOHILH9CGY~4-L+h?_kPkAG{2f!6H>eM!@hK?UH!OKxWVcQ9V==P} zv9SxGv0I#EI@w81dXJRf?B?{0g{quR2|ib<^`X`NwJcl4oV66?zOxM2`x zdfuS%_;g!Scq3>&5Y=7Jmt|b7_$PBx#?zwOp>x#qQ5t;#yTM$qNs>!`j2i0Hki+f< zez>4C&!*mMhuXQ|y*!4i$D`&{pANeCga<|@Yi7+n{)*;FvuIh^UdyoP`wsZklT+I} zJId4^)BX}Hc#jFO2!m-?peAH#kG^dlZ!er8BOxMOf#j^A&*cfTW5>uA3 zE>1F(*AGP>nx^bRFp#R=igv5zh%WSd=)fdT=|cl0`>GUf7R=y~7)>*(mh+tEnsiQ) zaVsU6FWx4+=?1;MXbMSpo)F#Gcdr9G=x%+QIt&-jQNWI8Gm^u$=R-7ZJJ5XldXSMa zP}XX#L>B;)`f!l3caI406aH!Px{Q7!R?J|9tx1C3YcAB};CnnZtsSExFI)=bH1k)DQ zU6{(~k?9aNWJKn7tV#B_t#6x(bJen2VJVPq+q({_d#z?A3j(WRVV!LcM|&(^G(hA} z;HFw;arbZ~T3s_nkQ7WDbWah)lX^Rv_}zv=)CXf|$ME?EIxAk60iUxfAPj(D1rx<22eQb6ED951cSU(6Fv0!-v~Pgv9hf)*xNaCY z594G62KXz+H;oQF3@}QH6Z1vr(+B3HaF{0z0Yp_`8Clr>!x-_dkaY>Y(Cd$aJ)ou^ zz{qr3uH3%aqMCbi*d=OnmFf#~psw21U_8X5Xt00y^tB~_2w$khz zHr1mKDGCI_WBB@{9Bc!hUaMm1=ArS+#$EHf*6VN{@D9U9%nPqQ6due&tNzi@bnlss z1zJ=SEO$ujOre5(o?t?Z;=)}Toy2w?6tVyDqkF9hyh#LJKi?a|7Vs~i5)Du*D$>mW zieZ-S7*-;?xI2K&N@&qo{ge0`EnG5McB4Vxm&H$mK}E45~w zh#$h)qO+u|)G}LS%4@}cy@2+`Z4T_*+)SKo$lsYJA zY!{;qUcom>JI{XE7@W--LGFevzh)ZrH^1M{7z67o3N{w3L1nkldctCav{3J87aK5n z*l=RArcvz<;QEM>NkOc1ZExhUl@)=8?I4DagE12PmtVx;AK|NX0kAsTDrPKb1P}^l z{@qHZ8rNr)UNwy)5F;dKh;5?s{t%mn13?jrt@$Q-26BuefJ0VUZM>ydFj`{)vVSO> zI}o!y_iRRQue4hwbY$?t`Be{hs{29JJDQSj+RRkR~ z|IYrYX>3Yi=oB|2&PKWt1Brw;FWx*PR07iM0tCBY_b6G%?c`z$z&tG81qu;(rpq5A@-fPCA`1eeuWH{8B3!)?W z3W~qP*RP-;0IZnV_aGZH`;R3{pB?K`n@NtYz=y6R6O9*t0iY1(L2PWfFifha}hoNQTO~P#xeXq{kqz) zCHYsl<1&p(XAV~;HXCD^gCa(p9ShVQ^_~>IWAZxV-`!)o$7$@{M{eY(EjV%bD2@ws zUSuDIfHRH3(xiyCO>QeQN|eA!bNhcDOX(|0$(*N%k`5r?2HR$*4gBR@IL+8w5a~^= zDF>O`Bb9)aUU;+R7^?P^Z-GXGf)Jh7iZgt2FSFhrPf1;+n^%2DQDLI(D*1oyEkcRf zNoH{Jr%;!dsUTbpvosThyX*MWh=mbqM?vMNs{_W9F2F-@+AdKz2hjHIi&nLtX(X%rT1!%jpgdUCspy zw!%nR5Pyx+{>vzgA~-iBTddfVYH#J=&1N9$L9BU;h_(tFFKeDanMdy;{?s)mP^;pb zXQDoVR>;WZgtYbDj&QTs7Wg~NfQiH=9)%jzS^0?o;t=&L6aZKP0i426SgEZ*N^5kU z&lF_`y_pNn^aeQ`>0Oe4g5Jz8qu%fX#3QOZiM%Mh!L!=6cgv(Q9~q}2{}$uG`5es! z9te=*Vg9ahxFAaD{w$j8t^E`B=H{mJ@)+@^z8Bes{^mV1%#yEQ|0K7+sJ*1HRpF%_ zKwsR{EpZqFlu5n`Pi*eL;H)9qGDPfS4}R&0r912xU3bW5K=$JRc#IeoM^@II8{Xcn zp=8qbYf~FTn?kbqD!%^5QLxf{_SNhGG?#-6%rk^QCKlNuyJp8aVN5c^wMhnA42*T9 zP}j`;+!?=q#)p5}ZZ`WvF$Tgm$?r+NGt>%tBCy3ija!7pXaSA$?=G1|AnpD}f_5`BI#2c9Ut)M)@x8GaZhYm7U)XG{NcUEA zJm?bLH$5M55wBKdd8zcM1tR#^=z}MP0$uV+%mO}mJ_rjV3N*O^EtvcZ%_c%RbXB~a z2<*^tyji}yh5;G{y{Ec)#M5ft?)Snxt8wU6tP z5L6j5C?RxykI!duwvMy#vGLh&@!9-t0q3uPQi_KqVFvcZyknkF!fIFdD5HneJ*=r7 zp9?Ao59w>DhsZK_sEAy!5L9;;AckI!^ZX=}+fBwIjp(KXf?UwQ!6{y$v= znj>?Iy8Y6i-5Z1Gr$<&&Vm%4vX;af#JL7|5*X=8Nh+Pew)M<$FJ=hM; z<*QBr3jw|_-KZkbWbscqu`nA^-_JQ;J>$O?D)YQ{Op@zJl1|rHQ1bPQ@NAJ^^thIt z(`Q#+Q8ajwjBjO?gvWHxsEM?CNjh-@i-kRNkxvjU%AcX4N=@aP@yOa zhRZCSV=-LN>ypIx?paD4U#Dg#E|}!VF;D(SpY(7;d$q~8O+v5;-wz2$5{LQh2{W5R z-7J!?%&fd){fAY|{##n})r*Q%ha(gh%gN_(vjD2*#N0Il1ahGBqXx_-HVnm9Ni)Xm z%+~(;47RZfvT+7l9QN6PvjGuYL@Id`5dFc}u#5;mVUD}1%__dknho@rJfHQM*U8)H zHwzUX=S~w;l%5Z!V^rV)%f6d-6U^J}sTI@il<{R%zkv$YNMBmD#SSjEcn)FqAxsS3 zft7=&OsqpF&?0je(Gjj?QKObpUh+;6cglRQ?HK1Q6*19pHs}oy43Gb%3H+ zr+bi#)JLFnXZjXHj3%SCDw*Z;U3$ae4d#9vFUIi6ZF#(CnCFok5cT}Y)8txDceEc2 zgD(8vW2}9kUFF2q=$`P%&tUIE@=65vX$r2m*+r(0dmV0F#Hl@huo^gCuiK{>F?cV! z@PO;~Xo|UZ+0Xf*Gu97}t=jShkVLqA1Z%>j*-d7@Xsrsv;5ub7A+{92ya_W<2o(*- zJW?4@WC+ODskll7(IK-%NuGaZiIJ;=SYntJF2-}HjSFUsV;rs$3n0VFfXx6#c$}g{ z6!b&gsQicZ&rs7+@gdC+(mWl$eSCD8qxx3ON_`7_YU>hAza890Zlee*&F1T4w-;%c zP`!rjW|PH3Sh@sp&LSeTsj5VRJWUs$p<D# z?YNz{mu$P3=VR*iu3alWT0B|INg8?o>=}wkIA2xKBmXt$tLK#(a{;xKhH~Mx*YK)J{G9$W!8XNv>BWqP7$*;KJ%yb8ztLZee^Y_aaBP|6<5EL2Z zY_SW>Vu%(yV=z;2Ko6Xt?bYGCMM|DR4D(iZMvwTAM_C^dY;S zG8R~Jkev=~5@rgb#CdWN9#kh)N{T>SF~{-qDvXx$q%v7R8c`9cMmFSU;b3vHNUmo0 z3!IPG}7(dp@!>lz{5cAW4@ky*85MO*0+eI4+v znan?-FLHpr1;o3TVZu}#g*ZiRNhMi4gSv8~K1;O~DoCqS9GJ98`AI6`k>s>DD9m6F zrAu9$xF8l2E=HT%?h8W2&x23+bya4hW zo&yR}`q*r6#TULo)NvMOfy-0qkpb&e$zwdpkWy6!vj-=N~kv@FhgMo;l}hAMvL{Yc3HlO zzDKz2eUJrKiVjxKq6@ezAxjmUw#uCL(+|mM({N1iMQ1n?vP3MBk&kG6mPJZOs~J&V zq~bi9*n7x8I(>kSa`bb?S^%S0O<{zu-+BjCU8oBdGv3KyH34j50k?|ZG5-cW> zF3xJ^>R6e$tIU4KNG&H*SIo?j$I|n3oX;u#2*K#wa`!ejlgyQ9dlfv^kche-&B#x( z8$S87N9Mih#1lEFsqwBtQSP~tgb`pe12ZMlkgUq_#8&MCO@aqWU^izD4==qGA#cfF z1BxQ}_bvP=wXb}YvtO0sS5XI-c}KyI6M`qD?1Qprm#&>hZq@1i_=T9@9(_oH`wm8a zfA0JVw6b~wGUMzIQfrVbHA`$0#HnK5yhJVoCb>r+OmfP(qZ6uJPLx81nhO&b0zS&) zCGiZO6XWQMaCPb)a4$oK6TN^2NFzrGr=$9+VO3@lcbUd6pNw25rWaC3p?iVsXrwkA z-h%)%M3nkKZlF+k4pB4i&8O)Zw2TPo2SL(&E38FR^v>|sJVIjl-iMfHCj4R0(Ud&m zBr1P!YNgmsT0h zZS!DZQrRt1%+@``l$ks}kYbe*lsrgEtBT1vkRCin-28uqaPA`tu`F89|1kOJd}>mr z6^c{-jZ!j+kizT$)-F;dS~x%|1}Wg$iM@peC7+b#z#fRi@4zkxQn?V2N~9N4=sabS zZ#&PVU~$EQ%b|O7@ic0Q4WR+|S41LDp~W~xv0ex+D2At3VK z#)LuB4mhSu2~H44COz~sDIs2K1sv183r{Z49S;VATQNWP;f2q$qN4njnz8`%{?*69{ApybLgLm7z^Zj<*pw;joO3yE6V0<~Zcz zB3)6rAJ$nNdZ6HWpc=|5h$geGA^RiUAeO0=XUs{$B>Z$*D$>56C;J$280dX?1QDws zi;1LS)SYJ?d8B0**$H^)sTGkn9&O@B2BY4ej2hzG=?Q%b4uo}Q;N40l6vrt6G)m!! zFIB!f@*%T}k!3zlW7`{e5}sD^{>((FwDZNVYD?6^XpKJzIjruL2;%$j6V8m%w6VtP zBwd9*|1E7ht?4HFMY|7g6TzCoRCNmA`}GL)(X*+fPQ?h!Q;K>Z6(Hv2mw_kHm>$|6 zq!c>&Jy0&Z8|12pvkO@lVAk>*)LM}@@uMCTDrnGzdGayBzn-wR%8SGHHO%KF@`owu z&n{QyaFie?iA&VVD$vf-{~>%M%=P9e-^U|KpWd;5h`HGlNEW~!>|Xdmkh>UpN0_6@ z-@;7VG<5W#nUwHlF@GMF#IHD6gzF;*x5v_yXK`t+XK{J5%*yv~JXrZ=M)SYdvv_R> z$cg`5JlqUF9DFqqz_s^j9XLrDQ(#cwY%q7htb9h#?y&x8a3;Bz_~Fx@Lo_E1nt7z@ zw4sArH7xQ0xJa|wzA zg&BZ4px@~Ed|3AqA;R7sW`GDP=#^roJOdD1pDuz2Y~azuNaO*y{~*vbR8W=UN7NaU z<-s5YSeR`Hda`^tau98RvwEB32;Aer0VI71T*Q>^LT?>-hD098$Y@w3zwlrw#-UD} zMLsHft<>Y4E$8f6>AgNC7v0&jo6a@%G0>wgL|kGIo(mn5Q7>jdbe*r}!JSCy0nCs% zuRFFh17kr4A&sZWaYnhG)Hyx3cq#~2P~JUUg_QCJjgPWp)02#Sd>gbk({03rr*FCG zT*S*NNKxZBlk%i1^-NFOan}08xAB?^&snAXrd7tM)pif*MyvYab)*9E>|0w1OuHe zQX|N@k>7OY_WTAAzU+R(#xB|D;i(v3kfaR2e;-IQiyv2Ty(UUXUW!jrL;$M$VT=(gn@b?^s?xWZ zA&Xl(-S&>k>Vh!#y5P={+$8!?6M9~UtC_}LiAjXs=7HQM5~b3k*SO$f+72Z9`N19@ zGsY_^0)IW;4n^G*LcigI9|rAuiqDWpz}t^Dolm9APj%9-E7J}Xz!rb98>*cXym93g zeE!S?dtJPBL^~zar7AI9s}#x0mq6^@j-DU!A2nVpmJrFEV8$YmWM+Emq+f@~r^X}G zQ|Dl7H$A4r+3Bg1e*Me*hN7d>Q|Dl7H@(RJ!|+2!%hZDi z#1$fc159Ur)l&US{1kZ$LXEeaonU&S#4v!5XM^6>(!D;0Bg<`*ib$I~J2a^W0Wv#) z(vXw%>@dGLOQD7yt_8K3Jzw;?CpfHBu8yH2*`Y$A8$y6Ar^2&4sX(%3G|(i;Ur!4bccHL#D-2wZAV@(+~4ca8)Oh|qxTs^ zFNUBT%3(x9v`EZy038`H8aOJ~lOFm2!P6%2vj*x8Q0~zkK{}UV!NeS;f@?hKW`kPh+6@|JO?fcuD zqtBvYiJu-0VgA8ity;-DNvbtH^M<)F@dHB=8vaS17jjG4`;Y`2*}s@iB~r}^hv2ya zz90#Qd?>L>715s)BH<9`M(m6ba7LKqM2y`LNl@fla5vNzIa5`>f%=yG2A97?B|evG z3n<^Gsfd=O;~DvjxQL#m>Wt|PdPr-<6!0JgC%FPIkUWTUmvBxFs9>LLhH6Em2APC=5C79qb)#doQo&=Y%X z8%wipMM>@;6?1l|mK0CpFf5)|52jrp==dRuY^h>p@uXwXJZ?V0kuCU%t)-tge%@He z!wk9XbY@hNDfPDfc$}IGCv#j^wYTlZ;xp-1(|Fr{7Ky;~NBwvE^xT}Rx9yM2jP{@Q P>iff-B878^h4^fsZy9tu^Pz;~ehS8!fTBEHJBytZ#(bb4EtEJ4Z z%nT)Mu)6i?f6zm6?4Rim;I*gxf&xXG_IYQ>-L>LFDR6d3&b*(``^>ACdwY?G>+h$3 z{PWda&-({GY+nOB`~tWB7=!R)PxvCp{5*(*ychR;Pwa`I82!bML$NP*M1)yi+!edx z4rT+<`@$O^@W;OAMJJ0?v%C~_CRtJzhNp#QmEws>6P_`7&GRagnw4|*yi977W|}2g zDhq?yE%lVK7lk&GiwPu=f-T{ZS#ZOaWeo+@lJP>YieoX1 zl$a?fq>qJ^0y>}%Pl}aSg>`E}AxY;;@`~%IkcrfqtK~HM77_QxK@%pWl1-47$IY-V zQi{dNw+N`0P;$C!gvk*1uW;+1U|985;i@nEzxHkh#=G!W-pXGEB3L0QulqN{)exx( z`F@DhFkHV$FJ%GiVPjPrrj3G06F7>HAW@u&6qzau*hVS(?a3d0&jj*>2pi`nGDL!& zZ`Qq%OB-z)ih}1ZyEY~h8>ma3)p&`7u$RuYR4CB@Wg!%mIdByv`9v%tpB z@Y5-EU)Vead`sld!Uw?kw6amjChQDhtF@fhnU%)a9P32N&x=w6tN_h4FFn`C|Y@1 zP+Wm<=)+d>Si?56L=7&aG4V02p{XEtD42iWR3qC0+2V_5ISxKNNtHVrQ%8Y3kLf`C8yl;(PSAu*0kXQf|qk%7~ zkK4O8m4iigODhL%JLTgexJxz(cD7`EiLT2W?u%y=MQ-yvF-*&ssUV#`3&*=WY6%aAERn+;0XBG0pB) zF*OIb!QJd$sT4q*5id0NwKT-+dRAUarI2|&4paahi}$MfEKBtQB>^rSkD5E%<*n%a zQoA$|9X6xRR7Gsq?5xE#eY^i}p1O|@|N8kOlUI+bv^uPdiYKq6IJ^Svv%}d>RW85$ zc=?D@N{7&+?qr%)%O)ZpohA1mM!%22`%&QI@4G=S^aIb%z2HBCP`!h137OGdJD3nr zTax|=6XQ8r23hw(%>L^E5wi$>=-rG~q3FHpsp)F;wZ96#@$qJ4Df`!Sn*KkOT{xDW zD}HWSniGw?0&B^W%GEJEvs6qxOEs`QDp3OT{Pe68%V!;gzQ?@a4Jp~_CN>YprBMG-4q|gU>Eqbg+7l|uK=g2jxbciPb`*ox_x=>zSU6q`E&$4T0PqdJy0&ru z+;#;n%3Tj&6fj`BA6KtZO)LiFb(NLWOlj-K9_Rvx_yY9Dr=_pLyfr4h#QCPg!&1SliiQ2>0cpoJ-PtRxVNf6(6>^_s%sX?d0 zO-Uawj@+IxRZd#XG~i<9G=MxUH5RgdKDeqkH57u2l9(J|cq)V3Gu$JUnaJQ|PQ zhEZ#hI-r#Uht{|Ub+-W7?5y+jJ1o^7V(^Bc9|a+x82X`wryDI)>Dk?G{AU!Y53pz4 zKR&hvbfO5j<3anl{Vr_Z9gm02a5jVevsp}JZaLV7#5!&(&=!Fey=5}dx}rj8Mo-

Fgx{{XnOeG`tY$YrATqTElx|v(eSMs*yrB_B&=3+)K zBQ@JBtd3SjZ41x2rn5R$8MCd{9{Dn!e97a>1iv6X)!b3pA@|AXzEkca&8gL0m0hd5 zE4x>3sob(UU77A{>sP&7D|=KyjlO18_Np;8j{9xuaW$cKyk=K!SMOJoYA2rdsUvDi z?ZVR?>It=5-GZk()loIAZpG7G>PfXn?ZuO;j;Y(!?Ra{h`heP}?!eQGdP?1??!wdE z>S^Vw_u=Ut^^BTPcjIZlI-2om8``h^JX~pSmA?DyoC3g!_HZ zS*olKy=JLHUT)?7>#559NI9$?K*|G1If#^lNO@2_gp`MnQu21Jl&_~NC8R#A9zp6O z-Y9a7T9^-iPdyNkNr>XbZW?6liWzg#Gsyt>xb9pCLNd&t^swy&^Iy;<{p&p%Qq z+~+QwUh6d4tur<4dwSuBJKsS=HLZHJveBd$y{5~(!YFop-S4zl8-b_X%bxa8quX9| z7usu`HP&1p@UamD8s>UW=e|?R;lZsxdHP<~K6`fsgbsDRl>wBFJ`szR7wlA!B zb&R2=k=j^YYvR_?>qsiN?(D*X`ChJdI=XRTz2hw`6w9tVZz}iQ`ugg66AfPW+-Ae? zBo(`}NeRCweK_83EjE_k6B5keE;i7Gen1qSZu)K4+ZNV~>#aIRYoKkw;MQx+=7n1Q zqJP9)0Nk`!MISp23~k|{yP&&mITHQ+mjf2{|qh1J?cuew(2Ec?~k1;5=SQuM)ae$A`9 zKN{7o!}0m^XU?2GIX_>0 z{^Y4MZ#Zva#abFv*uuvhXKPpb(FsY}C9hMzqVSY6PwT~WxTDzyF7)OvEX>yy*&+ZF zj-KSKonG&(t#_gq^QE3!xZjeM!tqwGo~=jTEeWU zEgVU@8m7?l8HZ5Q}t>VxB;%FM?Cru_plC zeYU<6X>~4?_>a$=0f8^)Bbew|n|9YW5NzE8_&R{^gSN$g9Y@(+t7|Vh)7EwSTkQz0 z0?E1Ho``a|GyDCSBkp?ZVyk_n<;HaRh@=BCv!K&n9Z1$}w=b@*g`=nBE--l`BX~=; zC&LfN4dg+}$ehFRh$lp^6Va;=?uaQH2Fgz0HaTsNxDbc@30y3PP?@mPcJ{`YqYohE z-68WZz79dgjUZF*gN(f$RDNw34zA3)8!;jS6?eA2+-^Xi!7Eupy)$#rooOt!KneJy zy|reoE|0=9A-sUWBxzSyoAu?I*4|<-k(6Yu4GHN&^P1ZRHPMhGe9v>aG*`VAXoDa* zgeQ`kGuJxH!1;v*GdT+j?rK}DH@#vprSHPcAxAkU$b3=-I*p(9gb@)h~7JO+0VepyC-&c_5{7Zne7E zuG39*)7L=?x+(n(NQHyt9(~&)2dH#XU1udpBh_!EyC4&t3=lihS3UzykP5zF$aq6} zC2w&NSa!s1EP_f8PNLf&U#K_Nm7(Sd?LO!>I_4vg7yMpoYqUCTfq88W64aV*06|@u zOSgu47Fp&Bo@$sb;5olWE9;P142H(PWgn?b3<9^94Kw~)v(XVyhA9-&V*s0w7{T#k zPT$Q0AuadtX+JOb;u7ZLl^W(E#t zYegi{NLWW)?RD053yZhrml{wSnQIQb_%L9jAK>LdULN9w%s@ZF%Xajy2lPlS_ylqq zpy#G~Kz|IWHv!#2qL4Z=c;ftZdjnVukXw3B2PO^jT!OxsniDBIm~DAWMz0eHJ^^VJ z>fHs9leXUweGlY4@N~QAgelM+eLHI2w%>aaWNEcqajjJp`EHajQks*;n$6q#{Ybf~ z??fx<`^WGQ6in}J+O0i?hHYeU7uAI6l)Pk)ojH9UN)|JMg<+aHqP`y~VQQ_t z7G|M{L9Pap-i@?v33?i0LT8wU-;)gMJ#^6@MwLc*bPDzuCLY51(?}Z_B)K!SFd5_# zJS2mh?Al9$y41EdG76~s8o29bN~N~!6A&FYvNGgsGT3zR{4iw@O9iwM5mtP6Ru~&} zCwJ!HOr$4)9=cbSq1O1&LOfV7xNhszKjS|xDNe*Ze!h##lGU|7x`)dO5`?v7YjA(_ z^m*q}8pve_DR-pshAoR7%f=}m4(-M;6bnb$J(z{oj{PF5=7f{c6|CTaJ^&A@@GMe3 zD(bF(3=eS)Z`lWaD_CAsUn0_z0!fKQ zbc^3O=Lt_jhu^U0V1vlV`f8XFGh#S#A~C9*!Zd}s7fu^;vE4{|v~$Q5^A!$*U5tfY zeP(zN10wD-_=-gY_{M@L5f$c&SqP~1inE!bZi~f}>1Hpc^zKd?QVyPDeeBZih;jt? zywDQx8aroXNZ7C4*)>lu*VcRx%MTQRbewa23YSWz1+C1lVsQO^wB%3YVgczy{KI_=OoeJ#-qBp919MCTmOnwkKgPo_c$Pq4 z1Vlf(kp*+fZh~DZXUh@$P97$L=OaZeVl1RWU77Xg+7im1ERim>GbE{t#KJzBYX7F%~H<-P3Pvp|F`z(cJ(PL(g z#`PULa#T9uADbzMnVMg3G{VVY-Skbehv388)p-VHR3C~BY>bV?Ywp8Q*JKp4(1|ci z$Y?NZ9;!FnzDLy+x<0J({i(%rF>g>ELeLallB$;AWW8L&a^v$OvKx3D|d{KcY zgQp5u0Wd{4g?Gl%c~HACJBuIRvng<1id1zH;`on*nV@Bwzkti9AYVf+hwMMW=@26$kNePL!{*{T);$&DSE+O z!WKj;!qqc0PRovl;96{1?JO&pKNi5(G3_pljwTOnqZ^*J--SHh9{!&_~#FP1Uh&z36C?s4z`f zykUnU$)F9E&_<_E;xdY5=5y|{P=td6+nDLMlMsq&O$o#3BO)VI@mkDO@@$U)3)6&- zzQ9}@g%JqFI8)=R7zuZ6)7;zm>hmiRGaJeH1t6gVf=t${6~5IS=7|3I%*mC^bn4P9p1^9ixOSF7vD0A2xxJ7ZK(S}#UHHePS=fv+*KJyyuuk^i4XuKn=W5@A zt|z3p-d+RE!bV_Z#PQ9>3iirqFajAqWQ=ws$bP$T+b>!t!{uOWsu{}7S_e(maT6}3 zE@T6p$0i~6Z3OYb-|N^Pgqq7O(^%vw&qo_R+!HFtHAp9;9-Nl#f?6}uD%&kQ_5^e8 zNpc^_9(Y%dewVJ_-+L=7qhj4j&Y8^&Z^*2s0Y2%F`95*LitGQiZ`|$7ejA2$|L}7fq0E zGFLwSs88UvlEYpD`t4Wp(t999C{LW@p;3gpx9jn44$DPVRw3`~hG;kDWFg+AVdhPP zy*XfQlg=1TPd@Unw*!Bipr`N?Bcf-)mBWJjhFwVs!?NJQ0nrQ&2pN@CIoz`GTDpD|PXD-~OAsJ~^O>~cj$4x%Ynb{@jpn))7g)yhm zsa9#+^$8HYj&zaz^^1I(!{v=snD)Kqq9!-gyLlP3@9Qf_dp{?bQn@9HWB!Jd3U(Oi zm*Zx(l~<0Vh|lE{TM9HR1uKrMJ2lxYb`z(2k6ZB+#e;KY6?JHmf38QH)E|jT&Lqn*+tHKAJ8mSr;tXkFI zg!+oMjAwXyyZCg9o#raEoM1HSBI~As8fZj10Pq#6RkK5c=dmh8;#xEMlB-t1ThI=1 zMH38~)%G+G44fRt zqJQHm{x|XZNG0!$c!iZwwL?u_PpwtFv9*fYSs7PTl?k;AZijF(T(TS1Vv0_NYR{6R z_If+iZLd2>xn1pBveg}QE0lLQ6{;EJxSOto>fYB=$a8=$gpzh&l6Jp3h;nzM_BdCG z?t}w%!Q#?^Rih;W^3iym|pCAH*n3j&D$>B*%-AXHM!pt1QZM8E74;!i@ph^YOC29kACQoc2T-F5Yv`Zo0O6W%WM zNh$Lw^=ahzc5k=(4tf8K`mFj+=1|{-JfD*p_`Lc%19|?gH||Z)s;RzPeUH>Op5*;| z-UQOW7o(X->ijPJ!X4fSJ!W&c?HxcUis|4F`kx2m5)nSY{wI(qvVdHbi)+t1?d4YfCV`?-O) zFAco?{J`5U;O!Oli{2jfOY9k1`Q_gC#RnHtZ~>l-{{719X*dFZ87{!T3g_Qn^X^!= z6TiDYm(~UK>wKEFK9^n_Q$LM0>~h_!f40}c^ZORl(-vHQ|4jX+`sZ-qy<7d3`U>Rb zd(>~Muj0O6{f_!w-0xNYLj4}@2h{JYKfrxf{h|6A?nU)S>W^{1PyI{vC%E6Q{+0Su z+z+Zr@Ya7Fjv3N-MjUf$KM2Al)ZM&`N;cp%OMjGRAQYLpdyMH3F^rbbWWI^F0412hQE=ep$VfY_xbP|ri60n zl^$}pmA-eDp=U>oDN=)v8_(mo$L_4yU(wPos)ibv7oxw1FgYIkIi)Z4+8 zJ9N`sh6ixOCe28|usnS^($fh=@Xxqe<0F`~LkD12hL1u{y5X?4Oi*5G-c%u3a#!Cio1LexWSn`go$}mT~xm?phM(PPlHx1)GJ2ffO z+t;r!AN#@=oyw^B0FUt2MIe%Nu8LM8`0F3xB#g%es`Sq1EM`AU3g^wz~!~RS(GYI!X z>_RT8Cpi3`jSFV9*J2bzU&_HQ({QJ~)@wFQ;T2;XY$dq=M8g-wCFu}HB$Z0CF@VCH z11n)LC4l9alH6D$NsYmyy`C<%+Z`-J&p%Xe7)M9}6&xr*(cpXqNc8}2LhGS9N77PV3D>aQI{^(%{Slx7JrLc(RGt zN1O)c7hsOCp_F8}>n8gzFzSuu-gqQ2HYMfzDPcL7HkfQsuGdI# z=&ZL2HB$C4F*UB&^u&;BP?WRRqs8$4DhF5+7r9 z;$<(XiB9LJ8P3>I&EFAqjyiMFF)^1%Awf^h9F?bIGw;@4_hrKikH8>K+-sn&YoL6z zz_!=nW()bomM=HshM;!?YwZG;Ycx3Y@Dw2nn2YT@?j+Jr7<1wg$b7Q~enyOd0kTsm z@M-`BW9d%}(v==;9+gf-(uv>1gi^wws0{8v9H5QxAJEG&C!W|MjdlZJbOQtesb3#G$Wfl$^e#Qk}cRDkLjig1_oxt+@x4Ik~{{Dez`sNN*5>^$|>}g zjTQpM+zz&Q`q9<++02)(izb>~Zjq_4km_NTP85dMI)T2_7cP;{3U1OOGc|+gU1^Ed5|> zzXj*H#nR&t;{;Z{?tFXPox%Asz!Jb4X-=@;?ZNDcBpPOWNF`7L__m9InGv+5Lm|kx z1kjX&yKd_GAUuN)#+|(xZZ~(|q}&Xy{r-{tSmzK&%w+Xpmlw<@E!>2{!yxIwf^7NS zTN5-HY-(s&NBbL%y|@rc=)2DxKjS|9n46@*Q;gBW$<)JRhcqPqjs?=JjK^;ftdtiz zUJImzYvx!i#LMgpJt@A-UHX_-nW(zhyOPRQAE|;)VsH$BA>NeuAtR(V-a>Tj0r3~P_WEACG6aya6z7tio>^0Y5br6xJuQ(KOenDBd z#>f-sX+xFZXSLY4YL+#(q=-%sDBHbnq0>;o4ltAT)ip@_CUBS8Bmv(03{7tO0oJRe zfW)?Z;Mi&}Y0dZ6Rl9`cLur%&+`b2bV@j41A+a)PJ~1S~REk*>fB9<|MGY!;3pgJe}abwx6;K0 zqzbp873?O;CVcvfP6xY+NRa~~K5MJ=>+rq(UfGz(o?Om<2G=~w=CC)1ojJGxS=9o| zc19VufnYSNI)**LaeN&UH+O4uqU&HcOB{(1p7u3-*+Ca1|7!trPGSQ*i+#hx*f-pX zeZ$|d;gp1ZL+&h2b#`GtP+|k3xYpdOxp==2-zU1+mECMbob|H7m&7Va%iu!KQV8b+ z$aJuDK->bWOd#3I;Yx@xCZbb=vjB{JwO&07gRVgf3w<6AXeN?Z=mEh-Ra=OVzV{e0T?oB!&VB_k94ykEqji;&d~^{o=08JCRKciWhbL`TZLyMcm}E#2b<~bT?%!J zWePnIhI_K9 zNih@@ZhRTt>SQ+QIs(sl?8Rf1Zo=i7s{^5)bl}dx4e)W~AK55ujCS)_#|4${jx_A< zC|CH#Sa)<22f%C@*Y3-3x)r3N9-#HTlXEqyt9+;#zd3lAGbGQ^Ib(_y$;e~-TdX*P( zk>jR(IBKx$x)qGk$ETU!a8Pm|N{*mp)09;3349F>@FrGJoZR9604H~>O>xZ~364a5 zxiJ?sWYKuDW9f0Vc&*C~oFYU+B#lZjQ7%^|PMkh|{@e?v=8vDAd-jFr!u0c}Upy(2 z#-K|%7P!TqxR_G>=*F&SG9}<|_SK=u3G;}oSiPWX$G#6U^gmI?3LYPT_;&n(vb5jt zAZn@@m;@4E_JJOKK8e2gyY4pru3Olv6EAnW&&ypugIrK2Nuoo0@eQ2Y0@)9osgF~f z#JBG!E{Xf9Hj zrh~ApYD7m~!G6{Ypfb91lFB&*Rl4r!-{j@r@gi&D-|&eGBi#G0u>B;5IE_3E;F{+0 zz_Ot;kYRkmySI1L`cAT|quO7NraT3ZgdheWuQ<79Wo!|`G``P@hkhDfpevU?qIj-D?kHnQ$I;$IHl z6K0JnBZzIVG^ZL+$1p1$eAgnlQGBf2Zkj@zig4foPhL5iL8dtz6*M(@Bq&4VK;dr) zgA(u5(WoZQzc{~1h(#qQE`XlW#18#O>>W-AlE#KHgt)Xt3^|Ag3y#~wbi^V7SIn6K zaC}2x2w6uSE5fnUpe{VdVTeJnuYH|KVsHlhg1Hp zX$%S>=z}?M$sFxc1En`EXjH78!{`y!(H0S!+tv+ui4lP!XD;S>VbQ(TUOxaICLY7s zye1Y8$;49ya8Mge8E~$LzYi;r4KH{ZnJRrAAZY%u^@NPH`Xd|{c}>}__w7oK(z6eUuMWT-WKQ~;YLbT@PhWw84f)g*h=-1LynHlo9X*ab7Js5fqK z+uUFoes-UH5+UDZ#=6HRYKbD@hp~1+f!H_#@NAQK0g7?&Pmo}aB^#oCf*GcJ)eF~v zBYx-4h#54oS%pa~!2%2e+hE6F8BkePJU3S?4SP?2f=&N9FZbh8*_j;0QH}RskMJV{ zYmLu%3L9ZG?!x;;Yf31U=@@m9f&(C9OFaA_jVUHNLMcukJW)wM%9{7`LTO$f<>e4B zMPAPEawjibp89ECMCtq*pT5G&y}X>lB^<3*W7|@-va9!^;7)|2OA#>fC1%Uh>O{Mi z{w)^0!pm2A`3qhs!D%vSP2-6s-P5Em`hW29zj*0Ql01p-_j!DPl4SW6bQEzGqd1Yt zMm$z7pPDqG_*h#EOU^Pv>jwPXZ{RyDKd|>OC)hmRAOz!(3x20f2x$oYku>HvY4Y91 zSx+|{oI3~MVDL*)GAkuXpHcE1$qNyq_gr{KTCnrcy+2=H8byz&beuYHPe}{R^;b?7 zqhWjTo0DblIG%S)WU$+k;9Bo!-4ydz1$8N}%~R zT8G}9e;aT>n&e{|`kVhNe#-(1Q98%rICw`c!i(<%Js*In8DTOv2I^T0_Y|~y(eRCy zANOtIo2@^`NIq`eC*#7Xve`7dgRXhu3&`a==J@OCAVue4zGc+2xsXAy__dT-6|hP$i;%)wfN@PMBaIQM_nmp+l^YU+_NcN6J=n zxiEjRVfGLhIkZhB<-&lBl*07#cN#wl5u?FqFrt!{4{8+Gd6)P}qflpb289fz{YyTP ze{rMAaFJ_F>Je3;r=-enlhu*MSoV~|Q*?q`3`BXnvwB4u)2eH6*ahrsyX68a$>z~1pH31Ul%u4aG zY4dY@PeJ|&bL*`Jca+VUlW86RqB*1be>2Ni%s=T9B$LMAu9{k03rA%0gUA(5oi}xy zpcjTYYE}PV7SBkycsK!ktHM*^al`82(##V^w9Nb~%r}Y%*;pA5cN#y7Dwb-b(1yKZ zMPs{29348s4p7DSO>pRcV0F&o+A#Y3C!}Wq1#?g$WF*FhI-)hwx&*07o~MyY`5KA~ z{slV+(2D~ekgI8n$>JxdwTTBg$`$$nb!cdiY3k3LI00XDNegG(VEX*SNW+N;MpxX- zi3#czoSp+@!vtcJ6G++OosqWYyiJtA$p6#$f$yVi9~+gB^XlmgEPf!?Cx^a~qloRjSE@Ka26CZZWU3hSwaW=tEJ0n=Do{{qS~ zk`)IX;1DGoN(6(8iDgBwH3E(^63==R6oc`sKZ<>6z&E(Fga0&vVb>;}l_eH4Mj?|u zYV5rAVp`Dxqgr9KBO;)M0w|qH!!yv2=rMf>NJO*<8i{iCUa_sTG00)~##9gDAaT7C z^9n;lFYYy|EuQ<{4i^M~{eYy1>A};HCf17BjWKPI{~S!%`3&6)X3Qy}`%Ux>HLv}? z3k{2rtvpXbOl!VD8j;DVQ<=!tKjhPAc)6XIQC^6B17WO!a`!N`hiE(ax|5gh;)RBe zVdN_S`3@8L9>+&3L(`o(<(R?eIC+(lC8c~`-znf|Av~oFit-5F=`8nqhENiwEpvo& z47&lE0~XlR^1-;=ZT$s#M@NxqFbFur0d!TfHHi`q)127ngDX6}x5P-n{ zqCv0HZNPAc=wy*PRCx$OkV{l=>U0C`=@ncsi4XI+X`Z=i5$7$cKbXo8lwyrnJm60e zS{#Ix4kDToac@&xG7XHF!fXaVS%lO(VacYk9wP?}EaM4w30a1_Wl_o!*@8`@o8l=k zUBbi;7895x=fud_NC}!j4jM30&%zs_11pA@2I5>vC93WDtpoJ+g%%&3gGj7|W=&FP z5RsS{>-9vd%2B7d_KjJSuuUWQX8Dou(-a}haexyH(cu56QkE+s!Q*#xPT-x%yUAsYE5=(Mb~G`) z7-totjv;gJ@aYCGVo(vg$pO9=c{#+3m|Gs>)BAZ5bIa3wdXAS5@& zCk&5B<-a|krs-6EEKjn2qrjoxC~))OMuGTnqd+m_MuAK1MuDosjY5A;Vrg8;d^P#+ YF6@SOedp9&Q@2ll-1@ln>g47B2fwM=J^%m! literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/io.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/io.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb68a11df23e74c274be7b4271d02c02d078e8fa GIT binary patch literal 13275 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 GKmP%C8MAKy literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/statemachine.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/__pycache__/statemachine.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afcbb779c070b0d6de8f231a8371769889b79119 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/blog-generator/venv/lib/python3.8/site-packages/docutils/examples.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/examples.py new file mode 100644 index 0000000..395dbbf --- /dev/null +++ b/blog-generator/venv/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/blog-generator/venv/lib/python3.8/site-packages/docutils/frontend.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/frontend.py new file mode 100644 index 0000000..ff571cc --- /dev/null +++ b/blog-generator/venv/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 ("", [nz*oWeXX zVVsuY%DVN0GN#75AjZ{pLoQ7y0hI#HQ-a@|CJ6_PI7d3E@)sq(BpTr3omg(iDF&~|Y!VMv{DI&K7HsYkJws~i{Y@KkM0(V|p@=pZs^80+{+ zlx|I{;I-B(@f;dKhZ>7T z%4RgDl$TBwk;Q46)Kx(tocnHRCOi$=wFLlgB*VU~(nw8lH@u@vx?+PED!uvSBe7S7 zT?)!?qo`P_=?2n5S0MpP5pBKsg<&?4NR}y;02^3FPhU1Fq_Ee$UPsazBq)4fg4p~= z*^(l-GO-u%8R{i`ppHlPH9`gV^qIM(%`9fk4q>J(&5?Cr02P?P4WGQhug{v&8M*9K(fr6@Kn1K(8C9%*pwC)RILxtV(IM)6W7d|=J{?NjqIF=- zI%u`<-oZ*_`fb*RIe&^Z@MYv403rj%eyYB7b`0^iqFs1|Gg307HtV8~zILnL!YCYI zkAH)+rNV`Y8ndOMTP$I}-NJ%lcFEjsJzrQK>f$n1IK^O?9~mELvtH3a-^HTGmd?Y3 zS&v2*y$x*(#;FYSbcI=tIWSojIq?QcPRiVZE4_PWrb|dx!i|BlfV_TV+_E+*tk5@4 z*dtDT#@c0qm;-sjGRo!^N;89OJh^(8Rv<+>nxVC|y=NDSKW>?8SCkLsSMf5RTfr;^ zYQ6~y3UCEB0e2?8i;lepykHgiPwe*fpqEd#wp6YIZXj?^=T!BvG?CTBRU+|Ys(hO3 z5iDB;0U#AZa;oa<)noaHFD}u?$EZ4ss$3dmlid(GA{@pEf`0|$8jB30+&ypr{Nb!Y z1Nb@G647KkXwbewQI5V?-BJEh`NKU$Ws=ys&pOFoc<~0p@Q%kLJb{4 z>0nVEV@sE|81p=E>m#I40;7;2zC#s>E@&u0An-`>BDHZ;8B#DIp_CRe6?pk{lc?t6 zhcxX3N+j-XqvS86B9zz#PPCMBle;%{2N>~;;h}bnF1f$n1!kl#)$xFkV;iHos#wO} z*)Oq#0U77~MIvN20QfkGpA_FUjQAajas^F^W$)ZV04Gdp9cGA#r}aJYEFR(_RjX7HY898L zQizz8BCb(&sI5a-OrZV-N=_$Lz~ZiDcuzG~1oaP4j{QjJ*HCh*4uLT0d%>cJa2vIB$CD1Ow0}&SUVA4XWJpQ}i96J;@ z1@Q~24wX-`ne#NvGC)n-DlB;V<5%+Z@SKNuS|nu(F7QF1y8~VLG(e_D>j8xe}tw zWBT6XkCd<)`p^dcm+p}Z6e}Il{mYy#KXCW?NOpYOH)evX03PD54oN4&`63VJcKc`I zk*I0<-lY@#ebwCce(R*`lf{d5s$Qe&msGuuDmYci199M%oUhq7a!ZoTOGNQqFG z)OUJ*rL?vl;&@$)D~OYcf`M!ZTC6t|Xz^FFdm MPw$z%=X>w`7uBi~5&!@I literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/peps.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/peps.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b70e8a4dcb137eb16d642ad77cfccac9450b0d1e GIT binary patch literal 8982 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/universal.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/universal.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c443533fb49c735e6b186f15cab8588be7b337e9 GIT binary patch literal 8493 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/writer_aux.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/__pycache__/writer_aux.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..963ffe78b5dcf65def460e8bc8dcf90d5096df97 GIT binary patch literal 2400 zcmbtWOK;pZ5GM85)yivU<0L?nwg6$|kOh)8iariO8st%=En4^zw*`c@DlKwtZKy{` zDtVopS3?Bj_n*G~ z@dH@>VK&RdgUub7>T4hjMTp@DGl#jt$=t}zyvWP^$j1nHp6F%$sE^U-i21Dd46z>X zKXs!3_I(z>KCt@%8$3kg@aV7bZgr4~l*&V*CC$~ekeMPGO>+U9g6wcoDbC2wA^A?G znoE)tSy|*f*J=`m+j}WU7pxMTz$&3afbhn?6^&_iumKtp3MxpU_qg0oVPzJa>=%^) zy*x~cd@9mJr}-{PLATV3i1d+>1C?Ov=FKo9Fs8D|2rH6Gr$U{Gl7%VtUxCTe_bk+& z%0?r}A8J`8x{{o2^8@`Sgcgn6#?K4JRpVO|%|Ot6x1zgTjd3&BZsU^};pO4L<_=8t z9uSToJ1BA>OD=OFkGafyh9aN&5b<6U+&A&7az@|92wAru2&y&D2?TEuT{tBrm2_9q za!*YNc~D5g4`@~je!a^RX#-<|bIaxh-n?yf8kQNiPW7DO3zJML;vG>WkItMey(O@qwX>1*m-=VcA0w_&3nvyfiZ$T zp7(1=7(+ihmyzYIF$Agdx3(WN{gcmV2B)7f4w}FeVFnOr0w}U4Tq-V24KzWUgeFW? znk!B7ghzuf^Cz&~5xnWqvgA2yhLV?pCOlSLOvhg1nWtO<9ns1(l}g9SUMg7Q+s8{J z&%@E*_cnD_ZkB0zqsmK~JmT!e{vPMzM*N}7_~TCwH(PXUcE!KhfpJnEHa>VD4zGba zH3EY0I`(h?bBKG+$T?bT>vLiSw_ZZY#&J$F9>+}>#|yB-dKkx#D=JP-`f&`l<2V{I zKBbk=aVgUR+Q6Z_09LI3OJv>fOfE0MRAv!4-Z{^)ytl&F%3YQfd8*SQS2SuNc8Xo1 zN}iN!-nx>2|m^pooaE$J;OI%{I3qs3ctqX?LEE}9%3z-_71Iriu8!H$>Pg?J&RD2 z$Ww&=0viqZ1e5|oXP$lfFPvk`nfG*m7FgU)0kh6*FbfT483uH&)PQJ=^ssh7Y8B9X z)jUCJZHj@O`^~&DdXA4h-JhRlfce>a4Y&sFe(lXKFt-Lv7}d`FV!c56Rf}qGOZLI9 z21(Od#+RgND$#J4>$q+9a$p1k#kIMTRJ7V2#0gvuQ2@||JBmwbu5F9^DC~-^8N{(| z8gVR5am!UhhDK%Br8XK!y03~#CLEfEfx6^52xu+Sol2W4$VR>C3A)3DYI@L3xYTkD z6pefGoY5Dwjy0aSwxWTd7OL`nW0V+T8pncI%o#9#1yfxCf(+>Y@tk!WIBR(5jId{S zLwt0;`yzGH3FJk1V@aRYY?WSygO6dhKwbwR8{XD9l<&YZTD9H5{98~BJ;L@+bBWvN tNvI;U$is!Ue=S|!(l^JZs;th}InV^R7H#RakyR!yUg$X&@z5QSe*q+odxQW0 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/components.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/components.py new file mode 100644 index 0000000..d3e548c --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/components.py @@ -0,0 +1,52 @@ +# $Id: components.py 4564 2006-05-21 20:44:42Z wiemann $ +# Author: David Goodger +# Copyright: This module has been placed in the public domain. + +""" +Docutils component-related transforms. +""" + +__docformat__ = 'reStructuredText' + +import sys +import os +import re +import time +from docutils import nodes, utils +from docutils import ApplicationError, DataError +from docutils.transforms import Transform, TransformError + + +class Filter(Transform): + + """ + Include or exclude elements which depend on a specific Docutils component. + + For use with `nodes.pending` elements. A "pending" element's dictionary + attribute ``details`` must contain the keys "component" and "format". The + value of ``details['component']`` must match the type name of the + component the elements depend on (e.g. "writer"). The value of + ``details['format']`` is the name of a specific format or context of that + component (e.g. "html"). If the matching Docutils component supports that + format or context, the "pending" element is replaced by the contents of + ``details['nodes']`` (a list of nodes); otherwise, the "pending" element + is removed. + + For example, the reStructuredText "meta" directive creates a "pending" + element containing a "meta" element (in ``pending.details['nodes']``). + Only writers (``pending.details['component'] == 'writer'``) supporting the + "html" format (``pending.details['format'] == 'html'``) will include the + "meta" element; it will be deleted from the output of all other writers. + """ + + default_priority = 780 + + def apply(self): + pending = self.startnode + component_type = pending.details['component'] # 'reader' or 'writer' + format = pending.details['format'] + component = self.document.transformer.components[component_type] + if component.supports(format): + pending.replace_self(pending.details['nodes']) + else: + pending.parent.remove(pending) diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/frontmatter.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/frontmatter.py new file mode 100644 index 0000000..1cb7176 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/frontmatter.py @@ -0,0 +1,548 @@ +# $Id: frontmatter.py 8389 2019-09-11 11:39:13Z milde $ +# Author: David Goodger, Ueli Schlaepfer +# Copyright: This module has been placed in the public domain. + +""" +Transforms related to the front matter of a document or a section +(information found before the main text): + +- `DocTitle`: Used to transform a lone top level section's title to + the document title, promote a remaining lone top-level section's + title to the document subtitle, and determine the document's title + metadata (document['title']) based on the document title and/or the + "title" setting. + +- `SectionSubTitle`: Used to transform a lone subsection into a + subtitle. + +- `DocInfo`: Used to transform a bibliographic field list into docinfo + elements. +""" + +__docformat__ = 'reStructuredText' + +import re +import sys + +from docutils import nodes, utils +from docutils.transforms import TransformError, Transform + + +if sys.version_info >= (3, 0): + unicode = str # noqa + + +class TitlePromoter(Transform): + + """ + Abstract base class for DocTitle and SectionSubTitle transforms. + """ + + def promote_title(self, node): + """ + Transform the following tree:: + + +

+ + ... + + into :: + + <node> + <title> + ... + + `node` is normally a document. + """ + # Type check + if not isinstance(node, nodes.Element): + raise TypeError('node must be of Element-derived type.') + + # `node` must not have a title yet. + assert not (len(node) and isinstance(node[0], nodes.title)) + section, index = self.candidate_index(node) + if index is None: + return False + + # Transfer the section's attributes to the node: + # NOTE: Change `replace` to False to NOT replace attributes that + # already exist in node with those in section. + # NOTE: Remove `and_source` to NOT copy the 'source' + # attribute from section + node.update_all_atts_concatenating(section, replace=True, and_source=True) + + # setup_child is called automatically for all nodes. + node[:] = (section[:1] # section title + + node[:index] # everything that was in the + # node before the section + + section[1:]) # everything that was in the section + assert isinstance(node[0], nodes.title) + return True + + def promote_subtitle(self, node): + """ + Transform the following node tree:: + + <node> + <title> + <section> + <title> + ... + + into :: + + <node> + <title> + <subtitle> + ... + """ + # Type check + if not isinstance(node, nodes.Element): + raise TypeError('node must be of Element-derived type.') + + subsection, index = self.candidate_index(node) + if index is None: + return False + subtitle = nodes.subtitle() + + # Transfer the subsection's attributes to the new subtitle + # NOTE: Change `replace` to False to NOT replace attributes + # that already exist in node with those in section. + # NOTE: Remove `and_source` to NOT copy the 'source' + # attribute from section. + subtitle.update_all_atts_concatenating(subsection, replace=True, and_source=True) + + # Transfer the contents of the subsection's title to the + # subtitle: + subtitle[:] = subsection[0][:] + node[:] = (node[:1] # title + + [subtitle] + # everything that was before the section: + + node[1:index] + # everything that was in the subsection: + + subsection[1:]) + return True + + def candidate_index(self, node): + """ + Find and return the promotion candidate and its index. + + Return (None, None) if no valid candidate was found. + """ + index = node.first_child_not_matching_class( + nodes.PreBibliographic) + if (index is None or len(node) > (index + 1) + or not isinstance(node[index], nodes.section)): + return None, None + else: + return node[index], index + + +class DocTitle(TitlePromoter): + + """ + In reStructuredText_, there is no way to specify a document title + and subtitle explicitly. Instead, we can supply the document title + (and possibly the subtitle as well) implicitly, and use this + two-step transform to "raise" or "promote" the title(s) (and their + corresponding section contents) to the document level. + + 1. If the document contains a single top-level section as its + first non-comment element, the top-level section's title + becomes the document's title, and the top-level section's + contents become the document's immediate contents. The lone + top-level section header must be the first non-comment element + in the document. + + For example, take this input text:: + + ================= + Top-Level Title + ================= + + A paragraph. + + Once parsed, it looks like this:: + + <document> + <section names="top-level title"> + <title> + Top-Level Title + <paragraph> + A paragraph. + + After running the DocTitle transform, we have:: + + <document names="top-level title"> + <title> + Top-Level Title + <paragraph> + A paragraph. + + 2. If step 1 successfully determines the document title, we + continue by checking for a subtitle. + + If the lone top-level section itself contains a single + second-level section as its first non-comment element, that + section's title is promoted to the document's subtitle, and + that section's contents become the document's immediate + contents. Given this input text:: + + ================= + Top-Level Title + ================= + + Second-Level Title + ~~~~~~~~~~~~~~~~~~ + + A paragraph. + + After parsing and running the Section Promotion transform, the + result is:: + + <document names="top-level title"> + <title> + Top-Level Title + <subtitle names="second-level title"> + Second-Level Title + <paragraph> + A paragraph. + + (Note that the implicit hyperlink target generated by the + "Second-Level Title" is preserved on the "subtitle" element + itself.) + + Any comment elements occurring before the document title or + subtitle are accumulated and inserted as the first body elements + after the title(s). + + This transform also sets the document's metadata title + (document['title']). + + .. _reStructuredText: http://docutils.sf.net/rst.html + """ + + default_priority = 320 + + def set_metadata(self): + """ + Set document['title'] metadata title from the following + sources, listed in order of priority: + + * Existing document['title'] attribute. + * "title" setting. + * Document title node (as promoted by promote_title). + """ + if not self.document.hasattr('title'): + if self.document.settings.title is not None: + self.document['title'] = self.document.settings.title + elif len(self.document) and isinstance(self.document[0], nodes.title): + self.document['title'] = self.document[0].astext() + + def apply(self): + if getattr(self.document.settings, 'doctitle_xform', 1): + # promote_(sub)title defined in TitlePromoter base class. + if self.promote_title(self.document): + # If a title has been promoted, also try to promote a + # subtitle. + self.promote_subtitle(self.document) + # Set document['title']. + self.set_metadata() + + +class SectionSubTitle(TitlePromoter): + + """ + This works like document subtitles, but for sections. For example, :: + + <section> + <title> + Title + <section> + <title> + Subtitle + ... + + is transformed into :: + + <section> + <title> + Title + <subtitle> + Subtitle + ... + + For details refer to the docstring of DocTitle. + """ + + default_priority = 350 + + def apply(self): + if not getattr(self.document.settings, 'sectsubtitle_xform', 1): + return + for section in self.document._traverse(nodes.section): + # On our way through the node tree, we are modifying it + # but only the not-yet-visited part, so that the iterator + # returned by _traverse() is not corrupted. + self.promote_subtitle(section) + + +class DocInfo(Transform): + + """ + This transform is specific to the reStructuredText_ markup syntax; + see "Bibliographic Fields" in the `reStructuredText Markup + Specification`_ for a high-level description. This transform + should be run *after* the `DocTitle` transform. + + Given a field list as the first non-comment element after the + document title and subtitle (if present), registered bibliographic + field names are transformed to the corresponding DTD elements, + becoming child elements of the "docinfo" element (except for a + dedication and/or an abstract, which become "topic" elements after + "docinfo"). + + For example, given this document fragment after parsing:: + + <document> + <title> + Document Title + <field_list> + <field> + <field_name> + Author + <field_body> + <paragraph> + A. Name + <field> + <field_name> + Status + <field_body> + <paragraph> + $RCSfile$ + ... + + After running the bibliographic field list transform, the + resulting document tree would look like this:: + + <document> + <title> + Document Title + <docinfo> + <author> + A. Name + <status> + frontmatter.py + ... + + The "Status" field contained an expanded RCS keyword, which is + normally (but optionally) cleaned up by the transform. The sole + contents of the field body must be a paragraph containing an + expanded RCS keyword of the form "$keyword: expansion text $". Any + RCS keyword can be processed in any bibliographic field. The + dollar signs and leading RCS keyword name are removed. Extra + processing is done for the following RCS keywords: + + - "RCSfile" expands to the name of the file in the RCS or CVS + repository, which is the name of the source file with a ",v" + suffix appended. The transform will remove the ",v" suffix. + + - "Date" expands to the format "YYYY/MM/DD hh:mm:ss" (in the UTC + time zone). The RCS Keywords transform will extract just the + date itself and transform it to an ISO 8601 format date, as in + "2000-12-31". + + (Since the source file for this text is itself stored under CVS, + we can't show an example of the "Date" RCS keyword because we + can't prevent any RCS keywords used in this explanation from + being expanded. Only the "RCSfile" keyword is stable; its + expansion text changes only if the file name changes.) + + .. _reStructuredText: http://docutils.sf.net/rst.html + .. _reStructuredText Markup Specification: + http://docutils.sf.net/docs/ref/rst/restructuredtext.html + """ + + default_priority = 340 + + biblio_nodes = { + 'author': nodes.author, + 'authors': nodes.authors, + 'organization': nodes.organization, + 'address': nodes.address, + 'contact': nodes.contact, + 'version': nodes.version, + 'revision': nodes.revision, + 'status': nodes.status, + 'date': nodes.date, + 'copyright': nodes.copyright, + 'dedication': nodes.topic, + 'abstract': nodes.topic} + """Canonical field name (lowcased) to node class name mapping for + bibliographic fields (field_list).""" + + def apply(self): + if not getattr(self.document.settings, 'docinfo_xform', 1): + return + document = self.document + index = document.first_child_not_matching_class( + nodes.PreBibliographic) + if index is None: + return + candidate = document[index] + if isinstance(candidate, nodes.field_list): + biblioindex = document.first_child_not_matching_class( + (nodes.Titular, nodes.Decorative)) + nodelist = self.extract_bibliographic(candidate) + del document[index] # untransformed field list (candidate) + document[biblioindex:biblioindex] = nodelist + + def extract_bibliographic(self, field_list): + docinfo = nodes.docinfo() + bibliofields = self.language.bibliographic_fields + labels = self.language.labels + topics = {'dedication': None, 'abstract': None} + for field in field_list: + try: + name = field[0][0].astext() + normedname = nodes.fully_normalize_name(name) + if not (len(field) == 2 and normedname in bibliofields + and self.check_empty_biblio_field(field, name)): + raise TransformError + canonical = bibliofields[normedname] + biblioclass = self.biblio_nodes[canonical] + if issubclass(biblioclass, nodes.TextElement): + if not self.check_compound_biblio_field(field, name): + raise TransformError + utils.clean_rcs_keywords( + field[1][0], self.rcs_keyword_substitutions) + docinfo.append(biblioclass('', '', *field[1][0])) + elif issubclass(biblioclass, nodes.authors): + self.extract_authors(field, name, docinfo) + elif issubclass(biblioclass, nodes.topic): + if topics[canonical]: + field[-1] += self.document.reporter.warning( + 'There can only be one "%s" field.' % name, + base_node=field) + raise TransformError + title = nodes.title(name, labels[canonical]) + title[0].rawsource = labels[canonical] + topics[canonical] = biblioclass( + '', title, classes=[canonical], *field[1].children) + else: + docinfo.append(biblioclass('', *field[1].children)) + except TransformError: + if len(field[-1]) == 1 \ + and isinstance(field[-1][0], nodes.paragraph): + utils.clean_rcs_keywords( + field[-1][0], self.rcs_keyword_substitutions) + # if normedname not in bibliofields: + classvalue = nodes.make_id(normedname) + if classvalue: + field['classes'].append(classvalue) + docinfo.append(field) + nodelist = [] + if len(docinfo) != 0: + nodelist.append(docinfo) + for name in ('dedication', 'abstract'): + if topics[name]: + nodelist.append(topics[name]) + return nodelist + + def check_empty_biblio_field(self, field, name): + if len(field[-1]) < 1: + field[-1] += self.document.reporter.warning( + 'Cannot extract empty bibliographic field "%s".' % name, + base_node=field) + return None + return 1 + + def check_compound_biblio_field(self, field, name): + if len(field[-1]) > 1: + field[-1] += self.document.reporter.warning( + 'Cannot extract compound bibliographic field "%s".' % name, + base_node=field) + return None + if not isinstance(field[-1][0], nodes.paragraph): + field[-1] += self.document.reporter.warning( + 'Cannot extract bibliographic field "%s" containing ' + 'anything other than a single paragraph.' % name, + base_node=field) + return None + return 1 + + rcs_keyword_substitutions = [ + (re.compile(r'\$' r'Date: (\d\d\d\d)[-/](\d\d)[-/](\d\d)[ T][\d:]+' + r'[^$]* \$', re.IGNORECASE), r'\1-\2-\3'), + (re.compile(r'\$' r'RCSfile: (.+),v \$', re.IGNORECASE), r'\1'), + (re.compile(r'\$[a-zA-Z]+: (.+) \$'), r'\1'),] + + def extract_authors(self, field, name, docinfo): + try: + if len(field[1]) == 1: + if isinstance(field[1][0], nodes.paragraph): + authors = self.authors_from_one_paragraph(field) + elif isinstance(field[1][0], nodes.bullet_list): + authors = self.authors_from_bullet_list(field) + else: + raise TransformError + else: + authors = self.authors_from_paragraphs(field) + authornodes = [nodes.author('', '', *author) + for author in authors if author] + if len(authornodes) >= 1: + docinfo.append(nodes.authors('', *authornodes)) + else: + raise TransformError + except TransformError: + field[-1] += self.document.reporter.warning( + 'Bibliographic field "%s" incompatible with extraction: ' + 'it must contain either a single paragraph (with authors ' + 'separated by one of "%s"), multiple paragraphs (one per ' + 'author), or a bullet list with one paragraph (one author) ' + 'per item.' + % (name, ''.join(self.language.author_separators)), + base_node=field) + raise + + def authors_from_one_paragraph(self, field): + """Return list of Text nodes for authornames. + + The set of separators is locale dependent (default: ";"- or ","). + """ + # @@ keep original formatting? (e.g. ``:authors: A. Test, *et-al*``) + text = ''.join(unicode(node) + for node in field[1].traverse(nodes.Text)) + if not text: + raise TransformError + for authorsep in self.language.author_separators: + # don't split at escaped `authorsep`: + pattern = '(?<!\x00)%s' % authorsep + authornames = re.split(pattern, text) + if len(authornames) > 1: + break + authornames = (name.strip() for name in authornames) + authors = [[nodes.Text(name, utils.unescape(name, True))] + for name in authornames if name] + return authors + + def authors_from_bullet_list(self, field): + authors = [] + for item in field[1][0]: + if isinstance(item, nodes.comment): + continue + if len(item) != 1 or not isinstance(item[0], nodes.paragraph): + raise TransformError + authors.append(item[0].children) + if not authors: + raise TransformError + return authors + + def authors_from_paragraphs(self, field): + for item in field[1]: + if not isinstance(item, (nodes.paragraph, nodes.comment)): + raise TransformError + authors = [item.children for item in field[1] + if not isinstance(item, nodes.comment)] + return authors diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/misc.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/misc.py new file mode 100644 index 0000000..cd68ee1 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/misc.py @@ -0,0 +1,144 @@ +# $Id: misc.py 6314 2010-04-26 10:04:17Z milde $ +# Author: David Goodger <goodger@python.org> +# Copyright: This module has been placed in the public domain. + +""" +Miscellaneous transforms. +""" + +__docformat__ = 'reStructuredText' + +from docutils import nodes +from docutils.transforms import Transform, TransformError + + +class CallBack(Transform): + + """ + Inserts a callback into a document. The callback is called when the + transform is applied, which is determined by its priority. + + For use with `nodes.pending` elements. Requires a ``details['callback']`` + entry, a bound method or function which takes one parameter: the pending + node. Other data can be stored in the ``details`` attribute or in the + object hosting the callback method. + """ + + default_priority = 990 + + def apply(self): + pending = self.startnode + pending.details['callback'](pending) + pending.parent.remove(pending) + + +class ClassAttribute(Transform): + + """ + Move the "class" attribute specified in the "pending" node into the + immediately following non-comment element. + """ + + default_priority = 210 + + def apply(self): + pending = self.startnode + parent = pending.parent + child = pending + while parent: + # Check for appropriate following siblings: + for index in range(parent.index(child) + 1, len(parent)): + element = parent[index] + if (isinstance(element, nodes.Invisible) or + isinstance(element, nodes.system_message)): + continue + element['classes'] += pending.details['class'] + pending.parent.remove(pending) + return + else: + # At end of section or container; apply to sibling + child = parent + parent = parent.parent + error = self.document.reporter.error( + 'No suitable element following "%s" directive' + % pending.details['directive'], + nodes.literal_block(pending.rawsource, pending.rawsource), + line=pending.line) + pending.replace_self(error) + + +class Transitions(Transform): + + """ + Move transitions at the end of sections up the tree. Complain + on transitions after a title, at the beginning or end of the + document, and after another transition. + + For example, transform this:: + + <section> + ... + <transition> + <section> + ... + + into this:: + + <section> + ... + <transition> + <section> + ... + """ + + default_priority = 830 + + def apply(self): + for node in self.document.traverse(nodes.transition): + self.visit_transition(node) + + def visit_transition(self, node): + index = node.parent.index(node) + error = None + if (index == 0 or + isinstance(node.parent[0], nodes.title) and + (index == 1 or + isinstance(node.parent[1], nodes.subtitle) and + index == 2)): + assert (isinstance(node.parent, nodes.document) or + isinstance(node.parent, nodes.section)) + error = self.document.reporter.error( + 'Document or section may not begin with a transition.', + source=node.source, line=node.line) + elif isinstance(node.parent[index - 1], nodes.transition): + error = self.document.reporter.error( + 'At least one body element must separate transitions; ' + 'adjacent transitions are not allowed.', + source=node.source, line=node.line) + if error: + # Insert before node and update index. + node.parent.insert(index, error) + index += 1 + assert index < len(node.parent) + if index != len(node.parent) - 1: + # No need to move the node. + return + # Node behind which the transition is to be moved. + sibling = node + # While sibling is the last node of its parent. + while index == len(sibling.parent) - 1: + sibling = sibling.parent + # If sibling is the whole document (i.e. it has no parent). + if sibling.parent is None: + # Transition at the end of document. Do not move the + # transition up, and place an error behind. + error = self.document.reporter.error( + 'Document may not end with a transition.', + line=node.line) + node.parent.insert(node.parent.index(node) + 1, error) + return + index = sibling.parent.index(sibling) + # Remove the original transition node. + node.parent.remove(node) + # Insert the transition after the sibling. + sibling.parent.insert(index + 1, node) diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/parts.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/parts.py new file mode 100644 index 0000000..27efc8d --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/parts.py @@ -0,0 +1,180 @@ +# $Id: parts.py 8403 2019-10-11 10:09:53Z milde $ +# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Dmitry Jemerov +# Copyright: This module has been placed in the public domain. + +""" +Transforms related to document parts. +""" + +__docformat__ = 'reStructuredText' + + +import re +import sys +from docutils import nodes, utils +from docutils.transforms import TransformError, Transform + + +class SectNum(Transform): + + """ + Automatically assigns numbers to the titles of document sections. + + It is possible to limit the maximum section level for which the numbers + are added. For those sections that are auto-numbered, the "autonum" + attribute is set, informing the contents table generator that a different + form of the TOC should be used. + """ + + default_priority = 710 + """Should be applied before `Contents`.""" + + def apply(self): + self.maxdepth = self.startnode.details.get('depth', None) + self.startvalue = self.startnode.details.get('start', 1) + self.prefix = self.startnode.details.get('prefix', '') + self.suffix = self.startnode.details.get('suffix', '') + self.startnode.parent.remove(self.startnode) + if self.document.settings.sectnum_xform: + if self.maxdepth is None: + self.maxdepth = sys.maxsize + self.update_section_numbers(self.document) + else: # store details for eventual section numbering by the writer + self.document.settings.sectnum_depth = self.maxdepth + self.document.settings.sectnum_start = self.startvalue + self.document.settings.sectnum_prefix = self.prefix + self.document.settings.sectnum_suffix = self.suffix + + def update_section_numbers(self, node, prefix=(), depth=0): + depth += 1 + if prefix: + sectnum = 1 + else: + sectnum = self.startvalue + for child in node: + if isinstance(child, nodes.section): + numbers = prefix + (str(sectnum),) + title = child[0] + # Use   for spacing: + generated = nodes.generated( + '', (self.prefix + '.'.join(numbers) + self.suffix + + u'\u00a0' * 3), + classes=['sectnum']) + title.insert(0, generated) + title['auto'] = 1 + if depth < self.maxdepth: + self.update_section_numbers(child, numbers, depth) + sectnum += 1 + + +class Contents(Transform): + + """ + This transform generates a table of contents from the entire document tree + or from a single branch. It locates "section" elements and builds them + into a nested bullet list, which is placed within a "topic" created by the + contents directive. A title is either explicitly specified, taken from + the appropriate language module, or omitted (local table of contents). + The depth may be specified. Two-way references between the table of + contents and section titles are generated (requires Writer support). + + This transform requires a startnode, which contains generation + options and provides the location for the generated table of contents (the + startnode is replaced by the table of contents "topic"). + """ + + default_priority = 720 + + def apply(self): + try: # let the writer (or output software) build the contents list? + toc_by_writer = self.document.settings.use_latex_toc + except AttributeError: + toc_by_writer = False + details = self.startnode.details + if 'local' in details: + startnode = self.startnode.parent.parent + while not (isinstance(startnode, nodes.section) + or isinstance(startnode, nodes.document)): + # find the ToC root: a direct ancestor of startnode + startnode = startnode.parent + else: + startnode = self.document + self.toc_id = self.startnode.parent['ids'][0] + if 'backlinks' in details: + self.backlinks = details['backlinks'] + else: + self.backlinks = self.document.settings.toc_backlinks + if toc_by_writer: + # move customization settings to the parent node + self.startnode.parent.attributes.update(details) + self.startnode.parent.remove(self.startnode) + else: + contents = self.build_contents(startnode) + if len(contents): + self.startnode.replace_self(contents) + else: + self.startnode.parent.parent.remove(self.startnode.parent) + + def build_contents(self, node, level=0): + level += 1 + sections = [sect for sect in node if isinstance(sect, nodes.section)] + entries = [] + autonum = 0 + depth = self.startnode.details.get('depth', sys.maxsize) + for section in sections: + title = section[0] + auto = title.get('auto') # May be set by SectNum. + entrytext = self.copy_and_filter(title) + reference = nodes.reference('', '', refid=section['ids'][0], + *entrytext) + ref_id = self.document.set_id(reference, + suggested_prefix='toc-entry') + entry = nodes.paragraph('', '', reference) + item = nodes.list_item('', entry) + if ( self.backlinks in ('entry', 'top') + and title.next_node(nodes.reference) is None): + if self.backlinks == 'entry': + title['refid'] = ref_id + elif self.backlinks == 'top': + title['refid'] = self.toc_id + if level < depth: + subsects = self.build_contents(section, level) + item += subsects + entries.append(item) + if entries: + contents = nodes.bullet_list('', *entries) + if auto: + contents['classes'].append('auto-toc') + return contents + else: + return [] + + def copy_and_filter(self, node): + """Return a copy of a title, with references, images, etc. removed.""" + visitor = ContentsFilter(self.document) + node.walkabout(visitor) + return visitor.get_entry_text() + + +class ContentsFilter(nodes.TreeCopyVisitor): + + def get_entry_text(self): + return self.get_tree_copy().children + + def visit_citation_reference(self, node): + raise nodes.SkipNode + + def visit_footnote_reference(self, node): + raise nodes.SkipNode + + def visit_image(self, node): + if node.hasattr('alt'): + self.parent.append(nodes.Text(node['alt'])) + raise nodes.SkipNode + + def ignore_node_but_process_children(self, node): + raise nodes.SkipDeparture + + visit_problematic = ignore_node_but_process_children + visit_reference = ignore_node_but_process_children + visit_target = ignore_node_but_process_children diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/peps.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/peps.py new file mode 100644 index 0000000..94b47c1 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/peps.py @@ -0,0 +1,305 @@ +# $Id: peps.py 7995 2016-12-10 17:50:59Z milde $ +# Author: David Goodger <goodger@python.org> +# Copyright: This module has been placed in the public domain. + +""" +Transforms for PEP processing. + +- `Headers`: Used to transform a PEP's initial RFC-2822 header. It remains a + field list, but some entries get processed. +- `Contents`: Auto-inserts a table of contents. +- `PEPZero`: Special processing for PEP 0. +""" + +__docformat__ = 'reStructuredText' + +import sys +import os +import re +import time +from docutils import nodes, utils, languages +from docutils import ApplicationError, DataError +from docutils.transforms import Transform, TransformError +from docutils.transforms import parts, references, misc + + +class Headers(Transform): + + """ + Process fields in a PEP's initial RFC-2822 header. + """ + + default_priority = 360 + + pep_url = 'pep-%04d' + pep_cvs_url = ('http://hg.python.org' + '/peps/file/default/pep-%04d.txt') + rcs_keyword_substitutions = ( + (re.compile(r'\$' r'RCSfile: (.+),v \$$', re.IGNORECASE), r'\1'), + (re.compile(r'\$[a-zA-Z]+: (.+) \$$'), r'\1'),) + + def apply(self): + if not len(self.document): + # @@@ replace these DataErrors with proper system messages + raise DataError('Document tree is empty.') + header = self.document[0] + if not isinstance(header, nodes.field_list) or \ + 'rfc2822' not in header['classes']: + raise DataError('Document does not begin with an RFC-2822 ' + 'header; it is not a PEP.') + pep = None + for field in header: + if field[0].astext().lower() == 'pep': # should be the first field + value = field[1].astext() + try: + pep = int(value) + cvs_url = self.pep_cvs_url % pep + except ValueError: + pep = value + cvs_url = None + msg = self.document.reporter.warning( + '"PEP" header must contain an integer; "%s" is an ' + 'invalid value.' % pep, base_node=field) + msgid = self.document.set_id(msg) + prb = nodes.problematic(value, value or '(none)', + refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + if len(field[1]): + field[1][0][:] = [prb] + else: + field[1] += nodes.paragraph('', '', prb) + break + if pep is None: + raise DataError('Document does not contain an RFC-2822 "PEP" ' + 'header.') + if pep == 0: + # Special processing for PEP 0. + pending = nodes.pending(PEPZero) + self.document.insert(1, pending) + self.document.note_pending(pending) + if len(header) < 2 or header[1][0].astext().lower() != 'title': + raise DataError('No title!') + for field in header: + name = field[0].astext().lower() + body = field[1] + if len(body) > 1: + raise DataError('PEP header field body contains multiple ' + 'elements:\n%s' % field.pformat(level=1)) + elif len(body) == 1: + if not isinstance(body[0], nodes.paragraph): + raise DataError('PEP header field body may only contain ' + 'a single paragraph:\n%s' + % field.pformat(level=1)) + elif name == 'last-modified': + date = time.strftime( + '%d-%b-%Y', + time.localtime(os.stat(self.document['source'])[8])) + if cvs_url: + body += nodes.paragraph( + '', '', nodes.reference('', date, refuri=cvs_url)) + else: + # empty + continue + para = body[0] + if name == 'author': + for node in para: + if isinstance(node, nodes.reference): + node.replace_self(mask_email(node)) + elif name == 'discussions-to': + for node in para: + if isinstance(node, nodes.reference): + node.replace_self(mask_email(node, pep)) + elif name in ('replaces', 'replaced-by', 'requires'): + newbody = [] + space = nodes.Text(' ') + for refpep in re.split(r',?\s+', body.astext()): + pepno = int(refpep) + newbody.append(nodes.reference( + refpep, refpep, + refuri=(self.document.settings.pep_base_url + + self.pep_url % pepno))) + newbody.append(space) + para[:] = newbody[:-1] # drop trailing space + elif name == 'last-modified': + utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions) + if cvs_url: + date = para.astext() + para[:] = [nodes.reference('', date, refuri=cvs_url)] + elif name == 'content-type': + pep_type = para.astext() + uri = self.document.settings.pep_base_url + self.pep_url % 12 + para[:] = [nodes.reference('', pep_type, refuri=uri)] + elif name == 'version' and len(body): + utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions) + + +class Contents(Transform): + + """ + Insert an empty table of contents topic and a transform placeholder into + the document after the RFC 2822 header. + """ + + default_priority = 380 + + def apply(self): + language = languages.get_language(self.document.settings.language_code, + self.document.reporter) + name = language.labels['contents'] + title = nodes.title('', name) + topic = nodes.topic('', title, classes=['contents']) + name = nodes.fully_normalize_name(name) + if not self.document.has_name(name): + topic['names'].append(name) + self.document.note_implicit_target(topic) + pending = nodes.pending(parts.Contents) + topic += pending + self.document.insert(1, topic) + self.document.note_pending(pending) + + +class TargetNotes(Transform): + + """ + Locate the "References" section, insert a placeholder for an external + target footnote insertion transform at the end, and schedule the + transform to run immediately. + """ + + default_priority = 520 + + def apply(self): + doc = self.document + i = len(doc) - 1 + refsect = copyright = None + while i >= 0 and isinstance(doc[i], nodes.section): + title_words = doc[i][0].astext().lower().split() + if 'references' in title_words: + refsect = doc[i] + break + elif 'copyright' in title_words: + copyright = i + i -= 1 + if not refsect: + refsect = nodes.section() + refsect += nodes.title('', 'References') + doc.set_id(refsect) + if copyright: + # Put the new "References" section before "Copyright": + doc.insert(copyright, refsect) + else: + # Put the new "References" section at end of doc: + doc.append(refsect) + pending = nodes.pending(references.TargetNotes) + refsect.append(pending) + self.document.note_pending(pending, 0) + pending = nodes.pending(misc.CallBack, + details={'callback': self.cleanup_callback}) + refsect.append(pending) + self.document.note_pending(pending, 1) + + def cleanup_callback(self, pending): + """ + Remove an empty "References" section. + + Called after the `references.TargetNotes` transform is complete. + """ + if len(pending.parent) == 2: # <title> and <pending> + pending.parent.parent.remove(pending.parent) + + +class PEPZero(Transform): + + """ + Special processing for PEP 0. + """ + + default_priority =760 + + def apply(self): + visitor = PEPZeroSpecial(self.document) + self.document.walk(visitor) + self.startnode.parent.remove(self.startnode) + + +class PEPZeroSpecial(nodes.SparseNodeVisitor): + + """ + Perform the special processing needed by PEP 0: + + - Mask email addresses. + + - Link PEP numbers in the second column of 4-column tables to the PEPs + themselves. + """ + + pep_url = Headers.pep_url + + def unknown_visit(self, node): + pass + + def visit_reference(self, node): + node.replace_self(mask_email(node)) + + def visit_field_list(self, node): + if 'rfc2822' in node['classes']: + raise nodes.SkipNode + + def visit_tgroup(self, node): + self.pep_table = node['cols'] == 4 + self.entry = 0 + + def visit_colspec(self, node): + self.entry += 1 + if self.pep_table and self.entry == 2: + node['classes'].append('num') + + def visit_row(self, node): + self.entry = 0 + + def visit_entry(self, node): + self.entry += 1 + if self.pep_table and self.entry == 2 and len(node) == 1: + node['classes'].append('num') + p = node[0] + if isinstance(p, nodes.paragraph) and len(p) == 1: + text = p.astext() + try: + pep = int(text) + ref = (self.document.settings.pep_base_url + + self.pep_url % pep) + p[0] = nodes.reference(text, text, refuri=ref) + except ValueError: + pass + + +non_masked_addresses = ('peps@python.org', + 'python-list@python.org', + 'python-dev@python.org') + +def mask_email(ref, pepno=None): + """ + Mask the email address in `ref` and return a replacement node. + + `ref` is returned unchanged if it contains no email address. + + For email addresses such as "user@host", mask the address as "user at + host" (text) to thwart simple email address harvesters (except for those + listed in `non_masked_addresses`). If a PEP number (`pepno`) is given, + return a reference including a default email subject. + """ + if ref.hasattr('refuri') and ref['refuri'].startswith('mailto:'): + if ref['refuri'][8:] in non_masked_addresses: + replacement = ref[0] + else: + replacement_text = ref.astext().replace('@', ' at ') + replacement = nodes.raw('', replacement_text, format='html') + if pepno is None: + return replacement + else: + ref['refuri'] += '?subject=PEP%%20%s' % pepno + ref[:] = [replacement] + return ref + else: + return ref diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/references.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/references.py new file mode 100644 index 0000000..e6f6149 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/references.py @@ -0,0 +1,911 @@ +# $Id: references.py 8387 2019-09-06 13:16:34Z milde $ +# Author: David Goodger <goodger@python.org> +# Copyright: This module has been placed in the public domain. + +""" +Transforms for resolving references. +""" + +__docformat__ = 'reStructuredText' + +import sys +import re +from docutils import nodes, utils +from docutils.transforms import TransformError, Transform + + +class PropagateTargets(Transform): + + """ + Propagate empty internal targets to the next element. + + Given the following nodes:: + + <target ids="internal1" names="internal1"> + <target anonymous="1" ids="id1"> + <target ids="internal2" names="internal2"> + <paragraph> + This is a test. + + PropagateTargets propagates the ids and names of the internal + targets preceding the paragraph to the paragraph itself:: + + <target refid="internal1"> + <target anonymous="1" refid="id1"> + <target refid="internal2"> + <paragraph ids="internal2 id1 internal1" names="internal2 internal1"> + This is a test. + """ + + default_priority = 260 + + def apply(self): + for target in self.document.traverse(nodes.target): + # Only block-level targets without reference (like ".. target:"): + if (isinstance(target.parent, nodes.TextElement) or + (target.hasattr('refid') or target.hasattr('refuri') or + target.hasattr('refname'))): + continue + assert len(target) == 0, 'error: block-level target has children' + next_node = target.next_node(ascend=True) + # Do not move names and ids into Invisibles (we'd lose the + # attributes) or different Targetables (e.g. footnotes). + if (next_node is not None and + ((not isinstance(next_node, nodes.Invisible) and + not isinstance(next_node, nodes.Targetable)) or + isinstance(next_node, nodes.target))): + next_node['ids'].extend(target['ids']) + next_node['names'].extend(target['names']) + # Set defaults for next_node.expect_referenced_by_name/id. + if not hasattr(next_node, 'expect_referenced_by_name'): + next_node.expect_referenced_by_name = {} + if not hasattr(next_node, 'expect_referenced_by_id'): + next_node.expect_referenced_by_id = {} + for id in target['ids']: + # Update IDs to node mapping. + self.document.ids[id] = next_node + # If next_node is referenced by id ``id``, this + # target shall be marked as referenced. + next_node.expect_referenced_by_id[id] = target + for name in target['names']: + next_node.expect_referenced_by_name[name] = target + # If there are any expect_referenced_by_... attributes + # in target set, copy them to next_node. + next_node.expect_referenced_by_name.update( + getattr(target, 'expect_referenced_by_name', {})) + next_node.expect_referenced_by_id.update( + getattr(target, 'expect_referenced_by_id', {})) + # Set refid to point to the first former ID of target + # which is now an ID of next_node. + target['refid'] = target['ids'][0] + # Clear ids and names; they have been moved to + # next_node. + target['ids'] = [] + target['names'] = [] + self.document.note_refid(target) + + +class AnonymousHyperlinks(Transform): + + """ + Link anonymous references to targets. Given:: + + <paragraph> + <reference anonymous="1"> + internal + <reference anonymous="1"> + external + <target anonymous="1" ids="id1"> + <target anonymous="1" ids="id2" refuri="http://external"> + + Corresponding references are linked via "refid" or resolved via "refuri":: + + <paragraph> + <reference anonymous="1" refid="id1"> + text + <reference anonymous="1" refuri="http://external"> + external + <target anonymous="1" ids="id1"> + <target anonymous="1" ids="id2" refuri="http://external"> + """ + + default_priority = 440 + + def apply(self): + anonymous_refs = [] + anonymous_targets = [] + for node in self.document.traverse(nodes.reference): + if node.get('anonymous'): + anonymous_refs.append(node) + for node in self.document.traverse(nodes.target): + if node.get('anonymous'): + anonymous_targets.append(node) + if len(anonymous_refs) \ + != len(anonymous_targets): + msg = self.document.reporter.error( + 'Anonymous hyperlink mismatch: %s references but %s ' + 'targets.\nSee "backrefs" attribute for IDs.' + % (len(anonymous_refs), len(anonymous_targets))) + msgid = self.document.set_id(msg) + for ref in anonymous_refs: + prb = nodes.problematic( + ref.rawsource, ref.rawsource, refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + ref.replace_self(prb) + return + for ref, target in zip(anonymous_refs, anonymous_targets): + target.referenced = 1 + while True: + if target.hasattr('refuri'): + ref['refuri'] = target['refuri'] + ref.resolved = 1 + break + else: + if not target['ids']: + # Propagated target. + target = self.document.ids[target['refid']] + continue + ref['refid'] = target['ids'][0] + self.document.note_refid(ref) + break + + +class IndirectHyperlinks(Transform): + + """ + a) Indirect external references:: + + <paragraph> + <reference refname="indirect external"> + indirect external + <target id="id1" name="direct external" + refuri="http://indirect"> + <target id="id2" name="indirect external" + refname="direct external"> + + The "refuri" attribute is migrated back to all indirect targets + from the final direct target (i.e. a target not referring to + another indirect target):: + + <paragraph> + <reference refname="indirect external"> + indirect external + <target id="id1" name="direct external" + refuri="http://indirect"> + <target id="id2" name="indirect external" + refuri="http://indirect"> + + Once the attribute is migrated, the preexisting "refname" attribute + is dropped. + + b) Indirect internal references:: + + <target id="id1" name="final target"> + <paragraph> + <reference refname="indirect internal"> + indirect internal + <target id="id2" name="indirect internal 2" + refname="final target"> + <target id="id3" name="indirect internal" + refname="indirect internal 2"> + + Targets which indirectly refer to an internal target become one-hop + indirect (their "refid" attributes are directly set to the internal + target's "id"). References which indirectly refer to an internal + target become direct internal references:: + + <target id="id1" name="final target"> + <paragraph> + <reference refid="id1"> + indirect internal + <target id="id2" name="indirect internal 2" refid="id1"> + <target id="id3" name="indirect internal" refid="id1"> + """ + + default_priority = 460 + + def apply(self): + for target in self.document.indirect_targets: + if not target.resolved: + self.resolve_indirect_target(target) + self.resolve_indirect_references(target) + + def resolve_indirect_target(self, target): + refname = target.get('refname') + if refname is None: + reftarget_id = target['refid'] + else: + reftarget_id = self.document.nameids.get(refname) + if not reftarget_id: + # Check the unknown_reference_resolvers + for resolver_function in \ + self.document.transformer.unknown_reference_resolvers: + if resolver_function(target): + break + else: + self.nonexistent_indirect_target(target) + return + reftarget = self.document.ids[reftarget_id] + reftarget.note_referenced_by(id=reftarget_id) + if isinstance(reftarget, nodes.target) \ + and not reftarget.resolved and reftarget.hasattr('refname'): + if hasattr(target, 'multiply_indirect'): + #and target.multiply_indirect): + #del target.multiply_indirect + self.circular_indirect_reference(target) + return + target.multiply_indirect = 1 + self.resolve_indirect_target(reftarget) # multiply indirect + del target.multiply_indirect + if reftarget.hasattr('refuri'): + target['refuri'] = reftarget['refuri'] + if 'refid' in target: + del target['refid'] + elif reftarget.hasattr('refid'): + target['refid'] = reftarget['refid'] + self.document.note_refid(target) + else: + if reftarget['ids']: + target['refid'] = reftarget_id + self.document.note_refid(target) + else: + self.nonexistent_indirect_target(target) + return + if refname is not None: + del target['refname'] + target.resolved = 1 + + def nonexistent_indirect_target(self, target): + if target['refname'] in self.document.nameids: + self.indirect_target_error(target, 'which is a duplicate, and ' + 'cannot be used as a unique reference') + else: + self.indirect_target_error(target, 'which does not exist') + + def circular_indirect_reference(self, target): + self.indirect_target_error(target, 'forming a circular reference') + + def indirect_target_error(self, target, explanation): + naming = '' + reflist = [] + if target['names']: + naming = '"%s" ' % target['names'][0] + for name in target['names']: + reflist.extend(self.document.refnames.get(name, [])) + for id in target['ids']: + reflist.extend(self.document.refids.get(id, [])) + if target['ids']: + naming += '(id="%s")' % target['ids'][0] + msg = self.document.reporter.error( + 'Indirect hyperlink target %s refers to target "%s", %s.' + % (naming, target['refname'], explanation), base_node=target) + msgid = self.document.set_id(msg) + for ref in utils.uniq(reflist): + prb = nodes.problematic( + ref.rawsource, ref.rawsource, refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + ref.replace_self(prb) + target.resolved = 1 + + def resolve_indirect_references(self, target): + if target.hasattr('refid'): + attname = 'refid' + call_method = self.document.note_refid + elif target.hasattr('refuri'): + attname = 'refuri' + call_method = None + else: + return + attval = target[attname] + for name in target['names']: + reflist = self.document.refnames.get(name, []) + if reflist: + target.note_referenced_by(name=name) + for ref in reflist: + if ref.resolved: + continue + del ref['refname'] + ref[attname] = attval + if call_method: + call_method(ref) + ref.resolved = 1 + if isinstance(ref, nodes.target): + self.resolve_indirect_references(ref) + for id in target['ids']: + reflist = self.document.refids.get(id, []) + if reflist: + target.note_referenced_by(id=id) + for ref in reflist: + if ref.resolved: + continue + del ref['refid'] + ref[attname] = attval + if call_method: + call_method(ref) + ref.resolved = 1 + if isinstance(ref, nodes.target): + self.resolve_indirect_references(ref) + + +class ExternalTargets(Transform): + + """ + Given:: + + <paragraph> + <reference refname="direct external"> + direct external + <target id="id1" name="direct external" refuri="http://direct"> + + The "refname" attribute is replaced by the direct "refuri" attribute:: + + <paragraph> + <reference refuri="http://direct"> + direct external + <target id="id1" name="direct external" refuri="http://direct"> + """ + + default_priority = 640 + + def apply(self): + for target in self.document.traverse(nodes.target): + if target.hasattr('refuri'): + refuri = target['refuri'] + for name in target['names']: + reflist = self.document.refnames.get(name, []) + if reflist: + target.note_referenced_by(name=name) + for ref in reflist: + if ref.resolved: + continue + del ref['refname'] + ref['refuri'] = refuri + ref.resolved = 1 + + +class InternalTargets(Transform): + + default_priority = 660 + + def apply(self): + for target in self.document.traverse(nodes.target): + if not target.hasattr('refuri') and not target.hasattr('refid'): + self.resolve_reference_ids(target) + + def resolve_reference_ids(self, target): + """ + Given:: + + <paragraph> + <reference refname="direct internal"> + direct internal + <target id="id1" name="direct internal"> + + The "refname" attribute is replaced by "refid" linking to the target's + "id":: + + <paragraph> + <reference refid="id1"> + direct internal + <target id="id1" name="direct internal"> + """ + for name in target['names']: + refid = self.document.nameids.get(name) + reflist = self.document.refnames.get(name, []) + if reflist: + target.note_referenced_by(name=name) + for ref in reflist: + if ref.resolved: + continue + if refid: + del ref['refname'] + ref['refid'] = refid + ref.resolved = 1 + + +class Footnotes(Transform): + + """ + Assign numbers to autonumbered footnotes, and resolve links to footnotes, + citations, and their references. + + Given the following ``document`` as input:: + + <document> + <paragraph> + A labeled autonumbered footnote referece: + <footnote_reference auto="1" id="id1" refname="footnote"> + <paragraph> + An unlabeled autonumbered footnote referece: + <footnote_reference auto="1" id="id2"> + <footnote auto="1" id="id3"> + <paragraph> + Unlabeled autonumbered footnote. + <footnote auto="1" id="footnote" name="footnote"> + <paragraph> + Labeled autonumbered footnote. + + Auto-numbered footnotes have attribute ``auto="1"`` and no label. + Auto-numbered footnote_references have no reference text (they're + empty elements). When resolving the numbering, a ``label`` element + is added to the beginning of the ``footnote``, and reference text + to the ``footnote_reference``. + + The transformed result will be:: + + <document> + <paragraph> + A labeled autonumbered footnote referece: + <footnote_reference auto="1" id="id1" refid="footnote"> + 2 + <paragraph> + An unlabeled autonumbered footnote referece: + <footnote_reference auto="1" id="id2" refid="id3"> + 1 + <footnote auto="1" id="id3" backrefs="id2"> + <label> + 1 + <paragraph> + Unlabeled autonumbered footnote. + <footnote auto="1" id="footnote" name="footnote" backrefs="id1"> + <label> + 2 + <paragraph> + Labeled autonumbered footnote. + + Note that the footnotes are not in the same order as the references. + + The labels and reference text are added to the auto-numbered ``footnote`` + and ``footnote_reference`` elements. Footnote elements are backlinked to + their references via "refids" attributes. References are assigned "id" + and "refid" attributes. + + After adding labels and reference text, the "auto" attributes can be + ignored. + """ + + default_priority = 620 + + autofootnote_labels = None + """Keep track of unlabeled autonumbered footnotes.""" + + symbols = [ + # Entries 1-4 and 6 below are from section 12.51 of + # The Chicago Manual of Style, 14th edition. + '*', # asterisk/star + u'\u2020', # dagger † + u'\u2021', # double dagger ‡ + u'\u00A7', # section mark § + u'\u00B6', # paragraph mark (pilcrow) ¶ + # (parallels ['||'] in CMoS) + '#', # number sign + # The entries below were chosen arbitrarily. + u'\u2660', # spade suit ♠ + u'\u2665', # heart suit ♥ + u'\u2666', # diamond suit ♦ + u'\u2663', # club suit ♣ + ] + + def apply(self): + self.autofootnote_labels = [] + startnum = self.document.autofootnote_start + self.document.autofootnote_start = self.number_footnotes(startnum) + self.number_footnote_references(startnum) + self.symbolize_footnotes() + self.resolve_footnotes_and_citations() + + def number_footnotes(self, startnum): + """ + Assign numbers to autonumbered footnotes. + + For labeled autonumbered footnotes, copy the number over to + corresponding footnote references. + """ + for footnote in self.document.autofootnotes: + while True: + label = str(startnum) + startnum += 1 + if label not in self.document.nameids: + break + footnote.insert(0, nodes.label('', label)) + for name in footnote['names']: + for ref in self.document.footnote_refs.get(name, []): + ref += nodes.Text(label) + ref.delattr('refname') + assert len(footnote['ids']) == len(ref['ids']) == 1 + ref['refid'] = footnote['ids'][0] + footnote.add_backref(ref['ids'][0]) + self.document.note_refid(ref) + ref.resolved = 1 + if not footnote['names'] and not footnote['dupnames']: + footnote['names'].append(label) + self.document.note_explicit_target(footnote, footnote) + self.autofootnote_labels.append(label) + return startnum + + def number_footnote_references(self, startnum): + """Assign numbers to autonumbered footnote references.""" + i = 0 + for ref in self.document.autofootnote_refs: + if ref.resolved or ref.hasattr('refid'): + continue + try: + label = self.autofootnote_labels[i] + except IndexError: + msg = self.document.reporter.error( + 'Too many autonumbered footnote references: only %s ' + 'corresponding footnotes available.' + % len(self.autofootnote_labels), base_node=ref) + msgid = self.document.set_id(msg) + for ref in self.document.autofootnote_refs[i:]: + if ref.resolved or ref.hasattr('refname'): + continue + prb = nodes.problematic( + ref.rawsource, ref.rawsource, refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + ref.replace_self(prb) + break + ref += nodes.Text(label) + id = self.document.nameids[label] + footnote = self.document.ids[id] + ref['refid'] = id + self.document.note_refid(ref) + assert len(ref['ids']) == 1 + footnote.add_backref(ref['ids'][0]) + ref.resolved = 1 + i += 1 + + def symbolize_footnotes(self): + """Add symbols indexes to "[*]"-style footnotes and references.""" + labels = [] + for footnote in self.document.symbol_footnotes: + reps, index = divmod(self.document.symbol_footnote_start, + len(self.symbols)) + labeltext = self.symbols[index] * (reps + 1) + labels.append(labeltext) + footnote.insert(0, nodes.label('', labeltext)) + self.document.symbol_footnote_start += 1 + self.document.set_id(footnote) + i = 0 + for ref in self.document.symbol_footnote_refs: + try: + ref += nodes.Text(labels[i]) + except IndexError: + msg = self.document.reporter.error( + 'Too many symbol footnote references: only %s ' + 'corresponding footnotes available.' % len(labels), + base_node=ref) + msgid = self.document.set_id(msg) + for ref in self.document.symbol_footnote_refs[i:]: + if ref.resolved or ref.hasattr('refid'): + continue + prb = nodes.problematic( + ref.rawsource, ref.rawsource, refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + ref.replace_self(prb) + break + footnote = self.document.symbol_footnotes[i] + assert len(footnote['ids']) == 1 + ref['refid'] = footnote['ids'][0] + self.document.note_refid(ref) + footnote.add_backref(ref['ids'][0]) + i += 1 + + def resolve_footnotes_and_citations(self): + """ + Link manually-labeled footnotes and citations to/from their + references. + """ + for footnote in self.document.footnotes: + for label in footnote['names']: + if label in self.document.footnote_refs: + reflist = self.document.footnote_refs[label] + self.resolve_references(footnote, reflist) + for citation in self.document.citations: + for label in citation['names']: + if label in self.document.citation_refs: + reflist = self.document.citation_refs[label] + self.resolve_references(citation, reflist) + + def resolve_references(self, note, reflist): + assert len(note['ids']) == 1 + id = note['ids'][0] + for ref in reflist: + if ref.resolved: + continue + ref.delattr('refname') + ref['refid'] = id + assert len(ref['ids']) == 1 + note.add_backref(ref['ids'][0]) + ref.resolved = 1 + note.resolved = 1 + + +class CircularSubstitutionDefinitionError(Exception): pass + + +class Substitutions(Transform): + + """ + Given the following ``document`` as input:: + + <document> + <paragraph> + The + <substitution_reference refname="biohazard"> + biohazard + symbol is deservedly scary-looking. + <substitution_definition name="biohazard"> + <image alt="biohazard" uri="biohazard.png"> + + The ``substitution_reference`` will simply be replaced by the + contents of the corresponding ``substitution_definition``. + + The transformed result will be:: + + <document> + <paragraph> + The + <image alt="biohazard" uri="biohazard.png"> + symbol is deservedly scary-looking. + <substitution_definition name="biohazard"> + <image alt="biohazard" uri="biohazard.png"> + """ + + default_priority = 220 + """The Substitutions transform has to be applied very early, before + `docutils.tranforms.frontmatter.DocTitle` and others.""" + + def apply(self): + defs = self.document.substitution_defs + normed = self.document.substitution_names + subreflist = list(self.document.traverse(nodes.substitution_reference)) + nested = {} + for ref in subreflist: + refname = ref['refname'] + key = None + if refname in defs: + key = refname + else: + normed_name = refname.lower() + if normed_name in normed: + key = normed[normed_name] + if key is None: + msg = self.document.reporter.error( + 'Undefined substitution referenced: "%s".' + % refname, base_node=ref) + msgid = self.document.set_id(msg) + prb = nodes.problematic( + ref.rawsource, ref.rawsource, refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + ref.replace_self(prb) + else: + subdef = defs[key] + parent = ref.parent + index = parent.index(ref) + if ('ltrim' in subdef.attributes + or 'trim' in subdef.attributes): + if index > 0 and isinstance(parent[index - 1], + nodes.Text): + parent[index - 1] = parent[index - 1].rstrip() + if ('rtrim' in subdef.attributes + or 'trim' in subdef.attributes): + if (len(parent) > index + 1 + and isinstance(parent[index + 1], nodes.Text)): + parent[index + 1] = parent[index + 1].lstrip() + subdef_copy = subdef.deepcopy() + try: + # Take care of nested substitution references: + for nested_ref in subdef_copy.traverse( + nodes.substitution_reference): + nested_name = normed[nested_ref['refname'].lower()] + if nested_name in nested.setdefault(nested_name, []): + raise CircularSubstitutionDefinitionError + else: + nested[nested_name].append(key) + nested_ref['ref-origin'] = ref + subreflist.append(nested_ref) + except CircularSubstitutionDefinitionError: + parent = ref.parent + if isinstance(parent, nodes.substitution_definition): + msg = self.document.reporter.error( + 'Circular substitution definition detected:', + nodes.literal_block(parent.rawsource, + parent.rawsource), + line=parent.line, base_node=parent) + parent.replace_self(msg) + else: + # find original ref substitution which cased this error + ref_origin = ref + while ref_origin.hasattr('ref-origin'): + ref_origin = ref_origin['ref-origin'] + msg = self.document.reporter.error( + 'Circular substitution definition referenced: ' + '"%s".' % refname, base_node=ref_origin) + msgid = self.document.set_id(msg) + prb = nodes.problematic( + ref.rawsource, ref.rawsource, refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + ref.replace_self(prb) + else: + ref.replace_self(subdef_copy.children) + # register refname of the replacment node(s) + # (needed for resolution of references) + for node in subdef_copy.children: + if isinstance(node, nodes.Referential): + # HACK: verify refname attribute exists. + # Test with docs/dev/todo.txt, see. |donate| + if 'refname' in node: + self.document.note_refname(node) + + +class TargetNotes(Transform): + + """ + Creates a footnote for each external target in the text, and corresponding + footnote references after each reference. + """ + + default_priority = 540 + """The TargetNotes transform has to be applied after `IndirectHyperlinks` + but before `Footnotes`.""" + + + def __init__(self, document, startnode): + Transform.__init__(self, document, startnode=startnode) + + self.classes = startnode.details.get('class', []) + + def apply(self): + notes = {} + nodelist = [] + for target in self.document.traverse(nodes.target): + # Only external targets. + if not target.hasattr('refuri'): + continue + names = target['names'] + refs = [] + for name in names: + refs.extend(self.document.refnames.get(name, [])) + if not refs: + continue + footnote = self.make_target_footnote(target['refuri'], refs, + notes) + if target['refuri'] not in notes: + notes[target['refuri']] = footnote + nodelist.append(footnote) + # Take care of anonymous references. + for ref in self.document.traverse(nodes.reference): + if not ref.get('anonymous'): + continue + if ref.hasattr('refuri'): + footnote = self.make_target_footnote(ref['refuri'], [ref], + notes) + if ref['refuri'] not in notes: + notes[ref['refuri']] = footnote + nodelist.append(footnote) + self.startnode.replace_self(nodelist) + + def make_target_footnote(self, refuri, refs, notes): + if refuri in notes: # duplicate? + footnote = notes[refuri] + assert len(footnote['names']) == 1 + footnote_name = footnote['names'][0] + else: # original + footnote = nodes.footnote() + footnote_id = self.document.set_id(footnote) + # Use uppercase letters and a colon; they can't be + # produced inside names by the parser. + footnote_name = 'TARGET_NOTE: ' + footnote_id + footnote['auto'] = 1 + footnote['names'] = [footnote_name] + footnote_paragraph = nodes.paragraph() + footnote_paragraph += nodes.reference('', refuri, refuri=refuri) + footnote += footnote_paragraph + self.document.note_autofootnote(footnote) + self.document.note_explicit_target(footnote, footnote) + for ref in refs: + if isinstance(ref, nodes.target): + continue + refnode = nodes.footnote_reference(refname=footnote_name, auto=1) + refnode['classes'] += self.classes + self.document.note_autofootnote_ref(refnode) + self.document.note_footnote_ref(refnode) + index = ref.parent.index(ref) + 1 + reflist = [refnode] + if not utils.get_trim_footnote_ref_space(self.document.settings): + if self.classes: + reflist.insert(0, nodes.inline(text=' ', Classes=self.classes)) + else: + reflist.insert(0, nodes.Text(' ')) + ref.parent.insert(index, reflist) + return footnote + + +class DanglingReferences(Transform): + + """ + Check for dangling references (incl. footnote & citation) and for + unreferenced targets. + """ + + default_priority = 850 + + def apply(self): + visitor = DanglingReferencesVisitor( + self.document, + self.document.transformer.unknown_reference_resolvers) + self.document.walk(visitor) + # *After* resolving all references, check for unreferenced + # targets: + for target in self.document.traverse(nodes.target): + if not target.referenced: + if target.get('anonymous'): + # If we have unreferenced anonymous targets, there + # is already an error message about anonymous + # hyperlink mismatch; no need to generate another + # message. + continue + if target['names']: + naming = target['names'][0] + elif target['ids']: + naming = target['ids'][0] + else: + # Hack: Propagated targets always have their refid + # attribute set. + naming = target['refid'] + self.document.reporter.info( + 'Hyperlink target "%s" is not referenced.' + % naming, base_node=target) + + +class DanglingReferencesVisitor(nodes.SparseNodeVisitor): + + def __init__(self, document, unknown_reference_resolvers): + nodes.SparseNodeVisitor.__init__(self, document) + self.document = document + self.unknown_reference_resolvers = unknown_reference_resolvers + + def unknown_visit(self, node): + pass + + def visit_reference(self, node): + if node.resolved or not node.hasattr('refname'): + return + refname = node['refname'] + id = self.document.nameids.get(refname) + if id is None: + for resolver_function in self.unknown_reference_resolvers: + if resolver_function(node): + break + else: + if refname in self.document.nameids: + msg = self.document.reporter.error( + 'Duplicate target name, cannot be used as a unique ' + 'reference: "%s".' % (node['refname']), base_node=node) + else: + msg = self.document.reporter.error( + 'Unknown target name: "%s".' % (node['refname']), + base_node=node) + msgid = self.document.set_id(msg) + prb = nodes.problematic( + node.rawsource, node.rawsource, refid=msgid) + try: + prbid = node['ids'][0] + except IndexError: + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + node.replace_self(prb) + else: + del node['refname'] + node['refid'] = id + self.document.ids[id].note_referenced_by(id=id) + node.resolved = 1 + + visit_footnote_reference = visit_citation_reference = visit_reference diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/universal.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/universal.py new file mode 100644 index 0000000..d8a4749 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/universal.py @@ -0,0 +1,320 @@ +# $Id: universal.py 8393 2019-09-18 10:13:00Z milde $ +# -*- coding: utf-8 -*- +# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Günter Milde +# Maintainer: docutils-develop@lists.sourceforge.net +# Copyright: This module has been placed in the public domain. + +""" +Transforms needed by most or all documents: + +- `Decorations`: Generate a document's header & footer. +- `Messages`: Placement of system messages stored in + `nodes.document.transform_messages`. +- `TestMessages`: Like `Messages`, used on test runs. +- `FinalReferences`: Resolve remaining references. +""" + +__docformat__ = 'reStructuredText' + +import re +import sys +import time +from docutils import nodes, utils +from docutils.transforms import TransformError, Transform +from docutils.utils import smartquotes + + +if sys.version_info >= (3, 0): + unicode = str # noqa + + +class Decorations(Transform): + + """ + Populate a document's decoration element (header, footer). + """ + + default_priority = 820 + + def apply(self): + header_nodes = self.generate_header() + if header_nodes: + decoration = self.document.get_decoration() + header = decoration.get_header() + header.extend(header_nodes) + footer_nodes = self.generate_footer() + if footer_nodes: + decoration = self.document.get_decoration() + footer = decoration.get_footer() + footer.extend(footer_nodes) + + def generate_header(self): + return None + + def generate_footer(self): + # @@@ Text is hard-coded for now. + # Should be made dynamic (language-dependent). + # @@@ Use timestamp from the `SOURCE_DATE_EPOCH`_ environment variable + # for the datestamp? + # See https://sourceforge.net/p/docutils/patches/132/ + # and https://reproducible-builds.org/specs/source-date-epoch/ + settings = self.document.settings + if settings.generator or settings.datestamp or settings.source_link \ + or settings.source_url: + text = [] + if settings.source_link and settings._source \ + or settings.source_url: + if settings.source_url: + source = settings.source_url + else: + source = utils.relative_path(settings._destination, + settings._source) + text.extend([ + nodes.reference('', 'View document source', + refuri=source), + nodes.Text('.\n')]) + if settings.datestamp: + datestamp = time.strftime(settings.datestamp, time.gmtime()) + text.append(nodes.Text('Generated on: ' + datestamp + '.\n')) + if settings.generator: + text.extend([ + nodes.Text('Generated by '), + nodes.reference('', 'Docutils', refuri= + 'http://docutils.sourceforge.net/'), + nodes.Text(' from '), + nodes.reference('', 'reStructuredText', refuri='http://' + 'docutils.sourceforge.net/rst.html'), + nodes.Text(' source.\n')]) + return [nodes.paragraph('', '', *text)] + else: + return None + + +class ExposeInternals(Transform): + + """ + Expose internal attributes if ``expose_internals`` setting is set. + """ + + default_priority = 840 + + def not_Text(self, node): + return not isinstance(node, nodes.Text) + + def apply(self): + if self.document.settings.expose_internals: + for node in self.document.traverse(self.not_Text): + for att in self.document.settings.expose_internals: + value = getattr(node, att, None) + if value is not None: + node['internal:' + att] = value + + +class Messages(Transform): + + """ + Place any system messages generated after parsing into a dedicated section + of the document. + """ + + default_priority = 860 + + def apply(self): + unfiltered = self.document.transform_messages + threshold = self.document.reporter.report_level + messages = [] + for msg in unfiltered: + if msg['level'] >= threshold and not msg.parent: + messages.append(msg) + if messages: + section = nodes.section(classes=['system-messages']) + # @@@ get this from the language module? + section += nodes.title('', 'Docutils System Messages') + section += messages + self.document.transform_messages[:] = [] + self.document += section + + +class FilterMessages(Transform): + + """ + Remove system messages below verbosity threshold. + """ + + default_priority = 870 + + def apply(self): + for node in tuple(self.document.traverse(nodes.system_message)): + if node['level'] < self.document.reporter.report_level: + node.parent.remove(node) + + +class TestMessages(Transform): + + """ + Append all post-parse system messages to the end of the document. + + Used for testing purposes. + """ + + default_priority = 880 + + def apply(self): + for msg in self.document.transform_messages: + if not msg.parent: + self.document += msg + + +class StripComments(Transform): + + """ + Remove comment elements from the document tree (only if the + ``strip_comments`` setting is enabled). + """ + + default_priority = 740 + + def apply(self): + if self.document.settings.strip_comments: + for node in tuple(self.document.traverse(nodes.comment)): + node.parent.remove(node) + + +class StripClassesAndElements(Transform): + + """ + Remove from the document tree all elements with classes in + `self.document.settings.strip_elements_with_classes` and all "classes" + attribute values in `self.document.settings.strip_classes`. + """ + + default_priority = 420 + + def apply(self): + if self.document.settings.strip_elements_with_classes: + self.strip_elements = set( + self.document.settings.strip_elements_with_classes) + # Iterate over a tuple as removing the current node + # corrupts the iterator returned by `traverse`: + for node in tuple(self.document.traverse(self.check_classes)): + node.parent.remove(node) + + if not self.document.settings.strip_classes: + return + strip_classes = self.document.settings.strip_classes + for node in self.document.traverse(nodes.Element): + for class_value in strip_classes: + try: + node['classes'].remove(class_value) + except ValueError: + pass + + def check_classes(self, node): + if not isinstance(node, nodes.Element): + return False + for class_value in node['classes'][:]: + if class_value in self.strip_elements: + return True + return False + + +class SmartQuotes(Transform): + + """ + Replace ASCII quotation marks with typographic form. + + Also replace multiple dashes with em-dash/en-dash characters. + """ + + default_priority = 850 + + nodes_to_skip = (nodes.FixedTextElement, nodes.Special) + """Do not apply "smartquotes" to instances of these block-level nodes.""" + + literal_nodes = (nodes.FixedTextElement, nodes.Special, + nodes.image, nodes.literal, nodes.math, + nodes.raw, nodes.problematic) + """Do apply smartquotes to instances of these inline nodes.""" + + smartquotes_action = 'qDe' + """Setting to select smartquote transformations. + + The default 'qDe' educates normal quote characters: (", '), + em- and en-dashes (---, --) and ellipses (...). + """ + + def __init__(self, document, startnode): + Transform.__init__(self, document, startnode=startnode) + self.unsupported_languages = set() + + def get_tokens(self, txtnodes): + # A generator that yields ``(texttype, nodetext)`` tuples for a list + # of "Text" nodes (interface to ``smartquotes.educate_tokens()``). + for node in txtnodes: + if (isinstance(node.parent, self.literal_nodes) + or isinstance(node.parent.parent, self.literal_nodes)): + yield ('literal', unicode(node)) + else: + # SmartQuotes uses backslash escapes instead of null-escapes + txt = re.sub('(?<=\x00)([-\\\'".`])', r'\\\1', unicode(node)) + yield ('plain', txt) + + def apply(self): + smart_quotes = self.document.settings.smart_quotes + if not smart_quotes: + return + try: + alternative = smart_quotes.startswith('alt') + except AttributeError: + alternative = False + + document_language = self.document.settings.language_code + lc_smartquotes = self.document.settings.smartquotes_locales + if lc_smartquotes: + smartquotes.smartchars.quotes.update(dict(lc_smartquotes)) + + # "Educate" quotes in normal text. Handle each block of text + # (TextElement node) as a unit to keep context around inline nodes: + for node in self.document.traverse(nodes.TextElement): + # skip preformatted text blocks and special elements: + if isinstance(node, self.nodes_to_skip): + continue + # nested TextElements are not "block-level" elements: + if isinstance(node.parent, nodes.TextElement): + continue + + # list of text nodes in the "text block": + txtnodes = [txtnode for txtnode in node.traverse(nodes.Text) + if not isinstance(txtnode.parent, + nodes.option_string)] + + # language: use typographical quotes for language "lang" + lang = node.get_language_code(document_language) + # use alternative form if `smart-quotes` setting starts with "alt": + if alternative: + if '-x-altquot' in lang: + lang = lang.replace('-x-altquot', '') + else: + lang += '-x-altquot' + # drop unsupported subtags: + for tag in utils.normalize_language_tag(lang): + if tag in smartquotes.smartchars.quotes: + lang = tag + break + else: # language not supported: (keep ASCII quotes) + if lang not in self.unsupported_languages: + self.document.reporter.warning('No smart quotes ' + 'defined for language "%s".'%lang, base_node=node) + self.unsupported_languages.add(lang) + lang = '' + + # Iterator educating quotes in plain text: + # (see "utils/smartquotes.py" for the attribute setting) + teacher = smartquotes.educate_tokens(self.get_tokens(txtnodes), + attr=self.smartquotes_action, language=lang) + + for txtnode, newtext in zip(txtnodes, teacher): + txtnode.parent.replace(txtnode, nodes.Text(newtext, + rawsource=txtnode.rawsource)) + + self.unsupported_languages = set() # reset diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/writer_aux.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/writer_aux.py new file mode 100644 index 0000000..c5818d9 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/transforms/writer_aux.py @@ -0,0 +1,88 @@ +# $Id: writer_aux.py 7808 2015-02-27 17:03:32Z milde $ +# Author: Lea Wiemann <LeWiemann@gmail.com> +# Copyright: This module has been placed in the public domain. + +""" +Auxiliary transforms mainly to be used by Writer components. + +This module is called "writer_aux" because otherwise there would be +conflicting imports like this one:: + + from docutils import writers + from docutils.transforms import writers +""" + +__docformat__ = 'reStructuredText' + +from docutils import nodes, utils, languages +from docutils.transforms import Transform + + +class Compound(Transform): + + """ + Flatten all compound paragraphs. For example, transform :: + + <compound> + <paragraph> + <literal_block> + <paragraph> + + into :: + + <paragraph> + <literal_block classes="continued"> + <paragraph classes="continued"> + """ + + default_priority = 910 + + def apply(self): + for compound in self.document.traverse(nodes.compound): + first_child = True + for child in compound: + if first_child: + if not isinstance(child, nodes.Invisible): + first_child = False + else: + child['classes'].append('continued') + # Substitute children for compound. + compound.replace_self(compound[:]) + + +class Admonitions(Transform): + + """ + Transform specific admonitions, like this: + + <note> + <paragraph> + Note contents ... + + into generic admonitions, like this:: + + <admonition classes="note"> + <title> + Note + <paragraph> + Note contents ... + + The admonition title is localized. + """ + + default_priority = 920 + + def apply(self): + language = languages.get_language(self.document.settings.language_code, + self.document.reporter) + for node in self.document.traverse(nodes.Admonition): + node_name = node.__class__.__name__ + # Set class, so that we know what node this admonition came from. + node['classes'].append(node_name) + if not isinstance(node, nodes.admonition): + # Specific admonition. Transform into a generic admonition. + admonition = nodes.admonition(node.rawsource, *node.children, + **node.attributes) + title = nodes.title('', language.labels[node_name]) + admonition.insert(0, title) + node.replace_self(admonition) diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__init__.py new file mode 100644 index 0000000..0744b4a --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__init__.py @@ -0,0 +1,797 @@ +# coding: utf-8 +# $Id: __init__.py 8376 2019-08-27 19:49:29Z milde $ +# Author: David Goodger <goodger@python.org> +# Copyright: This module has been placed in the public domain. + +""" +Miscellaneous utilities for the documentation utilities. +""" + +__docformat__ = 'reStructuredText' + +import sys +import os +import os.path +import re +import itertools +import warnings +import unicodedata +from docutils import ApplicationError, DataError, __version_info__ +from docutils import nodes +from docutils.nodes import unescape +import docutils.io +from docutils.utils.error_reporting import ErrorOutput, SafeString + +if sys.version_info >= (3, 0): + unicode = str + + +class SystemMessage(ApplicationError): + + def __init__(self, system_message, level): + Exception.__init__(self, system_message.astext()) + self.level = level + + +class SystemMessagePropagation(ApplicationError): pass + + +class Reporter(object): + + """ + Info/warning/error reporter and ``system_message`` element generator. + + Five levels of system messages are defined, along with corresponding + methods: `debug()`, `info()`, `warning()`, `error()`, and `severe()`. + + There is typically one Reporter object per process. A Reporter object is + instantiated with thresholds for reporting (generating warnings) and + halting processing (raising exceptions), a switch to turn debug output on + or off, and an I/O stream for warnings. These are stored as instance + attributes. + + When a system message is generated, its level is compared to the stored + thresholds, and a warning or error is generated as appropriate. Debug + messages are produced if the stored debug switch is on, independently of + other thresholds. Message output is sent to the stored warning stream if + not set to ''. + + The Reporter class also employs a modified form of the "Observer" pattern + [GoF95]_ to track system messages generated. The `attach_observer` method + should be called before parsing, with a bound method or function which + accepts system messages. The observer can be removed with + `detach_observer`, and another added in its place. + + .. [GoF95] Gamma, Helm, Johnson, Vlissides. *Design Patterns: Elements of + Reusable Object-Oriented Software*. Addison-Wesley, Reading, MA, USA, + 1995. + """ + + levels = 'DEBUG INFO WARNING ERROR SEVERE'.split() + """List of names for system message levels, indexed by level.""" + + # system message level constants: + (DEBUG_LEVEL, + INFO_LEVEL, + WARNING_LEVEL, + ERROR_LEVEL, + SEVERE_LEVEL) = range(5) + + def __init__(self, source, report_level, halt_level, stream=None, + debug=False, encoding=None, error_handler='backslashreplace'): + """ + :Parameters: + - `source`: The path to or description of the source data. + - `report_level`: The level at or above which warning output will + be sent to `stream`. + - `halt_level`: The level at or above which `SystemMessage` + exceptions will be raised, halting execution. + - `debug`: Show debug (level=0) system messages? + - `stream`: Where warning output is sent. Can be file-like (has a + ``.write`` method), a string (file name, opened for writing), + '' (empty string) or `False` (for discarding all stream messages) + or `None` (implies `sys.stderr`; default). + - `encoding`: The output encoding. + - `error_handler`: The error handler for stderr output encoding. + """ + + self.source = source + """The path to or description of the source data.""" + + self.error_handler = error_handler + """The character encoding error handler.""" + + self.debug_flag = debug + """Show debug (level=0) system messages?""" + + self.report_level = report_level + """The level at or above which warning output will be sent + to `self.stream`.""" + + self.halt_level = halt_level + """The level at or above which `SystemMessage` exceptions + will be raised, halting execution.""" + + if not isinstance(stream, ErrorOutput): + stream = ErrorOutput(stream, encoding, error_handler) + + self.stream = stream + """Where warning output is sent.""" + + self.encoding = encoding or getattr(stream, 'encoding', 'ascii') + """The output character encoding.""" + + self.observers = [] + """List of bound methods or functions to call with each system_message + created.""" + + self.max_level = -1 + """The highest level system message generated so far.""" + + def set_conditions(self, category, report_level, halt_level, + stream=None, debug=False): + warnings.warn('docutils.utils.Reporter.set_conditions deprecated; ' + 'set attributes via configuration settings or directly', + DeprecationWarning, stacklevel=2) + self.report_level = report_level + self.halt_level = halt_level + if not isinstance(stream, ErrorOutput): + stream = ErrorOutput(stream, self.encoding, self.error_handler) + self.stream = stream + self.debug_flag = debug + + def attach_observer(self, observer): + """ + The `observer` parameter is a function or bound method which takes one + argument, a `nodes.system_message` instance. + """ + self.observers.append(observer) + + def detach_observer(self, observer): + self.observers.remove(observer) + + def notify_observers(self, message): + for observer in self.observers: + observer(message) + + def system_message(self, level, message, *children, **kwargs): + """ + Return a system_message object. + + Raise an exception or generate a warning if appropriate. + """ + # `message` can be a `string`, `unicode`, or `Exception` instance. + if isinstance(message, Exception): + message = SafeString(message) + + attributes = kwargs.copy() + if 'base_node' in kwargs: + source, line = get_source_line(kwargs['base_node']) + del attributes['base_node'] + if source is not None: + attributes.setdefault('source', source) + if line is not None: + attributes.setdefault('line', line) + # assert source is not None, "node has line- but no source-argument" + if not 'source' in attributes: # 'line' is absolute line number + try: # look up (source, line-in-source) + source, line = self.get_source_and_line(attributes.get('line')) + except AttributeError: + source, line = None, None + if source is not None: + attributes['source'] = source + if line is not None: + attributes['line'] = line + # assert attributes['line'] is not None, (message, kwargs) + # assert attributes['source'] is not None, (message, kwargs) + attributes.setdefault('source', self.source) + + msg = nodes.system_message(message, level=level, + type=self.levels[level], + *children, **attributes) + if self.stream and (level >= self.report_level + or self.debug_flag and level == self.DEBUG_LEVEL + or level >= self.halt_level): + self.stream.write(msg.astext() + '\n') + if level >= self.halt_level: + raise SystemMessage(msg, level) + if level > self.DEBUG_LEVEL or self.debug_flag: + self.notify_observers(msg) + self.max_level = max(level, self.max_level) + return msg + + def debug(self, *args, **kwargs): + """ + Level-0, "DEBUG": an internal reporting issue. Typically, there is no + effect on the processing. Level-0 system messages are handled + separately from the others. + """ + if self.debug_flag: + return self.system_message(self.DEBUG_LEVEL, *args, **kwargs) + + def info(self, *args, **kwargs): + """ + Level-1, "INFO": a minor issue that can be ignored. Typically there is + no effect on processing, and level-1 system messages are not reported. + """ + return self.system_message(self.INFO_LEVEL, *args, **kwargs) + + def warning(self, *args, **kwargs): + """ + Level-2, "WARNING": an issue that should be addressed. If ignored, + there may be unpredictable problems with the output. + """ + return self.system_message(self.WARNING_LEVEL, *args, **kwargs) + + def error(self, *args, **kwargs): + """ + Level-3, "ERROR": an error that should be addressed. If ignored, the + output will contain errors. + """ + return self.system_message(self.ERROR_LEVEL, *args, **kwargs) + + def severe(self, *args, **kwargs): + """ + Level-4, "SEVERE": a severe error that must be addressed. If ignored, + the output will contain severe errors. Typically level-4 system + messages are turned into exceptions which halt processing. + """ + return self.system_message(self.SEVERE_LEVEL, *args, **kwargs) + + +class ExtensionOptionError(DataError): pass +class BadOptionError(ExtensionOptionError): pass +class BadOptionDataError(ExtensionOptionError): pass +class DuplicateOptionError(ExtensionOptionError): pass + + +def extract_extension_options(field_list, options_spec): + """ + Return a dictionary mapping extension option names to converted values. + + :Parameters: + - `field_list`: A flat field list without field arguments, where each + field body consists of a single paragraph only. + - `options_spec`: Dictionary mapping known option names to a + conversion function such as `int` or `float`. + + :Exceptions: + - `KeyError` for unknown option names. + - `ValueError` for invalid option values (raised by the conversion + function). + - `TypeError` for invalid option value types (raised by conversion + function). + - `DuplicateOptionError` for duplicate options. + - `BadOptionError` for invalid fields. + - `BadOptionDataError` for invalid option data (missing name, + missing data, bad quotes, etc.). + """ + option_list = extract_options(field_list) + option_dict = assemble_option_dict(option_list, options_spec) + return option_dict + +def extract_options(field_list): + """ + Return a list of option (name, value) pairs from field names & bodies. + + :Parameter: + `field_list`: A flat field list, where each field name is a single + word and each field body consists of a single paragraph only. + + :Exceptions: + - `BadOptionError` for invalid fields. + - `BadOptionDataError` for invalid option data (missing name, + missing data, bad quotes, etc.). + """ + option_list = [] + for field in field_list: + if len(field[0].astext().split()) != 1: + raise BadOptionError( + 'extension option field name may not contain multiple words') + name = str(field[0].astext().lower()) + body = field[1] + if len(body) == 0: + data = None + elif len(body) > 1 or not isinstance(body[0], nodes.paragraph) \ + or len(body[0]) != 1 or not isinstance(body[0][0], nodes.Text): + raise BadOptionDataError( + 'extension option field body may contain\n' + 'a single paragraph only (option "%s")' % name) + else: + data = body[0][0].astext() + option_list.append((name, data)) + return option_list + +def assemble_option_dict(option_list, options_spec): + """ + Return a mapping of option names to values. + + :Parameters: + - `option_list`: A list of (name, value) pairs (the output of + `extract_options()`). + - `options_spec`: Dictionary mapping known option names to a + conversion function such as `int` or `float`. + + :Exceptions: + - `KeyError` for unknown option names. + - `DuplicateOptionError` for duplicate options. + - `ValueError` for invalid option values (raised by conversion + function). + - `TypeError` for invalid option value types (raised by conversion + function). + """ + options = {} + for name, value in option_list: + convertor = options_spec[name] # raises KeyError if unknown + if convertor is None: + raise KeyError(name) # or if explicitly disabled + if name in options: + raise DuplicateOptionError('duplicate option "%s"' % name) + try: + options[name] = convertor(value) + except (ValueError, TypeError) as detail: + raise detail.__class__('(option: "%s"; value: %r)\n%s' + % (name, value, ' '.join(detail.args))) + return options + + +class NameValueError(DataError): pass + + +def decode_path(path): + """ + Ensure `path` is Unicode. Return `nodes.reprunicode` object. + + Decode file/path string in a failsave manner if not already done. + """ + # see also http://article.gmane.org/gmane.text.docutils.user/2905 + if isinstance(path, unicode): + return path + try: + path = path.decode(sys.getfilesystemencoding(), 'strict') + except AttributeError: # default value None has no decode method + return nodes.reprunicode(path) + except UnicodeDecodeError: + try: + path = path.decode('utf-8', 'strict') + except UnicodeDecodeError: + path = path.decode('ascii', 'replace') + return nodes.reprunicode(path) + + +def extract_name_value(line): + """ + Return a list of (name, value) from a line of the form "name=value ...". + + :Exception: + `NameValueError` for invalid input (missing name, missing data, bad + quotes, etc.). + """ + attlist = [] + while line: + equals = line.find('=') + if equals == -1: + raise NameValueError('missing "="') + attname = line[:equals].strip() + if equals == 0 or not attname: + raise NameValueError( + 'missing attribute name before "="') + line = line[equals+1:].lstrip() + if not line: + raise NameValueError( + 'missing value after "%s="' % attname) + if line[0] in '\'"': + endquote = line.find(line[0], 1) + if endquote == -1: + raise NameValueError( + 'attribute "%s" missing end quote (%s)' + % (attname, line[0])) + if len(line) > endquote + 1 and line[endquote + 1].strip(): + raise NameValueError( + 'attribute "%s" end quote (%s) not followed by ' + 'whitespace' % (attname, line[0])) + data = line[1:endquote] + line = line[endquote+1:].lstrip() + else: + space = line.find(' ') + if space == -1: + data = line + line = '' + else: + data = line[:space] + line = line[space+1:].lstrip() + attlist.append((attname.lower(), data)) + return attlist + +def new_reporter(source_path, settings): + """ + Return a new Reporter object. + + :Parameters: + `source` : string + The path to or description of the source text of the document. + `settings` : optparse.Values object + Runtime settings. + """ + reporter = Reporter( + source_path, settings.report_level, settings.halt_level, + stream=settings.warning_stream, debug=settings.debug, + encoding=settings.error_encoding, + error_handler=settings.error_encoding_error_handler) + return reporter + +def new_document(source_path, settings=None): + """ + Return a new empty document object. + + :Parameters: + `source_path` : string + The path to or description of the source text of the document. + `settings` : optparse.Values object + Runtime settings. If none are provided, a default core set will + be used. If you will use the document object with any Docutils + components, you must provide their default settings as well. For + example, if parsing, at least provide the parser settings, + obtainable as follows:: + + settings = docutils.frontend.OptionParser( + components=(docutils.parsers.rst.Parser,) + ).get_default_values() + """ + from docutils import frontend + if settings is None: + settings = frontend.OptionParser().get_default_values() + source_path = decode_path(source_path) + reporter = new_reporter(source_path, settings) + document = nodes.document(settings, reporter, source=source_path) + document.note_source(source_path, -1) + return document + +def clean_rcs_keywords(paragraph, keyword_substitutions): + if len(paragraph) == 1 and isinstance(paragraph[0], nodes.Text): + textnode = paragraph[0] + for pattern, substitution in keyword_substitutions: + match = pattern.search(textnode) + if match: + paragraph[0] = nodes.Text(pattern.sub(substitution, textnode)) + return + +def relative_path(source, target): + """ + Build and return a path to `target`, relative to `source` (both files). + + If there is no common prefix, return the absolute path to `target`. + """ + source_parts = os.path.abspath(source or type(target)('dummy_file') + ).split(os.sep) + target_parts = os.path.abspath(target).split(os.sep) + # Check first 2 parts because '/dir'.split('/') == ['', 'dir']: + if source_parts[:2] != target_parts[:2]: + # Nothing in common between paths. + # Return absolute path, using '/' for URLs: + return '/'.join(target_parts) + source_parts.reverse() + target_parts.reverse() + while (source_parts and target_parts + and source_parts[-1] == target_parts[-1]): + # Remove path components in common: + source_parts.pop() + target_parts.pop() + target_parts.reverse() + parts = ['..'] * (len(source_parts) - 1) + target_parts + return '/'.join(parts) + +def get_stylesheet_reference(settings, relative_to=None): + """ + Retrieve a stylesheet reference from the settings object. + + Deprecated. Use get_stylesheet_list() instead to + enable specification of multiple stylesheets as a comma-separated + list. + """ + if settings.stylesheet_path: + assert not settings.stylesheet, ( + 'stylesheet and stylesheet_path are mutually exclusive.') + if relative_to == None: + relative_to = settings._destination + return relative_path(relative_to, settings.stylesheet_path) + else: + return settings.stylesheet + +# Return 'stylesheet' or 'stylesheet_path' arguments as list. +# +# The original settings arguments are kept unchanged: you can test +# with e.g. ``if settings.stylesheet_path:`` +# +# Differences to ``get_stylesheet_reference``: +# * return value is a list +# * no re-writing of the path (and therefore no optional argument) +# (if required, use ``utils.relative_path(source, target)`` +# in the calling script) +def get_stylesheet_list(settings): + """ + Retrieve list of stylesheet references from the settings object. + """ + assert not (settings.stylesheet and settings.stylesheet_path), ( + 'stylesheet and stylesheet_path are mutually exclusive.') + stylesheets = settings.stylesheet_path or settings.stylesheet or [] + # programmatically set default can be string or unicode: + if not isinstance(stylesheets, list): + stylesheets = [path.strip() for path in stylesheets.split(',')] + # expand relative paths if found in stylesheet-dirs: + return [find_file_in_dirs(path, settings.stylesheet_dirs) + for path in stylesheets] + +def find_file_in_dirs(path, dirs): + """ + Search for `path` in the list of directories `dirs`. + + Return the first expansion that matches an existing file. + """ + if os.path.isabs(path): + return path + for d in dirs: + if d == '.': + f = path + else: + d = os.path.expanduser(d) + f = os.path.join(d, path) + if os.path.exists(f): + return f + return path + +def get_trim_footnote_ref_space(settings): + """ + Return whether or not to trim footnote space. + + If trim_footnote_reference_space is not None, return it. + + If trim_footnote_reference_space is None, return False unless the + footnote reference style is 'superscript'. + """ + if settings.trim_footnote_reference_space is None: + return hasattr(settings, 'footnote_references') and \ + settings.footnote_references == 'superscript' + else: + return settings.trim_footnote_reference_space + +def get_source_line(node): + """ + Return the "source" and "line" attributes from the `node` given or from + its closest ancestor. + """ + while node: + if node.source or node.line: + return node.source, node.line + node = node.parent + return None, None + +def escape2null(text): + """Return a string with escape-backslashes converted to nulls.""" + parts = [] + start = 0 + while True: + found = text.find('\\', start) + if found == -1: + parts.append(text[start:]) + return ''.join(parts) + parts.append(text[start:found]) + parts.append('\x00' + text[found+1:found+2]) + start = found + 2 # skip character after escape + +# `unescape` definition moved to `nodes` to avoid circular import dependency. + +def split_escaped_whitespace(text): + """ + Split `text` on escaped whitespace (null+space or null+newline). + Return a list of strings. + """ + strings = text.split('\x00 ') + strings = [string.split('\x00\n') for string in strings] + # flatten list of lists of strings to list of strings: + return list(itertools.chain(*strings)) + +def strip_combining_chars(text): + if isinstance(text, str) and sys.version_info < (3, 0): + return text + return u''.join([c for c in text if not unicodedata.combining(c)]) + +def find_combining_chars(text): + """Return indices of all combining chars in Unicode string `text`. + + >>> from docutils.utils import find_combining_chars + >>> find_combining_chars(u'A t̆ab̆lĕ') + [3, 6, 9] + + """ + if isinstance(text, str) and sys.version_info < (3, 0): + return [] + return [i for i,c in enumerate(text) if unicodedata.combining(c)] + +def column_indices(text): + """Indices of Unicode string `text` when skipping combining characters. + + >>> from docutils.utils import column_indices + >>> column_indices(u'A t̆ab̆lĕ') + [0, 1, 2, 4, 5, 7, 8] + + """ + # TODO: account for asian wide chars here instead of using dummy + # replacements in the tableparser? + string_indices = list(range(len(text))) + for index in find_combining_chars(text): + string_indices[index] = None + return [i for i in string_indices if i is not None] + +east_asian_widths = {'W': 2, # Wide + 'F': 2, # Full-width (wide) + 'Na': 1, # Narrow + 'H': 1, # Half-width (narrow) + 'N': 1, # Neutral (not East Asian, treated as narrow) + 'A': 1} # Ambiguous (s/b wide in East Asian context, + # narrow otherwise, but that doesn't work) +"""Mapping of result codes from `unicodedata.east_asian_widt()` to character +column widths.""" + +def column_width(text): + """Return the column width of text. + + Correct ``len(text)`` for wide East Asian and combining Unicode chars. + """ + if isinstance(text, str) and sys.version_info < (3, 0): + return len(text) + width = sum([east_asian_widths[unicodedata.east_asian_width(c)] + for c in text]) + # correction for combining chars: + width -= len(find_combining_chars(text)) + return width + +def uniq(L): + r = [] + for item in L: + if not item in r: + r.append(item) + return r + +def unique_combinations(items, n): + """Return `itertools.combinations`.""" + warnings.warn('docutils.utils.unique_combinations is deprecated; ' + 'use itertools.combinations directly.', + DeprecationWarning, stacklevel=2) + return itertools.combinations(items, n) + +def normalize_language_tag(tag): + """Return a list of normalized combinations for a `BCP 47` language tag. + + Example: + + >>> from docutils.utils import normalize_language_tag + >>> normalize_language_tag('de_AT-1901') + ['de-at-1901', 'de-at', 'de-1901', 'de'] + >>> normalize_language_tag('de-CH-x_altquot') + ['de-ch-x-altquot', 'de-ch', 'de-x-altquot', 'de'] + + """ + # normalize: + tag = tag.lower().replace('-', '_') + # split (except singletons, which mark the following tag as non-standard): + tag = re.sub(r'_([a-zA-Z0-9])_', r'_\1-', tag) + subtags = [subtag for subtag in tag.split('_')] + base_tag = (subtags.pop(0),) + # find all combinations of subtags + taglist = [] + for n in range(len(subtags), 0, -1): + # for tags in unique_combinations(subtags, n): + for tags in itertools.combinations(subtags, n): + taglist.append('-'.join(base_tag+tags)) + taglist += base_tag + return taglist + + +class DependencyList(object): + + """ + List of dependencies, with file recording support. + + Note that the output file is not automatically closed. You have + to explicitly call the close() method. + """ + + def __init__(self, output_file=None, dependencies=[]): + """ + Initialize the dependency list, automatically setting the + output file to `output_file` (see `set_output()`) and adding + all supplied dependencies. + """ + self.set_output(output_file) + for i in dependencies: + self.add(i) + + def set_output(self, output_file): + """ + Set the output file and clear the list of already added + dependencies. + + `output_file` must be a string. The specified file is + immediately overwritten. + + If output_file is '-', the output will be written to stdout. + If it is None, no file output is done when calling add(). + """ + self.list = [] + if output_file: + if output_file == '-': + of = None + else: + of = output_file + self.file = docutils.io.FileOutput(destination_path=of, + encoding='utf8', autoclose=False) + else: + self.file = None + + def add(self, *filenames): + """ + If the dependency `filename` has not already been added, + append it to self.list and print it to self.file if self.file + is not None. + """ + for filename in filenames: + if not filename in self.list: + self.list.append(filename) + if self.file is not None: + self.file.write(filename+'\n') + + def close(self): + """ + Close the output file. + """ + self.file.close() + self.file = None + + def __repr__(self): + try: + output_file = self.file.name + except AttributeError: + output_file = None + return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list) + + +release_level_abbreviations = { + 'alpha': 'a', + 'beta': 'b', + 'candidate': 'rc', + 'final': '',} + +def version_identifier(version_info=None): + """ + Return a version identifier string built from `version_info`, a + `docutils.VersionInfo` namedtuple instance or compatible tuple. If + `version_info` is not provided, by default return a version identifier + string based on `docutils.__version_info__` (i.e. the current Docutils + version). + """ + if version_info is None: + version_info = __version_info__ + if version_info.micro: + micro = '.%s' % version_info.micro + else: + # 0 is omitted: + micro = '' + releaselevel = release_level_abbreviations[version_info.releaselevel] + if version_info.serial: + serial = version_info.serial + else: + # 0 is omitted: + serial = '' + if version_info.release: + dev = '' + else: + dev = '.dev' + version = '%s.%s%s%s%s%s' % ( + version_info.major, + version_info.minor, + micro, + releaselevel, + serial, + dev) + return version diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46a8ee85d3459ab91113a1c8e604721d209c9112 GIT binary patch literal 25111 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 R?~zkBj!d76-~S|+`@e{_+9Ln} literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/code_analyzer.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/code_analyzer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96bfaabd742afb397bab858aac68d5d6d0c1f552 GIT binary patch literal 4373 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/error_reporting.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/error_reporting.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0485bc698e7d70c8e8c0c433e8838667810cd87 GIT binary patch literal 6367 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 KGN;Z@jsF|yXe(6! literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/punctuation_chars.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/punctuation_chars.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..918f2881321d2718093a26c72ee62a79adb444ec GIT binary patch literal 2316 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 WyNC8~dtBY^?Okry|MY)%UidFn<Zjad literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/roman.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/roman.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a21e69414575ca08ee15795362ba8d65a5e29ad GIT binary patch literal 2809 zcmb7G-ER{|5a0W7>|C4=3Iup4+9ptJDY2c8(u7upVx!7Z5)ibOWwp2$@5VlIzH|2W z65^hv3aHe_{t58NKhr<pUi(tNSAFPHXVw>R00}s2*E4gwJHOeT-|YP`J#7(q{`|T2 z@K=!jLS_6hLAeDjcmf?G4Z^gB#`K2HjE2F?hRITF!c8?&-w~E(nP-G$_{3AAkp_K| zS)f}y4SELjDV7C2tMp0Gr`ZhXGfKDEY-5Veu`|y|Bg<3Ir`abw^=RgW-k4=)**UPz zv55yHf4;v^_Ps+cB$Yn3Jx2G0-=+8cuI*7T>~dkdLI3k@TkO+&j@uSam*)01*zqmq z9CF8#e(zXze6Qe(cD`?{6xRFG8}!?-9R`xFmP#vjTO*_lqlDA$NSbTqm6?vOXj$KP zoPhR(-xhY4qG$ske~&IyzzeN{8+uRqSy-YrK;%5psSKqr9NVRPzOeY?9v2SxTAZD% z1`z}WN^4HwNZOIIccWN*8+s9^Q`zB`YfBE$VMhW7!g?E;avu15^2iqaD|+mQv;})5 zICBCioZV1z3a(%)i?C$ZXU^WS1%}XLT)Ci<i*A6?fxnY5RtqbI73w-I?gboTJhUCx z-gP;(rInyQIyx%6-t3~9QA}nOI<o6pL&zzz)53oIfdd%jTowdQAm0e&n+B(^$Cf(j zJ3{zk=cN&6noZB{@@6x(noYnSx+rIx&4bW(M{iydk%o0t_uocQc6-I1(_0R`p55B# zZ273exx3t46J36A{kX{dRwx}eD2{qaF581Jgbr(*gBGBWAxi%!<g<4}d3W!=?X~#` zzA#Q;y#^>UXq$xYJhT&EsDGTV9bZBc@-`Rm^M&-EAM=I!NBO!~^$u;<Vd`LZMhtwP z(<yLrVazG&`Dr*_ZQJ=9wj~b*ro8PuQ(~-DoPQuEl(FLcp~P4#4;jvak@fPhp~P6* z8m^ugw}!dISRZ0gII>zF;$EVo+AwuutPQcsp|Lu|+-qTX^583gLCVmAUFet=5fe=N zM4V&#J_#;+x<({n##8NyCgJT<X#0j(l{z!g#!>@K8Wr->!jJku9~cpdjQy0j5owYB zB^kiz$k-qQa&Y?qY>?&?ecDQj98@ekMJ#rwYMelf&hKXl>0gDiw+lo3P?aEo8Afwm zENHu&t`rLEo12^Y{-=z$oGw&HMSss%Zxc71#UyX4yo(KRDR9H$S(W_Bk#5_)ycug= zJRx`xx-w2D)izEi7~ja^I4ykz8IK`A>JWWi%V=3Gqnp?(SuBFx-T+cr6rP9Jz40tU z7;VS%9IuT<2#c22R-?CnDJ`uJP7hy%D&>a(l(T>?(-LmnI^Dh&s0q39c2urJm78Ul zxi-k-)J58XQU~P_$8VNO6b9v&=(>_BAeENaP*zK=(ekw*zoZsB?RTUtjvJwzeo-nd zZ{Y085>#y0^^c&^?;ekEjTRdLtCyqtR<w1qJ`PMmaaEvbu3lD{K-fwky+Ty~FhmLs zfT6jqcVfY1Mp&x#s9K9^H>=}Ve2*(EG*_)76!@==kh}s?{cs@58#GsYCk$Lf!MHNM zm5IDaIo$ZCli(Cvk<$~<6k8vG5Ro7Y+|)+ge6C02g%&J;1*CakDzMWSVAB;tuLDDk zfeDP%BVC#iaQXuIO}~VU)kOgqYbwSj??BcMt{;FMSZls!?J25a3MLfk&sV)3&=fD= zgn_%R?d|t3B}Mc!$#2lBfg*Z7C9p)sXU7?N&z5jA10e%$i&jTm#u0|gy?iRx0zpwt zIdF?V7N3DE7O;DD6{?#ip2V*wg;wntUIYZ#nb9pR3;)Q|i@?)4P2}NC{!E;1HsOXG z-M4lKR1+XiHJi!z2PkkQGx#O}X}Z~LoqR}vstX=Z-g(^OJqceb>H<|2M->|tp9(=$ zggD*uyFJI{ak_Tr{_VRD?uaW0A5o0OprXMmGtPWHy8XYwx)|VAm<m6{FqJXpAOiRq O=1gXG!ZQCgv;PD5W}#95 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/smartquotes.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/smartquotes.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fafbccaf12254740fd3276792c549de28e7abc4 GIT binary patch literal 29494 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 MFZ9ODkF)sxA8-C^ga7~l literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/urischemes.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/__pycache__/urischemes.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f6f047742383d01f36b6f01590408fb9024ab43 GIT binary patch literal 5205 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 J=hy$!zX9<<!<Ya7 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/code_analyzer.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/code_analyzer.py new file mode 100644 index 0000000..834fc07 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/code_analyzer.py @@ -0,0 +1,142 @@ +#!/usr/bin/python +# coding: utf-8 + +"""Lexical analysis of formal languages (i.e. code) using Pygments.""" + +# :Author: Georg Brandl; Felix Wiemann; Günter Milde +# :Date: $Date: 2019-08-26 18:46:50 +0200 (Mo, 26. Aug 2019) $ +# :Copyright: This module has been placed in the public domain. + +from docutils import ApplicationError +try: + from pkg_resources import DistributionNotFound as ResourceError +except (ImportError, RuntimeError): + class ResourceError(ApplicationError): + pass # stub +try: + import pygments + from pygments.lexers import get_lexer_by_name + from pygments.formatters.html import _get_ttype_class + with_pygments = True +except ImportError: + with_pygments = False + +# Filter the following token types from the list of class arguments: +unstyled_tokens = ['token', # Token (base token type) + 'text', # Token.Text + ''] # short name for Token and Text +# (Add, e.g., Token.Punctuation with ``unstyled_tokens += 'punctuation'``.) + +class LexerError(ApplicationError): + pass + +class Lexer(object): + """Parse `code` lines and yield "classified" tokens. + + Arguments + + code -- string of source code to parse, + language -- formal language the code is written in, + tokennames -- either 'long', 'short', or '' (see below). + + Merge subsequent tokens of the same token-type. + + Iterating over an instance yields the tokens as ``(tokentype, value)`` + tuples. The value of `tokennames` configures the naming of the tokentype: + + 'long': downcased full token type name, + 'short': short name defined by pygments.token.STANDARD_TYPES + (= class argument used in pygments html output), + 'none': skip lexical analysis. + """ + + def __init__(self, code, language, tokennames='short'): + """ + Set up a lexical analyzer for `code` in `language`. + """ + self.code = code + self.language = language + self.tokennames = tokennames + self.lexer = None + # get lexical analyzer for `language`: + if language in ('', 'text') or tokennames == 'none': + return + if not with_pygments: + raise LexerError('Cannot analyze code. ' + 'Pygments package not found.') + try: + self.lexer = get_lexer_by_name(self.language) + except (pygments.util.ClassNotFound, ResourceError): + raise LexerError('Cannot analyze code. ' + 'No Pygments lexer found for "%s".' % language) + # self.lexer.add_filter('tokenmerge') + # Since version 1.2. (released Jan 01, 2010) Pygments has a + # TokenMergeFilter. # ``self.merge(tokens)`` in __iter__ could + # be replaced by ``self.lexer.add_filter('tokenmerge')`` in __init__. + # However, `merge` below also strips a final newline added by pygments. + # + # self.lexer.add_filter('tokenmerge') + + def merge(self, tokens): + """Merge subsequent tokens of same token-type. + + Also strip the final newline (added by pygments). + """ + tokens = iter(tokens) + (lasttype, lastval) = next(tokens) + for ttype, value in tokens: + if ttype is lasttype: + lastval += value + else: + yield(lasttype, lastval) + (lasttype, lastval) = (ttype, value) + if lastval.endswith('\n'): + lastval = lastval[:-1] + if lastval: + yield(lasttype, lastval) + + def __iter__(self): + """Parse self.code and yield "classified" tokens. + """ + if self.lexer is None: + yield ([], self.code) + return + tokens = pygments.lex(self.code, self.lexer) + for tokentype, value in self.merge(tokens): + if self.tokennames == 'long': # long CSS class args + classes = str(tokentype).lower().split('.') + else: # short CSS class args + classes = [_get_ttype_class(tokentype)] + classes = [cls for cls in classes if cls not in unstyled_tokens] + yield (classes, value) + + +class NumberLines(object): + """Insert linenumber-tokens at the start of every code line. + + Arguments + + tokens -- iterable of ``(classes, value)`` tuples + startline -- first line number + endline -- last line number + + Iterating over an instance yields the tokens with a + ``(['ln'], '<the line number>')`` token added for every code line. + Multi-line tokens are splitted.""" + + def __init__(self, tokens, startline, endline): + self.tokens = tokens + self.startline = startline + # pad linenumbers, e.g. endline == 100 -> fmt_str = '%3d ' + self.fmt_str = '%%%dd ' % len(str(endline)) + + def __iter__(self): + lineno = self.startline + yield (['ln'], self.fmt_str % lineno) + for ttype, value in self.tokens: + lines = value.split('\n') + for line in lines[:-1]: + yield (ttype, line + '\n') + lineno += 1 + yield (['ln'], self.fmt_str % lineno) + yield (ttype, lines[-1]) diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/error_reporting.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/error_reporting.py new file mode 100644 index 0000000..64cd953 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/error_reporting.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# :Id: $Id: error_reporting.py 8367 2019-08-27 12:09:56Z milde $ +# :Copyright: © 2011 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 + +""" +Error reporting should be safe from encoding/decoding errors. +However, implicit conversions of strings and exceptions like + +>>> u'%s world: %s' % ('H\xe4llo', Exception(u'H\xe4llo') + +fail in some Python versions: + +* In Python <= 2.6, ``unicode(<exception instance>)`` uses + `__str__` and fails with non-ASCII chars in`unicode` arguments. + (work around http://bugs.python.org/issue2517): + +* In Python 2, unicode(<exception instance>) fails, with non-ASCII + chars in arguments. (Use case: in some locales, the errstr + argument of IOError contains non-ASCII chars.) + +* In Python 2, str(<exception instance>) fails, with non-ASCII chars + in `unicode` arguments. + +The `SafeString`, `ErrorString` and `ErrorOutput` classes handle +common exceptions. +""" + +import codecs +import sys + +# Guess the locale's encoding. +# If no valid guess can be made, locale_encoding is set to `None`: +try: + import locale # module missing in Jython +except ImportError: + locale_encoding = None +else: + try: + locale_encoding = locale.getlocale()[1] or locale.getdefaultlocale()[1] + # locale.getpreferredencoding([do_setlocale=True|False]) + # has side-effects | might return a wrong guess. + # (cf. Update 1 in http://stackoverflow.com/questions/4082645/using-python-2-xs-locale-module-to-format-numbers-and-currency) + except ValueError as error: # OS X may set UTF-8 without language code + # see http://bugs.python.org/issue18378 + # and https://sourceforge.net/p/docutils/bugs/298/ + if "unknown locale: UTF-8" in error.args: + locale_encoding = "UTF-8" + else: + locale_encoding = None + except: # any other problems determining the locale -> use None + locale_encoding = None + try: + codecs.lookup(locale_encoding or '') # None -> '' + except LookupError: + locale_encoding = None + + +if sys.version_info >= (3, 0): + unicode = str # noqa + + +class SafeString(object): + """ + A wrapper providing robust conversion to `str` and `unicode`. + """ + + def __init__(self, data, encoding=None, encoding_errors='backslashreplace', + decoding_errors='replace'): + self.data = data + self.encoding = (encoding or getattr(data, 'encoding', None) or + locale_encoding or 'ascii') + self.encoding_errors = encoding_errors + self.decoding_errors = decoding_errors + + + def __str__(self): + try: + return str(self.data) + except UnicodeEncodeError: + if isinstance(self.data, Exception): + args = [str(SafeString(arg, self.encoding, + self.encoding_errors)) + for arg in self.data.args] + return ', '.join(args) + if isinstance(self.data, unicode): + if sys.version_info > (3, 0): + return self.data + else: + return self.data.encode(self.encoding, + self.encoding_errors) + raise + + def __unicode__(self): + """ + Return unicode representation of `self.data`. + + Try ``unicode(self.data)``, catch `UnicodeError` and + + * if `self.data` is an Exception instance, work around + http://bugs.python.org/issue2517 with an emulation of + Exception.__unicode__, + + * else decode with `self.encoding` and `self.decoding_errors`. + """ + try: + u = unicode(self.data) + if isinstance(self.data, EnvironmentError): + u = u.replace(": u'", ": '") # normalize filename quoting + return u + except UnicodeError as error: # catch ..Encode.. and ..Decode.. errors + if isinstance(self.data, EnvironmentError): + return u"[Errno %s] %s: '%s'" % (self.data.errno, + SafeString(self.data.strerror, self.encoding, + self.decoding_errors), + SafeString(self.data.filename, self.encoding, + self.decoding_errors)) + if isinstance(self.data, Exception): + args = [unicode(SafeString(arg, self.encoding, + decoding_errors=self.decoding_errors)) + for arg in self.data.args] + return u', '.join(args) + if isinstance(error, UnicodeDecodeError): + return unicode(self.data, self.encoding, self.decoding_errors) + raise + +class ErrorString(SafeString): + """ + Safely report exception type and message. + """ + def __str__(self): + return '%s: %s' % (self.data.__class__.__name__, + super(ErrorString, self).__str__()) + + def __unicode__(self): + return u'%s: %s' % (self.data.__class__.__name__, + super(ErrorString, self).__unicode__()) + + +class ErrorOutput(object): + """ + Wrapper class for file-like error streams with + failsave de- and encoding of `str`, `bytes`, `unicode` and + `Exception` instances. + """ + + def __init__(self, stream=None, encoding=None, + encoding_errors='backslashreplace', + decoding_errors='replace'): + """ + :Parameters: + - `stream`: a file-like object, + a string (path to a file), + `None` (write to `sys.stderr`, default), or + evaluating to `False` (write() requests are ignored). + - `encoding`: `stream` text encoding. Guessed if None. + - `encoding_errors`: how to treat encoding errors. + """ + if stream is None: + stream = sys.stderr + elif not(stream): + stream = False + # if `stream` is a file name, open it + elif isinstance(stream, str): + stream = open(stream, 'w') + elif isinstance(stream, unicode): + stream = open(stream.encode(sys.getfilesystemencoding()), 'w') + + self.stream = stream + """Where warning output is sent.""" + + self.encoding = (encoding or getattr(stream, 'encoding', None) or + locale_encoding or 'ascii') + """The output character encoding.""" + + self.encoding_errors = encoding_errors + """Encoding error handler.""" + + self.decoding_errors = decoding_errors + """Decoding error handler.""" + + def write(self, data): + """ + Write `data` to self.stream. Ignore, if self.stream is False. + + `data` can be a `string`, `unicode`, or `Exception` instance. + """ + if self.stream is False: + return + if isinstance(data, Exception): + data = unicode(SafeString(data, self.encoding, + self.encoding_errors, self.decoding_errors)) + try: + self.stream.write(data) + except UnicodeEncodeError: + self.stream.write(data.encode(self.encoding, self.encoding_errors)) + except TypeError: + if isinstance(data, unicode): # passed stream may expect bytes + self.stream.write(data.encode(self.encoding, + self.encoding_errors)) + return + if self.stream in (sys.stderr, sys.stdout): + self.stream.buffer.write(data) # write bytes to raw stream + else: + self.stream.write(unicode(data, self.encoding, + self.decoding_errors)) + + def close(self): + """ + Close the error-output stream. + + Ignored if the stream is` sys.stderr` or `sys.stdout` or has no + close() method. + """ + if self.stream in (sys.stdout, sys.stderr): + return + try: + self.stream.close() + except AttributeError: + pass diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__init__.py new file mode 100644 index 0000000..673f93e --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__init__.py @@ -0,0 +1,48 @@ +# :Id: $Id: __init__.py 7865 2015-04-12 10:06:43Z milde $ +# :Author: Guenter 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 + +""" +This is the Docutils (Python Documentation Utilities) "math" sub-package. + +It contains various modules for conversion between different math formats +(LaTeX, MathML, HTML). + +:math2html: LaTeX math -> HTML conversion from eLyXer +:latex2mathml: LaTeX math -> presentational MathML +:unichar2tex: Unicode character to LaTeX math translation table +:tex2unichar: LaTeX math to Unicode character translation dictionaries +:tex2mathml_extern: Wrapper for TeX -> MathML command line converters +""" + +# helpers for Docutils math support +# ================================= + +def pick_math_environment(code, numbered=False): + """Return the right math environment to display `code`. + + The test simply looks for line-breaks (``\\``) outside environments. + Multi-line formulae are set with ``align``, one-liners with + ``equation``. + + If `numbered` evaluates to ``False``, the "starred" versions are used + to suppress numbering. + """ + # cut out environment content: + chunks = code.split(r'\begin{') + toplevel_code = ''.join([chunk.split(r'\end{')[-1] + for chunk in chunks]) + if toplevel_code.find(r'\\') >= 0: + env = 'align' + else: + env = 'equation' + if not numbered: + env += '*' + return env diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e2bc825734f873e952769686506081c23cfd14e GIT binary patch literal 1453 zcmZux!EPHj5G7YDS>4t}5G02dJrF)wg=GaU&;o*C1Z`k6fL#=g-3Ef%U1~{5thn4Y z$(18VJ~cnkKX8uynSQ|b*pq*umvm+&6)F(Iq?hE(o0&IHyxiT52#i0IAAk9)MabW{ z*&YqpJca2V!Xn6kh^7cc;|(295xyXu7Qd&2L>E)#82tIEWY6-n^h!In|NX*Gb5kE= z(s=F_>@ML>c_m$k?Pc6g_n0e3-GZkxK9Pq}^xU&F2V-R%n{%u3(y=TTrIwD3bBmXA zX&pk1q`#KZFrmg{X(0kbK(vDYF4{li7xLu+JBP#bvjg_+#ratWBJ|PfXzDZFXE183 zm1p;)HrkFcwt2?n+2W<NQD1W}Umc-4`u^Xsu+nXc<a!-6>X$~PQ*MvI5u#nfE*FyF z5l_9e%;(!U-g4t03RdU&NXw{?5!WC9uoV+L-vhS=AXJJ#z@c<2oK@zrd<BtBpZ#Qc zQ9uqzD=@{N{1sO~K$dYMm{taotr-Uw7oDa7=wLIN@DalN2BtfOWl8Rcpl|7IAc8w8 z8X|l{mccXf8=f_mjk`cJ-%`<<HSLkuxeZMy+PC47y04d^_~0u7-zchx_d!%YNMBl@ z0VHMBWV&vyG;?KhgL*>lgmQ)E3zi_Q2{acwdI2t8I?tTS3cX-D&u1&~U_ITDl^pi_ zNis~54$DjL6!c^Z*&Wt6=cV?lTXTS#Dm9mkTgjaC>{@}+l7wqDF-da3asWn4>*}l8 zKS|_OSvND;r1pHw5>sX)kgG_ToO2BZplm25Nlv+T62Y+MJ?FUvt39@syQ^cDPKp{F zJX~3z>Kt1kDl=K-eX}zh$%!(rE0O|{{|)RN_Ur{r_bDtB=-AH>Z|Rak-w1SuenNf^ zuCNEeO>-!Xczyp4Mu%2S;92=jPz8ris%APZ&Fl|i;mIKXJni|c=oPBymIi;vQgpAU zQtEE}h0WyEmy4cQKMB41Vd$X@dvUCc@^O4vEUM^OE9XIU#mPSAhN5cG;N4B9Q0Xj2 z`*^E8hsQckfvXev*!bN9!{I%+kwLTW$)LUAzM`LZ8Wtb2D*QE9rV7W(h)%N#Q8R<~ zrX5wQuF4H|eO_oempVp+ssWMfLRZTU0zH0jUZ260djt#lFrpFU-wr;etstZ!ZBzRI m&cEx>Q{ZqXj)9UmuFtlxkxp9&XdkcMypxaM$YJBc2mb;NH@h|f literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/latex2mathml.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/latex2mathml.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a1214abba01eb8beb3d70987b3fa479cf833bda GIT binary patch literal 15236 zcmbVTeUMyLm4ElW{+gbTOp+nVgakSx328_s5Ri|Mgn@)09~qDYg(fic^nEkaGu^Kz z_r1wS)1#0HAOaE-P?3N$fJhJl5fBv-5iNH`u(ozB>(%a->sIMfWx4KJ{^67>`#a~p z*B>(z5GHx&-g7_BJ@?*o&pG#_uWfBj8u)wb=1<&o##Y1lPeSVdJ_@7<pS#sE3~6Kx zDWq8tMbk8dQM4FFG7(`&OGac=#$;S3WRpzFX4xWJWt*HQ+mE(pqH?}mAQ#FGd4gOd z7t1BGQ!bS!%4J8JGch|d9M2>Gn=(l|IoXU@%ajmC5O1xEx7Eex)y3QE;`1pkmrpK` zC&`l!8Zx!jm=IGUvrw*(UGgLH6uDBalBdemGA&P&r^_{Rt?ZWT<Qeizxn7<n&z2vR z=g4#AdGdU@L0%v?%1v^!yioSYi{!;}i`*(Nk=q7WWjf@g@?-KcdAYnoUMaWBUU`+g zT7Fz!BX`K1@>=-``AK=5yk2JH4RV*fQQjo`<jpdBbZO=U*)MZaN?Q)dK{+Jza#)VY zf-Fi$mgK11EtPboC&%O-xmWI!`(;_)A}exSeoB5?-YRdC2jql2C~uc{$UEg{<X!T! z@@{#LyjOls-X{;q&&$K|h`e7uAir?*?93whMfoN9p#1VtE3^1gLp~&rVpNXWOD3$0 z1^i+82=GU23wS5+ugFQ@lZ-C~J|!Oo{;1uF{1bscCLag>IOEHJe^ovK{0T0<9QfDd zlfa*}m!teiz>mqNfIr3f$-uuZp9cOk<0;_Zkk0^rhU>2Y{;Yfs_;ZYR0sp3a9{BT& ze+2lq<O{%GVEh!|FUpsIzr^@T;NO-n1Am$ERlvU^zYF}kjGqepd-4_FuQ0wE`1j?j zz+YuN4g3f4HQ=u?ej4x}%GZIv&iLuTe<a@k{s!Y~fd5$j1o%%FUn}2|Kb8M*P-MF0 zKgypSG&1Yt+wx8MbEKRh%^gPi7v=R^O3ofzd8sS2JMDd`V%8f<<x0{{<sGk-8dbJy zJ6_hymz-=NwH>+JuY8BrWbdC%z}H{U!Lwt8{p?FRxKjrY>bxh%uv(4ZOguC#Zk`r5 z>AWuoiBlRq8lYcHxBAg+Zp^cNt3RtU(SBv`vHfUn$j*)UmMnRhh$I+=z)~=%vU}`| zHI(%-3F2Mlox#k45_(jy2RxM@9P+YCmG=5kFJF)-xyR0NlW#qtgGY4mm=2!Q!TmbW z-Ff@4#wK-eOb17F@KCzhx2_(_`{s3dKe{77Sj+-<5#MSTysRJHIb<V<UpwmN3nj-l zuSV8YMSBogmu8D79lJ7H?3Y>J$O#Nn_(#JT!M6pU+W|0WRE!&2#)W58M5pn2b9ZEi zam+{yKkkm&xqP;eHhr`E3_s@XFZP!TY6<EvnBKb1D~_%k&5y1fb4Ihd5nHa^J7n91 zwS8x)qP_c^{p(~2Bc3m~>olZsTvy0?_P+HLEf%^*_xs6>g}m$KO2yI5=MhiDT+A>H zwH%Rj#JAkBqHjTHGLaIX9~o68nTcgpE?06nbn^~}Ue@ugtQzz!<oFSQp$wv^2tZLc zhncnqGXNey9(3(}qrNqmlbGoeH#3m2Mr@Ta3n*5|7c(({yfeU|J2vW@1vFA9p^;*C z9{}1muU6pF261rWM*xP1YY--mA^<~~Sl$^Xa!q@(kfdr9Nhp|!qfhl|)L;@NgXA$9 zlRrLu|I1<IJ6fs_9tab@7e-zQBi|1ruLfoB4H6!>HH_RAMnW<VOoS;1gGvvC33mhu z4+ded%nm*r7Wix!xjT&96Go~ne=bb9FN_=t$UUB3>Whnfaj`G9_+qOsF7d@SUtH>o zkNM&<UtI2sD|~UKFSh%l*B4j$;%Z-f+!xpQVuvqw`r=w&e8Lx>^u=|)xZW3;pn=1| z`ak$|nD9s#`AX3Ab3ypcFyql6;qD+j6lQ!ij64zK91g;7g&D`f$WvkD>tW>SpzK3o z!ZTsy*)Z~47^$-Ie3(*g;e{~e#W3<x82NS>3B}}aC??ewz85eNPS)X2N)EpoR{lW{ zITDJ=kx)#Igko}JA|MkobL950(j8&s&M@+sFmhKI2^&8WO3IN?QjUa@awL?LBlo4x zR_h`C>MR0h6Ch_zokQSU0;Dw5`2;o)xPZV$0-FeICU7Bv9s(B;xR?OxKLuaVP?r$c zM&MEcA0u!Xfy)V80pN?QFZz9v^M&+<?TZ0l4Ekco7kOU{`(nfw1z!|>;rOEDi&0<f z_J#6=>kH2pW4_qqi@m<s=ZpQmDC@zyYf^`wxhudQO<U7qQ`y>;cgnF{_U^I#o*de4 z_#=DQgU=lRu#Jp>uWCvGU1q|3Eg|0&7MT50*yI@bs0icary@*{uZpmV{8fZW*)HcJ zY$l%-VGH@K2wTZ_Mc5`SSn^IkLdv>)^2J%#PUQ+&*G&zSRA91GcEK*fkh|Uao{Q%h zy*Xkr{3EqRAC0w3qe-@=4|Yb1ktTJXCn~}-Crs5{5nGKL+s3VmF=<sSa%^`mbCQg~ zr4>d6okWdo6%+L%Qh+V9yo=aceM4>t_E*`?jp@|d%`>=4CR4#*SSppvI;nm;RdUc5 zs+mGpvMDk_snUQ>0<rGibkt9TmHcELO5KGb&)I&2%KEYF=&0>TA9}rzcWl_Hh-()H z)DU{93IOC<5Mxzysg_Y{qOULS<h{PW$AP)+07f(>5+aGO%}SaHQEsJvb%*5|j5itb z7(O0Q5_}kK>{T#?YbwUD7&fITtx4Xa97N7=MDGa}8H<e_grmd`>~Ao9v0i4i99g~6 zO;3w84b6l;!Va`B%SV_H+DG7?!A*!LdsL-OwG@SwL!hzCY{y?FN+b$o*~=?}9#YM| zzV3~MQZ8F?HzN{y0vP@HP}a?Qp7NXe`dI4v`e^i=Y|%z6G7M*cyKqdX;_Ozbs3!j+ zHO<>U9^{U9V^(#Db%}<)(-2etd5CF#Xo!c!ga9;0q8K_+UVKfdROCfaEU7?_AT$@I zEw~1@X3KAKLh(_1KxW3M_>qCJLg5u;xYU|qm791_C^g3^l!`wq_?REkdRP_4l%ZNY zae#TkiqUHX>#8qOF~-e`$tBiT%;Ctmxx1@E4!J1r(IUH=+2X|#tliowxrl|@4OT|h zktt<+W6E(;B;2X|KoGhqr{txGS6V&;dF6W5mFAS3wVX4W#h7^A>8L7$ZNKdz*Tr@K z{{AKKo0VQEBa{=<CDWFkNRlBx;$W*VW6Ttl{vkfM4Zw)Ch!znO5v&}nnr0q8-Nl9p zrNOLD=prDPNUWJoW1NN$u}v5_Rwx%q42Wm<@c^yn5#nfVeBgScKngn0n>9wMyx0BC zyZB2B?i-c_%jFzP!f&Z>>22`j(yBJ1qy@_JxhM4{j^7_zbkqy<MNA5a#iEKJY<G<N zB+6Ih3MJRpozcTw>&+I*3Ke*&HrskaF~z||24d2U9#zmDPiNRWPH0^4(0oMrS19Tx z0JMTb$CBJJ&TQxrEjbc%7IC7bMH~=4T1=QpAq(-seZ_+A4I*n@Y{Z;FEW0LPeNfQK z^Ai;9FUkFWoMKSYbFM!NnZH3>;qv26UN;gOSR=uyvPS+zsBqmS61IpG>LOzh;v+2< zCrho7k%|b?qSaWSa>+21BO6z`o6B88o;SK--MYPd_jd0+tGlEI*PVI(`RA?M4&~2a z`<3PS8)?K+V9Iefb**%}HkVT~lTt-2lucbS?~WF-`@1%$BTAta<r44+P@}<g`BA1d zb6wqr62HUewg4DVlWka4F_AROZ9HYDqzAWQY#KBrtw_lWYB=b9+UzYyH?BipkC}Dc z%%Ka_1S<a#pPma*ZmG74*=uN%<|2xZMWqXo!C)D~e^>y`heZJG2XSE^B1wzjnCOLO zA-n9y?0p`|!$BaSwxRf(X6pbl{)A7<Fa{(k+C$?^141H(KK7>P@i6<zzCKLFSb?ll zOJCpav1}o*Rq?()Y=mKt_ETFW0(%LNT4bH3K25P(2{1b}A3P|En5dgAUTEY;s6l{7 z@VS(f5D_zCCFdvNiD;rN(UeFcY)V*MDu)6Me<agA_}H@7oJeWH<+Ir3gELda(MH3_ zzt3zRquEZ9WUD(sd#)v?s9V$2FmYfA2p1ZmC8vd}_gF*=>|MxJpC!Np!JV!F?*2W< z{R=)Ol@N;X57p6F(aZK1><`jabuY2@p1u5A$QpXtu3M<<r}`WbsP%|r+^zeN@qb}m zbc^s=-J+T3p+dA;Yx74Y4CfJ^>OE%79LKrZI)vJAt%D&n6yYDVE!nF+k7{%F<uEeL zI{JjqqF<H8Q;=KhOR%AVBMX^~(t$fd9J-^A3EwR4D=(k187Y?5q>A}9Y{ZI=q9JPV zqNpAEw%}uDumWAx$F8ut6KTib$I7gi4b9pENUQ4=PYx~IMA#urY;$qn@x657fEyzV zNEVum1UIGbC)#tV!2`%>p3y+4X?oM~nUi`q(W$8vs$Iu&O{k6_16LPXk+G@}Pz{ti zYdS0>_TY0*0;o*~?JAC%m=xMy8rW&ZFcEP~M5!EERq!qV9P}<oo6}<BwAegrEk!_# z$AXR<X)K_m;Y`yvWmd-pR=n9$S;xfzA)G{<%GsXcc{tu!wKt4aiB}kDW$fK%j@5%` z`S{B83&?FFV#F!!#T2E?8Xc6-qcg|CGmH86SPKuK=E9KMgrNxkfaIO`Ab%9(I_k(1 zethz@sj1B^Ej7%h1(olP^}k~xa}Gt!Vm6l+c^KsvRht%y@DJ7Ws3LRLtG)s_rx;Hn zqqD9h!as0J(W1LsdGCPCdo?wM>}7RL5&j{XQl*mje!Y4Oq))DEitrE7)PTz7-mj_0 zLAtB1DZ*zpWg)Q#pW6k{ASH?5bP20p##t?s+%)-dk{cXize81fx8*1Z|0rHv{fmI` z0gmB`NvwWsTVWsQG(xLj%TLgqjB;(sjthHAuw}f9;&YWJL7`4Is#^I}>J_zPz-xuU z)eIe9IagVt^F&fe>NG%{N_7&3tKUvzkiC0Se7Bn$4fyo17M_W{HatsoJKD>mtsW(g zo&eYeznj@(M#($VuH0O@>mYJZCzcb4fMxR}V!JtH8!8`u<+fw7nM$mt>xn|$K-6^o zSCO%jNYj22x?UtBiqdlU8vZE12cNqJpf=CcVSU4WGz!gtTW;3(xasB@Z${T!FyjL@ zPQq{$dW$~0yyuuN#)IfnYB4CLqtoWDTc+c?3R!2cU;`Nk0__gO7u~aLGYQHTVuwux z+h#2!e90Y(2((nZgkv{sWNQ)<Zfz_|t*NN0aGWzkI5h8b3rB;z(y=oMN4>SuX9k=C zQ5d$S%yARj9&9=Wf{h?;drsOIj8KZW<((T2PO&G}n>dIH+oLa|0rf2aoHSA{IuPti z{0LQ4w^D%_UAhfv8^Rej!~*=oi9yh*nlGK6B|Y3EZ$5}b9od@nd>t9<i8k%#NP0|o zaOU4)RwAM(Z<Z9Htd^qV*pyh&#l@h_{@8n{_HTpCh19Oe?JB}&wMBE&gRjvyiIK$O z%)92B(DID?XxZCeu;)IHzJkb{0)TU61Lw+Zv(-`s)7xiNl@q3nS068I8bn+s<80DJ zdQCl12|qTn7gvyO-S}1|aSL@(ulWR4e2Xa0(_GFij5N4aO_c&7#UOMOx*Le)ltIV4 zi=mwc0a+`R6B{+jRD%~r<4UA<;A=S0mC(YAf=gc<5yn^Qa|Y%f3u`IL`;ok77iaco zIdU$i{t(%iFyAeo67;1igL9qhsxP592!DqNM~SdIrz?CL@-HLu)q~r2ankoL>2{jd z+GdJ(;IrJl_ZIV)LHy#7cer~oMJdM@xGv<@R3t?0c&0E~r1t^Z4u5z<sJ@2w)G-3Q zG#ONd=&F!$wsmdX;_>B&7R?rXZVG^u84d_x;pl_}rdR7(YZBItts1NjT<5A8^W%X% z*2?xENX$7|l(B=@3hWsiXxOtR&01j1)KgTu)}LCZzK@LURJ+b(QQEBeKpCw7j;n0O z9Gn@ypBwZ8khz}PqeX!|HsQ0{qH*iN=h6yjnENOhNGO~LyUj5_S>#rE;>i){on_l- zh435@-yWNj8Lkf&L{+f_=1d=t*T$<l|2KuKV+Xph)^=3{(m3v#wH{b^@uH|vtj)k{ z;A<C=B~D50D@vI)CNy3>_*j-2#)NeeMnrE9v0G;q94+FZhxg(3;#4yni65cOI?1Vy z1ZlY1Q4-at4nl+SLoo<@Fb5=}v<|A<PW3vGpUX`<fQ*6JZIFJ`yUbZ8wl>UEw~pu9 zSpN_iSt1%rJGSDKwzENO<{^a&u-NdML@^1r={$T&j6-LuRk%3CRgY)EgkkvaHODPy zsTa{{Uet?K%n4jtVM;j9i&tPOWOO8Q$WlET8^^MjQQU)I!p372`1K<=fJ0ggX>lha z<Kyv46c?|iI(W!*o<Te@VjdFeU?nb_Mq=tI9JMCArb>JQ7f|qnlH)Pwm&l_UZ*X36 zg80=ruOO!xIsZN@=g~@hvU$n?<&B_`s3a<p5yINAM@V!UL0(%WA!Fwn<B8qBCmt(_ z+u^2<H+e0UCNkg1ZK0G2YZrVn^amwSI_7LeyPEG&9-kz}COIL-o54rxl)+!3(#+S) z$$-~(uT8dAqLny#brZN~J0z(80Vk8(gL##x?l<xdBd?u%@CxV6uglwmacdiip+CRk zyr#Om4D#k-Oik5;yaiLnc#F5N(&BYYP+H78q0%zE2=m*H`E7Mh<Gd!$TaBE>-V)F? z)oQP^(t;kfItg#7j!{b$eo<O!9XFl-MLYAkowpj=S<1AAbvvNY=IpF%<DR-U?(t4! z%5BbiF44&~Ut<0sLsed0@|IB=(@J<9x(;*0Z(1vD;6{R*1<cJKSc+*T!Wn2r{#N8K zM82iyDid>rv@?*_!D*}XEb1K8ONKM&v|!dws6_RQK_X&WBF2r~Jr#P%u&DeFTx{3w z<0oi+bjh$<-yo%KSflUp>mL!U^^|Sv+p=qdThMIqzJRk*OiZQ*6fT1`o$eG~H`056 zO*_>XUOMti3BDQC$@&!}-LwV8w&C78ESC!IaBRuNx^>gU1QGIv?9|?&Qo&Af3elh| z(l9GGrs%dcyv^&L7O9=M881MIY-1Iyx2m)^n-;su<}KrT13QX@-g3u|{dkMHF9qva zQX5jZYQkkxx#RS;r>)zxI(@^9m5rO%bg#JZ)D0K(_@WPV*+(D^rJg464JNy)y!f(0 z0WS~>xE#&mM8dN*v99!THHIR76qi(ak5B8h#iK)EKIP`)XSI*e5dvQzK>Gkco_Di_ z(V?v0HiS;&dS%4kzqh0$?~eRt&AGl(reifKFY|+F<tUNho0UApCJE49SesTlS@e^5 zTZlJ>^rDdc06xA_<bALSOwYrsN4{d@fmGvECqm<|uBS4+jJqRwJPXXNS34P{OCLXq zxlsFk3l|)GxkT>)`_($CRI|Wj$^7=2BAF-aFo`Uqsm-KoxHdB;I?Oh{=BCT;BvN^6 z57>tM1Yd(|NO?=(f3+}7qGkdcL{Kq1kh-Amqw?)k3QtbRU!$vMx=`1(+un_sE!7;# zrH}rBA5d!nRKEg`Ig2<A{u<2IUy&olxP=>2m?9X32p*|mv)pM&6J~(o*k7>{M~vS7 z$OzIE7B&pklyJ9sri_vDt>7R6s@(D{n74=*@uHOo8MkrVuTI7)D2o?Dk#TXzat?qB zl)ZYgO649<X{x7!I&rA|;Nx0XqE?bsG|VP**gRsXpP(kxD%yv7l2E2(RG`XD_3LU5 z+J^xI|CJaUA2NjC7v-$Q2JsBT`3F!ZB`=_;VGv<diR(CX9Y_17^Cn8PbBW8nW|T;9 zi3FEOaEYf-f)uz=&&dV2>s&I9R&fl`GzHV7t`jhqyUX~l17{0~XEKWzA>4qXEmo0U zD=0TtlEAgGYbH)HJ17@$x)rUEl7;D!C(LT)Rc__iXysM30u_&u;jsjrCcHgqt77$3 z1^0h3Q@zfc$5dOGcl`JPE#chykh%LDd>x>=B%m7e+P!&|7MSy3M8PNKg83BAQSjNx z6mRwBLyGVd3o?-0*U;#Z$tGuJ8JC085zgx&(|v(v42}g1E;t};Ii#|61hb`H0T(A# zxmXAj#${`q$ddyuu#=K0NDc1%>!@39q>i42cRHqAQAh8Dx#>AS1+^~lYT=a|NmaZ2 zi0(Ta55rr;?MR*Dq2-Vt=MZuibM67oUFa>Y%f*8Yb`mT#8Pr`;m%9_Wom}_3I+vV8 zl3-^8a+Y$=e|aZjE|%(A^rI4tG|hCZ5*l;?!)wY_6+F?<{j696bToWwuQohyKs&JY z@uU6rAYL~nZh`4l`F-Q%3odc?<W<R`7lizz2<OP7CFR+2MQTSFP1&_VuuZydSNA*Q z%HsjIBg;!J*@vg<sFmv41w16*wE|lR+C5}qWb0Ltja7M3U1{1i+|u3MJ>Io~jhOlr z5slC#0bXdqgyFd#p8Ka`(_;0sxM5mU)HBqbX9+wHP+qt_@8WUbV2aAE?MD@Rg&*bL z2T(1%t-DeE2bF$~z&ES)I>LHfG^}XhT~#?<Wza1ZZEuLE<0lgiEURZ@1a{HmD=^)) zLU*ixAQQpMe2L!D4kVKtC^_C<n|`8zb1?M0zn_hLdF3303;7WnBz3V{E~0^;Z7lAR z<CNy+RE8sXp;un@-t|$I3E%-x2|r1g78`b|pMq9-@wLu~Q`+nBPeHE3uR!qg1V?U2 zrI)eAhZ&}qJMP{*Ch6xiLNnX~_6Tl82IeG>_ZzffQd0yTCqPG&+NXFCF+a%zMYsB{ zb|YS<RJa8YC^$IeB&gpK_#LH3FNHZD@#A>d1$V_&os`%#Fy`dw77{-r;GI3W1bFE2 z&s2@P0QCz3|3u(l0PrIaYL7ht^{<rrZv<Wd$i(#7tokLDOW<5rWxbMuD?|rb8LPBs z)~WTIDEV{p0;s+L>%9banJvFaz$VklAz5p(+XTt7w^Xr3u<D^buZ3jW$<l|mKEkDH zspKb6y)b0~W4fKBI1TBGxYcDGBR_yjcUbr+3~_|;4NOHnXxPw_mq4crTk!Fj3caJE zcfiml*ucV)1+R9XH>~o#+TRYG>J-UE_^_9ML6pPuLE9ZIIWkxpH)9>MKYw%JHQ%iL z>znKS@WAJ;`QX(;+6$*g%`;tadOfUu45sz1hQ&S)`?A3!qD&%enq9;UKSRU`0XvB^ zT)iZU20wf`)5JK?fY2*O^=E`>v6KFvsqO}nIXV30OgH~>rkj>xH&q{V^5k3lQBG$k zI@4U2q5cQe)gOokKPY9_S^YQRyo~$tYL-PjHa3a}54KKKc0otrS8JV88r460qI(EU ziLWShlqFh^!rRo`9|=^Kl=?kTKUV4=hECS&@;)kXhybr_dV8RkCND;I)E}m_NdmmE zAEOwrZg$yuiPLs~k7~7tP6v1DH3F;;$QxzB<Ke7xvw0TS*T&&EztGye0A<}_EU`#r ziG?eU+5b$W{VCRt3lO>jX@q}`#bWTR$y*NonMs_0C#)7-l1hiQ-alSX{V$Q`Ie3}P zU1Q2`V<&xxT8%XRKJ3ldx!ls<V$t>++9UWU+RgT4dz3?~J^a_&-imm0dkbK+J(0wT G`TqlBTBa=k literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/math2html.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/math2html.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9175bc00adb9fe3df3971dfea07162b8dac42bdf GIT binary patch literal 195613 zcmcG%2Vh*)mGG|_O;dHDn9d+f5xCGH#(+CGF~-=Y4I<7+?`bslXhwcBV_Rbj3>LB_ znFJDwO$;^xV=yTs*#PMql57hLTe5AkEo56Z+q2pIqHMzVJLldvMV1Ns<^R{{+<VXM z_uO;O?f2c**4Es>-<u!0{e#<nKiKdCL2Cb^Ad7(fC-CPqIDt$<!svlSK=EKAsCr|f zQT0$Fta>C7Q9YW7x{-}BC%7r>t-+=-)70ObXbv=FTNP_DSjA7lZB4WR?QY}7X^H7K zHaH<CJlx=f-5I+Y6EndhP82+<_zB=KrwP1C@e{$DofhyG#ZLlnb=tt&6h9ff-I)eH zP4QXa)14XMGZa4se5P{(_z8-i3Vxz<68K4qp9X%iGYfo{;-`b3;+zV8s^VvWpXQtn ze!Ajkf}i1>34W&HXMvyPoDF`q;%9@$opZp?Q9KUb;hYP8uHxr_&vwoOKTq)v@bjGu zz%NkzT<{B>PVi2}XM<nlTnv7(;^%?Sapr>0Rs4MLdCq+B`HEiveu;A__@(Xz(Dy>{ z%bd%>FIT)1{0iqv@GBL+2>dGNYVfPwi|~Ij_%+V^z~86tbHEok*MeWG_+0RX&UN6| zxfkPq9{Ban4d6Fu`t!jTIg7y;yYq3s1bm6J6nv@Tmx3>ImV+->{4($r&W+$Vx|iYq za`2m+mEbECzXJUI&IiChp#HA}U*+5kezT@`75HlB7VujXzZ!gvb1V3*ieCf1)>#L> zPVx7FuXk<(zfJK4;I}(>fZyR>L;BZ(-|5^1ewTYK_(Jf6b2s?iieCrb<=g{)kA}Y< z{DaO0@D1+u_`d=CLrxMr>D~ao2)x_r0q;@w#o&(Pg1hcw+?Rm&Iw|m!x-SLqbJE~x zjei;VMrRZFCZ+#!@Ql+B-tR6a{0i`_lLOCb_#43ooXy~y-5YVg3EXq?;CXim_)74C zQv@%n`}@JSI9tKDD*gfRZO$P0pyI2*OU`!i?TX(FzQY*;A5wfZ_`S}3;P)wh3;0gw ze(?L<TS#vW_yf)^@LgJ-Tfv8&2f-gyd@cBhvm1Q3=6@ad9%mGMRO4F@KIV*rkE{RN z!1p>2fj^}9?e6Wn8r<7A+=2avosVGu5w*V){9)%2@JHM`$;VybA9X$k{xNk=fIsRy z2L70v!2NFbZsJL7=mHb{9^4;yp1}PH_5VTeea?RH{hH4W;7>Xq2miR@9|Aw%JO%!g zyOj8n;7>aT!4E3l4SvXZ2K*Vtd%!>8JPZD;;tu$8&SCJwio4*?J4e8eDBcVHg7YHy zi;Abfk2)`bzod8{_$QrDfqzQzH29~T&wzhM@r~dwJD&yrtn%e1@XtA)2mie0KLh@2 z&KJPHpm;y{E6%InuPUAef6e(K_!kw=fq%*QGWeI>9OWGV|BCZf@UN=-X7H~$UkCrX zrtg9Oy7LY2Z)o~?@YkJhf`3!}7r?*ed>j1RZh`oU;J@MgCiri<Mer@)zvcWk_;0Hm z*b4qT&Ue7SqxG{5{0--K!GBlrLGU-7x4_@h_)6fv=lnkS?<>9?{12Qz1ph<jvmM~y zb^ZwakK7%kHw6C2&Yyt)i8};-FZiE2e+K?%ir)ubcD@JxJ@;PRcY^=9^B3TMq3-vC z|E2R+;D4p~1K@w{d>{P#ithq{+xY?b4-_8;{~PCT!T;91pZFehZwobS9C3HJ52S)u zHv}6tjJP}9d)@op2i;+JmwR6->h9PuLa4uU{+>{Ouch7%{twO%!GGxPCYC+m|LFV( z{70I~DEL1){|x@mTFNo-e{ud5{9hFx2md$c-@*S~{qF_;59i0=KX&&L-$UU4>HGxz zCyIX<{J)(42LErxKLY-LoS%aKRPl$wC!C*w|4ie1#NDB#dL$JvWy1Y`oS)<Vb1n5p z!GGbr1OATUAG@*PVMZlDU|3b9^`mMV#I{jw8{J3A+hb}Q!Zxh7VfR*SA6MH5wo$c> zYP?UVZ4BEcwQW+r`_#4>+ZMHL(bV?aJb%pnsQak<L@H!!V=X0l(tR9hv2Ry{t)nM3 zhE`%|(-_*cRz9w_?buFJ+i6OR18O@R+Zk#*!#zNLpHkbI*q)%aX4LYu&BIewy5ZwQ z;3V~RlJ*S;HSEdQ&QjZ1YI{g+Pr>$7wKe0KXVmsIY)@C)(=|_@P}?)GJyUJZ)VA@g z+Mb2&*=l>X`h8Aq<Jg{~w&%F($p2x>x6k@HwK;#z$MN3*oIBi*cpiN=a31C(?hBaC z-xPef*?ZbOva2D$*mPaPg%<=G8h$7P*wrrvf7pobVbRbTC^v5|<_hkHflM*qBkr|- zL6Aj2egMU7kby0O+5iLEU?K#Bfr!(Xh?=2jB4&o5i6%4jOf;JzXQIUnH509Fn;Y8| zNW{>a(3{Yk(VNj*&|A=3(OaFybq$^E<?wnh+2fX`Eshs3q_e4bPbQhquUOq9IrIO- z90HaC`3{sq!^VKuiW>B$OW_L*hZ=VT3ZaeRXM%<tox#$H>-utA<H@+=b{A9eem9>_ zrrgz?5id*(<tDZ6&pB?nX>&2{7StHZ6Q<mlAIz5{`GS)x7G4aN8+$VOa@0ofVuROC z_=&~y3;hH02hsy`i`ju>&nDNIyS2}CGjlgw?)AHyuNs{1<a&yQbS6LFsQt-8-+WOn z>nrqU<_!#%!<vOFq)-u*hG1(T6ezVQN#?2B@u_eb{*?;Nru<MM4&JD0a7SQP!%zUK zgrG`zV`K`d2)*4ZRia82PbNL($bjeerni;bgczB0*3AoTyclj?lPEHA@>)a@QW#~L znA%Vl0C}BS1tXNFHP9R=wV5(m5+1))mk`zo__?Q!&(b;;wPIUW(?PhXv2>ED>1^Ef zyqxD3sua8^?pL=rL$Wthlu9wQh6yoMNy=f3YKfFZ0yG3;rX;p@)b;q~IE@fcA7LzI zc_t8OC<LA0E_CJlQ0d$$a~w}*op{0Z`qSBD!7W8sEMC8O)q?mB-{Eg{XQQd26N$SV za<`=mQ)j$4Sx9D9;wdjprXko~VJUU#5z*lPiMi6S&Ib`fJAq9N-ibQ`hsg3XfuX>T zppe{YGzD=&kUU&E+Z4d3b)1$G&-K#Udis*ttef$q%}#`ih2FW>lmpGHJ44Dk<<>2( zmrv)i8`9a{Tsh)qd!z-1w|eP<O9@*ErCgMV`VmcHF{zE!fNe6(!d}gWy@XwnDX|S3 zvdMmT!-jJ6h7E9TF(c;I4I4HWlNsw0-LQe?xnYAR4Ntk=Fo&|qbUzcG(At|NiX>ZZ zQQ_3@7W#5d4eM(TmH$PuTnyyTLWu=J!4NF~H5iM;VzFo}j2<vQt;`<0)%{8Oi-7#& zDE0E#X%rcJpb@#uG63>d%weZVBrwo=AcUlDlPNyxG@06?PGd?h_z5zV$8_?6>B#a~ zOx&5e6Fw$Wc3jTT@J-H{GDT-vev)&J({Uhzd_R{-_({%r>fYj<Pvu`wp0*_2y{<5r zaq~-a+1_+&;$ov0y<~y9H8MQj>*f06Zf0<s>&@#?fAQXQ#w`ubP8Ok{m!B7(T}T%) z?!5TI^!2kh=89f6nOQhLef^y6@$Iv><TAy6cfru?0mOEG&QN@Ie=b|-i_ac(lis}T zaVM8v5TA`YZ)kh`wzaF`3zP9a1lM&Pvx{D)<9bmS&QD%1&a<=hfb)h*(`M%-k$(3= zjis}+u9_FggJwr^K-LC|-I;X0&-Lb1l6-HebT&@J7A3txx+mk7Lp?BdIqJB*$zrBZ z+E-1_mVNu=!f&5bDg4m(3ukAG{oStDIW)AL(kdy2@S)islA^s!sjE&xcPTbh@r{#7 z6P>-T=*_<Cu2SKbXHhD{)<QLnV~AdL^3!~m<h`0yHR|K?MtouS^_Dpn&hNgyLLrEv z<bgHbTRqiQzA27Y#gsho-XpEBn5`rP-)!3QM0inmF1N`$53?tdw&<exg<cSUd*=be z5O42%YR+Vqpgjx>2uu1c!4m&HmUH9wYC1!8Y`#5y;cVAQ7jiJU>&)vMnzx<CQssQV zp5J>5yQ7*^T}r=l#P=O1;_dNtR_P_=t<>Ey1^bmtR!sep`l?I+SFEwV;}mu>6{#%x zJior2O1pgT^>yQMQu^Ntz2Y6eggmw4y&^r{BLhcfr?ZZ`t#i6ICGP@~D#f%tW!yrk zWs&qQuE$t{G1H=SR%&9R4MR^ZlW}{bOPXj09q@8JF6^F7<?+{_%rYJ*wPVOL=E@iP z+<ZD;3NPwU=X*-ciw61}Yt_1_He}19g4;t!Gm!HNrPf7^{%uF$R2z3Gc*6~4My842 zU3Vp-w!2G2ZRb<Gw}w`8eo51h(+|@0O>a0Sp3Q-nK4DI+Q25`Hw9@ezVN+>1ze>kf zTyflT5$*p@W^M8Ll8~A?B=DqB!tp!Gsrt$H$ZB2HbnE3;tyrYl=~%=UkMFt1xwjg7 zrBo}Y5MOaR{(8AgQa+z~2$%oI^rskl8M4+1um4{NySCB^&5IBDh5yw$8>aHowW>Vu zE)-LzD3vbuy^J&sUv9s4d;O@QcI35vf#oOq5E)u5c(*Z^KhnJAn3`r(SFJ%vP;C$I zDZ&p;j_}&!L|E4&*s<|@Nnv$ot9Pc*Pv$P(*`mZz60u}=x3`4}X*rzC4D=-vEk>R> zOi?e>p$w}(W_Vjjrt*nM+I8K6R}K$klId)sX-g70Tx8le<%~&IbM6N6eJISB8iN6T zKaWJ~^g!@`A~CfQ*QtO17CAA<>TmF!NZ9(Q4>J*I_U%1M^_aPrOokT$d6~T*JNG&u zD`H{hKap}P^PlzZoo3SGos0LMNZ_}3K3WdU>kLi==gut!=gnK)8J>!w<rtkuhSis; z=a6%W=^&u%4oVTq<caMuIo^roA|QX1rM_cx?1Y&qnz^FP5`)YW*$~zlqRbB2>^*P- zWs;fU$*D$XRw^K~LY)z^acgIS%mZ}}c%E#&%7&|KvdYG)Y^KTvs&iTDbmwxNi(a9r zT!}eCtXIi)scexF<JpQ`#RlnB&b6{F%2w#<&JD5wDx03N(J7movY{!Pn6h!nW+mH| zvPH?Z<hjl|*^FcZ(u7$|I0<<h;Uvs5!b->`sH>ejWMh(4*p8GfNZEFD*lLvRMcGo6 zZA95R<i~~~WoDaDwg%Y_yo!0R<Xe7c^4rYJSj-;K;pAmQP&NV8?kXsB6<dJfKB#IO zwFGQ;b{x2mdG?TVZ<@7G=RVo!O9e4EIS;@=yUNqxodV6n^=g=?)Y9c<oei1fAgd`8 zp|0+vSBiG!T`%qCOOb{1d)!QBVn&xNjHKKR#jG(n6Ok?kIytWt?sEGF`at`baAiu( z8e2M>XN=UQW?7N!ce4zc6zy}9EbEoR3+H>etpv;WB?sJza92KEatWO;c<D{9WF^|w zo9s_#21y~CD`q=SD2Eqk(y45@c}ddqTxY$ztx%3F$z_Zww3LjN+m>oRm${75T&LV_ z(3NDz6TE4u<XJ<uE+^Zp9P}s_zDaUl4vWu1IkHNrQEpl_c;|{7vv^O9H)+<(jcZx0 zZC)q&wwYK*-Zh%0b(;NKiiL8sSgg<zl-qA-sF%#73(35Cn<n0}sY-Q}V;J*=WVTSA zwj$^C7c)uU!n=s3R&H4%V$J5Nd3`dKGD&-~?pcm5O%BL-)B6CJw^)=_qFgJAEXsL{ zP|C4YRN*SBzZ|uRl%q>nkljRyqid5}C2NU@NSS1++-AM3)|G&A>td0@OLP4UV4bqi zt}y6h({IVTYm#2Fe+Aqj`6#!q8|?4SWh!{9(!zIbT>%?b+-49>cRC9>DpoU>xji{q z)v2-b^J8Kzx7&={JS3tj86Ee<#&R^7$>g?D*^!=1E-RHzxhN*}Z&{GN{Q*`t8YkMi zy4_SdyTMqLS}m&FTX8fk15QJFZd#Jt=3NId6A?J6*q>$J6r_2X#<(gC_sVcI0e3J^ zUoY!S30QQSvK6%T=$85tEzmfV&MnUtyg@^7_s&GSv0Mt1C=DCw^b@Tsvpt!j<C^fz zYv7u~N|}|E!>f|rZYI$r^=VvZsO#z+ZH*PfLeX;*GiotSuH3ZNwX>GQwDrmEjC)J3 zup#X;pJ-gZc73^NMaH%How?fG+6&KQTxV%tF}sPNiP*Zd<F2Mjz(jbIOomrva!EKx zihm0}q{Yb6SDA`dUcNcm<K+_JmHn(FB-%Cq)m${KWKGtTpq2Dw<-dxpA%tS(kffPt zSwr(K<odN0wcjdROqE8I2y1x~L`WM}A8oWdT6i+Ej?EG`5xT=m4kV(IPgpC_vaZKV z4?s_8@?rJjEz^dwxSNWEV-k_Yx@f3<FEy4TeBWSV+9bM^Tb8+bjSJ>a#3cTe1-CyD z5)<hS(rL5a+`f($?j$|Ov}5wC{LzB@8qZDkQyJd%r0?Az%5qVbNOoE@hpXIds?cXe zlE;=#St2&g+0v~X#ULc}7E0ioBybyvdWFRU0|@!_Ht+q|b>62!r4%}s2uiIB=d)T` zNOmK1L@bNEFGUw3++puhXdzO%6zM{ErLx}TgqBv4^w{4rYl~6EvN@WTX-nNXXVB{v zkJJ3t<#zynbF*E*Nwv)_zSv8dZen_!HI1iqLcNVPqSA?VmR16m&Z)OG@=EC!?@o8K zD%xL)zpIymyRFo5d><^VYV$0eb$mav9{g?@VTnN6bm_d~N1-bZ8wRAgm(D)Ew~WYu zcgu>jrqTt+k05KLg-z-FU+PiCO6knw`;(%-i*q5@Q>w3DL{4c&U3?-|N~axT6;}}? z@t<+5+s#Q2IW9tHs*obG)UBT5Bq5nvm1a(g5NTFA`B*z?&6D$rsGG!zR_2vXt&gBa z5|-+-aia*8bWeU#HdIVbN=`)OB+gpJglL=X1&_nxlf4Lw*RyY(57|3-w?xD}$*w{@ zUmg?1z%TPqc(+7kx0<#6cZ);Y$h&zkt)rf)>#}LN-!S#Lb@f%}kDcj4VNh6a_Pcqa zv6?(x{7Zb*rCZ-x>e7`IJC7e1GCSkudV6g5J*nN*#U!MBmnz>PDb;hOX;Cay*2`Jj z(;RCny9ATCReJ16vip{S0&;#*Xxpbx@~WMCev(&uc<rX@C5H6%lS1FF-T9;pN%udg zm>Dw`$WIDxdh<ywGB1M&PgdkB(!q=k<NkP|l3U+iM-LT|WNpnr&x|E1=~_1xauwNO zEo(*>rCF9AtkZH<WnG5KZlzq-K?Wc)qw-~&wN@GC%QoL`@Xon1K$)BuopVessy~LA z>{-V$6MmOZi_!56V*opGbj*wl>2EF4c24HWQ55e=p=!ICQnI(g254F)j5@_+`I%mf z$s`lD%DAJ+pt;`OQp_5&3{BKeA(vvzTEYtxTOE(Q&x}XRgt8Jxo1J0C*)vXNy{p92 zj4l-$Thpw=GYDjy$lNr;Aec!p+nEf(n4~gb>P4W_O~k}3z3fD+D{Drt*kO|PFww-! zRYU^4c$-dQD@lt>G0Wiv$-XgWsjC5|QOXz_gxN@(BAKapocWXkIW6W7zuJ9^epYUa z{od7vjykEXNzCBI0q+`dCr(%cvQmT$sWS8Q3LA308<KXIsCIT9UWuixIya9q$7|J4 zJ!XV85$GyM&9E+CYFSt_pln*$>#BgwukLJ~a$zbeBU5%q$}M)DM*mbunCN{cjzy70 zJsu@hQVy%^n{sVW&L}+(<X5mfWmmEStkB8&ov5-}cdY5ZBW?H%TqA3M;{J<Bq~f#c z-w)@<HT9Zcy{jMk_<pB$k#Oc$jiG9)b*uUklkewO)1QxgkeJ>Hg@X-|cRZo#G3$VG zYG#oT+Ce#H9Z=7WIFSQk*81e!NR*X8b819Z1B0?2c%X%oB>tM9S-m@n)vBmm_^3T8 zqAOTuu!40a3lI4omR*?haR5ZuKy@lp43h=6v>uJyCDHv>-^XI;skoIw@ws#3r7-H; z_(b4>iNJ?`62$)XL)PP{Hy_j@&ljWW_V(kizJ6#TFn1y_-+KU?&K3l`PA0T>iFav_ zuzjd>N}X+?57{Pt1ukv1F89)Y*A2Km>12j=DKFkN7jal;v1lH0yv`=$<O+ErI=$YS zNq#Z!inw4KoerihOg7hz{N3av^L=wC$Cu}%V;}Lw>w`#}qb(0?&3R6L(%ZCsXrh^! zUC$=<Ukaa}>>s$c6godsxOO6ReyVUSt0#f;Cjtv60@qIj=U?wV0ewo5^RwM~{6)@p z`$dnQf9^GxzVB*0dmpZncb6ga{Rh1#tCkNQPdtR_FT8v?W+e?K#A&*~>SQ@2qr`Gk zI-k4dnk(OT>6PVXdWvE;EvLJtlntY#cOGIPFY{_E8$=$M_50cu<F_MOzpuJ$d#Lz+ z$CLPuX&38YtVKBF3!JMurd_a_U$Z)X%-XnF7l;2()Kzh_E`GXPX?pJ~<Id%Bg@_el zvkuPnAiMT0tJvr13U+1f`@l-tXJ!4H(_CR)1HXlpd0hiXUngte=v>2b?nJ-KtZ=77 z&ONN%e-MmyZm=X+_kkFz@T_;Ig0kX`nqmhds_Wi;sH}V=5n`3K?|!)qBNt#;<Ib?k zonu8@R=T&L4$8$AF0<spxYBaqRMxS%$|9@UTv=J^?2?NraydmVq{t-{xp*R%OypvT zTqcnVByveaE{4cu5V-&%mp&XWddTGtxzGWnxW*w@H@L2GrSp<p(vXW8av4J|U~uW; zD(4GI$yeA@cvUW0$i)h|Od%I2xHPfA`G#DT;CjTh&bPS~vC#QVR{gmQ!F~f*AmrME zTy>D^4RWPHt})2f1-Y&uR}|!0f?P$A>j!e>fIM^2K&}nQRROskAXft98h{-Am*f6& z#Gia{uwM@I%K?6eL;7+spCj6O3?E&O-=ph+d-RC&1Jo#>$Li7bAU(Pshey`~@aTHv z9bFH(qw6ttbUnC^u1D3;^>8}69!Ez%%Xt&^Y(Nj4qw7I(^x4kepq>Yu4_p9T2y|Mw z2>oJU4lvikJoNd%CBUV?Wx(am0n{siD}k$ktAT5P_W=ulYk`Hpb-?w&4ZtE`F|Y(! z3M>Pb11o?Vft!Gp&NHa*2R;C-0&WIY1GfNcfLnpJz&c<(a2s$taEI0JM86A20Cxjj zz&*eRfepZifF#fj^Z*Xv0=+;A=mXNgMnLR00U4m*ITbYv<bVNSGvEPv=XBHpP;~wU zbqlZ+*ai#&B@5fpcK||{AwY6^FK{2Q6SyCE0N4c#0}lctz;0j<Fba$T<5u5`{t)nC z;3L4pz$3s%fsX-?0*?WY15W_^fc?Oez{i0Dz*E4}z(L>;Ak_Z^@GS5ga2R+VI0C%j z{4?r{z)|2O&G#oUeG2$A@EPD`;IqKzfX@TJ27Cc{1$Y&B4frDPCE&}zSAeeqUjx1l z{5tRr;C0}ez_$R&m%z7y-*CQz`kTOS0ly9W4j^^{Zvejwya~Jo{2uW8$SI+)#2|Km z07$q$1ilOW5%9;rp8$Uf{25RNz6bm{@E5>e0)GYkHSm4lZQuvM-vECL{2lQ3z&{`@ zgn~Z={t@^Q@K1oy?O)W_zpB6QC<p!<w*T(@H|l=?KL-92_zCb|fY|>Z;HSWZg`c7S z5Abu~7r;C4N)R~{bOJySXaqt)*g^z73dDdWpc!ZZT7fp89he482WHghGclh4oCur* zoD9qYP618@P6JK{&H&B?&H~N`;=nmT2XHPh8#oU*AGiRx5a<Lh0>u4dU=A=Bm<P-U zE&(nDE~DOp&gH-rz?HyN&Oe}D4O|1f4_E-_2az^GT2&Bf6GYkskv2i3O%Q2gU<vwC zU>UF+SOMG!+ytxy-Vb~LSOwe+tcJEPqhCqw2a!BMl{}Kdtpe0>5E&Fi1_hBpL1a)6 z85BeY1+`TR<=WuoAd)CZue=NOZlDXeN4errOdkX`03QO9KsV3>IDiZE0^[X4gB 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 PKUpD;lHi<AeCpf3Q#<P8 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/tex2mathml_extern.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/tex2mathml_extern.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..290cb863d9e3f0933ff6f78153e3fcccf4f7ab03 GIT binary patch literal 3344 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 NyKTR0w<^Ri{tI<GY5@QM literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/tex2unichar.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/tex2unichar.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15f92d03456cc9c261298cd3a7271826a642c7fa GIT binary patch literal 14152 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/unichar2tex.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/__pycache__/unichar2tex.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c654c087b71799df591c41bc4ae17e896f54d279 GIT binary patch literal 16724 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/latex2mathml.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/latex2mathml.py new file mode 100644 index 0000000..dc8549e --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/latex2mathml.py @@ -0,0 +1,568 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# :Id: $Id: latex2mathml.py 8366 2019-08-27 12:09:19Z milde $ +# :Copyright: © 2010 Günter Milde. +# Based on rst2mathml.py from the latex_math sandbox project +# © 2005 Jens Jørgen Mortensen +# :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 + + +"""Convert LaTex math code into presentational MathML""" + +# Based on the `latex_math` sandbox project by Jens Jørgen Mortensen + +import docutils.utils.math.tex2unichar as tex2unichar + +# TeX spacing combining +over = {'acute': u'\u00B4', # u'\u0301', + 'bar': u'\u00AF', # u'\u0304', + 'breve': u'\u02D8', # u'\u0306', + 'check': u'\u02C7', # u'\u030C', + 'dot': u'\u02D9', # u'\u0307', + 'ddot': u'\u00A8', # u'\u0308', + 'dddot': u'\u20DB', + 'grave': u'`', # u'\u0300', + 'hat': u'^', # u'\u0302', + 'mathring': u'\u02DA', # u'\u030A', + 'overleftrightarrow': u'\u20e1', + # 'overline': # u'\u0305', + 'tilde': u'\u02DC', # u'\u0303', + 'vec': u'\u20D7'} + +Greek = { # Capital Greek letters: (upright in TeX style) + 'Phi':u'\u03a6', 'Xi':u'\u039e', 'Sigma':u'\u03a3', + 'Psi':u'\u03a8', 'Delta':u'\u0394', 'Theta':u'\u0398', + 'Upsilon':u'\u03d2', 'Pi':u'\u03a0', 'Omega':u'\u03a9', + 'Gamma':u'\u0393', 'Lambda':u'\u039b'} + +letters = tex2unichar.mathalpha + +special = tex2unichar.mathbin # Binary symbols +special.update(tex2unichar.mathrel) # Relation symbols, arrow symbols +special.update(tex2unichar.mathord) # Miscellaneous symbols +special.update(tex2unichar.mathop) # Variable-sized symbols +special.update(tex2unichar.mathopen) # Braces +special.update(tex2unichar.mathclose) # Braces +special.update(tex2unichar.mathfence) + +sumintprod = ''.join([special[symbol] for symbol in + ['sum', 'int', 'oint', 'prod']]) + +functions = ['arccos', 'arcsin', 'arctan', 'arg', 'cos', 'cosh', + 'cot', 'coth', 'csc', 'deg', 'det', 'dim', + 'exp', 'gcd', 'hom', 'inf', 'ker', 'lg', + 'lim', 'liminf', 'limsup', 'ln', 'log', 'max', + 'min', 'Pr', 'sec', 'sin', 'sinh', 'sup', + 'tan', 'tanh', + 'injlim', 'varinjlim', 'varlimsup', + 'projlim', 'varliminf', 'varprojlim'] + + +mathbb = { + 'A': u'\U0001D538', + 'B': u'\U0001D539', + 'C': u'\u2102', + 'D': u'\U0001D53B', + 'E': u'\U0001D53C', + 'F': u'\U0001D53D', + 'G': u'\U0001D53E', + 'H': u'\u210D', + 'I': u'\U0001D540', + 'J': u'\U0001D541', + 'K': u'\U0001D542', + 'L': u'\U0001D543', + 'M': u'\U0001D544', + 'N': u'\u2115', + 'O': u'\U0001D546', + 'P': u'\u2119', + 'Q': u'\u211A', + 'R': u'\u211D', + 'S': u'\U0001D54A', + 'T': u'\U0001D54B', + 'U': u'\U0001D54C', + 'V': u'\U0001D54D', + 'W': u'\U0001D54E', + 'X': u'\U0001D54F', + 'Y': u'\U0001D550', + 'Z': u'\u2124', + } + +mathscr = { + 'A': u'\U0001D49C', + 'B': u'\u212C', # bernoulli function + 'C': u'\U0001D49E', + 'D': u'\U0001D49F', + 'E': u'\u2130', + 'F': u'\u2131', + 'G': u'\U0001D4A2', + 'H': u'\u210B', # hamiltonian + 'I': u'\u2110', + 'J': u'\U0001D4A5', + 'K': u'\U0001D4A6', + 'L': u'\u2112', # lagrangian + 'M': u'\u2133', # physics m-matrix + 'N': u'\U0001D4A9', + 'O': u'\U0001D4AA', + 'P': u'\U0001D4AB', + 'Q': u'\U0001D4AC', + 'R': u'\u211B', + 'S': u'\U0001D4AE', + 'T': u'\U0001D4AF', + 'U': u'\U0001D4B0', + 'V': u'\U0001D4B1', + 'W': u'\U0001D4B2', + 'X': u'\U0001D4B3', + 'Y': u'\U0001D4B4', + 'Z': u'\U0001D4B5', + 'a': u'\U0001D4B6', + 'b': u'\U0001D4B7', + 'c': u'\U0001D4B8', + 'd': u'\U0001D4B9', + 'e': u'\u212F', + 'f': u'\U0001D4BB', + 'g': u'\u210A', + 'h': u'\U0001D4BD', + 'i': u'\U0001D4BE', + 'j': u'\U0001D4BF', + 'k': u'\U0001D4C0', + 'l': u'\U0001D4C1', + 'm': u'\U0001D4C2', + 'n': u'\U0001D4C3', + 'o': u'\u2134', # order of + 'p': u'\U0001D4C5', + 'q': u'\U0001D4C6', + 'r': u'\U0001D4C7', + 's': u'\U0001D4C8', + 't': u'\U0001D4C9', + 'u': u'\U0001D4CA', + 'v': u'\U0001D4CB', + 'w': u'\U0001D4CC', + 'x': u'\U0001D4CD', + 'y': u'\U0001D4CE', + 'z': u'\U0001D4CF', + } + +negatables = {'=': u'\u2260', + r'\in': u'\u2209', + r'\equiv': u'\u2262'} + +# LaTeX to MathML translation stuff: +class math(object): + """Base class for MathML elements.""" + + nchildren = 1000000 + """Required number of children""" + + def __init__(self, children=None, inline=None): + """math([children]) -> MathML element + + children can be one child or a list of children.""" + + self.children = [] + if children is not None: + if isinstance(children, list): + for child in children: + self.append(child) + else: + # Only one child: + self.append(children) + + if inline is not None: + self.inline = inline + + def __repr__(self): + if hasattr(self, 'children'): + return self.__class__.__name__ + '(%s)' % \ + ','.join([repr(child) for child in self.children]) + else: + return self.__class__.__name__ + + def full(self): + """Room for more children?""" + + return len(self.children) >= self.nchildren + + def append(self, child): + """append(child) -> element + + Appends child and returns self if self is not full or first + non-full parent.""" + + assert not self.full() + self.children.append(child) + child.parent = self + node = self + while node.full(): + node = node.parent + return node + + def delete_child(self): + """delete_child() -> child + + Delete last child and return it.""" + + child = self.children[-1] + del self.children[-1] + return child + + def close(self): + """close() -> parent + + Close element and return first non-full element.""" + + parent = self.parent + while parent.full(): + parent = parent.parent + return parent + + def xml(self): + """xml() -> xml-string""" + + return self.xml_start() + self.xml_body() + self.xml_end() + + def xml_start(self): + if not hasattr(self, 'inline'): + return ['<%s>' % self.__class__.__name__] + xmlns = 'http://www.w3.org/1998/Math/MathML' + if self.inline: + return ['<math xmlns="%s">' % xmlns] + else: + return ['<math xmlns="%s" mode="display">' % xmlns] + + def xml_end(self): + return ['</%s>' % self.__class__.__name__] + + def xml_body(self): + xml = [] + for child in self.children: + xml.extend(child.xml()) + return xml + +class mrow(math): + def xml_start(self): + return ['\n<%s>' % self.__class__.__name__] + +class mtable(math): + def xml_start(self): + return ['\n<%s>' % self.__class__.__name__] + +class mtr(mrow): pass +class mtd(mrow): pass + +class mx(math): + """Base class for mo, mi, and mn""" + + nchildren = 0 + def __init__(self, data): + self.data = data + + def xml_body(self): + return [self.data] + +class mo(mx): + translation = {'<': '<', '>': '>'} + def xml_body(self): + return [self.translation.get(self.data, self.data)] + +class mi(mx): pass +class mn(mx): pass + +class msub(math): + nchildren = 2 + +class msup(math): + nchildren = 2 + +class msqrt(math): + nchildren = 1 + +class mroot(math): + nchildren = 2 + +class mfrac(math): + nchildren = 2 + +class msubsup(math): + nchildren = 3 + def __init__(self, children=None, reversed=False): + self.reversed = reversed + math.__init__(self, children) + + def xml(self): + if self.reversed: +## self.children[1:3] = self.children[2:0:-1] + self.children[1:3] = [self.children[2], self.children[1]] + self.reversed = False + return math.xml(self) + +class mfenced(math): + translation = {'\\{': '{', '\\langle': u'\u2329', + '\\}': '}', '\\rangle': u'\u232A', + '.': ''} + def __init__(self, par): + self.openpar = par + math.__init__(self) + + def xml_start(self): + open = self.translation.get(self.openpar, self.openpar) + close = self.translation.get(self.closepar, self.closepar) + return ['<mfenced open="%s" close="%s">' % (open, close)] + +class mspace(math): + nchildren = 0 + +class mstyle(math): + def __init__(self, children=None, nchildren=None, **kwargs): + if nchildren is not None: + self.nchildren = nchildren + math.__init__(self, children) + self.attrs = kwargs + + def xml_start(self): + return ['<mstyle '] + ['%s="%s"' % item + for item in self.attrs.items()] + ['>'] + +class mover(math): + nchildren = 2 + def __init__(self, children=None, reversed=False): + self.reversed = reversed + math.__init__(self, children) + + def xml(self): + if self.reversed: + self.children.reverse() + self.reversed = False + return math.xml(self) + +class munder(math): + nchildren = 2 + +class munderover(math): + nchildren = 3 + def __init__(self, children=None): + math.__init__(self, children) + +class mtext(math): + nchildren = 0 + def __init__(self, text): + self.text = text + + def xml_body(self): + return [self.text] + +def parse_latex_math(string, inline=True): + """parse_latex_math(string [,inline]) -> MathML-tree + + Returns a MathML-tree parsed from string. inline=True is for + inline math and inline=False is for displayed math. + + tree is the whole tree and node is the current element.""" + + # Normalize white-space: + string = ' '.join(string.split()) + + if inline: + node = mrow() + tree = math(node, inline=True) + else: + node = mtd() + tree = math(mtable(mtr(node)), inline=False) + + while len(string) > 0: + n = len(string) + c = string[0] + skip = 1 # number of characters consumed + if n > 1: + c2 = string[1] + else: + c2 = '' + if c == ' ': + pass + elif c == '\\': + if c2 in '{}': + node = node.append(mo(c2)) + skip = 2 + elif c2 == ' ': + node = node.append(mspace()) + skip = 2 + elif c2 == ',': # TODO: small space + node = node.append(mspace()) + skip = 2 + elif c2.isalpha(): + # We have a LaTeX-name: + i = 2 + while i < n and string[i].isalpha(): + i += 1 + name = string[1:i] + node, skip = handle_keyword(name, node, string[i:]) + skip += i + elif c2 == '\\': + # End of a row: + entry = mtd() + row = mtr(entry) + node.close().close().append(row) + node = entry + skip = 2 + else: + raise SyntaxError(u'Syntax error: "%s%s"' % (c, c2)) + elif c.isalpha(): + node = node.append(mi(c)) + elif c.isdigit(): + node = node.append(mn(c)) + elif c in "+-*/=()[]|<>,.!?':;@": + node = node.append(mo(c)) + elif c == '_': + child = node.delete_child() + if isinstance(child, msup): + sub = msubsup(child.children, reversed=True) + elif isinstance(child, mo) and child.data in sumintprod: + sub = munder(child) + else: + sub = msub(child) + node.append(sub) + node = sub + elif c == '^': + child = node.delete_child() + if isinstance(child, msub): + sup = msubsup(child.children) + elif isinstance(child, mo) and child.data in sumintprod: + sup = mover(child) + elif (isinstance(child, munder) and + child.children[0].data in sumintprod): + sup = munderover(child.children) + else: + sup = msup(child) + node.append(sup) + node = sup + elif c == '{': + row = mrow() + node.append(row) + node = row + elif c == '}': + node = node.close() + elif c == '&': + entry = mtd() + node.close().append(entry) + node = entry + else: + raise SyntaxError(u'Illegal character: "%s"' % c) + string = string[skip:] + return tree + + +def handle_keyword(name, node, string): + skip = 0 + if len(string) > 0 and string[0] == ' ': + string = string[1:] + skip = 1 + if name == 'begin': + if not string.startswith('{matrix}'): + raise SyntaxError(u'Environment not supported! ' + u'Supported environment: "matrix".') + skip += 8 + entry = mtd() + table = mtable(mtr(entry)) + node.append(table) + node = entry + elif name == 'end': + if not string.startswith('{matrix}'): + raise SyntaxError(u'Expected "\\end{matrix}"!') + skip += 8 + node = node.close().close().close() + elif name in ('text', 'mathrm'): + if string[0] != '{': + raise SyntaxError(u'Expected "\\text{...}"!') + i = string.find('}') + if i == -1: + raise SyntaxError(u'Expected "\\text{...}"!') + node = node.append(mtext(string[1:i])) + skip += i + 1 + elif name == 'sqrt': + sqrt = msqrt() + node.append(sqrt) + node = sqrt + elif name == 'frac': + frac = mfrac() + node.append(frac) + node = frac + elif name == 'left': + for par in ['(', '[', '|', '\\{', '\\langle', '.']: + if string.startswith(par): + break + else: + raise SyntaxError(u'Missing left-brace!') + fenced = mfenced(par) + node.append(fenced) + row = mrow() + fenced.append(row) + node = row + skip += len(par) + elif name == 'right': + for par in [')', ']', '|', '\\}', '\\rangle', '.']: + if string.startswith(par): + break + else: + raise SyntaxError(u'Missing right-brace!') + node = node.close() + node.closepar = par + node = node.close() + skip += len(par) + elif name == 'not': + for operator in negatables: + if string.startswith(operator): + break + else: + raise SyntaxError(u'Expected something to negate: "\\not ..."!') + node = node.append(mo(negatables[operator])) + skip += len(operator) + elif name == 'mathbf': + style = mstyle(nchildren=1, fontweight='bold') + node.append(style) + node = style + elif name == 'mathbb': + if string[0] != '{' or not string[1].isupper() or string[2] != '}': + raise SyntaxError(u'Expected something like "\\mathbb{A}"!') + node = node.append(mi(mathbb[string[1]])) + skip += 3 + elif name in ('mathscr', 'mathcal'): + if string[0] != '{' or string[2] != '}': + raise SyntaxError(u'Expected something like "\\mathscr{A}"!') + node = node.append(mi(mathscr[string[1]])) + skip += 3 + elif name == 'colon': # "normal" colon, not binary operator + node = node.append(mo(':')) # TODO: add ``lspace="0pt"`` + elif name in Greek: # Greek capitals (upright in "TeX style") + node = node.append(mo(Greek[name])) + # TODO: "ISO style" sets them italic. Could we use a class argument + # to enable styling via CSS? + elif name in letters: + node = node.append(mi(letters[name])) + elif name in special: + node = node.append(mo(special[name])) + elif name in functions: + node = node.append(mo(name)) + elif name in over: + ovr = mover(mo(over[name]), reversed=True) + node.append(ovr) + node = ovr + else: + raise SyntaxError(u'Unknown LaTeX command: ' + name) + + return node, skip + +def tex2mathml(tex_math, inline=True): + """Return string with MathML code corresponding to `tex_math`. + + `inline`=True is for inline math and `inline`=False for displayed math. + """ + + mathml_tree = parse_latex_math(tex_math, inline=inline) + return ''.join(mathml_tree.xml()) diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/math2html.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/math2html.py new file mode 100644 index 0000000..ca7092c --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/math2html.py @@ -0,0 +1,5383 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# math2html: convert LaTeX equations to HTML output. +# +# Copyright (C) 2009-2011 Alex Fernández +# +# 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 + +# Based on eLyXer: convert LyX source files to HTML output. +# http://alexfernandez.github.io/elyxer/ + +# --end-- +# Alex 20101110 +# eLyXer standalone formula conversion to HTML. + +import codecs +import datetime +import gettext +import io +import os.path +import sys +import unicodedata + +if sys.version_info >= (3, 0): + from urllib.parse import quote_plus +else: + from urllib import quote_plus + + +if sys.version_info >= (3, 0): + unicode = str #noqa + basestring = str # noqa + file = io.IOBase # noqa + + +class Trace(object): + "A tracing class" + + debugmode = False + quietmode = False + showlinesmode = False + + prefix = None + + def debug(cls, message): + "Show a debug message" + if not Trace.debugmode or Trace.quietmode: + return + Trace.show(message, sys.stdout) + + def message(cls, message): + "Show a trace message" + if Trace.quietmode: + return + if Trace.prefix and Trace.showlinesmode: + message = Trace.prefix + message + Trace.show(message, sys.stdout) + + def error(cls, message): + "Show an error message" + message = '* ' + message + if Trace.prefix and Trace.showlinesmode: + message = Trace.prefix + message + Trace.show(message, sys.stderr) + + def fatal(cls, message): + "Show an error message and terminate" + Trace.error('FATAL: ' + message) + exit(-1) + + def show(cls, message, channel): + "Show a message out of a channel" + if sys.version_info < (3, 0): + message = message.encode('utf-8') + channel.write(message + '\n') + + debug = classmethod(debug) + message = classmethod(message) + error = classmethod(error) + fatal = classmethod(fatal) + show = classmethod(show) + + +class BibStylesConfig(object): + "Configuration class from elyxer.config file" + + abbrvnat = { + u'@article': u'$authors. $title. <i>$journal</i>,{ {$volume:}$pages,} $month $year.{ doi: $doi.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'cite': u'$surname($year)', + u'default': u'$authors. <i>$title</i>. $publisher, $year.{ URL <a href="$url">$url</a>.}{ $note.}', + } + + alpha = { + u'@article': u'$authors. $title.{ <i>$journal</i>{, {$volume}{($number)}}{: $pages}{, $year}.}{ <a href="$url">$url</a>.}{ <a href="$filename">$filename</a>.}{ $note.}', + u'cite': u'$Sur$YY', + u'default': u'$authors. $title.{ <i>$journal</i>,} $year.{ <a href="$url">$url</a>.}{ <a href="$filename">$filename</a>.}{ $note.}', + } + + authordate2 = { + u'@article': u'$authors. $year. $title. <i>$journal</i>, <b>$volume</b>($number), $pages.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@book': u'$authors. $year. <i>$title</i>. $publisher.{ URL <a href="$url">$url</a>.}{ $note.}', + u'cite': u'$surname, $year', + u'default': u'$authors. $year. <i>$title</i>. $publisher.{ URL <a href="$url">$url</a>.}{ $note.}', + } + + default = { + u'@article': u'$authors: “$title”, <i>$journal</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@book': u'{$authors: }<i>$title</i>{ ($editor, ed.)}.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@booklet': u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@conference': u'$authors: “$title”, <i>$journal</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@inbook': u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@incollection': u'$authors: <i>$title</i>{ in <i>$booktitle</i>{ ($editor, ed.)}}.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@inproceedings': u'$authors: “$title”, <i>$booktitle</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@manual': u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@mastersthesis': u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@misc': u'$authors: <i>$title</i>.{{ $publisher,}{ $howpublished,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@phdthesis': u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@proceedings': u'$authors: “$title”, <i>$journal</i>,{ pp. $pages,} $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@techreport': u'$authors: <i>$title</i>, $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@unpublished': u'$authors: “$title”, <i>$journal</i>, $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'cite': u'$index', + u'default': u'$authors: <i>$title</i>.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + } + + defaulttags = { + u'YY': u'??', u'authors': u'', u'surname': u'', + } + + ieeetr = { + u'@article': u'$authors, “$title”, <i>$journal</i>, vol. $volume, no. $number, pp. $pages, $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@book': u'$authors, <i>$title</i>. $publisher, $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'cite': u'$index', + u'default': u'$authors, “$title”. $year.{ URL <a href="$url">$url</a>.}{ $note.}', + } + + plain = { + u'@article': u'$authors. $title.{ <i>$journal</i>{, {$volume}{($number)}}{:$pages}{, $year}.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'@book': u'$authors. <i>$title</i>. $publisher,{ $month} $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@incollection': u'$authors. $title.{ In <i>$booktitle</i> {($editor, ed.)}.} $publisher,{ $month} $year.{ URL <a href="$url">$url</a>.}{ $note.}', + u'@inproceedings': u'$authors. $title. { <i>$booktitle</i>{, {$volume}{($number)}}{:$pages}{, $year}.}{ URL <a href="$url">$url</a>.}{ $note.}', + u'cite': u'$index', + u'default': u'{$authors. }$title.{{ $publisher,} $year.}{ URL <a href="$url">$url</a>.}{ $note.}', + } + + vancouver = { + u'@article': u'$authors. $title. <i>$journal</i>, $year{;{<b>$volume</b>}{($number)}{:$pages}}.{ URL: <a href="$url">$url</a>.}{ $note.}', + u'@book': u'$authors. $title. {$publisher, }$year.{ URL: <a href="$url">$url</a>.}{ $note.}', + u'cite': u'$index', + u'default': u'$authors. $title; {$publisher, }$year.{ $howpublished.}{ URL: <a href="$url">$url</a>.}{ $note.}', + } + +class BibTeXConfig(object): + "Configuration class from elyxer.config file" + + replaced = { + u'--': u'—', u'..': u'.', + } + +class ContainerConfig(object): + "Configuration class from elyxer.config file" + + endings = { + u'Align': u'\\end_layout', u'BarredText': u'\\bar', + u'BoldText': u'\\series', u'Cell': u'</cell', + u'ChangeDeleted': u'\\change_unchanged', + u'ChangeInserted': u'\\change_unchanged', u'ColorText': u'\\color', + u'EmphaticText': u'\\emph', u'Hfill': u'\\hfill', u'Inset': u'\\end_inset', + u'Layout': u'\\end_layout', u'LyXFooter': u'\\end_document', + u'LyXHeader': u'\\end_header', u'Row': u'</row', u'ShapedText': u'\\shape', + u'SizeText': u'\\size', u'StrikeOut': u'\\strikeout', + u'TextFamily': u'\\family', u'VersalitasText': u'\\noun', + } + + extracttext = { + u'allowed': [u'StringContainer', u'Constant', u'FormulaConstant',], + u'cloned': [u'',], + u'extracted': [u'PlainLayout', u'TaggedText', u'Align', u'Caption', u'TextFamily', u'EmphaticText', u'VersalitasText', u'BarredText', u'SizeText', u'ColorText', u'LangLine', u'Formula', u'Bracket', u'RawText', u'BibTag', u'FormulaNumber', u'AlphaCommand', u'EmptyCommand', u'OneParamFunction', u'SymbolFunction', u'TextFunction', u'FontFunction', u'CombiningFunction', u'DecoratingFunction', u'FormulaSymbol', u'BracketCommand', u'TeXCode',], + } + + startendings = { + u'\\begin_deeper': u'\\end_deeper', u'\\begin_inset': u'\\end_inset', + u'\\begin_layout': u'\\end_layout', + } + + starts = { + u'': u'StringContainer', u'#LyX': u'BlackBox', u'</lyxtabular': u'BlackBox', + u'<cell': u'Cell', u'<column': u'Column', u'<row': u'Row', + u'\\align': u'Align', u'\\bar': u'BarredText', + u'\\bar default': u'BlackBox', u'\\bar no': u'BlackBox', + u'\\begin_body': u'BlackBox', u'\\begin_deeper': u'DeeperList', + u'\\begin_document': u'BlackBox', u'\\begin_header': u'LyXHeader', + u'\\begin_inset Argument': u'ShortTitle', + u'\\begin_inset Box': u'BoxInset', u'\\begin_inset Branch': u'Branch', + u'\\begin_inset Caption': u'Caption', + u'\\begin_inset CommandInset bibitem': u'BiblioEntry', + u'\\begin_inset CommandInset bibtex': u'BibTeX', + u'\\begin_inset CommandInset citation': u'BiblioCitation', + u'\\begin_inset CommandInset href': u'URL', + u'\\begin_inset CommandInset include': u'IncludeInset', + u'\\begin_inset CommandInset index_print': u'PrintIndex', + u'\\begin_inset CommandInset label': u'Label', + u'\\begin_inset CommandInset line': u'LineInset', + u'\\begin_inset CommandInset nomencl_print': u'PrintNomenclature', + u'\\begin_inset CommandInset nomenclature': u'NomenclatureEntry', + u'\\begin_inset CommandInset ref': u'Reference', + u'\\begin_inset CommandInset toc': u'TableOfContents', + u'\\begin_inset ERT': u'ERT', u'\\begin_inset Flex': u'FlexInset', + u'\\begin_inset Flex Chunkref': u'NewfangledChunkRef', + u'\\begin_inset Flex Marginnote': u'SideNote', + u'\\begin_inset Flex Sidenote': u'SideNote', + u'\\begin_inset Flex URL': u'FlexURL', u'\\begin_inset Float': u'Float', + u'\\begin_inset FloatList': u'ListOf', u'\\begin_inset Foot': u'Footnote', + u'\\begin_inset Formula': u'Formula', + u'\\begin_inset FormulaMacro': u'FormulaMacro', + u'\\begin_inset Graphics': u'Image', + u'\\begin_inset Index': u'IndexReference', + u'\\begin_inset Info': u'InfoInset', + u'\\begin_inset LatexCommand bibitem': u'BiblioEntry', + u'\\begin_inset LatexCommand bibtex': u'BibTeX', + u'\\begin_inset LatexCommand cite': u'BiblioCitation', + u'\\begin_inset LatexCommand citealt': u'BiblioCitation', + u'\\begin_inset LatexCommand citep': u'BiblioCitation', + u'\\begin_inset LatexCommand citet': u'BiblioCitation', + u'\\begin_inset LatexCommand htmlurl': u'URL', + u'\\begin_inset LatexCommand index': u'IndexReference', + u'\\begin_inset LatexCommand label': u'Label', + u'\\begin_inset LatexCommand nomenclature': u'NomenclatureEntry', + u'\\begin_inset LatexCommand prettyref': u'Reference', + u'\\begin_inset LatexCommand printindex': u'PrintIndex', + u'\\begin_inset LatexCommand printnomenclature': u'PrintNomenclature', + u'\\begin_inset LatexCommand ref': u'Reference', + u'\\begin_inset LatexCommand tableofcontents': u'TableOfContents', + u'\\begin_inset LatexCommand url': u'URL', + u'\\begin_inset LatexCommand vref': u'Reference', + u'\\begin_inset Marginal': u'SideNote', + u'\\begin_inset Newline': u'NewlineInset', + u'\\begin_inset Newpage': u'NewPageInset', u'\\begin_inset Note': u'Note', + u'\\begin_inset OptArg': u'ShortTitle', + u'\\begin_inset Phantom': u'PhantomText', + u'\\begin_inset Quotes': u'QuoteContainer', + u'\\begin_inset Tabular': u'Table', u'\\begin_inset Text': u'InsetText', + u'\\begin_inset VSpace': u'VerticalSpace', u'\\begin_inset Wrap': u'Wrap', + u'\\begin_inset listings': u'Listing', + u'\\begin_inset script': u'ScriptInset', u'\\begin_inset space': u'Space', + u'\\begin_layout': u'Layout', u'\\begin_layout Abstract': u'Abstract', + u'\\begin_layout Author': u'Author', + u'\\begin_layout Bibliography': u'Bibliography', + u'\\begin_layout Chunk': u'NewfangledChunk', + u'\\begin_layout Description': u'Description', + u'\\begin_layout Enumerate': u'ListItem', + u'\\begin_layout Itemize': u'ListItem', u'\\begin_layout List': u'List', + u'\\begin_layout LyX-Code': u'LyXCode', + u'\\begin_layout Plain': u'PlainLayout', + u'\\begin_layout Standard': u'StandardLayout', + u'\\begin_layout Title': u'Title', u'\\begin_preamble': u'LyXPreamble', + u'\\change_deleted': u'ChangeDeleted', + u'\\change_inserted': u'ChangeInserted', + u'\\change_unchanged': u'BlackBox', u'\\color': u'ColorText', + u'\\color inherit': u'BlackBox', u'\\color none': u'BlackBox', + u'\\emph default': u'BlackBox', u'\\emph off': u'BlackBox', + u'\\emph on': u'EmphaticText', u'\\emph toggle': u'EmphaticText', + u'\\end_body': u'LyXFooter', u'\\family': u'TextFamily', + u'\\family default': u'BlackBox', u'\\family roman': u'BlackBox', + u'\\hfill': u'Hfill', u'\\labelwidthstring': u'BlackBox', + u'\\lang': u'LangLine', u'\\length': u'InsetLength', + u'\\lyxformat': u'LyXFormat', u'\\lyxline': u'LyXLine', + u'\\newline': u'Newline', u'\\newpage': u'NewPage', + u'\\noindent': u'BlackBox', u'\\noun default': u'BlackBox', + u'\\noun off': u'BlackBox', u'\\noun on': u'VersalitasText', + u'\\paragraph_spacing': u'BlackBox', u'\\series bold': u'BoldText', + u'\\series default': u'BlackBox', u'\\series medium': u'BlackBox', + u'\\shape': u'ShapedText', u'\\shape default': u'BlackBox', + u'\\shape up': u'BlackBox', u'\\size': u'SizeText', + u'\\size normal': u'BlackBox', u'\\start_of_appendix': u'StartAppendix', + u'\\strikeout default': u'BlackBox', u'\\strikeout on': u'StrikeOut', + } + + string = { + u'startcommand': u'\\', + } + + table = { + u'headers': [u'<lyxtabular', u'<features',], + } + +class EscapeConfig(object): + "Configuration class from elyxer.config file" + + chars = { + u'\n': u'', u' -- ': u' — ', u' --- ': u' — ', u'\'': u'’', u'`': u'‘', + } + + commands = { + u'\\InsetSpace \\space{}': u' ', u'\\InsetSpace \\thinspace{}': u' ', + u'\\InsetSpace ~': u' ', u'\\SpecialChar \\-': u'', + u'\\SpecialChar \\@.': u'.', u'\\SpecialChar \\ldots{}': u'…', + u'\\SpecialChar \\menuseparator': u' ▷ ', + u'\\SpecialChar \\nobreakdash-': u'-', u'\\SpecialChar \\slash{}': u'/', + u'\\SpecialChar \\textcompwordmark{}': u'', u'\\backslash': u'\\', + } + + entities = { + u'&': u'&', u'<': u'<', u'>': u'>', + } + + html = { + u'/>': u'>', + } + + iso885915 = { + u' ': u' ', u' ': u' ', u' ': u' ', + } + + nonunicode = { + u' ': u' ', + } + +class FormulaConfig(object): + "Configuration class from elyxer.config file" + + alphacommands = { + u'\\AA': u'Å', u'\\AE': u'Æ', + u'\\AmS': u'<span class="versalitas">AmS</span>', u'\\Angstroem': u'Å', + u'\\DH': u'Ð', u'\\Koppa': u'Ϟ', u'\\L': u'Ł', u'\\Micro': u'µ', u'\\O': u'Ø', + u'\\OE': u'Œ', u'\\Sampi': u'Ϡ', u'\\Stigma': u'Ϛ', u'\\TH': u'Þ', + u'\\aa': u'å', u'\\ae': u'æ', u'\\alpha': u'α', u'\\beta': u'β', + u'\\delta': u'δ', u'\\dh': u'ð', u'\\digamma': u'ϝ', u'\\epsilon': u'ϵ', + u'\\eta': u'η', u'\\eth': u'ð', u'\\gamma': u'γ', u'\\i': u'ı', + u'\\imath': u'ı', u'\\iota': u'ι', u'\\j': u'ȷ', u'\\jmath': u'ȷ', + u'\\kappa': u'κ', u'\\koppa': u'ϟ', u'\\l': u'ł', u'\\lambda': u'λ', + u'\\mu': u'μ', u'\\nu': u'ν', u'\\o': u'ø', u'\\oe': u'œ', u'\\omega': u'ω', + u'\\phi': u'φ', u'\\pi': u'π', u'\\psi': u'ψ', u'\\rho': u'ρ', + u'\\sampi': u'ϡ', u'\\sigma': u'σ', u'\\ss': u'ß', u'\\stigma': u'ϛ', + u'\\tau': u'τ', u'\\tcohm': u'Ω', u'\\textcrh': u'ħ', u'\\th': u'þ', + u'\\theta': u'θ', u'\\upsilon': u'υ', u'\\varDelta': u'∆', + u'\\varGamma': u'Γ', u'\\varLambda': u'Λ', u'\\varOmega': u'Ω', + u'\\varPhi': u'Φ', u'\\varPi': u'Π', u'\\varPsi': u'Ψ', u'\\varSigma': u'Σ', + u'\\varTheta': u'Θ', u'\\varUpsilon': u'Υ', u'\\varXi': u'Ξ', + u'\\varbeta': u'ϐ', u'\\varepsilon': u'ε', u'\\varkappa': u'ϰ', + u'\\varphi': u'φ', u'\\varpi': u'ϖ', u'\\varrho': u'ϱ', u'\\varsigma': u'ς', + u'\\vartheta': u'ϑ', u'\\xi': u'ξ', u'\\zeta': u'ζ', + } + + array = { + u'begin': u'\\begin', u'cellseparator': u'&', u'end': u'\\end', + u'rowseparator': u'\\\\', + } + + bigbrackets = { + u'(': [u'⎛', u'⎜', u'⎝',], u')': [u'⎞', u'⎟', u'⎠',], u'[': [u'⎡', u'⎢', u'⎣',], + u']': [u'⎤', u'⎥', u'⎦',], u'{': [u'⎧', u'⎪', u'⎨', u'⎩',], u'|': [u'|',], + u'}': [u'⎫', u'⎪', u'⎬', u'⎭',], u'∥': [u'∥',], + } + + bigsymbols = { + u'∑': [u'⎲', u'⎳',], u'∫': [u'⌠', u'⌡',], + } + + bracketcommands = { + u'\\left': u'span class="symbol"', + u'\\left.': u'<span class="leftdot"></span>', + u'\\middle': u'span class="symbol"', u'\\right': u'span class="symbol"', + u'\\right.': u'<span class="rightdot"></span>', + } + + combiningfunctions = { + u'\\"': u'̈', u'\\\'': u'́', u'\\^': u'̂', u'\\`': u'̀', u'\\acute': u'́', + u'\\bar': u'̄', u'\\breve': u'̆', u'\\c': u'̧', u'\\check': u'̌', + u'\\dddot': u'⃛', u'\\ddot': u'̈', u'\\dot': u'̇', u'\\grave': u'̀', + u'\\hat': u'̂', u'\\mathring': u'̊', u'\\overleftarrow': u'⃖', + u'\\overrightarrow': u'⃗', u'\\r': u'̊', u'\\s': u'̩', + u'\\textcircled': u'⃝', u'\\textsubring': u'̥', u'\\tilde': u'̃', + u'\\v': u'̌', u'\\vec': u'⃗', u'\\~': u'̃', + } + + commands = { + u'\\ ': u' ', u'\\!': u'', u'\\#': u'#', u'\\$': u'$', u'\\%': u'%', + u'\\&': u'&', u'\\,': u' ', u'\\:': u' ', u'\\;': u' ', u'\\AC': u'∿', + u'\\APLcomment': u'⍝', u'\\APLdownarrowbox': u'⍗', u'\\APLinput': u'⍞', + u'\\APLinv': u'⌹', u'\\APLleftarrowbox': u'⍇', u'\\APLlog': u'⍟', + u'\\APLrightarrowbox': u'⍈', u'\\APLuparrowbox': u'⍐', u'\\Box': u'□', + u'\\Bumpeq': u'≎', u'\\CIRCLE': u'●', u'\\Cap': u'⋒', + u'\\CapitalDifferentialD': u'ⅅ', u'\\CheckedBox': u'☑', u'\\Circle': u'○', + u'\\Coloneqq': u'⩴', u'\\ComplexI': u'ⅈ', u'\\ComplexJ': u'ⅉ', + u'\\Corresponds': u'≙', u'\\Cup': u'⋓', u'\\Delta': u'Δ', u'\\Diamond': u'◇', + u'\\Diamondblack': u'◆', u'\\Diamonddot': u'⟐', u'\\DifferentialD': u'ⅆ', + u'\\Downarrow': u'⇓', u'\\EUR': u'€', u'\\Euler': u'ℇ', + u'\\ExponetialE': u'ⅇ', u'\\Finv': u'Ⅎ', u'\\Game': u'⅁', u'\\Gamma': u'Γ', + u'\\Im': u'ℑ', u'\\Join': u'⨝', u'\\LEFTCIRCLE': u'◖', u'\\LEFTcircle': u'◐', + u'\\LHD': u'◀', u'\\Lambda': u'Λ', u'\\Lbag': u'⟅', u'\\Leftarrow': u'⇐', + u'\\Lleftarrow': u'⇚', u'\\Longleftarrow': u'⟸', + u'\\Longleftrightarrow': u'⟺', u'\\Longrightarrow': u'⟹', u'\\Lparen': u'⦅', + u'\\Lsh': u'↰', u'\\Mapsfrom': u'⇐|', u'\\Mapsto': u'|⇒', u'\\Omega': u'Ω', + u'\\P': u'¶', u'\\Phi': u'Φ', u'\\Pi': u'Π', u'\\Pr': u'Pr', u'\\Psi': u'Ψ', + u'\\Qoppa': u'Ϙ', u'\\RHD': u'▶', u'\\RIGHTCIRCLE': u'◗', + u'\\RIGHTcircle': u'◑', u'\\Rbag': u'⟆', u'\\Re': u'ℜ', u'\\Rparen': u'⦆', + u'\\Rrightarrow': u'⇛', u'\\Rsh': u'↱', u'\\S': u'§', u'\\Sigma': u'Σ', + u'\\Square': u'☐', u'\\Subset': u'⋐', u'\\Sun': u'☉', u'\\Supset': u'⋑', + u'\\Theta': u'Θ', u'\\Uparrow': u'⇑', u'\\Updownarrow': u'⇕', + u'\\Upsilon': u'Υ', u'\\Vdash': u'⊩', u'\\Vert': u'∥', u'\\Vvdash': u'⊪', + u'\\XBox': u'☒', u'\\Xi': u'Ξ', u'\\Yup': u'⅄', u'\\\\': u'<br/>', + u'\\_': u'_', u'\\aleph': u'ℵ', u'\\amalg': u'∐', u'\\anchor': u'⚓', + u'\\angle': u'∠', u'\\aquarius': u'♒', u'\\arccos': u'arccos', + u'\\arcsin': u'arcsin', u'\\arctan': u'arctan', u'\\arg': u'arg', + u'\\aries': u'♈', u'\\arrowbullet': u'➢', u'\\ast': u'∗', u'\\asymp': u'≍', + u'\\backepsilon': u'∍', u'\\backprime': u'‵', u'\\backsimeq': u'⋍', + u'\\backslash': u'\\', u'\\ballotx': u'✗', u'\\barwedge': u'⊼', + u'\\because': u'∵', u'\\beth': u'ℶ', u'\\between': u'≬', u'\\bigcap': u'∩', + u'\\bigcirc': u'○', u'\\bigcup': u'∪', u'\\bigodot': u'⊙', + u'\\bigoplus': u'⊕', u'\\bigotimes': u'⊗', u'\\bigsqcup': u'⊔', + u'\\bigstar': u'★', u'\\bigtriangledown': u'▽', u'\\bigtriangleup': u'△', + u'\\biguplus': u'⊎', u'\\bigvee': u'∨', u'\\bigwedge': u'∧', + u'\\biohazard': u'☣', u'\\blacklozenge': u'⧫', u'\\blacksmiley': u'☻', + u'\\blacksquare': u'■', u'\\blacktriangle': u'▲', + u'\\blacktriangledown': u'▼', u'\\blacktriangleleft': u'◂', + u'\\blacktriangleright': u'▶', u'\\blacktriangleup': u'▴', u'\\bot': u'⊥', + u'\\bowtie': u'⋈', u'\\box': u'▫', u'\\boxast': u'⧆', u'\\boxbar': u'◫', + u'\\boxbox': u'⧈', u'\\boxbslash': u'⧅', u'\\boxcircle': u'⧇', + u'\\boxdot': u'⊡', u'\\boxminus': u'⊟', u'\\boxplus': u'⊞', + u'\\boxslash': u'⧄', u'\\boxtimes': u'⊠', u'\\bullet': u'•', + u'\\bumpeq': u'≏', u'\\cancer': u'♋', u'\\cap': u'∩', u'\\capricornus': u'♑', + u'\\cat': u'⁀', u'\\cdot': u'⋅', u'\\cdots': u'⋯', u'\\cent': u'¢', + u'\\centerdot': u'∙', u'\\checkmark': u'✓', u'\\chi': u'χ', u'\\circ': u'∘', + u'\\circeq': u'≗', u'\\circlearrowleft': u'↺', u'\\circlearrowright': u'↻', + u'\\circledR': u'®', u'\\circledast': u'⊛', u'\\circledbslash': u'⦸', + u'\\circledcirc': u'⊚', u'\\circleddash': u'⊝', u'\\circledgtr': u'⧁', + u'\\circledless': u'⧀', u'\\clubsuit': u'♣', u'\\colon': u': ', u'\\coloneqq': u'≔', + u'\\complement': u'∁', u'\\cong': u'≅', u'\\coprod': u'∐', + u'\\copyright': u'©', u'\\cos': u'cos', u'\\cosh': u'cosh', u'\\cot': u'cot', + u'\\coth': u'coth', u'\\csc': u'csc', u'\\cup': u'∪', u'\\curlyvee': u'⋎', + u'\\curlywedge': u'⋏', u'\\curvearrowleft': u'↶', + u'\\curvearrowright': u'↷', u'\\dag': u'†', u'\\dagger': u'†', + u'\\daleth': u'ℸ', u'\\dashleftarrow': u'⇠', u'\\dashv': u'⊣', + u'\\ddag': u'‡', u'\\ddagger': u'‡', u'\\ddots': u'⋱', u'\\deg': u'deg', + u'\\det': u'det', u'\\diagdown': u'╲', u'\\diagup': u'╱', + u'\\diameter': u'⌀', u'\\diamond': u'◇', u'\\diamondsuit': u'♦', + u'\\dim': u'dim', u'\\div': u'÷', u'\\divideontimes': u'⋇', + u'\\dotdiv': u'∸', u'\\doteq': u'≐', u'\\doteqdot': u'≑', u'\\dotplus': u'∔', + u'\\dots': u'…', u'\\doublebarwedge': u'⌆', u'\\downarrow': u'↓', + u'\\downdownarrows': u'⇊', u'\\downharpoonleft': u'⇃', + u'\\downharpoonright': u'⇂', u'\\dsub': u'⩤', u'\\earth': u'♁', + u'\\eighthnote': u'♪', u'\\ell': u'ℓ', u'\\emptyset': u'∅', + u'\\eqcirc': u'≖', u'\\eqcolon': u'≕', u'\\eqsim': u'≂', u'\\euro': u'€', + u'\\exists': u'∃', u'\\exp': u'exp', u'\\fallingdotseq': u'≒', + u'\\fcmp': u'⨾', u'\\female': u'♀', u'\\flat': u'♭', u'\\forall': u'∀', + u'\\fourth': u'⁗', u'\\frown': u'⌢', u'\\frownie': u'☹', u'\\gcd': u'gcd', + u'\\gemini': u'♊', u'\\geq)': u'≥', u'\\geqq': u'≧', u'\\geqslant': u'≥', + u'\\gets': u'←', u'\\gg': u'≫', u'\\ggg': u'⋙', u'\\gimel': u'ℷ', + u'\\gneqq': u'≩', u'\\gnsim': u'⋧', u'\\gtrdot': u'⋗', u'\\gtreqless': u'⋚', + u'\\gtreqqless': u'⪌', u'\\gtrless': u'≷', u'\\gtrsim': u'≳', + u'\\guillemotleft': u'«', u'\\guillemotright': u'»', u'\\hbar': u'ℏ', + u'\\heartsuit': u'♥', u'\\hfill': u'<span class="hfill"> </span>', + u'\\hom': u'hom', u'\\hookleftarrow': u'↩', u'\\hookrightarrow': u'↪', + u'\\hslash': u'ℏ', u'\\idotsint': u'<span class="bigsymbol">∫⋯∫</span>', + u'\\iiint': u'<span class="bigsymbol">∭</span>', + u'\\iint': u'<span class="bigsymbol">∬</span>', u'\\imath': u'ı', + u'\\inf': u'inf', u'\\infty': u'∞', u'\\intercal': u'⊺', + u'\\interleave': u'⫴', u'\\invamp': u'⅋', u'\\invneg': u'⌐', + u'\\jmath': u'ȷ', u'\\jupiter': u'♃', u'\\ker': u'ker', u'\\land': u'∧', + u'\\landupint': u'<span class="bigsymbol">∱</span>', u'\\lang': u'⟪', + u'\\langle': u'⟨', u'\\lblot': u'⦉', u'\\lbrace': u'{', u'\\lbrace)': u'{', + u'\\lbrack': u'[', u'\\lceil': u'⌈', u'\\ldots': u'…', u'\\leadsto': u'⇝', + u'\\leftarrow)': u'←', u'\\leftarrowtail': u'↢', u'\\leftarrowtobar': u'⇤', + u'\\leftharpoondown': u'↽', u'\\leftharpoonup': u'↼', + u'\\leftleftarrows': u'⇇', u'\\leftleftharpoons': u'⥢', u'\\leftmoon': u'☾', + u'\\leftrightarrow': u'↔', u'\\leftrightarrows': u'⇆', + u'\\leftrightharpoons': u'⇋', u'\\leftthreetimes': u'⋋', u'\\leo': u'♌', + u'\\leq)': u'≤', u'\\leqq': u'≦', u'\\leqslant': u'≤', u'\\lessdot': u'⋖', + u'\\lesseqgtr': u'⋛', u'\\lesseqqgtr': u'⪋', u'\\lessgtr': u'≶', + u'\\lesssim': u'≲', u'\\lfloor': u'⌊', u'\\lg': u'lg', u'\\lgroup': u'⟮', + u'\\lhd': u'⊲', u'\\libra': u'♎', u'\\lightning': u'↯', u'\\limg': u'⦇', + u'\\liminf': u'liminf', u'\\limsup': u'limsup', u'\\ll': u'≪', + u'\\llbracket': u'⟦', u'\\llcorner': u'⌞', u'\\lll': u'⋘', u'\\ln': u'ln', + u'\\lneqq': u'≨', u'\\lnot': u'¬', u'\\lnsim': u'⋦', u'\\log': u'log', + u'\\longleftarrow': u'⟵', u'\\longleftrightarrow': u'⟷', + u'\\longmapsto': u'⟼', u'\\longrightarrow': u'⟶', u'\\looparrowleft': u'↫', + u'\\looparrowright': u'↬', u'\\lor': u'∨', u'\\lozenge': u'◊', + u'\\lrcorner': u'⌟', u'\\ltimes': u'⋉', u'\\lyxlock': u'', u'\\male': u'♂', + u'\\maltese': u'✠', u'\\mapsfrom': u'↤', u'\\mapsto': u'↦', + u'\\mathcircumflex': u'^', u'\\max': u'max', u'\\measuredangle': u'∡', + u'\\medbullet': u'⚫', u'\\medcirc': u'⚪', u'\\mercury': u'☿', u'\\mho': u'℧', + u'\\mid': u'∣', u'\\min': u'min', u'\\models': u'⊨', u'\\mp': u'∓', + u'\\multimap': u'⊸', u'\\nLeftarrow': u'⇍', u'\\nLeftrightarrow': u'⇎', + u'\\nRightarrow': u'⇏', u'\\nVDash': u'⊯', u'\\nabla': u'∇', + u'\\napprox': u'≉', u'\\natural': u'♮', u'\\ncong': u'≇', u'\\nearrow': u'↗', + u'\\neg': u'¬', u'\\neg)': u'¬', u'\\neptune': u'♆', u'\\nequiv': u'≢', + u'\\newline': u'<br/>', u'\\nexists': u'∄', u'\\ngeqslant': u'≱', + u'\\ngtr': u'≯', u'\\ngtrless': u'≹', u'\\ni': u'∋', u'\\ni)': u'∋', + u'\\nleftarrow': u'↚', u'\\nleftrightarrow': u'↮', u'\\nleqslant': u'≰', + u'\\nless': u'≮', u'\\nlessgtr': u'≸', u'\\nmid': u'∤', u'\\nolimits': u'', + u'\\nonumber': u'', u'\\not': u'¬', u'\\not<': u'≮', u'\\not=': u'≠', + u'\\not>': u'≯', u'\\notbackslash': u'⍀', u'\\notin': u'∉', u'\\notni': u'∌', + u'\\notslash': u'⌿', u'\\nparallel': u'∦', u'\\nprec': u'⊀', + u'\\nrightarrow': u'↛', u'\\nsim': u'≁', u'\\nsimeq': u'≄', + u'\\nsqsubset': u'⊏̸', u'\\nsubseteq': u'⊈', u'\\nsucc': u'⊁', + u'\\nsucccurlyeq': u'⋡', u'\\nsupset': u'⊅', u'\\nsupseteq': u'⊉', + u'\\ntriangleleft': u'⋪', u'\\ntrianglelefteq': u'⋬', + u'\\ntriangleright': u'⋫', u'\\ntrianglerighteq': u'⋭', u'\\nvDash': u'⊭', + u'\\nvdash': u'⊬', u'\\nwarrow': u'↖', u'\\odot': u'⊙', + u'\\officialeuro': u'€', u'\\oiiint': u'<span class="bigsymbol">∰</span>', + u'\\oiint': u'<span class="bigsymbol">∯</span>', + u'\\oint': u'<span class="bigsymbol">∮</span>', + u'\\ointclockwise': u'<span class="bigsymbol">∲</span>', + u'\\ointctrclockwise': u'<span class="bigsymbol">∳</span>', + u'\\ominus': u'⊖', u'\\oplus': u'⊕', u'\\oslash': u'⊘', u'\\otimes': u'⊗', + u'\\owns': u'∋', u'\\parallel': u'∥', u'\\partial': u'∂', u'\\pencil': u'✎', + u'\\perp': u'⊥', u'\\pisces': u'♓', u'\\pitchfork': u'⋔', u'\\pluto': u'♇', + u'\\pm': u'±', u'\\pointer': u'➪', u'\\pointright': u'☞', u'\\pounds': u'£', + u'\\prec': u'≺', u'\\preccurlyeq': u'≼', u'\\preceq': u'≼', + u'\\precsim': u'≾', u'\\prime': u'′', u'\\prompto': u'∝', u'\\qoppa': u'ϙ', + u'\\qquad': u' ', u'\\quad': u' ', u'\\quarternote': u'♩', + u'\\radiation': u'☢', u'\\rang': u'⟫', u'\\rangle': u'⟩', u'\\rblot': u'⦊', + u'\\rbrace': u'}', u'\\rbrace)': u'}', u'\\rbrack': u']', u'\\rceil': u'⌉', + u'\\recycle': u'♻', u'\\rfloor': u'⌋', u'\\rgroup': u'⟯', u'\\rhd': u'⊳', + u'\\rightangle': u'∟', u'\\rightarrow)': u'→', u'\\rightarrowtail': u'↣', + u'\\rightarrowtobar': u'⇥', u'\\rightharpoondown': u'⇁', + u'\\rightharpoonup': u'⇀', u'\\rightharpooondown': u'⇁', + u'\\rightharpooonup': u'⇀', u'\\rightleftarrows': u'⇄', + u'\\rightleftharpoons': u'⇌', u'\\rightmoon': u'☽', + u'\\rightrightarrows': u'⇉', u'\\rightrightharpoons': u'⥤', + u'\\rightthreetimes': u'⋌', u'\\rimg': u'⦈', u'\\risingdotseq': u'≓', + u'\\rrbracket': u'⟧', u'\\rsub': u'⩥', u'\\rtimes': u'⋊', + u'\\sagittarius': u'♐', u'\\saturn': u'♄', u'\\scorpio': u'♏', + u'\\searrow': u'↘', u'\\sec': u'sec', u'\\second': u'″', u'\\setminus': u'∖', + u'\\sharp': u'♯', u'\\simeq': u'≃', u'\\sin': u'sin', u'\\sinh': u'sinh', + u'\\sixteenthnote': u'♬', u'\\skull': u'☠', u'\\slash': u'∕', + u'\\smallsetminus': u'∖', u'\\smalltriangledown': u'▿', + u'\\smalltriangleleft': u'◃', u'\\smalltriangleright': u'▹', + u'\\smalltriangleup': u'▵', u'\\smile': u'⌣', u'\\smiley': u'☺', + u'\\spadesuit': u'♠', u'\\spddot': u'¨', u'\\sphat': u'', + u'\\sphericalangle': u'∢', u'\\spot': u'⦁', u'\\sptilde': u'~', + u'\\sqcap': u'⊓', u'\\sqcup': u'⊔', u'\\sqsubset': u'⊏', + u'\\sqsubseteq': u'⊑', u'\\sqsupset': u'⊐', u'\\sqsupseteq': u'⊒', + u'\\square': u'□', u'\\sslash': u'⫽', u'\\star': u'⋆', u'\\steaming': u'☕', + u'\\subseteqq': u'⫅', u'\\subsetneqq': u'⫋', u'\\succ': u'≻', + u'\\succcurlyeq': u'≽', u'\\succeq': u'≽', u'\\succnsim': u'⋩', + u'\\succsim': u'≿', u'\\sun': u'☼', u'\\sup': u'sup', u'\\supseteqq': u'⫆', + u'\\supsetneqq': u'⫌', u'\\surd': u'√', u'\\swarrow': u'↙', + u'\\swords': u'⚔', u'\\talloblong': u'⫾', u'\\tan': u'tan', + u'\\tanh': u'tanh', u'\\taurus': u'♉', u'\\textasciicircum': u'^', + u'\\textasciitilde': u'~', u'\\textbackslash': u'\\', + u'\\textcopyright': u'©\'', u'\\textdegree': u'°', u'\\textellipsis': u'…', + u'\\textemdash': u'—', u'\\textendash': u'—', u'\\texteuro': u'€', + u'\\textgreater': u'>', u'\\textless': u'<', u'\\textordfeminine': u'ª', + u'\\textordmasculine': u'º', u'\\textquotedblleft': u'“', + u'\\textquotedblright': u'”', u'\\textquoteright': u'’', + u'\\textregistered': u'®', u'\\textrightarrow': u'→', + u'\\textsection': u'§', u'\\texttrademark': u'™', + u'\\texttwosuperior': u'²', u'\\textvisiblespace': u' ', + u'\\therefore': u'∴', u'\\third': u'‴', u'\\top': u'⊤', u'\\triangle': u'△', + u'\\triangleleft': u'⊲', u'\\trianglelefteq': u'⊴', u'\\triangleq': u'≜', + u'\\triangleright': u'▷', u'\\trianglerighteq': u'⊵', + u'\\twoheadleftarrow': u'↞', u'\\twoheadrightarrow': u'↠', + u'\\twonotes': u'♫', u'\\udot': u'⊍', u'\\ulcorner': u'⌜', u'\\unlhd': u'⊴', + u'\\unrhd': u'⊵', u'\\unrhl': u'⊵', u'\\uparrow': u'↑', + u'\\updownarrow': u'↕', u'\\upharpoonleft': u'↿', u'\\upharpoonright': u'↾', + u'\\uplus': u'⊎', u'\\upuparrows': u'⇈', u'\\uranus': u'♅', + u'\\urcorner': u'⌝', u'\\vDash': u'⊨', u'\\varclubsuit': u'♧', + u'\\vardiamondsuit': u'♦', u'\\varheartsuit': u'♥', u'\\varnothing': u'∅', + u'\\varspadesuit': u'♤', u'\\vdash': u'⊢', u'\\vdots': u'⋮', u'\\vee': u'∨', + u'\\vee)': u'∨', u'\\veebar': u'⊻', u'\\vert': u'∣', u'\\virgo': u'♍', + u'\\warning': u'⚠', u'\\wasylozenge': u'⌑', u'\\wedge': u'∧', + u'\\wedge)': u'∧', u'\\wp': u'℘', u'\\wr': u'≀', u'\\yen': u'¥', + u'\\yinyang': u'☯', u'\\{': u'{', u'\\|': u'∥', u'\\}': u'}', + } + + decoratedcommand = { + } + + decoratingfunctions = { + u'\\overleftarrow': u'⟵', u'\\overrightarrow': u'⟶', u'\\widehat': u'^', + } + + endings = { + u'bracket': u'}', u'complex': u'\\]', u'endafter': u'}', + u'endbefore': u'\\end{', u'squarebracket': u']', + } + + environments = { + u'align': [u'r', u'l',], u'eqnarray': [u'r', u'c', u'l',], + u'gathered': [u'l', u'l',], + } + + fontfunctions = { + u'\\boldsymbol': u'b', u'\\mathbb': u'span class="blackboard"', + u'\\mathbb{A}': u'𝔸', u'\\mathbb{B}': u'𝔹', u'\\mathbb{C}': u'ℂ', + u'\\mathbb{D}': u'𝔻', u'\\mathbb{E}': u'𝔼', u'\\mathbb{F}': u'𝔽', + u'\\mathbb{G}': u'𝔾', u'\\mathbb{H}': u'ℍ', u'\\mathbb{J}': u'𝕁', + u'\\mathbb{K}': u'𝕂', u'\\mathbb{L}': u'𝕃', u'\\mathbb{N}': u'ℕ', + u'\\mathbb{O}': u'𝕆', u'\\mathbb{P}': u'ℙ', u'\\mathbb{Q}': u'ℚ', + u'\\mathbb{R}': u'ℝ', u'\\mathbb{S}': u'𝕊', u'\\mathbb{T}': u'𝕋', + u'\\mathbb{W}': u'𝕎', u'\\mathbb{Z}': u'ℤ', u'\\mathbf': u'b', + u'\\mathcal': u'span class="scriptfont"', u'\\mathcal{B}': u'ℬ', + u'\\mathcal{E}': u'ℰ', u'\\mathcal{F}': u'ℱ', u'\\mathcal{H}': u'ℋ', + u'\\mathcal{I}': u'ℐ', u'\\mathcal{L}': u'ℒ', u'\\mathcal{M}': u'ℳ', + u'\\mathcal{R}': u'ℛ', u'\\mathfrak': u'span class="fraktur"', + u'\\mathfrak{C}': u'ℭ', u'\\mathfrak{F}': u'𝔉', u'\\mathfrak{H}': u'ℌ', + u'\\mathfrak{I}': u'ℑ', u'\\mathfrak{R}': u'ℜ', u'\\mathfrak{Z}': u'ℨ', + u'\\mathit': u'i', u'\\mathring{A}': u'Å', u'\\mathring{U}': u'Ů', + u'\\mathring{a}': u'å', u'\\mathring{u}': u'ů', u'\\mathring{w}': u'ẘ', + u'\\mathring{y}': u'ẙ', u'\\mathrm': u'span class="mathrm"', + u'\\mathscr': u'span class="scriptfont"', u'\\mathscr{B}': u'ℬ', + u'\\mathscr{E}': u'ℰ', u'\\mathscr{F}': u'ℱ', u'\\mathscr{H}': u'ℋ', + u'\\mathscr{I}': u'ℐ', u'\\mathscr{L}': u'ℒ', u'\\mathscr{M}': u'ℳ', + u'\\mathscr{R}': u'ℛ', u'\\mathsf': u'span class="mathsf"', + u'\\mathtt': u'tt', + } + + hybridfunctions = { + u'\\addcontentsline': [u'{$p!}{$q!}{$r!}', u'f0{}', u'ignored',], + u'\\addtocontents': [u'{$p!}{$q!}', u'f0{}', u'ignored',], + u'\\backmatter': [u'', u'f0{}', u'ignored',], + u'\\binom': [u'{$1}{$2}', u'f2{(}f0{f1{$1}f1{$2}}f2{)}', u'span class="binom"', u'span class="binomstack"', u'span class="bigsymbol"',], + u'\\boxed': [u'{$1}', u'f0{$1}', u'span class="boxed"',], + u'\\cfrac': [u'[$p!]{$1}{$2}', u'f0{f3{(}f1{$1}f3{)/(}f2{$2}f3{)}}', u'span class="fullfraction"', u'span class="numerator align-$p"', u'span class="denominator"', u'span class="ignored"',], + u'\\color': [u'{$p!}{$1}', u'f0{$1}', u'span style="color: $p;"',], + u'\\colorbox': [u'{$p!}{$1}', u'f0{$1}', u'span class="colorbox" style="background: $p;"',], + u'\\dbinom': [u'{$1}{$2}', u'(f0{f1{f2{$1}}f1{f2{ }}f1{f2{$2}}})', u'span class="binomial"', u'span class="binomrow"', u'span class="binomcell"',], + u'\\dfrac': [u'{$1}{$2}', u'f0{f3{(}f1{$1}f3{)/(}f2{$2}f3{)}}', u'span class="fullfraction"', u'span class="numerator"', u'span class="denominator"', u'span class="ignored"',], + u'\\displaystyle': [u'{$1}', u'f0{$1}', u'span class="displaystyle"',], + u'\\fancyfoot': [u'[$p!]{$q!}', u'f0{}', u'ignored',], + u'\\fancyhead': [u'[$p!]{$q!}', u'f0{}', u'ignored',], + u'\\fbox': [u'{$1}', u'f0{$1}', u'span class="fbox"',], + u'\\fboxrule': [u'{$p!}', u'f0{}', u'ignored',], + u'\\fboxsep': [u'{$p!}', u'f0{}', u'ignored',], + u'\\fcolorbox': [u'{$p!}{$q!}{$1}', u'f0{$1}', u'span class="boxed" style="border-color: $p; background: $q;"',], + u'\\frac': [u'{$1}{$2}', u'f0{f3{(}f1{$1}f3{)/(}f2{$2}f3{)}}', u'span class="fraction"', u'span class="numerator"', u'span class="denominator"', u'span class="ignored"',], + u'\\framebox': [u'[$p!][$q!]{$1}', u'f0{$1}', u'span class="framebox align-$q" style="width: $p;"',], + u'\\frontmatter': [u'', u'f0{}', u'ignored',], + u'\\href': [u'[$o]{$u!}{$t!}', u'f0{$t}', u'a href="$u"',], + u'\\hspace': [u'{$p!}', u'f0{ }', u'span class="hspace" style="width: $p;"',], + u'\\leftroot': [u'{$p!}', u'f0{ }', u'span class="leftroot" style="width: $p;px"',], + u'\\mainmatter': [u'', u'f0{}', u'ignored',], + u'\\markboth': [u'{$p!}{$q!}', u'f0{}', u'ignored',], + u'\\markright': [u'{$p!}', u'f0{}', u'ignored',], + u'\\nicefrac': [u'{$1}{$2}', u'f0{f1{$1}⁄f2{$2}}', u'span class="fraction"', u'sup class="numerator"', u'sub class="denominator"', u'span class="ignored"',], + u'\\parbox': [u'[$p!]{$w!}{$1}', u'f0{1}', u'div class="Boxed" style="width: $w;"',], + u'\\raisebox': [u'{$p!}{$1}', u'f0{$1.font}', u'span class="raisebox" style="vertical-align: $p;"',], + u'\\renewenvironment': [u'{$1!}{$2!}{$3!}', u'',], + u'\\rule': [u'[$v!]{$w!}{$h!}', u'f0/', u'hr class="line" style="width: $w; height: $h;"',], + u'\\scriptscriptstyle': [u'{$1}', u'f0{$1}', u'span class="scriptscriptstyle"',], + u'\\scriptstyle': [u'{$1}', u'f0{$1}', u'span class="scriptstyle"',], + u'\\sqrt': [u'[$0]{$1}', u'f0{f1{$0}f2{√}f4{(}f3{$1}f4{)}}', u'span class="sqrt"', u'sup class="root"', u'span class="radical"', u'span class="root"', u'span class="ignored"',], + u'\\stackrel': [u'{$1}{$2}', u'f0{f1{$1}f2{$2}}', u'span class="stackrel"', u'span class="upstackrel"', u'span class="downstackrel"',], + u'\\tbinom': [u'{$1}{$2}', u'(f0{f1{f2{$1}}f1{f2{ }}f1{f2{$2}}})', u'span class="binomial"', u'span class="binomrow"', u'span class="binomcell"',], + u'\\textcolor': [u'{$p!}{$1}', u'f0{$1}', u'span style="color: $p;"',], + u'\\textstyle': [u'{$1}', u'f0{$1}', u'span class="textstyle"',], + u'\\thispagestyle': [u'{$p!}', u'f0{}', u'ignored',], + u'\\unit': [u'[$0]{$1}', u'$0f0{$1.font}', u'span class="unit"',], + u'\\unitfrac': [u'[$0]{$1}{$2}', u'$0f0{f1{$1.font}⁄f2{$2.font}}', u'span class="fraction"', u'sup class="unit"', u'sub class="unit"',], + u'\\uproot': [u'{$p!}', u'f0{ }', u'span class="uproot" style="width: $p;px"',], + u'\\url': [u'{$u!}', u'f0{$u}', u'a href="$u"',], + u'\\vspace': [u'{$p!}', u'f0{ }', u'span class="vspace" style="height: $p;"',], + } + + hybridsizes = { + u'\\binom': u'$1+$2', u'\\cfrac': u'$1+$2', u'\\dbinom': u'$1+$2+1', + u'\\dfrac': u'$1+$2', u'\\frac': u'$1+$2', u'\\tbinom': u'$1+$2+1', + } + + labelfunctions = { + u'\\label': u'a name="#"', + } + + limitcommands = { + u'\\biginterleave': u'⫼', u'\\bigsqcap': u'⨅', u'\\fint': u'⨏', + u'\\iiiint': u'⨌', u'\\int': u'∫', u'\\intop': u'∫', u'\\lim': u'lim', + u'\\prod': u'∏', u'\\smallint': u'∫', u'\\sqint': u'⨖', u'\\sum': u'∑', + u'\\varointclockwise': u'∲', u'\\varprod': u'⨉', u'\\zcmp': u'⨟', + u'\\zhide': u'⧹', u'\\zpipe': u'⨠', u'\\zproject': u'⨡', + } + + misccommands = { + u'\\limits': u'LimitPreviousCommand', u'\\newcommand': u'MacroDefinition', + u'\\renewcommand': u'MacroDefinition', + u'\\setcounter': u'SetCounterFunction', u'\\tag': u'FormulaTag', + u'\\tag*': u'FormulaTag', u'\\today': u'TodayCommand', + } + + modified = { + u'\n': u'', u' ': u'', u'$': u'', u'&': u' ', u'\'': u'’', u'+': u' + ', + u',': u', ', u'-': u' − ', u'/': u' ⁄ ', u':': u' : ', u'<': u' < ', + u'=': u' = ', u'>': u' > ', u'@': u'', u'~': u'', + } + + onefunctions = { + u'\\Big': u'span class="bigsymbol"', u'\\Bigg': u'span class="hugesymbol"', + u'\\bar': u'span class="bar"', u'\\begin{array}': u'span class="arraydef"', + u'\\big': u'span class="symbol"', u'\\bigg': u'span class="largesymbol"', + u'\\bigl': u'span class="bigsymbol"', u'\\bigr': u'span class="bigsymbol"', + u'\\centering': u'span class="align-center"', + u'\\ensuremath': u'span class="ensuremath"', + u'\\hphantom': u'span class="phantom"', + u'\\noindent': u'span class="noindent"', + u'\\overbrace': u'span class="overbrace"', + u'\\overline': u'span class="overline"', + u'\\phantom': u'span class="phantom"', + u'\\underbrace': u'span class="underbrace"', u'\\underline': u'u', + u'\\vphantom': u'span class="phantom"', + } + + spacedcommands = { + u'\\Bot': u'⫫', u'\\Doteq': u'≑', u'\\DownArrowBar': u'⤓', + u'\\DownLeftTeeVector': u'⥞', u'\\DownLeftVectorBar': u'⥖', + u'\\DownRightTeeVector': u'⥟', u'\\DownRightVectorBar': u'⥗', + u'\\Equal': u'⩵', u'\\LeftArrowBar': u'⇤', u'\\LeftDownTeeVector': u'⥡', + u'\\LeftDownVectorBar': u'⥙', u'\\LeftTeeVector': u'⥚', + u'\\LeftTriangleBar': u'⧏', u'\\LeftUpTeeVector': u'⥠', + u'\\LeftUpVectorBar': u'⥘', u'\\LeftVectorBar': u'⥒', + u'\\Leftrightarrow': u'⇔', u'\\Longmapsfrom': u'⟽', u'\\Longmapsto': u'⟾', + u'\\MapsDown': u'↧', u'\\MapsUp': u'↥', u'\\Nearrow': u'⇗', + u'\\NestedGreaterGreater': u'⪢', u'\\NestedLessLess': u'⪡', + u'\\NotGreaterLess': u'≹', u'\\NotGreaterTilde': u'≵', + u'\\NotLessTilde': u'≴', u'\\Nwarrow': u'⇖', u'\\Proportion': u'∷', + u'\\RightArrowBar': u'⇥', u'\\RightDownTeeVector': u'⥝', + u'\\RightDownVectorBar': u'⥕', u'\\RightTeeVector': u'⥛', + u'\\RightTriangleBar': u'⧐', u'\\RightUpTeeVector': u'⥜', + u'\\RightUpVectorBar': u'⥔', u'\\RightVectorBar': u'⥓', + u'\\Rightarrow': u'⇒', u'\\Same': u'⩶', u'\\Searrow': u'⇘', + u'\\Swarrow': u'⇙', u'\\Top': u'⫪', u'\\UpArrowBar': u'⤒', u'\\VDash': u'⊫', + u'\\approx': u'≈', u'\\approxeq': u'≊', u'\\backsim': u'∽', u'\\barin': u'⋶', + u'\\barleftharpoon': u'⥫', u'\\barrightharpoon': u'⥭', u'\\bij': u'⤖', + u'\\coloneq': u'≔', u'\\corresponds': u'≙', u'\\curlyeqprec': u'⋞', + u'\\curlyeqsucc': u'⋟', u'\\dashrightarrow': u'⇢', u'\\dlsh': u'↲', + u'\\downdownharpoons': u'⥥', u'\\downuparrows': u'⇵', + u'\\downupharpoons': u'⥯', u'\\drsh': u'↳', u'\\eqslantgtr': u'⪖', + u'\\eqslantless': u'⪕', u'\\equiv': u'≡', u'\\ffun': u'⇻', u'\\finj': u'⤕', + u'\\ge': u'≥', u'\\geq': u'≥', u'\\ggcurly': u'⪼', u'\\gnapprox': u'⪊', + u'\\gneq': u'⪈', u'\\gtrapprox': u'⪆', u'\\hash': u'⋕', u'\\iddots': u'⋰', + u'\\implies': u' ⇒ ', u'\\in': u'∈', u'\\le': u'≤', u'\\leftarrow': u'←', + u'\\leftarrowtriangle': u'⇽', u'\\leftbarharpoon': u'⥪', + u'\\leftrightarrowtriangle': u'⇿', u'\\leftrightharpoon': u'⥊', + u'\\leftrightharpoondown': u'⥐', u'\\leftrightharpoonup': u'⥎', + u'\\leftrightsquigarrow': u'↭', u'\\leftslice': u'⪦', + u'\\leftsquigarrow': u'⇜', u'\\leftupdownharpoon': u'⥑', u'\\leq': u'≤', + u'\\lessapprox': u'⪅', u'\\llcurly': u'⪻', u'\\lnapprox': u'⪉', + u'\\lneq': u'⪇', u'\\longmapsfrom': u'⟻', u'\\multimapboth': u'⧟', + u'\\multimapdotbothA': u'⊶', u'\\multimapdotbothB': u'⊷', + u'\\multimapinv': u'⟜', u'\\nVdash': u'⊮', u'\\ne': u'≠', u'\\neq': u'≠', + u'\\ngeq': u'≱', u'\\nleq': u'≰', u'\\nni': u'∌', u'\\not\\in': u'∉', + u'\\notasymp': u'≭', u'\\npreceq': u'⋠', u'\\nsqsubseteq': u'⋢', + u'\\nsqsupseteq': u'⋣', u'\\nsubset': u'⊄', u'\\nsucceq': u'⋡', + u'\\pfun': u'⇸', u'\\pinj': u'⤔', u'\\precapprox': u'⪷', u'\\preceqq': u'⪳', + u'\\precnapprox': u'⪹', u'\\precnsim': u'⋨', u'\\propto': u'∝', + u'\\psur': u'⤀', u'\\rightarrow': u'→', u'\\rightarrowtriangle': u'⇾', + u'\\rightbarharpoon': u'⥬', u'\\rightleftharpoon': u'⥋', + u'\\rightslice': u'⪧', u'\\rightsquigarrow': u'⇝', + u'\\rightupdownharpoon': u'⥏', u'\\sim': u'~', u'\\strictfi': u'⥼', + u'\\strictif': u'⥽', u'\\subset': u'⊂', u'\\subseteq': u'⊆', + u'\\subsetneq': u'⊊', u'\\succapprox': u'⪸', u'\\succeqq': u'⪴', + u'\\succnapprox': u'⪺', u'\\supset': u'⊃', u'\\supseteq': u'⊇', + u'\\supsetneq': u'⊋', u'\\times': u'×', u'\\to': u'→', + u'\\updownarrows': u'⇅', u'\\updownharpoons': u'⥮', u'\\upupharpoons': u'⥣', + u'\\vartriangleleft': u'⊲', u'\\vartriangleright': u'⊳', + } + + starts = { + u'beginafter': u'}', u'beginbefore': u'\\begin{', u'bracket': u'{', + u'command': u'\\', u'comment': u'%', u'complex': u'\\[', u'simple': u'$', + u'squarebracket': u'[', u'unnumbered': u'*', + } + + symbolfunctions = { + u'^': u'sup', u'_': u'sub', + } + + textfunctions = { + u'\\mbox': u'span class="mbox"', u'\\text': u'span class="text"', + u'\\textbf': u'b', u'\\textipa': u'span class="textipa"', u'\\textit': u'i', + u'\\textnormal': u'span class="textnormal"', + u'\\textrm': u'span class="textrm"', + u'\\textsc': u'span class="versalitas"', + u'\\textsf': u'span class="textsf"', u'\\textsl': u'i', u'\\texttt': u'tt', + u'\\textup': u'span class="normal"', + } + + unmodified = { + u'characters': [u'.', u'*', u'€', u'(', u')', u'[', u']', u'·', u'!', u';', u'|', u'§', u'"',], + } + + urls = { + u'googlecharts': u'http://chart.googleapis.com/chart?cht=tx&chl=', + } + +class GeneralConfig(object): + "Configuration class from elyxer.config file" + + version = { + u'date': u'2015-02-26', u'lyxformat': u'413', u'number': u'1.2.5', + } + +class HeaderConfig(object): + "Configuration class from elyxer.config file" + + parameters = { + u'beginpreamble': u'\\begin_preamble', u'branch': u'\\branch', + u'documentclass': u'\\textclass', u'endbranch': u'\\end_branch', + u'endpreamble': u'\\end_preamble', u'language': u'\\language', + u'lstset': u'\\lstset', u'outputchanges': u'\\output_changes', + u'paragraphseparation': u'\\paragraph_separation', + u'pdftitle': u'\\pdf_title', u'secnumdepth': u'\\secnumdepth', + u'tocdepth': u'\\tocdepth', + } + + styles = { + u'article': [u'article', u'aastex', u'aapaper', u'acmsiggraph', u'sigplanconf', u'achemso', u'amsart', u'apa', u'arab-article', u'armenian-article', u'article-beamer', u'chess', u'dtk', u'elsarticle', u'heb-article', u'IEEEtran', u'iopart', u'kluwer', u'scrarticle-beamer', u'scrartcl', u'extarticle', u'paper', u'mwart', u'revtex4', u'spie', u'svglobal3', u'ltugboat', u'agu-dtd', u'jgrga', u'agums', u'entcs', u'egs', u'ijmpc', u'ijmpd', u'singlecol-new', u'doublecol-new', u'isprs', u'tarticle', u'jsarticle', u'jarticle', u'jss', u'literate-article', u'siamltex', u'cl2emult', u'llncs', u'svglobal', u'svjog', u'svprobth',], + u'book': [u'book', u'amsbook', u'scrbook', u'extbook', u'tufte-book', u'report', u'extreport', u'scrreprt', u'memoir', u'tbook', u'jsbook', u'jbook', u'mwbk', u'svmono', u'svmult', u'treport', u'jreport', u'mwrep',], + } + +class ImageConfig(object): + "Configuration class from elyxer.config file" + + converters = { + u'imagemagick': u'convert[ -density $scale][ -define $format:use-cropbox=true] "$input" "$output"', + u'inkscape': u'inkscape "$input" --export-png="$output"', + u'lyx': u'lyx -C "$input" "$output"', + } + + cropboxformats = { + u'.eps': u'ps', u'.pdf': u'pdf', u'.ps': u'ps', + } + + formats = { + u'default': u'.png', u'vector': [u'.svg', u'.eps',], + } + +class LayoutConfig(object): + "Configuration class from elyxer.config file" + + groupable = { + u'allowed': [u'StringContainer', u'Constant', u'TaggedText', u'Align', u'TextFamily', u'EmphaticText', u'VersalitasText', u'BarredText', u'SizeText', u'ColorText', u'LangLine', u'Formula',], + } + +class NewfangleConfig(object): + "Configuration class from elyxer.config file" + + constants = { + u'chunkref': u'chunkref{', u'endcommand': u'}', u'endmark': u'>', + u'startcommand': u'\\', u'startmark': u'=<', + } + +class NumberingConfig(object): + "Configuration class from elyxer.config file" + + layouts = { + u'ordered': [u'Chapter', u'Section', u'Subsection', u'Subsubsection', u'Paragraph',], + u'roman': [u'Part', u'Book',], + } + + sequence = { + u'symbols': [u'*', u'**', u'†', u'‡', u'§', u'§§', u'¶', u'¶¶', u'#', u'##',], + } + +class StyleConfig(object): + "Configuration class from elyxer.config file" + + hspaces = { + u'\\enskip{}': u' ', u'\\hfill{}': u'<span class="hfill"> </span>', + u'\\hspace*{\\fill}': u' ', u'\\hspace*{}': u'', u'\\hspace{}': u' ', + u'\\negthinspace{}': u'', u'\\qquad{}': u'  ', u'\\quad{}': u' ', + u'\\space{}': u' ', u'\\thinspace{}': u' ', u'~': u' ', + } + + quotes = { + u'ald': u'»', u'als': u'›', u'ard': u'«', u'ars': u'‹', u'eld': u'“', + u'els': u'‘', u'erd': u'”', u'ers': u'’', u'fld': u'«', + u'fls': u'‹', u'frd': u'»', u'frs': u'›', u'gld': u'„', u'gls': u'‚', + u'grd': u'“', u'grs': u'‘', u'pld': u'„', u'pls': u'‚', u'prd': u'”', + u'prs': u'’', u'sld': u'”', u'srd': u'”', + } + + referenceformats = { + u'eqref': u'(@↕)', u'formatted': u'¶↕', u'nameref': u'$↕', u'pageref': u'#↕', + u'ref': u'@↕', u'vpageref': u'on-page#↕', u'vref': u'@on-page#↕', + } + + size = { + u'ignoredtexts': [u'col', u'text', u'line', u'page', u'theight', u'pheight',], + } + + vspaces = { + u'bigskip': u'<div class="bigskip"> </div>', + u'defskip': u'<div class="defskip"> </div>', + u'medskip': u'<div class="medskip"> </div>', + u'smallskip': u'<div class="smallskip"> </div>', + u'vfill': u'<div class="vfill"> </div>', + } + +class TOCConfig(object): + "Configuration class from elyxer.config file" + + extractplain = { + u'allowed': [u'StringContainer', u'Constant', u'TaggedText', u'Align', u'TextFamily', u'EmphaticText', u'VersalitasText', u'BarredText', u'SizeText', u'ColorText', u'LangLine', u'Formula',], + u'cloned': [u'',], u'extracted': [u'',], + } + + extracttitle = { + u'allowed': [u'StringContainer', u'Constant', u'Space',], + u'cloned': [u'TextFamily', u'EmphaticText', u'VersalitasText', u'BarredText', u'SizeText', u'ColorText', u'LangLine', u'Formula',], + u'extracted': [u'PlainLayout', u'TaggedText', u'Align', u'Caption', u'StandardLayout', u'FlexInset',], + } + +class TagConfig(object): + "Configuration class from elyxer.config file" + + barred = { + u'under': u'u', + } + + family = { + u'sans': u'span class="sans"', u'typewriter': u'tt', + } + + flex = { + u'CharStyle:Code': u'span class="code"', + u'CharStyle:MenuItem': u'span class="menuitem"', + u'Code': u'span class="code"', u'MenuItem': u'span class="menuitem"', + u'Noun': u'span class="noun"', u'Strong': u'span class="strong"', + } + + group = { + u'layouts': [u'Quotation', u'Quote',], + } + + layouts = { + u'Center': u'div', u'Chapter': u'h?', u'Date': u'h2', u'Paragraph': u'div', + u'Part': u'h1', u'Quotation': u'blockquote', u'Quote': u'blockquote', + u'Section': u'h?', u'Subsection': u'h?', u'Subsubsection': u'h?', + } + + listitems = { + u'Enumerate': u'ol', u'Itemize': u'ul', + } + + notes = { + u'Comment': u'', u'Greyedout': u'span class="greyedout"', u'Note': u'', + } + + script = { + u'subscript': u'sub', u'superscript': u'sup', + } + + shaped = { + u'italic': u'i', u'slanted': u'i', u'smallcaps': u'span class="versalitas"', + } + +class TranslationConfig(object): + "Configuration class from elyxer.config file" + + constants = { + u'Appendix': u'Appendix', u'Book': u'Book', u'Chapter': u'Chapter', + u'Paragraph': u'Paragraph', u'Part': u'Part', u'Section': u'Section', + u'Subsection': u'Subsection', u'Subsubsection': u'Subsubsection', + u'abstract': u'Abstract', u'bibliography': u'Bibliography', + u'figure': u'figure', u'float-algorithm': u'Algorithm ', + u'float-figure': u'Figure ', u'float-listing': u'Listing ', + u'float-table': u'Table ', u'float-tableau': u'Tableau ', + u'footnotes': u'Footnotes', u'generated-by': u'Document generated by ', + u'generated-on': u' on ', u'index': u'Index', + u'jsmath-enable': u'Please enable JavaScript on your browser.', + u'jsmath-requires': u' requires JavaScript to correctly process the mathematics on this page. ', + u'jsmath-warning': u'Warning: ', u'list-algorithm': u'List of Algorithms', + u'list-figure': u'List of Figures', u'list-table': u'List of Tables', + u'list-tableau': u'List of Tableaux', u'main-page': u'Main page', + u'next': u'Next', u'nomenclature': u'Nomenclature', + u'on-page': u' on page ', u'prev': u'Prev', u'references': u'References', + u'toc': u'Table of Contents', u'toc-for': u'Contents for ', u'up': u'Up', + } + + languages = { + u'american': u'en', u'british': u'en', u'deutsch': u'de', u'dutch': u'nl', + u'english': u'en', u'french': u'fr', u'ngerman': u'de', u'russian': u'ru', + u'spanish': u'es', + } + + +class CommandLineParser(object): + "A parser for runtime options" + + def __init__(self, options): + self.options = options + + def parseoptions(self, args): + "Parse command line options" + if len(args) == 0: + return None + while len(args) > 0 and args[0].startswith('--'): + key, value = self.readoption(args) + if not key: + return 'Option ' + value + ' not recognized' + if not value: + return 'Option ' + key + ' needs a value' + setattr(self.options, key, value) + return None + + def readoption(self, args): + "Read the key and value for an option" + arg = args[0][2:] + del args[0] + if '=' in arg: + key = self.readequalskey(arg, args) + else: + key = arg.replace('-', '') + if not hasattr(self.options, key): + return None, key + current = getattr(self.options, key) + if isinstance(current, bool): + return key, True + # read value + if len(args) == 0: + return key, None + if args[0].startswith('"'): + initial = args[0] + del args[0] + return key, self.readquoted(args, initial) + value = args[0].decode('utf-8') + del args[0] + if isinstance(current, list): + current.append(value) + return key, current + return key, value + + def readquoted(self, args, initial): + "Read a value between quotes" + Trace.error('Oops') + value = initial[1:] + while len(args) > 0 and not args[0].endswith('"') and not args[0].startswith('--'): + Trace.error('Appending ' + args[0]) + value += ' ' + args[0] + del args[0] + if len(args) == 0 or args[0].startswith('--'): + return None + value += ' ' + args[0:-1] + return value + + def readequalskey(self, arg, args): + "Read a key using equals" + split = arg.split('=', 1) + key = split[0] + value = split[1] + args.insert(0, value) + return key + + +class Options(object): + "A set of runtime options" + + instance = None + + location = None + nocopy = False + copyright = False + debug = False + quiet = False + version = False + hardversion = False + versiondate = False + html = False + help = False + showlines = True + unicode = False + iso885915 = False + css = [] + favicon = '' + title = None + directory = None + destdirectory = None + toc = False + toctarget = '' + tocfor = None + forceformat = None + lyxformat = False + target = None + splitpart = None + memory = True + lowmem = False + nobib = False + converter = 'imagemagick' + raw = False + jsmath = None + mathjax = None + nofooter = False + simplemath = False + template = None + noconvert = False + notoclabels = False + letterfoot = True + numberfoot = False + symbolfoot = False + hoverfoot = True + marginfoot = False + endfoot = False + supfoot = True + alignfoot = False + footnotes = None + imageformat = None + copyimages = False + googlecharts = False + embedcss = [] + + branches = dict() + + def parseoptions(self, args): + "Parse command line options" + Options.location = args[0] + del args[0] + parser = CommandLineParser(Options) + result = parser.parseoptions(args) + if result: + Trace.error(result) + self.usage() + self.processoptions() + + def processoptions(self): + "Process all options parsed." + if Options.help: + self.usage() + if Options.version: + self.showversion() + if Options.hardversion: + self.showhardversion() + if Options.versiondate: + self.showversiondate() + if Options.lyxformat: + self.showlyxformat() + if Options.splitpart: + try: + Options.splitpart = int(Options.splitpart) + if Options.splitpart <= 0: + Trace.error('--splitpart requires a number bigger than zero') + self.usage() + except: + Trace.error('--splitpart needs a numeric argument, not ' + Options.splitpart) + self.usage() + if Options.lowmem or Options.toc or Options.tocfor: + Options.memory = False + self.parsefootnotes() + if Options.forceformat and not Options.imageformat: + Options.imageformat = Options.forceformat + if Options.imageformat == 'copy': + Options.copyimages = True + if Options.css == []: + Options.css = ['http://elyxer.nongnu.org/lyx.css'] + if Options.favicon == '': + pass # no default favicon + if Options.html: + Options.simplemath = True + if Options.toc and not Options.tocfor: + Trace.error('Option --toc is deprecated; use --tocfor "page" instead') + Options.tocfor = Options.toctarget + if Options.nocopy: + Trace.error('Option --nocopy is deprecated; it is no longer needed') + if Options.jsmath: + Trace.error('Option --jsmath is deprecated; use --mathjax instead') + # set in Trace if necessary + for param in dir(Trace): + if param.endswith('mode'): + setattr(Trace, param, getattr(self, param[:-4])) + + def usage(self): + "Show correct usage" + Trace.error('Usage: ' + os.path.basename(Options.location) + ' [options] [filein] [fileout]') + Trace.error('Convert LyX input file "filein" to HTML file "fileout".') + Trace.error('If filein (or fileout) is not given use standard input (or output).') + Trace.error('Main program of the eLyXer package (http://elyxer.nongnu.org/).') + self.showoptions() + + def parsefootnotes(self): + "Parse footnotes options." + if not Options.footnotes: + return + Options.marginfoot = False + Options.letterfoot = False + Options.hoverfoot = False + options = Options.footnotes.split(',') + for option in options: + footoption = option + 'foot' + if hasattr(Options, footoption): + setattr(Options, footoption, True) + else: + Trace.error('Unknown footnotes option: ' + option) + if not Options.endfoot and not Options.marginfoot and not Options.hoverfoot: + Options.hoverfoot = True + if not Options.numberfoot and not Options.symbolfoot: + Options.letterfoot = True + + def showoptions(self): + "Show all possible options" + Trace.error(' Common options:') + Trace.error(' --help: show this online help') + Trace.error(' --quiet: disables all runtime messages') + Trace.error('') + Trace.error(' Advanced options:') + Trace.error(' --debug: enable debugging messages (for developers)') + Trace.error(' --version: show version number and release date') + Trace.error(' --lyxformat: return the highest LyX version supported') + Trace.error(' Options for HTML output:') + Trace.error(' --title "title": set the generated page title') + Trace.error(' --css "file.css": use a custom CSS file') + Trace.error(' --embedcss "file.css": embed styles from a CSS file into the output') + Trace.error(' --favicon "icon.ico": insert the specified favicon in the header.') + Trace.error(' --html: output HTML 4.0 instead of the default XHTML') + Trace.error(' --unicode: full Unicode output') + Trace.error(' --iso885915: output a document with ISO-8859-15 encoding') + Trace.error(' --nofooter: remove the footer "generated by eLyXer"') + Trace.error(' --simplemath: do not generate fancy math constructions') + Trace.error(' Options for image output:') + Trace.error(' --directory "img_dir": look for images in the specified directory') + Trace.error(' --destdirectory "dest": put converted images into this directory') + Trace.error(' --imageformat ".ext": image output format, or "copy" to copy images') + Trace.error(' --noconvert: do not convert images, use in original locations') + Trace.error(' --converter "inkscape": use an alternative program to convert images') + Trace.error(' Options for footnote display:') + Trace.error(' --numberfoot: mark footnotes with numbers instead of letters') + Trace.error(' --symbolfoot: mark footnotes with symbols (*, **...)') + Trace.error(' --hoverfoot: show footnotes as hovering text (default)') + Trace.error(' --marginfoot: show footnotes on the page margin') + Trace.error(' --endfoot: show footnotes at the end of the page') + Trace.error(' --supfoot: use superscript for footnote markers (default)') + Trace.error(' --alignfoot: use aligned text for footnote markers') + Trace.error(' --footnotes "options": specify several comma-separated footnotes options') + Trace.error(' Available options are: "number", "symbol", "hover", "margin", "end",') + Trace.error(' "sup", "align"') + Trace.error(' Advanced output options:') + Trace.error(' --splitpart "depth": split the resulting webpage at the given depth') + Trace.error(' --tocfor "page": generate a TOC that points to the given page') + Trace.error(' --target "frame": make all links point to the given frame') + Trace.error(' --notoclabels: omit the part labels in the TOC, such as Chapter') + Trace.error(' --lowmem: do the conversion on the fly (conserve memory)') + Trace.error(' --raw: generate HTML without header or footer.') + Trace.error(' --mathjax remote: use MathJax remotely to display equations') + Trace.error(' --mathjax "URL": use MathJax from the given URL to display equations') + Trace.error(' --googlecharts: use Google Charts to generate formula images') + Trace.error(' --template "file": use a template, put everything in <!--$content-->') + Trace.error(' --copyright: add a copyright notice at the bottom') + Trace.error(' Deprecated options:') + Trace.error(' --toc: (deprecated) create a table of contents') + Trace.error(' --toctarget "page": (deprecated) generate a TOC for the given page') + Trace.error(' --nocopy: (deprecated) maintained for backwards compatibility') + Trace.error(' --jsmath "URL": use jsMath from the given URL to display equations') + sys.exit() + + def showversion(self): + "Return the current eLyXer version string" + string = 'eLyXer version ' + GeneralConfig.version['number'] + string += ' (' + GeneralConfig.version['date'] + ')' + Trace.error(string) + sys.exit() + + def showhardversion(self): + "Return just the version string" + Trace.message(GeneralConfig.version['number']) + sys.exit() + + def showversiondate(self): + "Return just the version dte" + Trace.message(GeneralConfig.version['date']) + sys.exit() + + def showlyxformat(self): + "Return just the lyxformat parameter" + Trace.message(GeneralConfig.version['lyxformat']) + sys.exit() + +class BranchOptions(object): + "A set of options for a branch" + + def __init__(self, name): + self.name = name + self.options = {'color':'#ffffff'} + + def set(self, key, value): + "Set a branch option" + if not key.startswith(ContainerConfig.string['startcommand']): + Trace.error('Invalid branch option ' + key) + return + key = key.replace(ContainerConfig.string['startcommand'], '') + self.options[key] = value + + def isselected(self): + "Return if the branch is selected" + if not 'selected' in self.options: + return False + return self.options['selected'] == '1' + + def __unicode__(self): + "String representation" + return 'options for ' + self.name + ': ' + unicode(self.options) + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class Cloner(object): + "An object used to clone other objects." + + def clone(cls, original): + "Return an exact copy of an object." + "The original object must have an empty constructor." + return cls.create(original.__class__) + + def create(cls, type): + "Create an object of a given class." + clone = type.__new__(type) + clone.__init__() + return clone + + clone = classmethod(clone) + create = classmethod(create) + +class ContainerExtractor(object): + "A class to extract certain containers." + + def __init__(self, config): + "The config parameter is a map containing three lists: allowed, copied and extracted." + "Each of the three is a list of class names for containers." + "Allowed containers are included as is into the result." + "Cloned containers are cloned and placed into the result." + "Extracted containers are looked into." + "All other containers are silently ignored." + self.allowed = config['allowed'] + self.cloned = config['cloned'] + self.extracted = config['extracted'] + + def extract(self, container): + "Extract a group of selected containers from elyxer.a container." + list = [] + locate = lambda c: c.__class__.__name__ in self.allowed + self.cloned + recursive = lambda c: c.__class__.__name__ in self.extracted + process = lambda c: self.process(c, list) + container.recursivesearch(locate, recursive, process) + return list + + def process(self, container, list): + "Add allowed containers, clone cloned containers and add the clone." + name = container.__class__.__name__ + if name in self.allowed: + list.append(container) + elif name in self.cloned: + list.append(self.safeclone(container)) + else: + Trace.error('Unknown container class ' + name) + + def safeclone(self, container): + "Return a new container with contents only in a safe list, recursively." + clone = Cloner.clone(container) + clone.output = container.output + clone.contents = self.extract(container) + return clone + + + + + + +class Parser(object): + "A generic parser" + + def __init__(self): + self.begin = 0 + self.parameters = dict() + + def parseheader(self, reader): + "Parse the header" + header = reader.currentline().split() + reader.nextline() + self.begin = reader.linenumber + return header + + def parseparameter(self, reader): + "Parse a parameter" + if reader.currentline().strip().startswith('<'): + key, value = self.parsexml(reader) + self.parameters[key] = value + return + split = reader.currentline().strip().split(' ', 1) + reader.nextline() + if len(split) == 0: + return + key = split[0] + if len(split) == 1: + self.parameters[key] = True + return + if not '"' in split[1]: + self.parameters[key] = split[1].strip() + return + doublesplit = split[1].split('"') + self.parameters[key] = doublesplit[1] + + def parsexml(self, reader): + "Parse a parameter in xml form: <param attr1=value...>" + strip = reader.currentline().strip() + reader.nextline() + if not strip.endswith('>'): + Trace.error('XML parameter ' + strip + ' should be <...>') + split = strip[1:-1].split() + if len(split) == 0: + Trace.error('Empty XML parameter <>') + return None, None + key = split[0] + del split[0] + if len(split) == 0: + return key, dict() + attrs = dict() + for attr in split: + if not '=' in attr: + Trace.error('Erroneous attribute for ' + key + ': ' + attr) + attr += '="0"' + parts = attr.split('=') + attrkey = parts[0] + value = parts[1].split('"')[1] + attrs[attrkey] = value + return key, attrs + + def parseending(self, reader, process): + "Parse until the current ending is found" + if not self.ending: + Trace.error('No ending for ' + unicode(self)) + return + while not reader.currentline().startswith(self.ending): + process() + + def parsecontainer(self, reader, contents): + container = self.factory.createcontainer(reader) + if container: + container.parent = self.parent + contents.append(container) + + def __unicode__(self): + "Return a description" + return self.__class__.__name__ + ' (' + unicode(self.begin) + ')' + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class LoneCommand(Parser): + "A parser for just one command line" + + def parse(self, reader): + "Read nothing" + return [] + +class TextParser(Parser): + "A parser for a command and a bit of text" + + stack = [] + + def __init__(self, container): + Parser.__init__(self) + self.ending = None + if container.__class__.__name__ in ContainerConfig.endings: + self.ending = ContainerConfig.endings[container.__class__.__name__] + self.endings = [] + + def parse(self, reader): + "Parse lines as long as they are text" + TextParser.stack.append(self.ending) + self.endings = TextParser.stack + [ContainerConfig.endings['Layout'], + ContainerConfig.endings['Inset'], self.ending] + contents = [] + while not self.isending(reader): + self.parsecontainer(reader, contents) + return contents + + def isending(self, reader): + "Check if text is ending" + current = reader.currentline().split() + if len(current) == 0: + return False + if current[0] in self.endings: + if current[0] in TextParser.stack: + TextParser.stack.remove(current[0]) + else: + TextParser.stack = [] + return True + return False + +class ExcludingParser(Parser): + "A parser that excludes the final line" + + def parse(self, reader): + "Parse everything up to (and excluding) the final line" + contents = [] + self.parseending(reader, lambda: self.parsecontainer(reader, contents)) + return contents + +class BoundedParser(ExcludingParser): + "A parser bound by a final line" + + def parse(self, reader): + "Parse everything, including the final line" + contents = ExcludingParser.parse(self, reader) + # skip last line + reader.nextline() + return contents + +class BoundedDummy(Parser): + "A bound parser that ignores everything" + + def parse(self, reader): + "Parse the contents of the container" + self.parseending(reader, lambda: reader.nextline()) + # skip last line + reader.nextline() + return [] + +class StringParser(Parser): + "Parses just a string" + + def parseheader(self, reader): + "Do nothing, just take note" + self.begin = reader.linenumber + 1 + return [] + + def parse(self, reader): + "Parse a single line" + contents = reader.currentline() + reader.nextline() + return contents + +class InsetParser(BoundedParser): + "Parses a LyX inset" + + def parse(self, reader): + "Parse inset parameters into a dictionary" + startcommand = ContainerConfig.string['startcommand'] + while reader.currentline() != '' and not reader.currentline().startswith(startcommand): + self.parseparameter(reader) + return BoundedParser.parse(self, reader) + + + + + + +class ContainerOutput(object): + "The generic HTML output for a container." + + def gethtml(self, container): + "Show an error." + Trace.error('gethtml() not implemented for ' + unicode(self)) + + def isempty(self): + "Decide if the output is empty: by default, not empty." + return False + +class EmptyOutput(ContainerOutput): + + def gethtml(self, container): + "Return empty HTML code." + return [] + + def isempty(self): + "This output is particularly empty." + return True + +class FixedOutput(ContainerOutput): + "Fixed output" + + def gethtml(self, container): + "Return constant HTML code" + return container.html + +class ContentsOutput(ContainerOutput): + "Outputs the contents converted to HTML" + + def gethtml(self, container): + "Return the HTML code" + html = [] + if container.contents == None: + return html + for element in container.contents: + if not hasattr(element, 'gethtml'): + Trace.error('No html in ' + element.__class__.__name__ + ': ' + unicode(element)) + return html + html += element.gethtml() + return html + +class TaggedOutput(ContentsOutput): + "Outputs an HTML tag surrounding the contents." + + tag = None + breaklines = False + empty = False + + def settag(self, tag, breaklines=False, empty=False): + "Set the value for the tag and other attributes." + self.tag = tag + if breaklines: + self.breaklines = breaklines + if empty: + self.empty = empty + return self + + def setbreaklines(self, breaklines): + "Set the value for breaklines." + self.breaklines = breaklines + return self + + def gethtml(self, container): + "Return the HTML code." + if self.empty: + return [self.selfclosing(container)] + html = [self.open(container)] + html += ContentsOutput.gethtml(self, container) + html.append(self.close(container)) + return html + + def open(self, container): + "Get opening line." + if not self.checktag(container): + return '' + open = '<' + self.tag + '>' + if self.breaklines: + return open + '\n' + return open + + def close(self, container): + "Get closing line." + if not self.checktag(container): + return '' + close = '</' + self.tag.split()[0] + '>' + if self.breaklines: + return '\n' + close + '\n' + return close + + def selfclosing(self, container): + "Get self-closing line." + if not self.checktag(container): + return '' + selfclosing = '<' + self.tag + '/>' + if self.breaklines: + return selfclosing + '\n' + return selfclosing + + def checktag(self, container): + "Check that the tag is valid." + if not self.tag: + Trace.error('No tag in ' + unicode(container)) + return False + if self.tag == '': + return False + return True + +class FilteredOutput(ContentsOutput): + "Returns the output in the contents, but filtered:" + "some strings are replaced by others." + + def __init__(self): + "Initialize the filters." + self.filters = [] + + def addfilter(self, original, replacement): + "Add a new filter: replace the original by the replacement." + self.filters.append((original, replacement)) + + def gethtml(self, container): + "Return the HTML code" + result = [] + html = ContentsOutput.gethtml(self, container) + for line in html: + result.append(self.filter(line)) + return result + + def filter(self, line): + "Filter a single line with all available filters." + for original, replacement in self.filters: + if original in line: + line = line.replace(original, replacement) + return line + +class StringOutput(ContainerOutput): + "Returns a bare string as output" + + def gethtml(self, container): + "Return a bare string" + return [container.string] + + +class LineReader(object): + "Reads a file line by line" + + def __init__(self, filename): + if isinstance(filename, file): + self.file = filename + else: + self.file = codecs.open(filename, 'rU', 'utf-8') + self.linenumber = 1 + self.lastline = None + self.current = None + self.mustread = True + self.depleted = False + try: + self.readline() + except UnicodeDecodeError: + # try compressed file + import gzip + self.file = gzip.open(filename, 'rb') + self.readline() + + def setstart(self, firstline): + "Set the first line to read." + for i in range(firstline): + self.file.readline() + self.linenumber = firstline + + def setend(self, lastline): + "Set the last line to read." + self.lastline = lastline + + def currentline(self): + "Get the current line" + if self.mustread: + self.readline() + return self.current + + def nextline(self): + "Go to next line" + if self.depleted: + Trace.fatal('Read beyond file end') + self.mustread = True + + def readline(self): + "Read a line from elyxer.file" + self.current = self.file.readline() + if not isinstance(self.file, codecs.StreamReaderWriter): + self.current = self.current.decode('utf-8') + if len(self.current) == 0: + self.depleted = True + self.current = self.current.rstrip('\n\r') + self.linenumber += 1 + self.mustread = False + Trace.prefix = 'Line ' + unicode(self.linenumber) + ': ' + if self.linenumber % 1000 == 0: + Trace.message('Parsing') + + def finished(self): + "Find out if the file is finished" + if self.lastline and self.linenumber == self.lastline: + return True + if self.mustread: + self.readline() + return self.depleted + + def close(self): + self.file.close() + +class LineWriter(object): + "Writes a file as a series of lists" + + file = False + + def __init__(self, filename): + if isinstance(filename, file): + self.file = filename + self.filename = None + else: + self.filename = filename + + def write(self, strings): + "Write a list of strings" + for string in strings: + if not isinstance(string, basestring): + Trace.error('Not a string: ' + unicode(string) + ' in ' + unicode(strings)) + return + self.writestring(string) + + def writestring(self, string): + "Write a string" + if not self.file: + self.file = codecs.open(self.filename, 'w', "utf-8") + if self.file == sys.stdout and sys.version_info < (3, 0): + string = string.encode('utf-8') + self.file.write(string) + + def writeline(self, line): + "Write a line to file" + self.writestring(line + '\n') + + def close(self): + self.file.close() + + + + + + +class Globable(object): + """A bit of text which can be globbed (lumped together in bits). + Methods current(), skipcurrent(), checkfor() and isout() have to be + implemented by subclasses.""" + + leavepending = False + + def __init__(self): + self.endinglist = EndingList() + + def checkbytemark(self): + "Check for a Unicode byte mark and skip it." + if self.finished(): + return + if ord(self.current()) == 0xfeff: + self.skipcurrent() + + def isout(self): + "Find out if we are out of the position yet." + Trace.error('Unimplemented isout()') + return True + + def current(self): + "Return the current character." + Trace.error('Unimplemented current()') + return '' + + def checkfor(self, string): + "Check for the given string in the current position." + Trace.error('Unimplemented checkfor()') + return False + + def finished(self): + "Find out if the current text has finished." + if self.isout(): + if not self.leavepending: + self.endinglist.checkpending() + return True + return self.endinglist.checkin(self) + + def skipcurrent(self): + "Return the current character and skip it." + Trace.error('Unimplemented skipcurrent()') + return '' + + def glob(self, currentcheck): + "Glob a bit of text that satisfies a check on the current char." + glob = '' + while not self.finished() and currentcheck(): + glob += self.skipcurrent() + return glob + + def globalpha(self): + "Glob a bit of alpha text" + return self.glob(lambda: self.current().isalpha()) + + def globnumber(self): + "Glob a row of digits." + return self.glob(lambda: self.current().isdigit()) + + def isidentifier(self): + "Return if the current character is alphanumeric or _." + if self.current().isalnum() or self.current() == '_': + return True + return False + + def globidentifier(self): + "Glob alphanumeric and _ symbols." + return self.glob(self.isidentifier) + + def isvalue(self): + "Return if the current character is a value character:" + "not a bracket or a space." + if self.current().isspace(): + return False + if self.current() in '{}()': + return False + return True + + def globvalue(self): + "Glob a value: any symbols but brackets." + return self.glob(self.isvalue) + + def skipspace(self): + "Skip all whitespace at current position." + return self.glob(lambda: self.current().isspace()) + + def globincluding(self, magicchar): + "Glob a bit of text up to (including) the magic char." + glob = self.glob(lambda: self.current() != magicchar) + magicchar + self.skip(magicchar) + return glob + + def globexcluding(self, excluded): + "Glob a bit of text up until (excluding) any excluded character." + return self.glob(lambda: self.current() not in excluded) + + def pushending(self, ending, optional = False): + "Push a new ending to the bottom" + self.endinglist.add(ending, optional) + + def popending(self, expected = None): + "Pop the ending found at the current position" + if self.isout() and self.leavepending: + return expected + ending = self.endinglist.pop(self) + if expected and expected != ending: + Trace.error('Expected ending ' + expected + ', got ' + ending) + self.skip(ending) + return ending + + def nextending(self): + "Return the next ending in the queue." + nextending = self.endinglist.findending(self) + if not nextending: + return None + return nextending.ending + +class EndingList(object): + "A list of position endings" + + def __init__(self): + self.endings = [] + + def add(self, ending, optional = False): + "Add a new ending to the list" + self.endings.append(PositionEnding(ending, optional)) + + def pickpending(self, pos): + "Pick any pending endings from a parse position." + self.endings += pos.endinglist.endings + + def checkin(self, pos): + "Search for an ending" + if self.findending(pos): + return True + return False + + def pop(self, pos): + "Remove the ending at the current position" + if pos.isout(): + Trace.error('No ending out of bounds') + return '' + ending = self.findending(pos) + if not ending: + Trace.error('No ending at ' + pos.current()) + return '' + for each in reversed(self.endings): + self.endings.remove(each) + if each == ending: + return each.ending + elif not each.optional: + Trace.error('Removed non-optional ending ' + each) + Trace.error('No endings left') + return '' + + def findending(self, pos): + "Find the ending at the current position" + if len(self.endings) == 0: + return None + for index, ending in enumerate(reversed(self.endings)): + if ending.checkin(pos): + return ending + if not ending.optional: + return None + return None + + def checkpending(self): + "Check if there are any pending endings" + if len(self.endings) != 0: + Trace.error('Pending ' + unicode(self) + ' left open') + + def __unicode__(self): + "Printable representation" + string = 'endings [' + for ending in self.endings: + string += unicode(ending) + ',' + if len(self.endings) > 0: + string = string[:-1] + return string + ']' + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class PositionEnding(object): + "An ending for a parsing position" + + def __init__(self, ending, optional): + self.ending = ending + self.optional = optional + + def checkin(self, pos): + "Check for the ending" + return pos.checkfor(self.ending) + + def __unicode__(self): + "Printable representation" + string = 'Ending ' + self.ending + if self.optional: + string += ' (optional)' + return string + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class Position(Globable): + """A position in a text to parse. + Including those in Globable, functions to implement by subclasses are: + skip(), identifier(), extract(), isout() and current().""" + + def __init__(self): + Globable.__init__(self) + + def skip(self, string): + "Skip a string" + Trace.error('Unimplemented skip()') + + def identifier(self): + "Return an identifier for the current position." + Trace.error('Unimplemented identifier()') + return 'Error' + + def extract(self, length): + "Extract the next string of the given length, or None if not enough text," + "without advancing the parse position." + Trace.error('Unimplemented extract()') + return None + + def checkfor(self, string): + "Check for a string at the given position." + return string == self.extract(len(string)) + + def checkforlower(self, string): + "Check for a string in lower case." + extracted = self.extract(len(string)) + if not extracted: + return False + return string.lower() == self.extract(len(string)).lower() + + def skipcurrent(self): + "Return the current character and skip it." + current = self.current() + self.skip(current) + return current + + def __next__(self): + "Advance the position and return the next character." + self.skipcurrent() + return self.current() + + if sys.version_info < (3, 0): + next = __next__ + + def checkskip(self, string): + "Check for a string at the given position; if there, skip it" + if not self.checkfor(string): + return False + self.skip(string) + return True + + def error(self, message): + "Show an error message and the position identifier." + Trace.error(message + ': ' + self.identifier()) + +class TextPosition(Position): + "A parse position based on a raw text." + + def __init__(self, text): + "Create the position from elyxer.some text." + Position.__init__(self) + self.pos = 0 + self.text = text + self.checkbytemark() + + def skip(self, string): + "Skip a string of characters." + self.pos += len(string) + + def identifier(self): + "Return a sample of the remaining text." + length = 30 + if self.pos + length > len(self.text): + length = len(self.text) - self.pos + return '*' + self.text[self.pos:self.pos + length] + '*' + + def isout(self): + "Find out if we are out of the text yet." + return self.pos >= len(self.text) + + def current(self): + "Return the current character, assuming we are not out." + return self.text[self.pos] + + def extract(self, length): + "Extract the next string of the given length, or None if not enough text." + if self.pos + length > len(self.text): + return None + return self.text[self.pos : self.pos + length] + +class FilePosition(Position): + "A parse position based on an underlying file." + + def __init__(self, filename): + "Create the position from a file." + Position.__init__(self) + self.reader = LineReader(filename) + self.pos = 0 + self.checkbytemark() + + def skip(self, string): + "Skip a string of characters." + length = len(string) + while self.pos + length > len(self.reader.currentline()): + length -= len(self.reader.currentline()) - self.pos + 1 + self.nextline() + self.pos += length + + def currentline(self): + "Get the current line of the underlying file." + return self.reader.currentline() + + def nextline(self): + "Go to the next line." + self.reader.nextline() + self.pos = 0 + + def linenumber(self): + "Return the line number of the file." + return self.reader.linenumber + 1 + + def identifier(self): + "Return the current line and line number in the file." + before = self.reader.currentline()[:self.pos - 1] + after = self.reader.currentline()[self.pos:] + return 'line ' + unicode(self.getlinenumber()) + ': ' + before + '*' + after + + def isout(self): + "Find out if we are out of the text yet." + if self.pos > len(self.reader.currentline()): + if self.pos > len(self.reader.currentline()) + 1: + Trace.error('Out of the line ' + self.reader.currentline() + ': ' + unicode(self.pos)) + self.nextline() + return self.reader.finished() + + def current(self): + "Return the current character, assuming we are not out." + if self.pos == len(self.reader.currentline()): + return '\n' + if self.pos > len(self.reader.currentline()): + Trace.error('Out of the line ' + self.reader.currentline() + ': ' + unicode(self.pos)) + return '*' + return self.reader.currentline()[self.pos] + + def extract(self, length): + "Extract the next string of the given length, or None if not enough text." + if self.pos + length > len(self.reader.currentline()): + return None + return self.reader.currentline()[self.pos : self.pos + length] + + + +class Container(object): + "A container for text and objects in a lyx file" + + partkey = None + parent = None + begin = None + + def __init__(self): + self.contents = list() + + def process(self): + "Process contents" + pass + + def gethtml(self): + "Get the resulting HTML" + html = self.output.gethtml(self) + if isinstance(html, basestring): + Trace.error('Raw string ' + html) + html = [html] + return self.escapeall(html) + + def escapeall(self, lines): + "Escape all lines in an array according to the output options." + result = [] + for line in lines: + if Options.html: + line = self.escape(line, EscapeConfig.html) + if Options.iso885915: + line = self.escape(line, EscapeConfig.iso885915) + line = self.escapeentities(line) + elif not Options.unicode: + line = self.escape(line, EscapeConfig.nonunicode) + result.append(line) + return result + + def escape(self, line, replacements = EscapeConfig.entities): + "Escape a line with replacements from elyxer.a map" + pieces = sorted(replacements.keys()) + # do them in order + for piece in pieces: + if piece in line: + line = line.replace(piece, replacements[piece]) + return line + + def escapeentities(self, line): + "Escape all Unicode characters to HTML entities." + result = '' + pos = TextPosition(line) + while not pos.finished(): + if ord(pos.current()) > 128: + codepoint = hex(ord(pos.current())) + if codepoint == '0xd835': + codepoint = hex(ord(next(pos)) + 0xf800) + result += '&#' + codepoint[1:] + ';' + else: + result += pos.current() + pos.skipcurrent() + return result + + def searchall(self, type): + "Search for all embedded containers of a given type" + list = [] + self.searchprocess(type, lambda container: list.append(container)) + return list + + def searchremove(self, type): + "Search for all containers of a type and remove them" + list = self.searchall(type) + for container in list: + container.parent.contents.remove(container) + return list + + def searchprocess(self, type, process): + "Search for elements of a given type and process them" + self.locateprocess(lambda container: isinstance(container, type), process) + + def locateprocess(self, locate, process): + "Search for all embedded containers and process them" + for container in self.contents: + container.locateprocess(locate, process) + if locate(container): + process(container) + + def recursivesearch(self, locate, recursive, process): + "Perform a recursive search in the container." + for container in self.contents: + if recursive(container): + container.recursivesearch(locate, recursive, process) + if locate(container): + process(container) + + def extracttext(self): + "Extract all text from elyxer.allowed containers." + result = '' + constants = ContainerExtractor(ContainerConfig.extracttext).extract(self) + for constant in constants: + result += constant.string + return result + + def group(self, index, group, isingroup): + "Group some adjoining elements into a group" + if index >= len(self.contents): + return + if hasattr(self.contents[index], 'grouped'): + return + while index < len(self.contents) and isingroup(self.contents[index]): + self.contents[index].grouped = True + group.contents.append(self.contents[index]) + self.contents.pop(index) + self.contents.insert(index, group) + + def remove(self, index): + "Remove a container but leave its contents" + container = self.contents[index] + self.contents.pop(index) + while len(container.contents) > 0: + self.contents.insert(index, container.contents.pop()) + + def tree(self, level = 0): + "Show in a tree" + Trace.debug(" " * level + unicode(self)) + for container in self.contents: + container.tree(level + 1) + + def getparameter(self, name): + "Get the value of a parameter, if present." + if not name in self.parameters: + return None + return self.parameters[name] + + def getparameterlist(self, name): + "Get the value of a comma-separated parameter as a list." + paramtext = self.getparameter(name) + if not paramtext: + return [] + return paramtext.split(',') + + def hasemptyoutput(self): + "Check if the parent's output is empty." + current = self.parent + while current: + if current.output.isempty(): + return True + current = current.parent + return False + + def __unicode__(self): + "Get a description" + if not self.begin: + return self.__class__.__name__ + return self.__class__.__name__ + '@' + unicode(self.begin) + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class BlackBox(Container): + "A container that does not output anything" + + def __init__(self): + self.parser = LoneCommand() + self.output = EmptyOutput() + self.contents = [] + +class LyXFormat(BlackBox): + "Read the lyxformat command" + + def process(self): + "Show warning if version < 276" + version = int(self.header[1]) + if version < 276: + Trace.error('Warning: unsupported old format version ' + str(version)) + if version > int(GeneralConfig.version['lyxformat']): + Trace.error('Warning: unsupported new format version ' + str(version)) + +class StringContainer(Container): + "A container for a single string" + + parsed = None + + def __init__(self): + self.parser = StringParser() + self.output = StringOutput() + self.string = '' + + def process(self): + "Replace special chars from elyxer.the contents." + if self.parsed: + self.string = self.replacespecial(self.parsed) + self.parsed = None + + def replacespecial(self, line): + "Replace all special chars from elyxer.a line" + replaced = self.escape(line, EscapeConfig.entities) + replaced = self.changeline(replaced) + if ContainerConfig.string['startcommand'] in replaced and len(replaced) > 1: + # unprocessed commands + if self.begin: + message = 'Unknown command at ' + unicode(self.begin) + ': ' + else: + message = 'Unknown command: ' + Trace.error(message + replaced.strip()) + return replaced + + def changeline(self, line): + line = self.escape(line, EscapeConfig.chars) + if not ContainerConfig.string['startcommand'] in line: + return line + line = self.escape(line, EscapeConfig.commands) + return line + + def extracttext(self): + "Return all text." + return self.string + + def __unicode__(self): + "Return a printable representation." + result = 'StringContainer' + if self.begin: + result += '@' + unicode(self.begin) + ellipsis = '...' + if len(self.string.strip()) <= 15: + ellipsis = '' + return result + ' (' + self.string.strip()[:15] + ellipsis + ')' + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class Constant(StringContainer): + "A constant string" + + def __init__(self, text): + self.contents = [] + self.string = text + self.output = StringOutput() + + def __unicode__(self): + return 'Constant: ' + self.string + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class TaggedText(Container): + "Text inside a tag" + + output = None + + def __init__(self): + self.parser = TextParser(self) + self.output = TaggedOutput() + + def complete(self, contents, tag, breaklines=False): + "Complete the tagged text and return it" + self.contents = contents + self.output.tag = tag + self.output.breaklines = breaklines + return self + + def constant(self, text, tag, breaklines=False): + "Complete the tagged text with a constant" + constant = Constant(text) + return self.complete([constant], tag, breaklines) + + def __unicode__(self): + "Return a printable representation." + if not hasattr(self.output, 'tag'): + return 'Emtpy tagged text' + if not self.output.tag: + return 'Tagged <unknown tag>' + return 'Tagged <' + self.output.tag + '>' + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class DocumentParameters(object): + "Global parameters for the document." + + pdftitle = None + indentstandard = False + tocdepth = 10 + startinglevel = 0 + maxdepth = 10 + language = None + bibliography = None + outputchanges = False + displaymode = False + + + + + + +class FormulaParser(Parser): + "Parses a formula" + + def parseheader(self, reader): + "See if the formula is inlined" + self.begin = reader.linenumber + 1 + type = self.parsetype(reader) + if not type: + reader.nextline() + type = self.parsetype(reader) + if not type: + Trace.error('Unknown formula type in ' + reader.currentline().strip()) + return ['unknown'] + return [type] + + def parsetype(self, reader): + "Get the formula type from the first line." + if reader.currentline().find(FormulaConfig.starts['simple']) >= 0: + return 'inline' + if reader.currentline().find(FormulaConfig.starts['complex']) >= 0: + return 'block' + if reader.currentline().find(FormulaConfig.starts['unnumbered']) >= 0: + return 'block' + if reader.currentline().find(FormulaConfig.starts['beginbefore']) >= 0: + return 'numbered' + return None + + def parse(self, reader): + "Parse the formula until the end" + formula = self.parseformula(reader) + while not reader.currentline().startswith(self.ending): + stripped = reader.currentline().strip() + if len(stripped) > 0: + Trace.error('Unparsed formula line ' + stripped) + reader.nextline() + reader.nextline() + return formula + + def parseformula(self, reader): + "Parse the formula contents" + simple = FormulaConfig.starts['simple'] + if simple in reader.currentline(): + rest = reader.currentline().split(simple, 1)[1] + if simple in rest: + # formula is $...$ + return self.parsesingleliner(reader, simple, simple) + # formula is multiline $...$ + return self.parsemultiliner(reader, simple, simple) + if FormulaConfig.starts['complex'] in reader.currentline(): + # formula of the form \[...\] + return self.parsemultiliner(reader, FormulaConfig.starts['complex'], + FormulaConfig.endings['complex']) + beginbefore = FormulaConfig.starts['beginbefore'] + beginafter = FormulaConfig.starts['beginafter'] + if beginbefore in reader.currentline(): + if reader.currentline().strip().endswith(beginafter): + current = reader.currentline().strip() + endsplit = current.split(beginbefore)[1].split(beginafter) + startpiece = beginbefore + endsplit[0] + beginafter + endbefore = FormulaConfig.endings['endbefore'] + endafter = FormulaConfig.endings['endafter'] + endpiece = endbefore + endsplit[0] + endafter + return startpiece + self.parsemultiliner(reader, startpiece, endpiece) + endpiece + Trace.error('Missing ' + beginafter + ' in ' + reader.currentline()) + return '' + begincommand = FormulaConfig.starts['command'] + beginbracket = FormulaConfig.starts['bracket'] + if begincommand in reader.currentline() and beginbracket in reader.currentline(): + endbracket = FormulaConfig.endings['bracket'] + return self.parsemultiliner(reader, beginbracket, endbracket) + Trace.error('Formula beginning ' + reader.currentline() + ' is unknown') + return '' + + def parsesingleliner(self, reader, start, ending): + "Parse a formula in one line" + line = reader.currentline().strip() + if not start in line: + Trace.error('Line ' + line + ' does not contain formula start ' + start) + return '' + if not line.endswith(ending): + Trace.error('Formula ' + line + ' does not end with ' + ending) + return '' + index = line.index(start) + rest = line[index + len(start):-len(ending)] + reader.nextline() + return rest + + def parsemultiliner(self, reader, start, ending): + "Parse a formula in multiple lines" + formula = '' + line = reader.currentline() + if not start in line: + Trace.error('Line ' + line.strip() + ' does not contain formula start ' + start) + return '' + index = line.index(start) + line = line[index + len(start):].strip() + while not line.endswith(ending): + formula += line + '\n' + reader.nextline() + line = reader.currentline() + formula += line[:-len(ending)] + reader.nextline() + return formula + +class MacroParser(FormulaParser): + "A parser for a formula macro." + + def parseheader(self, reader): + "See if the formula is inlined" + self.begin = reader.linenumber + 1 + return ['inline'] + + def parse(self, reader): + "Parse the formula until the end" + formula = self.parsemultiliner(reader, self.parent.start, self.ending) + reader.nextline() + return formula + + +class FormulaBit(Container): + "A bit of a formula" + + type = None + size = 1 + original = '' + + def __init__(self): + "The formula bit type can be 'alpha', 'number', 'font'." + self.contents = [] + self.output = ContentsOutput() + + def setfactory(self, factory): + "Set the internal formula factory." + self.factory = factory + return self + + def add(self, bit): + "Add any kind of formula bit already processed" + self.contents.append(bit) + self.original += bit.original + bit.parent = self + + def skiporiginal(self, string, pos): + "Skip a string and add it to the original formula" + self.original += string + if not pos.checkskip(string): + Trace.error('String ' + string + ' not at ' + pos.identifier()) + + def computesize(self): + "Compute the size of the bit as the max of the sizes of all contents." + if len(self.contents) == 0: + return 1 + self.size = max([element.size for element in self.contents]) + return self.size + + def clone(self): + "Return a copy of itself." + return self.factory.parseformula(self.original) + + def __unicode__(self): + "Get a string representation" + return self.__class__.__name__ + ' read in ' + self.original + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class TaggedBit(FormulaBit): + "A tagged string in a formula" + + def constant(self, constant, tag): + "Set the constant and the tag" + self.output = TaggedOutput().settag(tag) + self.add(FormulaConstant(constant)) + return self + + def complete(self, contents, tag, breaklines = False): + "Set the constant and the tag" + self.contents = contents + self.output = TaggedOutput().settag(tag, breaklines) + return self + + def selfcomplete(self, tag): + "Set the self-closing tag, no contents (as in <hr/>)." + self.output = TaggedOutput().settag(tag, empty = True) + return self + +class FormulaConstant(Constant): + "A constant string in a formula" + + def __init__(self, string): + "Set the constant string" + Constant.__init__(self, string) + self.original = string + self.size = 1 + self.type = None + + def computesize(self): + "Compute the size of the constant: always 1." + return self.size + + def clone(self): + "Return a copy of itself." + return FormulaConstant(self.original) + + def __unicode__(self): + "Return a printable representation." + return 'Formula constant: ' + self.string + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class RawText(FormulaBit): + "A bit of text inside a formula" + + def detect(self, pos): + "Detect a bit of raw text" + return pos.current().isalpha() + + def parsebit(self, pos): + "Parse alphabetic text" + alpha = pos.globalpha() + self.add(FormulaConstant(alpha)) + self.type = 'alpha' + +class FormulaSymbol(FormulaBit): + "A symbol inside a formula" + + modified = FormulaConfig.modified + unmodified = FormulaConfig.unmodified['characters'] + + def detect(self, pos): + "Detect a symbol" + if pos.current() in FormulaSymbol.unmodified: + return True + if pos.current() in FormulaSymbol.modified: + return True + return False + + def parsebit(self, pos): + "Parse the symbol" + if pos.current() in FormulaSymbol.unmodified: + self.addsymbol(pos.current(), pos) + return + if pos.current() in FormulaSymbol.modified: + self.addsymbol(FormulaSymbol.modified[pos.current()], pos) + return + Trace.error('Symbol ' + pos.current() + ' not found') + + def addsymbol(self, symbol, pos): + "Add a symbol" + self.skiporiginal(pos.current(), pos) + self.contents.append(FormulaConstant(symbol)) + +class FormulaNumber(FormulaBit): + "A string of digits in a formula" + + def detect(self, pos): + "Detect a digit" + return pos.current().isdigit() + + def parsebit(self, pos): + "Parse a bunch of digits" + digits = pos.glob(lambda: pos.current().isdigit()) + self.add(FormulaConstant(digits)) + self.type = 'number' + +class Comment(FormulaBit): + "A LaTeX comment: % to the end of the line." + + start = FormulaConfig.starts['comment'] + + def detect(self, pos): + "Detect the %." + return pos.current() == self.start + + def parsebit(self, pos): + "Parse to the end of the line." + self.original += pos.globincluding('\n') + +class WhiteSpace(FormulaBit): + "Some white space inside a formula." + + def detect(self, pos): + "Detect the white space." + return pos.current().isspace() + + def parsebit(self, pos): + "Parse all whitespace." + self.original += pos.skipspace() + + def __unicode__(self): + "Return a printable representation." + return 'Whitespace: *' + self.original + '*' + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class Bracket(FormulaBit): + "A {} bracket inside a formula" + + start = FormulaConfig.starts['bracket'] + ending = FormulaConfig.endings['bracket'] + + def __init__(self): + "Create a (possibly literal) new bracket" + FormulaBit.__init__(self) + self.inner = None + + def detect(self, pos): + "Detect the start of a bracket" + return pos.checkfor(self.start) + + def parsebit(self, pos): + "Parse the bracket" + self.parsecomplete(pos, self.innerformula) + return self + + def parsetext(self, pos): + "Parse a text bracket" + self.parsecomplete(pos, self.innertext) + return self + + def parseliteral(self, pos): + "Parse a literal bracket" + self.parsecomplete(pos, self.innerliteral) + return self + + def parsecomplete(self, pos, innerparser): + "Parse the start and end marks" + if not pos.checkfor(self.start): + Trace.error('Bracket should start with ' + self.start + ' at ' + pos.identifier()) + return None + self.skiporiginal(self.start, pos) + pos.pushending(self.ending) + innerparser(pos) + self.original += pos.popending(self.ending) + self.computesize() + + def innerformula(self, pos): + "Parse a whole formula inside the bracket" + while not pos.finished(): + self.add(self.factory.parseany(pos)) + + def innertext(self, pos): + "Parse some text inside the bracket, following textual rules." + specialchars = list(FormulaConfig.symbolfunctions.keys()) + specialchars.append(FormulaConfig.starts['command']) + specialchars.append(FormulaConfig.starts['bracket']) + specialchars.append(Comment.start) + while not pos.finished(): + if pos.current() in specialchars: + self.add(self.factory.parseany(pos)) + if pos.checkskip(' '): + self.original += ' ' + else: + self.add(FormulaConstant(pos.skipcurrent())) + + def innerliteral(self, pos): + "Parse a literal inside the bracket, which does not generate HTML." + self.literal = '' + while not pos.finished() and not pos.current() == self.ending: + if pos.current() == self.start: + self.parseliteral(pos) + else: + self.literal += pos.skipcurrent() + self.original += self.literal + +class SquareBracket(Bracket): + "A [] bracket inside a formula" + + start = FormulaConfig.starts['squarebracket'] + ending = FormulaConfig.endings['squarebracket'] + + def clone(self): + "Return a new square bracket with the same contents." + bracket = SquareBracket() + bracket.contents = self.contents + return bracket + + +class MathsProcessor(object): + "A processor for a maths construction inside the FormulaProcessor." + + def process(self, contents, index): + "Process an element inside a formula." + Trace.error('Unimplemented process() in ' + unicode(self)) + + def __unicode__(self): + "Return a printable description." + return 'Maths processor ' + self.__class__.__name__ + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class FormulaProcessor(object): + "A processor specifically for formulas." + + processors = [] + + def process(self, bit): + "Process the contents of every formula bit, recursively." + self.processcontents(bit) + self.processinsides(bit) + self.traversewhole(bit) + + def processcontents(self, bit): + "Process the contents of a formula bit." + if not isinstance(bit, FormulaBit): + return + bit.process() + for element in bit.contents: + self.processcontents(element) + + def processinsides(self, bit): + "Process the insides (limits, brackets) in a formula bit." + if not isinstance(bit, FormulaBit): + return + for index, element in enumerate(bit.contents): + for processor in self.processors: + processor.process(bit.contents, index) + # continue with recursive processing + self.processinsides(element) + + def traversewhole(self, formula): + "Traverse over the contents to alter variables and space units." + last = None + for bit, contents in self.traverse(formula): + if bit.type == 'alpha': + self.italicize(bit, contents) + elif bit.type == 'font' and last and last.type == 'number': + bit.contents.insert(0, FormulaConstant(u' ')) + last = bit + + def traverse(self, bit): + "Traverse a formula and yield a flattened structure of (bit, list) pairs." + for element in bit.contents: + if hasattr(element, 'type') and element.type: + yield (element, bit.contents) + elif isinstance(element, FormulaBit): + for pair in self.traverse(element): + yield pair + + def italicize(self, bit, contents): + "Italicize the given bit of text." + index = contents.index(bit) + contents[index] = TaggedBit().complete([bit], 'i') + + + + +class Formula(Container): + "A LaTeX formula" + + def __init__(self): + self.parser = FormulaParser() + self.output = TaggedOutput().settag('span class="formula"') + + def process(self): + "Convert the formula to tags" + if self.header[0] == 'inline': + DocumentParameters.displaymode = False + else: + DocumentParameters.displaymode = True + self.output.settag('div class="formula"', True) + if Options.jsmath: + self.jsmath() + elif Options.mathjax: + self.mathjax() + elif Options.googlecharts: + self.googlecharts() + else: + self.classic() + + def jsmath(self): + "Make the contents for jsMath." + if self.header[0] != 'inline': + self.output = TaggedOutput().settag('div class="math"') + else: + self.output = TaggedOutput().settag('span class="math"') + self.contents = [Constant(self.parsed)] + + def mathjax(self): + "Make the contents for MathJax." + self.output.tag = 'span class="MathJax_Preview"' + tag = 'script type="math/tex' + if self.header[0] != 'inline': + tag += ';mode=display' + self.contents = [TaggedText().constant(self.parsed, tag + '"', True)] + + def googlecharts(self): + "Make the contents using Google Charts http://code.google.com/apis/chart/." + url = FormulaConfig.urls['googlecharts'] + quote_plus(self.parsed) + img = '<img class="chart" src="' + url + '" alt="' + self.parsed + '"/>' + self.contents = [Constant(img)] + + def classic(self): + "Make the contents using classic output generation with XHTML and CSS." + whole = FormulaFactory().parseformula(self.parsed) + FormulaProcessor().process(whole) + whole.parent = self + self.contents = [whole] + + def parse(self, pos): + "Parse using a parse position instead of self.parser." + if pos.checkskip('$$'): + self.parsedollarblock(pos) + elif pos.checkskip('$'): + self.parsedollarinline(pos) + elif pos.checkskip('\\('): + self.parseinlineto(pos, '\\)') + elif pos.checkskip('\\['): + self.parseblockto(pos, '\\]') + else: + pos.error('Unparseable formula') + self.process() + return self + + def parsedollarinline(self, pos): + "Parse a $...$ formula." + self.header = ['inline'] + self.parsedollar(pos) + + def parsedollarblock(self, pos): + "Parse a $$...$$ formula." + self.header = ['block'] + self.parsedollar(pos) + if not pos.checkskip('$'): + pos.error('Formula should be $$...$$, but last $ is missing.') + + def parsedollar(self, pos): + "Parse to the next $." + pos.pushending('$') + self.parsed = pos.globexcluding('$') + pos.popending('$') + + def parseinlineto(self, pos, limit): + "Parse a \\(...\\) formula." + self.header = ['inline'] + self.parseupto(pos, limit) + + def parseblockto(self, pos, limit): + "Parse a \\[...\\] formula." + self.header = ['block'] + self.parseupto(pos, limit) + + def parseupto(self, pos, limit): + "Parse a formula that ends with the given command." + pos.pushending(limit) + self.parsed = pos.glob(lambda: True) + pos.popending(limit) + + def __unicode__(self): + "Return a printable representation." + if self.partkey and self.partkey.number: + return 'Formula (' + self.partkey.number + ')' + return 'Unnumbered formula' + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class WholeFormula(FormulaBit): + "Parse a whole formula" + + def detect(self, pos): + "Not outside the formula is enough." + return not pos.finished() + + def parsebit(self, pos): + "Parse with any formula bit" + while not pos.finished(): + self.add(self.factory.parseany(pos)) + +class FormulaFactory(object): + "Construct bits of formula" + + # bit types will be appended later + types = [FormulaSymbol, RawText, FormulaNumber, Bracket, Comment, WhiteSpace] + skippedtypes = [Comment, WhiteSpace] + defining = False + + def __init__(self): + "Initialize the map of instances." + self.instances = dict() + + def detecttype(self, type, pos): + "Detect a bit of a given type." + if pos.finished(): + return False + return self.instance(type).detect(pos) + + def instance(self, type): + "Get an instance of the given type." + if not type in self.instances or not self.instances[type]: + self.instances[type] = self.create(type) + return self.instances[type] + + def create(self, type): + "Create a new formula bit of the given type." + return Cloner.create(type).setfactory(self) + + def clearskipped(self, pos): + "Clear any skipped types." + while not pos.finished(): + if not self.skipany(pos): + return + return + + def skipany(self, pos): + "Skip any skipped types." + for type in self.skippedtypes: + if self.instance(type).detect(pos): + return self.parsetype(type, pos) + return None + + def parseany(self, pos): + "Parse any formula bit at the current location." + for type in self.types + self.skippedtypes: + if self.detecttype(type, pos): + return self.parsetype(type, pos) + Trace.error('Unrecognized formula at ' + pos.identifier()) + return FormulaConstant(pos.skipcurrent()) + + def parsetype(self, type, pos): + "Parse the given type and return it." + bit = self.instance(type) + self.instances[type] = None + returnedbit = bit.parsebit(pos) + if returnedbit: + return returnedbit.setfactory(self) + return bit + + def parseformula(self, formula): + "Parse a string of text that contains a whole formula." + pos = TextPosition(formula) + whole = self.create(WholeFormula) + if whole.detect(pos): + whole.parsebit(pos) + return whole + # no formula found + if not pos.finished(): + Trace.error('Unknown formula at: ' + pos.identifier()) + whole.add(TaggedBit().constant(formula, 'span class="unknown"')) + return whole + + +class Translator(object): + "Reads the configuration file and tries to find a translation." + "Otherwise falls back to the messages in the config file." + + instance = None + + def translate(cls, key): + "Get the translated message for a key." + return cls.instance.getmessage(key) + + translate = classmethod(translate) + + def __init__(self): + self.translation = None + self.first = True + + def findtranslation(self): + "Find the translation for the document language." + self.langcodes = None + if not DocumentParameters.language: + Trace.error('No language in document') + return + if not DocumentParameters.language in TranslationConfig.languages: + Trace.error('Unknown language ' + DocumentParameters.language) + return + if TranslationConfig.languages[DocumentParameters.language] == 'en': + return + langcodes = [TranslationConfig.languages[DocumentParameters.language]] + try: + self.translation = gettext.translation('elyxer', None, langcodes) + except IOError: + Trace.error('No translation for ' + unicode(langcodes)) + + def getmessage(self, key): + "Get the translated message for the given key." + if self.first: + self.findtranslation() + self.first = False + message = self.getuntranslated(key) + if not self.translation: + return message + try: + message = self.translation.ugettext(message) + except IOError: + pass + return message + + def getuntranslated(self, key): + "Get the untranslated message." + if not key in TranslationConfig.constants: + Trace.error('Cannot translate ' + key) + return key + return TranslationConfig.constants[key] + +Translator.instance = Translator() + + + +class NumberCounter(object): + "A counter for numbers (by default)." + "The type can be changed to return letters, roman numbers..." + + name = None + value = None + mode = None + master = None + + letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + symbols = NumberingConfig.sequence['symbols'] + romannumerals = [ + ('M', 1000), ('CM', 900), ('D', 500), ('CD', 400), ('C', 100), + ('XC', 90), ('L', 50), ('XL', 40), ('X', 10), ('IX', 9), ('V', 5), + ('IV', 4), ('I', 1) + ] + + def __init__(self, name): + "Give a name to the counter." + self.name = name + + def setmode(self, mode): + "Set the counter mode. Can be changed at runtime." + self.mode = mode + return self + + def init(self, value): + "Set an initial value." + self.value = value + + def gettext(self): + "Get the next value as a text string." + return unicode(self.value) + + def getletter(self): + "Get the next value as a letter." + return self.getsequence(self.letters) + + def getsymbol(self): + "Get the next value as a symbol." + return self.getsequence(self.symbols) + + def getsequence(self, sequence): + "Get the next value from elyxer.a sequence." + return sequence[(self.value - 1) % len(sequence)] + + def getroman(self): + "Get the next value as a roman number." + result = '' + number = self.value + for numeral, value in self.romannumerals: + if number >= value: + result += numeral * (number / value) + number = number % value + return result + + def getvalue(self): + "Get the current value as configured in the current mode." + if not self.mode or self.mode in ['text', '1']: + return self.gettext() + if self.mode == 'A': + return self.getletter() + if self.mode == 'a': + return self.getletter().lower() + if self.mode == 'I': + return self.getroman() + if self.mode == '*': + return self.getsymbol() + Trace.error('Unknown counter mode ' + self.mode) + return self.gettext() + + def getnext(self): + "Increase the current value and get the next value as configured." + if not self.value: + self.value = 0 + self.value += 1 + return self.getvalue() + + def reset(self): + "Reset the counter." + self.value = 0 + + def __unicode__(self): + "Return a printable representation." + result = 'Counter ' + self.name + if self.mode: + result += ' in mode ' + self.mode + return result + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class DependentCounter(NumberCounter): + "A counter which depends on another one (the master)." + + def setmaster(self, master): + "Set the master counter." + self.master = master + self.last = self.master.getvalue() + return self + + def getnext(self): + "Increase or, if the master counter has changed, restart." + if self.last != self.master.getvalue(): + self.reset() + value = NumberCounter.getnext(self) + self.last = self.master.getvalue() + return value + + def getvalue(self): + "Get the value of the combined counter: master.dependent." + return self.master.getvalue() + '.' + NumberCounter.getvalue(self) + +class NumberGenerator(object): + "A number generator for unique sequences and hierarchical structures. Used in:" + " * ordered part numbers: Chapter 3, Section 5.3." + " * unique part numbers: Footnote 15, Bibliography cite [15]." + " * chaptered part numbers: Figure 3.15, Equation (8.3)." + " * unique roman part numbers: Part I, Book IV." + + chaptered = None + generator = None + + romanlayouts = [x.lower() for x in NumberingConfig.layouts['roman']] + orderedlayouts = [x.lower() for x in NumberingConfig.layouts['ordered']] + + counters = dict() + appendix = None + + def deasterisk(self, type): + "Remove the possible asterisk in a layout type." + return type.replace('*', '') + + def isunique(self, type): + "Find out if the layout type corresponds to a unique part." + return self.isroman(type) + + def isroman(self, type): + "Find out if the layout type should have roman numeration." + return self.deasterisk(type).lower() in self.romanlayouts + + def isinordered(self, type): + "Find out if the layout type corresponds to an (un)ordered part." + return self.deasterisk(type).lower() in self.orderedlayouts + + def isnumbered(self, type): + "Find out if the type for a layout corresponds to a numbered layout." + if '*' in type: + return False + if self.isroman(type): + return True + if not self.isinordered(type): + return False + if self.getlevel(type) > DocumentParameters.maxdepth: + return False + return True + + def isunordered(self, type): + "Find out if the type contains an asterisk, basically." + return '*' in type + + def getlevel(self, type): + "Get the level that corresponds to a layout type." + if self.isunique(type): + return 0 + if not self.isinordered(type): + Trace.error('Unknown layout type ' + type) + return 0 + type = self.deasterisk(type).lower() + level = self.orderedlayouts.index(type) + 1 + return level - DocumentParameters.startinglevel + + def getparttype(self, type): + "Obtain the type for the part: without the asterisk, " + "and switched to Appendix if necessary." + if NumberGenerator.appendix and self.getlevel(type) == 1: + return 'Appendix' + return self.deasterisk(type) + + def generate(self, type): + "Generate a number for a layout type." + "Unique part types such as Part or Book generate roman numbers: Part I." + "Ordered part types return dot-separated tuples: Chapter 5, Subsection 2.3.5." + "Everything else generates unique numbers: Bibliography [1]." + "Each invocation results in a new number." + return self.getcounter(type).getnext() + + def getcounter(self, type): + "Get the counter for the given type." + type = type.lower() + if not type in self.counters: + self.counters[type] = self.create(type) + return self.counters[type] + + def create(self, type): + "Create a counter for the given type." + if self.isnumbered(type) and self.getlevel(type) > 1: + index = self.orderedlayouts.index(type) + above = self.orderedlayouts[index - 1] + master = self.getcounter(above) + return self.createdependent(type, master) + counter = NumberCounter(type) + if self.isroman(type): + counter.setmode('I') + return counter + + def getdependentcounter(self, type, master): + "Get (or create) a counter of the given type that depends on another." + if not type in self.counters or not self.counters[type].master: + self.counters[type] = self.createdependent(type, master) + return self.counters[type] + + def createdependent(self, type, master): + "Create a dependent counter given the master." + return DependentCounter(type).setmaster(master) + + def startappendix(self): + "Start appendices here." + firsttype = self.orderedlayouts[DocumentParameters.startinglevel] + counter = self.getcounter(firsttype) + counter.setmode('A').reset() + NumberGenerator.appendix = True + +class ChapteredGenerator(NumberGenerator): + "Generate chaptered numbers, as in Chapter.Number." + "Used in equations, figures: Equation (5.3), figure 8.15." + + def generate(self, type): + "Generate a number which goes with first-level numbers (chapters). " + "For the article classes a unique number is generated." + if DocumentParameters.startinglevel > 0: + return NumberGenerator.generator.generate(type) + chapter = self.getcounter('Chapter') + return self.getdependentcounter(type, chapter).getnext() + + +NumberGenerator.chaptered = ChapteredGenerator() +NumberGenerator.generator = NumberGenerator() + + + + + + +class ContainerSize(object): + "The size of a container." + + width = None + height = None + maxwidth = None + maxheight = None + scale = None + + def set(self, width = None, height = None): + "Set the proper size with width and height." + self.setvalue('width', width) + self.setvalue('height', height) + return self + + def setmax(self, maxwidth = None, maxheight = None): + "Set max width and/or height." + self.setvalue('maxwidth', maxwidth) + self.setvalue('maxheight', maxheight) + return self + + def readparameters(self, container): + "Read some size parameters off a container." + self.setparameter(container, 'width') + self.setparameter(container, 'height') + self.setparameter(container, 'scale') + self.checkvalidheight(container) + return self + + def setparameter(self, container, name): + "Read a size parameter off a container, and set it if present." + value = container.getparameter(name) + self.setvalue(name, value) + + def setvalue(self, name, value): + "Set the value of a parameter name, only if it's valid." + value = self.processparameter(value) + if value: + setattr(self, name, value) + + def checkvalidheight(self, container): + "Check if the height parameter is valid; otherwise erase it." + heightspecial = container.getparameter('height_special') + if self.height and self.extractnumber(self.height) == '1' and heightspecial == 'totalheight': + self.height = None + + def processparameter(self, value): + "Do the full processing on a parameter." + if not value: + return None + if self.extractnumber(value) == '0': + return None + for ignored in StyleConfig.size['ignoredtexts']: + if ignored in value: + value = value.replace(ignored, '') + return value + + def extractnumber(self, text): + "Extract the first number in the given text." + result = '' + decimal = False + for char in text: + if char.isdigit(): + result += char + elif char == '.' and not decimal: + result += char + decimal = True + else: + return result + return result + + def checkimage(self, width, height): + "Check image dimensions, set them if possible." + if width: + self.maxwidth = unicode(width) + 'px' + if self.scale and not self.width: + self.width = self.scalevalue(width) + if height: + self.maxheight = unicode(height) + 'px' + if self.scale and not self.height: + self.height = self.scalevalue(height) + if self.width and not self.height: + self.height = 'auto' + if self.height and not self.width: + self.width = 'auto' + + def scalevalue(self, value): + "Scale the value according to the image scale and return it as unicode." + scaled = value * int(self.scale) / 100 + return unicode(int(scaled)) + 'px' + + def removepercentwidth(self): + "Remove percent width if present, to set it at the figure level." + if not self.width: + return None + if not '%' in self.width: + return None + width = self.width + self.width = None + if self.height == 'auto': + self.height = None + return width + + def addstyle(self, container): + "Add the proper style attribute to the output tag." + if not isinstance(container.output, TaggedOutput): + Trace.error('No tag to add style, in ' + unicode(container)) + if not self.width and not self.height and not self.maxwidth and not self.maxheight: + # nothing to see here; move along + return + tag = ' style="' + tag += self.styleparameter('width') + tag += self.styleparameter('maxwidth') + tag += self.styleparameter('height') + tag += self.styleparameter('maxheight') + if tag[-1] == ' ': + tag = tag[:-1] + tag += '"' + container.output.tag += tag + + def styleparameter(self, name): + "Get the style for a single parameter." + value = getattr(self, name) + if value: + return name.replace('max', 'max-') + ': ' + value + '; ' + return '' + + + +class QuoteContainer(Container): + "A container for a pretty quote" + + def __init__(self): + self.parser = BoundedParser() + self.output = FixedOutput() + + def process(self): + "Process contents" + self.type = self.header[2] + if not self.type in StyleConfig.quotes: + Trace.error('Quote type ' + self.type + ' not found') + self.html = ['"'] + return + self.html = [StyleConfig.quotes[self.type]] + +class LyXLine(Container): + "A Lyx line" + + def __init__(self): + self.parser = LoneCommand() + self.output = FixedOutput() + + def process(self): + self.html = ['<hr class="line" />'] + +class EmphaticText(TaggedText): + "Text with emphatic mode" + + def process(self): + self.output.tag = 'i' + +class ShapedText(TaggedText): + "Text shaped (italic, slanted)" + + def process(self): + self.type = self.header[1] + if not self.type in TagConfig.shaped: + Trace.error('Unrecognized shape ' + self.header[1]) + self.output.tag = 'span' + return + self.output.tag = TagConfig.shaped[self.type] + +class VersalitasText(TaggedText): + "Text in versalitas" + + def process(self): + self.output.tag = 'span class="versalitas"' + +class ColorText(TaggedText): + "Colored text" + + def process(self): + self.color = self.header[1] + self.output.tag = 'span class="' + self.color + '"' + +class SizeText(TaggedText): + "Sized text" + + def process(self): + self.size = self.header[1] + self.output.tag = 'span class="' + self.size + '"' + +class BoldText(TaggedText): + "Bold text" + + def process(self): + self.output.tag = 'b' + +class TextFamily(TaggedText): + "A bit of text from elyxer.a different family" + + def process(self): + "Parse the type of family" + self.type = self.header[1] + if not self.type in TagConfig.family: + Trace.error('Unrecognized family ' + type) + self.output.tag = 'span' + return + self.output.tag = TagConfig.family[self.type] + +class Hfill(TaggedText): + "Horizontall fill" + + def process(self): + self.output.tag = 'span class="hfill"' + +class BarredText(TaggedText): + "Text with a bar somewhere" + + def process(self): + "Parse the type of bar" + self.type = self.header[1] + if not self.type in TagConfig.barred: + Trace.error('Unknown bar type ' + self.type) + self.output.tag = 'span' + return + self.output.tag = TagConfig.barred[self.type] + +class LangLine(TaggedText): + "A line with language information" + + def process(self): + "Only generate a span with lang info when the language is recognized." + lang = self.header[1] + if not lang in TranslationConfig.languages: + self.output = ContentsOutput() + return + isolang = TranslationConfig.languages[lang] + self.output = TaggedOutput().settag('span lang="' + isolang + '"', False) + +class InsetLength(BlackBox): + "A length measure inside an inset." + + def process(self): + self.length = self.header[1] + +class Space(Container): + "A space of several types" + + def __init__(self): + self.parser = InsetParser() + self.output = FixedOutput() + + def process(self): + self.type = self.header[2] + if self.type not in StyleConfig.hspaces: + Trace.error('Unknown space type ' + self.type) + self.html = [' '] + return + self.html = [StyleConfig.hspaces[self.type]] + length = self.getlength() + if not length: + return + self.output = TaggedOutput().settag('span class="hspace"', False) + ContainerSize().set(length).addstyle(self) + + def getlength(self): + "Get the space length from elyxer.the contents or parameters." + if len(self.contents) == 0 or not isinstance(self.contents[0], InsetLength): + return None + return self.contents[0].length + +class VerticalSpace(Container): + "An inset that contains a vertical space." + + def __init__(self): + self.parser = InsetParser() + self.output = FixedOutput() + + def process(self): + "Set the correct tag" + self.type = self.header[2] + if self.type not in StyleConfig.vspaces: + self.output = TaggedOutput().settag('div class="vspace" style="height: ' + self.type + ';"', True) + return + self.html = [StyleConfig.vspaces[self.type]] + +class Align(Container): + "Bit of aligned text" + + def __init__(self): + self.parser = ExcludingParser() + self.output = TaggedOutput().setbreaklines(True) + + def process(self): + self.output.tag = 'div class="' + self.header[1] + '"' + +class Newline(Container): + "A newline" + + def __init__(self): + self.parser = LoneCommand() + self.output = FixedOutput() + + def process(self): + "Process contents" + self.html = ['<br/>\n'] + +class NewPage(Newline): + "A new page" + + def process(self): + "Process contents" + self.html = ['<p><br/>\n</p>\n'] + +class Separator(Container): + "A separator string which is not extracted by extracttext()." + + def __init__(self, constant): + self.output = FixedOutput() + self.contents = [] + self.html = [constant] + +class StrikeOut(TaggedText): + "Striken out text." + + def process(self): + "Set the output tag to strike." + self.output.tag = 'strike' + +class StartAppendix(BlackBox): + "Mark to start an appendix here." + "From this point on, all chapters become appendices." + + def process(self): + "Activate the special numbering scheme for appendices, using letters." + NumberGenerator.generator.startappendix() + + + + + + +class Link(Container): + "A link to another part of the document" + + anchor = None + url = None + type = None + page = None + target = None + destination = None + title = None + + def __init__(self): + "Initialize the link, add target if configured." + self.contents = [] + self.parser = InsetParser() + self.output = LinkOutput() + if Options.target: + self.target = Options.target + + def complete(self, text, anchor = None, url = None, type = None, title = None): + "Complete the link." + self.contents = [Constant(text)] + if anchor: + self.anchor = anchor + if url: + self.url = url + if type: + self.type = type + if title: + self.title = title + return self + + def computedestination(self): + "Use the destination link to fill in the destination URL." + if not self.destination: + return + self.url = '' + if self.destination.anchor: + self.url = '#' + self.destination.anchor + if self.destination.page: + self.url = self.destination.page + self.url + + def setmutualdestination(self, destination): + "Set another link as destination, and set its destination to this one." + self.destination = destination + destination.destination = self + + def __unicode__(self): + "Return a printable representation." + result = 'Link' + if self.anchor: + result += ' #' + self.anchor + if self.url: + result += ' to ' + self.url + return result + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class URL(Link): + "A clickable URL" + + def process(self): + "Read URL from elyxer.parameters" + target = self.escape(self.getparameter('target')) + self.url = target + type = self.getparameter('type') + if type: + self.url = self.escape(type) + target + name = self.getparameter('name') + if not name: + name = target + self.contents = [Constant(name)] + +class FlexURL(URL): + "A flexible URL" + + def process(self): + "Read URL from elyxer.contents" + self.url = self.extracttext() + +class LinkOutput(ContainerOutput): + "A link pointing to some destination" + "Or an anchor (destination)" + + def gethtml(self, link): + "Get the HTML code for the link" + type = link.__class__.__name__ + if link.type: + type = link.type + tag = 'a class="' + type + '"' + if link.anchor: + tag += ' name="' + link.anchor + '"' + if link.destination: + link.computedestination() + if link.url: + tag += ' href="' + link.url + '"' + if link.target: + tag += ' target="' + link.target + '"' + if link.title: + tag += ' title="' + link.title + '"' + return TaggedOutput().settag(tag).gethtml(link) + + + + + +class Postprocessor(object): + "Postprocess a container keeping some context" + + stages = [] + + def __init__(self): + self.stages = StageDict(Postprocessor.stages, self) + self.current = None + self.last = None + + def postprocess(self, next): + "Postprocess a container and its contents." + self.postrecursive(self.current) + result = self.postcurrent(next) + self.last = self.current + self.current = next + return result + + def postrecursive(self, container): + "Postprocess the container contents recursively" + if not hasattr(container, 'contents'): + return + if len(container.contents) == 0: + return + if hasattr(container, 'postprocess'): + if not container.postprocess: + return + postprocessor = Postprocessor() + contents = [] + for element in container.contents: + post = postprocessor.postprocess(element) + if post: + contents.append(post) + # two rounds to empty the pipeline + for i in range(2): + post = postprocessor.postprocess(None) + if post: + contents.append(post) + container.contents = contents + + def postcurrent(self, next): + "Postprocess the current element taking into account next and last." + stage = self.stages.getstage(self.current) + if not stage: + return self.current + return stage.postprocess(self.last, self.current, next) + +class StageDict(object): + "A dictionary of stages corresponding to classes" + + def __init__(self, classes, postprocessor): + "Instantiate an element from elyxer.each class and store as a dictionary" + instances = self.instantiate(classes, postprocessor) + self.stagedict = dict([(x.processedclass, x) for x in instances]) + + def instantiate(self, classes, postprocessor): + "Instantiate an element from elyxer.each class" + stages = [x.__new__(x) for x in classes] + for element in stages: + element.__init__() + element.postprocessor = postprocessor + return stages + + def getstage(self, element): + "Get the stage for a given element, if the type is in the dict" + if not element.__class__ in self.stagedict: + return None + return self.stagedict[element.__class__] + + + +class Label(Link): + "A label to be referenced" + + names = dict() + lastlayout = None + + def __init__(self): + Link.__init__(self) + self.lastnumbered = None + + def process(self): + "Process a label container." + key = self.getparameter('name') + self.create(' ', key) + self.lastnumbered = Label.lastlayout + + def create(self, text, key, type = 'Label'): + "Create the label for a given key." + self.key = key + self.complete(text, anchor = key, type = type) + Label.names[key] = self + if key in Reference.references: + for reference in Reference.references[key]: + reference.destination = self + return self + + def findpartkey(self): + "Get the part key for the latest numbered container seen." + numbered = self.numbered(self) + if numbered and numbered.partkey: + return numbered.partkey + return '' + + def numbered(self, container): + "Get the numbered container for the label." + if container.partkey: + return container + if not container.parent: + if self.lastnumbered: + return self.lastnumbered + return None + return self.numbered(container.parent) + + def __unicode__(self): + "Return a printable representation." + if not hasattr(self, 'key'): + return 'Unnamed label' + return 'Label ' + self.key + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class Reference(Link): + "A reference to a label." + + references = dict() + key = 'none' + + def process(self): + "Read the reference and set the arrow." + self.key = self.getparameter('reference') + if self.key in Label.names: + self.direction = u'↑' + label = Label.names[self.key] + else: + self.direction = u'↓' + label = Label().complete(' ', self.key, 'preref') + self.destination = label + self.formatcontents() + if not self.key in Reference.references: + Reference.references[self.key] = [] + Reference.references[self.key].append(self) + + def formatcontents(self): + "Format the reference contents." + formatkey = self.getparameter('LatexCommand') + if not formatkey: + formatkey = 'ref' + self.formatted = u'↕' + if formatkey in StyleConfig.referenceformats: + self.formatted = StyleConfig.referenceformats[formatkey] + else: + Trace.error('Unknown reference format ' + formatkey) + self.replace(u'↕', self.direction) + self.replace('#', '1') + self.replace('on-page', Translator.translate('on-page')) + partkey = self.destination.findpartkey() + # only if partkey and partkey.number are not null, send partkey.number + self.replace('@', partkey and partkey.number) + self.replace(u'¶', partkey and partkey.tocentry) + if not '$' in self.formatted or not partkey or not partkey.titlecontents: + # there is a $ left, but it should go away on preprocessing + self.contents = [Constant(self.formatted)] + return + pieces = self.formatted.split('$') + self.contents = [Constant(pieces[0])] + for piece in pieces[1:]: + self.contents += partkey.titlecontents + self.contents.append(Constant(piece)) + + def replace(self, key, value): + "Replace a key in the format template with a value." + if not key in self.formatted: + return + if not value: + value = '' + self.formatted = self.formatted.replace(key, value) + + def __unicode__(self): + "Return a printable representation." + return 'Reference ' + self.key + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class FormulaCommand(FormulaBit): + "A LaTeX command inside a formula" + + types = [] + start = FormulaConfig.starts['command'] + commandmap = None + + def detect(self, pos): + "Find the current command." + return pos.checkfor(FormulaCommand.start) + + def parsebit(self, pos): + "Parse the command." + command = self.extractcommand(pos) + bit = self.parsewithcommand(command, pos) + if bit: + return bit + if command.startswith('\\up') or command.startswith('\\Up'): + upgreek = self.parseupgreek(command, pos) + if upgreek: + return upgreek + if not self.factory.defining: + Trace.error('Unknown command ' + command) + self.output = TaggedOutput().settag('span class="unknown"') + self.add(FormulaConstant(command)) + return None + + def parsewithcommand(self, command, pos): + "Parse the command type once we have the command." + for type in FormulaCommand.types: + if command in type.commandmap: + return self.parsecommandtype(command, type, pos) + return None + + def parsecommandtype(self, command, type, pos): + "Parse a given command type." + bit = self.factory.create(type) + bit.setcommand(command) + returned = bit.parsebit(pos) + if returned: + return returned + return bit + + def extractcommand(self, pos): + "Extract the command from elyxer.the current position." + if not pos.checkskip(FormulaCommand.start): + pos.error('Missing command start ' + FormulaCommand.start) + return + if pos.finished(): + return self.emptycommand(pos) + if pos.current().isalpha(): + # alpha command + command = FormulaCommand.start + pos.globalpha() + # skip mark of short command + pos.checkskip('*') + return command + # symbol command + return FormulaCommand.start + pos.skipcurrent() + + def emptycommand(self, pos): + """Check for an empty command: look for command disguised as ending. + Special case against '{ \\{ \\} }' situation.""" + command = '' + if not pos.isout(): + ending = pos.nextending() + if ending and pos.checkskip(ending): + command = ending + return FormulaCommand.start + command + + def parseupgreek(self, command, pos): + "Parse the Greek \\up command.." + if len(command) < 4: + return None + if command.startswith('\\up'): + upcommand = '\\' + command[3:] + elif pos.checkskip('\\Up'): + upcommand = '\\' + command[3:4].upper() + command[4:] + else: + Trace.error('Impossible upgreek command: ' + command) + return + upgreek = self.parsewithcommand(upcommand, pos) + if upgreek: + upgreek.type = 'font' + return upgreek + +class CommandBit(FormulaCommand): + "A formula bit that includes a command" + + def setcommand(self, command): + "Set the command in the bit" + self.command = command + if self.commandmap: + self.original += command + self.translated = self.commandmap[self.command] + + def parseparameter(self, pos): + "Parse a parameter at the current position" + self.factory.clearskipped(pos) + if pos.finished(): + return None + parameter = self.factory.parseany(pos) + self.add(parameter) + return parameter + + def parsesquare(self, pos): + "Parse a square bracket" + self.factory.clearskipped(pos) + if not self.factory.detecttype(SquareBracket, pos): + return None + bracket = self.factory.parsetype(SquareBracket, pos) + self.add(bracket) + return bracket + + def parseliteral(self, pos): + "Parse a literal bracket." + self.factory.clearskipped(pos) + if not self.factory.detecttype(Bracket, pos): + if not pos.isvalue(): + Trace.error('No literal parameter found at: ' + pos.identifier()) + return None + return pos.globvalue() + bracket = Bracket().setfactory(self.factory) + self.add(bracket.parseliteral(pos)) + return bracket.literal + + def parsesquareliteral(self, pos): + "Parse a square bracket literally." + self.factory.clearskipped(pos) + if not self.factory.detecttype(SquareBracket, pos): + return None + bracket = SquareBracket().setfactory(self.factory) + self.add(bracket.parseliteral(pos)) + return bracket.literal + + def parsetext(self, pos): + "Parse a text parameter." + self.factory.clearskipped(pos) + if not self.factory.detecttype(Bracket, pos): + Trace.error('No text parameter for ' + self.command) + return None + bracket = Bracket().setfactory(self.factory).parsetext(pos) + self.add(bracket) + return bracket + +class EmptyCommand(CommandBit): + "An empty command (without parameters)" + + commandmap = FormulaConfig.commands + + def parsebit(self, pos): + "Parse a command without parameters" + self.contents = [FormulaConstant(self.translated)] + +class SpacedCommand(CommandBit): + "An empty command which should have math spacing in formulas." + + commandmap = FormulaConfig.spacedcommands + + def parsebit(self, pos): + "Place as contents the command translated and spaced." + self.contents = [FormulaConstant(u' ' + self.translated + u' ')] + +class AlphaCommand(EmptyCommand): + "A command without paramters whose result is alphabetical" + + commandmap = FormulaConfig.alphacommands + + def parsebit(self, pos): + "Parse the command and set type to alpha" + EmptyCommand.parsebit(self, pos) + self.type = 'alpha' + +class OneParamFunction(CommandBit): + "A function of one parameter" + + commandmap = FormulaConfig.onefunctions + simplified = False + + def parsebit(self, pos): + "Parse a function with one parameter" + self.output = TaggedOutput().settag(self.translated) + self.parseparameter(pos) + self.simplifyifpossible() + + def simplifyifpossible(self): + "Try to simplify to a single character." + if self.original in self.commandmap: + self.output = FixedOutput() + self.html = [self.commandmap[self.original]] + self.simplified = True + +class SymbolFunction(CommandBit): + "Find a function which is represented by a symbol (like _ or ^)" + + commandmap = FormulaConfig.symbolfunctions + + def detect(self, pos): + "Find the symbol" + return pos.current() in SymbolFunction.commandmap + + def parsebit(self, pos): + "Parse the symbol" + self.setcommand(pos.current()) + pos.skip(self.command) + self.output = TaggedOutput().settag(self.translated) + self.parseparameter(pos) + +class TextFunction(CommandBit): + "A function where parameters are read as text." + + commandmap = FormulaConfig.textfunctions + + def parsebit(self, pos): + "Parse a text parameter" + self.output = TaggedOutput().settag(self.translated) + self.parsetext(pos) + + def process(self): + "Set the type to font" + self.type = 'font' + +class LabelFunction(CommandBit): + "A function that acts as a label" + + commandmap = FormulaConfig.labelfunctions + + def parsebit(self, pos): + "Parse a literal parameter" + self.key = self.parseliteral(pos) + + def process(self): + "Add an anchor with the label contents." + self.type = 'font' + self.label = Label().create(' ', self.key, type = 'eqnumber') + self.contents = [self.label] + # store as a Label so we know it's been seen + Label.names[self.key] = self.label + +class FontFunction(OneParamFunction): + "A function of one parameter that changes the font" + + commandmap = FormulaConfig.fontfunctions + + def process(self): + "Simplify if possible using a single character." + self.type = 'font' + self.simplifyifpossible() + +FormulaFactory.types += [FormulaCommand, SymbolFunction] +FormulaCommand.types = [ + AlphaCommand, EmptyCommand, OneParamFunction, FontFunction, LabelFunction, + TextFunction, SpacedCommand, + ] + + + + + + + + + + + + +class BigSymbol(object): + "A big symbol generator." + + symbols = FormulaConfig.bigsymbols + + def __init__(self, symbol): + "Create the big symbol." + self.symbol = symbol + + def getpieces(self): + "Get an array with all pieces." + if not self.symbol in self.symbols: + return [self.symbol] + if self.smalllimit(): + return [self.symbol] + return self.symbols[self.symbol] + + def smalllimit(self): + "Decide if the limit should be a small, one-line symbol." + if not DocumentParameters.displaymode: + return True + if len(self.symbols[self.symbol]) == 1: + return True + return Options.simplemath + +class BigBracket(BigSymbol): + "A big bracket generator." + + def __init__(self, size, bracket, alignment='l'): + "Set the size and symbol for the bracket." + self.size = size + self.original = bracket + self.alignment = alignment + self.pieces = None + if bracket in FormulaConfig.bigbrackets: + self.pieces = FormulaConfig.bigbrackets[bracket] + + def getpiece(self, index): + "Return the nth piece for the bracket." + function = getattr(self, 'getpiece' + unicode(len(self.pieces))) + return function(index) + + def getpiece1(self, index): + "Return the only piece for a single-piece bracket." + return self.pieces[0] + + def getpiece3(self, index): + "Get the nth piece for a 3-piece bracket: parenthesis or square bracket." + if index == 0: + return self.pieces[0] + if index == self.size - 1: + return self.pieces[-1] + return self.pieces[1] + + def getpiece4(self, index): + "Get the nth piece for a 4-piece bracket: curly bracket." + if index == 0: + return self.pieces[0] + if index == self.size - 1: + return self.pieces[3] + if index == (self.size - 1)/2: + return self.pieces[2] + return self.pieces[1] + + def getcell(self, index): + "Get the bracket piece as an array cell." + piece = self.getpiece(index) + span = 'span class="bracket align-' + self.alignment + '"' + return TaggedBit().constant(piece, span) + + def getcontents(self): + "Get the bracket as an array or as a single bracket." + if self.size == 1 or not self.pieces: + return self.getsinglebracket() + rows = [] + for index in range(self.size): + cell = self.getcell(index) + rows.append(TaggedBit().complete([cell], 'span class="arrayrow"')) + return [TaggedBit().complete(rows, 'span class="array"')] + + def getsinglebracket(self): + "Return the bracket as a single sign." + if self.original == '.': + return [TaggedBit().constant('', 'span class="emptydot"')] + return [TaggedBit().constant(self.original, 'span class="symbol"')] + + + + + + +class FormulaEquation(CommandBit): + "A simple numbered equation." + + piece = 'equation' + + def parsebit(self, pos): + "Parse the array" + self.output = ContentsOutput() + self.add(self.factory.parsetype(WholeFormula, pos)) + +class FormulaCell(FormulaCommand): + "An array cell inside a row" + + def setalignment(self, alignment): + self.alignment = alignment + self.output = TaggedOutput().settag('span class="arraycell align-' + alignment +'"', True) + return self + + def parsebit(self, pos): + self.factory.clearskipped(pos) + if pos.finished(): + return + self.add(self.factory.parsetype(WholeFormula, pos)) + +class FormulaRow(FormulaCommand): + "An array row inside an array" + + cellseparator = FormulaConfig.array['cellseparator'] + + def setalignments(self, alignments): + self.alignments = alignments + self.output = TaggedOutput().settag('span class="arrayrow"', True) + return self + + def parsebit(self, pos): + "Parse a whole row" + index = 0 + pos.pushending(self.cellseparator, optional=True) + while not pos.finished(): + cell = self.createcell(index) + cell.parsebit(pos) + self.add(cell) + index += 1 + pos.checkskip(self.cellseparator) + if len(self.contents) == 0: + self.output = EmptyOutput() + + def createcell(self, index): + "Create the cell that corresponds to the given index." + alignment = self.alignments[index % len(self.alignments)] + return self.factory.create(FormulaCell).setalignment(alignment) + +class MultiRowFormula(CommandBit): + "A formula with multiple rows." + + def parserows(self, pos): + "Parse all rows, finish when no more row ends" + self.rows = [] + first = True + for row in self.iteraterows(pos): + if first: + first = False + else: + # intersparse empty rows + self.addempty() + row.parsebit(pos) + self.addrow(row) + self.size = len(self.rows) + + def iteraterows(self, pos): + "Iterate over all rows, end when no more row ends" + rowseparator = FormulaConfig.array['rowseparator'] + while True: + pos.pushending(rowseparator, True) + row = self.factory.create(FormulaRow) + yield row.setalignments(self.alignments) + if pos.checkfor(rowseparator): + self.original += pos.popending(rowseparator) + else: + return + + def addempty(self): + "Add an empty row." + row = self.factory.create(FormulaRow).setalignments(self.alignments) + for index, originalcell in enumerate(self.rows[-1].contents): + cell = row.createcell(index) + cell.add(FormulaConstant(u' ')) + row.add(cell) + self.addrow(row) + + def addrow(self, row): + "Add a row to the contents and to the list of rows." + self.rows.append(row) + self.add(row) + +class FormulaArray(MultiRowFormula): + "An array within a formula" + + piece = 'array' + + def parsebit(self, pos): + "Parse the array" + self.output = TaggedOutput().settag('span class="array"', False) + self.parsealignments(pos) + self.parserows(pos) + + def parsealignments(self, pos): + "Parse the different alignments" + # vertical + self.valign = 'c' + literal = self.parsesquareliteral(pos) + if literal: + self.valign = literal + # horizontal + literal = self.parseliteral(pos) + self.alignments = [] + for l in literal: + self.alignments.append(l) + +class FormulaMatrix(MultiRowFormula): + "A matrix (array with center alignment)." + + piece = 'matrix' + + def parsebit(self, pos): + "Parse the matrix, set alignments to 'c'." + self.output = TaggedOutput().settag('span class="array"', False) + self.valign = 'c' + self.alignments = ['c'] + self.parserows(pos) + +class FormulaCases(MultiRowFormula): + "A cases statement" + + piece = 'cases' + + def parsebit(self, pos): + "Parse the cases" + self.output = ContentsOutput() + self.alignments = ['l', 'l'] + self.parserows(pos) + for row in self.contents: + for cell in row.contents: + cell.output.settag('span class="case align-l"', True) + cell.contents.append(FormulaConstant(u' ')) + array = TaggedBit().complete(self.contents, 'span class="bracketcases"', True) + brace = BigBracket(len(self.contents), '{', 'l') + self.contents = brace.getcontents() + [array] + +class EquationEnvironment(MultiRowFormula): + "A \\begin{}...\\end equation environment with rows and cells." + + def parsebit(self, pos): + "Parse the whole environment." + self.output = TaggedOutput().settag('span class="environment"', False) + environment = self.piece.replace('*', '') + if environment in FormulaConfig.environments: + self.alignments = FormulaConfig.environments[environment] + else: + Trace.error('Unknown equation environment ' + self.piece) + self.alignments = ['l'] + self.parserows(pos) + +class BeginCommand(CommandBit): + "A \\begin{}...\\end command and what it entails (array, cases, aligned)" + + commandmap = {FormulaConfig.array['begin']:''} + + types = [FormulaEquation, FormulaArray, FormulaCases, FormulaMatrix] + + def parsebit(self, pos): + "Parse the begin command" + command = self.parseliteral(pos) + bit = self.findbit(command) + ending = FormulaConfig.array['end'] + '{' + command + '}' + pos.pushending(ending) + bit.parsebit(pos) + self.add(bit) + self.original += pos.popending(ending) + self.size = bit.size + + def findbit(self, piece): + "Find the command bit corresponding to the \\begin{piece}" + for type in BeginCommand.types: + if piece.replace('*', '') == type.piece: + return self.factory.create(type) + bit = self.factory.create(EquationEnvironment) + bit.piece = piece + return bit + +FormulaCommand.types += [BeginCommand] + + + +class CombiningFunction(OneParamFunction): + + commandmap = FormulaConfig.combiningfunctions + + def parsebit(self, pos): + "Parse a combining function." + self.type = 'alpha' + combining = self.translated + parameter = self.parsesingleparameter(pos) + if not parameter: + Trace.error('Empty parameter for combining function ' + self.command) + elif len(parameter.extracttext()) != 1: + Trace.error('Applying combining function ' + self.command + ' to invalid string "' + parameter.extracttext() + '"') + self.contents.append(Constant(combining)) + + def parsesingleparameter(self, pos): + "Parse a parameter, or a single letter." + self.factory.clearskipped(pos) + if pos.finished(): + Trace.error('Error while parsing single parameter at ' + pos.identifier()) + return None + if self.factory.detecttype(Bracket, pos) \ + or self.factory.detecttype(FormulaCommand, pos): + return self.parseparameter(pos) + letter = FormulaConstant(pos.skipcurrent()) + self.add(letter) + return letter + +class DecoratingFunction(OneParamFunction): + "A function that decorates some bit of text" + + commandmap = FormulaConfig.decoratingfunctions + + def parsebit(self, pos): + "Parse a decorating function" + self.type = 'alpha' + symbol = self.translated + self.symbol = TaggedBit().constant(symbol, 'span class="symbolover"') + self.parameter = self.parseparameter(pos) + self.output = TaggedOutput().settag('span class="withsymbol"') + self.contents.insert(0, self.symbol) + self.parameter.output = TaggedOutput().settag('span class="undersymbol"') + self.simplifyifpossible() + +class LimitCommand(EmptyCommand): + "A command which accepts limits above and below, in display mode." + + commandmap = FormulaConfig.limitcommands + + def parsebit(self, pos): + "Parse a limit command." + pieces = BigSymbol(self.translated).getpieces() + self.output = TaggedOutput().settag('span class="limits"') + for piece in pieces: + self.contents.append(TaggedBit().constant(piece, 'span class="limit"')) + +class LimitPreviousCommand(LimitCommand): + "A command to limit the previous command." + + commandmap = None + + def parsebit(self, pos): + "Do nothing." + self.output = TaggedOutput().settag('span class="limits"') + self.factory.clearskipped(pos) + + def __unicode__(self): + "Return a printable representation." + return 'Limit previous command' + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class LimitsProcessor(MathsProcessor): + "A processor for limits inside an element." + + def process(self, contents, index): + "Process the limits for an element." + if Options.simplemath: + return + if self.checklimits(contents, index): + self.modifylimits(contents, index) + if self.checkscript(contents, index) and self.checkscript(contents, index + 1): + self.modifyscripts(contents, index) + + def checklimits(self, contents, index): + "Check if the current position has a limits command." + if not DocumentParameters.displaymode: + return False + if self.checkcommand(contents, index + 1, LimitPreviousCommand): + self.limitsahead(contents, index) + return False + if not isinstance(contents[index], LimitCommand): + return False + return self.checkscript(contents, index + 1) + + def limitsahead(self, contents, index): + "Limit the current element based on the next." + contents[index + 1].add(contents[index].clone()) + contents[index].output = EmptyOutput() + + def modifylimits(self, contents, index): + "Modify a limits commands so that the limits appear above and below." + limited = contents[index] + subscript = self.getlimit(contents, index + 1) + limited.contents.append(subscript) + if self.checkscript(contents, index + 1): + superscript = self.getlimit(contents, index + 1) + else: + superscript = TaggedBit().constant(u' ', 'sup class="limit"') + limited.contents.insert(0, superscript) + + def getlimit(self, contents, index): + "Get the limit for a limits command." + limit = self.getscript(contents, index) + limit.output.tag = limit.output.tag.replace('script', 'limit') + return limit + + def modifyscripts(self, contents, index): + "Modify the super- and subscript to appear vertically aligned." + subscript = self.getscript(contents, index) + # subscript removed so instead of index + 1 we get index again + superscript = self.getscript(contents, index) + scripts = TaggedBit().complete([superscript, subscript], 'span class="scripts"') + contents.insert(index, scripts) + + def checkscript(self, contents, index): + "Check if the current element is a sub- or superscript." + return self.checkcommand(contents, index, SymbolFunction) + + def checkcommand(self, contents, index, type): + "Check for the given type as the current element." + if len(contents) <= index: + return False + return isinstance(contents[index], type) + + def getscript(self, contents, index): + "Get the sub- or superscript." + bit = contents[index] + bit.output.tag += ' class="script"' + del contents[index] + return bit + +class BracketCommand(OneParamFunction): + "A command which defines a bracket." + + commandmap = FormulaConfig.bracketcommands + + def parsebit(self, pos): + "Parse the bracket." + OneParamFunction.parsebit(self, pos) + + def create(self, direction, character): + "Create the bracket for the given character." + self.original = character + self.command = '\\' + direction + self.contents = [FormulaConstant(character)] + return self + +class BracketProcessor(MathsProcessor): + "A processor for bracket commands." + + def process(self, contents, index): + "Convert the bracket using Unicode pieces, if possible." + if Options.simplemath: + return + if self.checkleft(contents, index): + return self.processleft(contents, index) + + def processleft(self, contents, index): + "Process a left bracket." + rightindex = self.findright(contents, index + 1) + if not rightindex: + return + size = self.findmax(contents, index, rightindex) + self.resize(contents[index], size) + self.resize(contents[rightindex], size) + + def checkleft(self, contents, index): + "Check if the command at the given index is left." + return self.checkdirection(contents[index], '\\left') + + def checkright(self, contents, index): + "Check if the command at the given index is right." + return self.checkdirection(contents[index], '\\right') + + def checkdirection(self, bit, command): + "Check if the given bit is the desired bracket command." + if not isinstance(bit, BracketCommand): + return False + return bit.command == command + + def findright(self, contents, index): + "Find the right bracket starting at the given index, or 0." + depth = 1 + while index < len(contents): + if self.checkleft(contents, index): + depth += 1 + if self.checkright(contents, index): + depth -= 1 + if depth == 0: + return index + index += 1 + return None + + def findmax(self, contents, leftindex, rightindex): + "Find the max size of the contents between the two given indices." + sliced = contents[leftindex:rightindex] + return max([element.size for element in sliced]) + + def resize(self, command, size): + "Resize a bracket command to the given size." + character = command.extracttext() + alignment = command.command.replace('\\', '') + bracket = BigBracket(size, character, alignment) + command.output = ContentsOutput() + command.contents = bracket.getcontents() + +class TodayCommand(EmptyCommand): + "Shows today's date." + + commandmap = None + + def parsebit(self, pos): + "Parse a command without parameters" + self.output = FixedOutput() + self.html = [datetime.date.today().strftime('%b %d, %Y')] + + +FormulaCommand.types += [ + DecoratingFunction, CombiningFunction, LimitCommand, BracketCommand, + ] + +FormulaProcessor.processors += [ + LimitsProcessor(), BracketProcessor(), + ] + + + +class ParameterDefinition(object): + "The definition of a parameter in a hybrid function." + "[] parameters are optional, {} parameters are mandatory." + "Each parameter has a one-character name, like {$1} or {$p}." + "A parameter that ends in ! like {$p!} is a literal." + "Example: [$1]{$p!} reads an optional parameter $1 and a literal mandatory parameter p." + + parambrackets = [('[', ']'), ('{', '}')] + + def __init__(self): + self.name = None + self.literal = False + self.optional = False + self.value = None + self.literalvalue = None + + def parse(self, pos): + "Parse a parameter definition: [$0], {$x}, {$1!}..." + for (opening, closing) in ParameterDefinition.parambrackets: + if pos.checkskip(opening): + if opening == '[': + self.optional = True + if not pos.checkskip('$'): + Trace.error('Wrong parameter name, did you mean $' + pos.current() + '?') + return None + self.name = pos.skipcurrent() + if pos.checkskip('!'): + self.literal = True + if not pos.checkskip(closing): + Trace.error('Wrong parameter closing ' + pos.skipcurrent()) + return None + return self + Trace.error('Wrong character in parameter template: ' + pos.skipcurrent()) + return None + + def read(self, pos, function): + "Read the parameter itself using the definition." + if self.literal: + if self.optional: + self.literalvalue = function.parsesquareliteral(pos) + else: + self.literalvalue = function.parseliteral(pos) + if self.literalvalue: + self.value = FormulaConstant(self.literalvalue) + elif self.optional: + self.value = function.parsesquare(pos) + else: + self.value = function.parseparameter(pos) + + def __unicode__(self): + "Return a printable representation." + result = 'param ' + self.name + if self.value: + result += ': ' + unicode(self.value) + else: + result += ' (empty)' + return result + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +class ParameterFunction(CommandBit): + "A function with a variable number of parameters defined in a template." + "The parameters are defined as a parameter definition." + + def readparams(self, readtemplate, pos): + "Read the params according to the template." + self.params = dict() + for paramdef in self.paramdefs(readtemplate): + paramdef.read(pos, self) + self.params['$' + paramdef.name] = paramdef + + def paramdefs(self, readtemplate): + "Read each param definition in the template" + pos = TextPosition(readtemplate) + while not pos.finished(): + paramdef = ParameterDefinition().parse(pos) + if paramdef: + yield paramdef + + def getparam(self, name): + "Get a parameter as parsed." + if not name in self.params: + return None + return self.params[name] + + def getvalue(self, name): + "Get the value of a parameter." + return self.getparam(name).value + + def getliteralvalue(self, name): + "Get the literal value of a parameter." + param = self.getparam(name) + if not param or not param.literalvalue: + return None + return param.literalvalue + +class HybridFunction(ParameterFunction): + """ + A parameter function where the output is also defined using a template. + The template can use a number of functions; each function has an associated + tag. + Example: [f0{$1},span class="fbox"] defines a function f0 which corresponds + to a span of class fbox, yielding <span class="fbox">$1</span>. + Literal parameters can be used in tags definitions: + [f0{$1},span style="color: $p;"] + yields <span style="color: $p;">$1</span>, where $p is a literal parameter. + Sizes can be specified in hybridsizes, e.g. adding parameter sizes. By + default the resulting size is the max of all arguments. Sizes are used + to generate the right parameters. + A function followed by a single / is output as a self-closing XHTML tag: + [f0/,hr] + will generate <hr/>. + """ + + commandmap = FormulaConfig.hybridfunctions + + def parsebit(self, pos): + "Parse a function with [] and {} parameters" + readtemplate = self.translated[0] + writetemplate = self.translated[1] + self.readparams(readtemplate, pos) + self.contents = self.writeparams(writetemplate) + self.computehybridsize() + + def writeparams(self, writetemplate): + "Write all params according to the template" + return self.writepos(TextPosition(writetemplate)) + + def writepos(self, pos): + "Write all params as read in the parse position." + result = [] + while not pos.finished(): + if pos.checkskip('$'): + param = self.writeparam(pos) + if param: + result.append(param) + elif pos.checkskip('f'): + function = self.writefunction(pos) + if function: + function.type = None + result.append(function) + elif pos.checkskip('('): + result.append(self.writebracket('left', '(')) + elif pos.checkskip(')'): + result.append(self.writebracket('right', ')')) + else: + result.append(FormulaConstant(pos.skipcurrent())) + return result + + def writeparam(self, pos): + "Write a single param of the form $0, $x..." + name = '$' + pos.skipcurrent() + if not name in self.params: + Trace.error('Unknown parameter ' + name) + return None + if not self.params[name]: + return None + if pos.checkskip('.'): + self.params[name].value.type = pos.globalpha() + return self.params[name].value + + def writefunction(self, pos): + "Write a single function f0,...,fn." + tag = self.readtag(pos) + if not tag: + return None + if pos.checkskip('/'): + # self-closing XHTML tag, such as <hr/> + return TaggedBit().selfcomplete(tag) + if not pos.checkskip('{'): + Trace.error('Function should be defined in {}') + return None + pos.pushending('}') + contents = self.writepos(pos) + pos.popending() + if len(contents) == 0: + return None + return TaggedBit().complete(contents, tag) + + def readtag(self, pos): + "Get the tag corresponding to the given index. Does parameter substitution." + if not pos.current().isdigit(): + Trace.error('Function should be f0,...,f9: f' + pos.current()) + return None + index = int(pos.skipcurrent()) + if 2 + index > len(self.translated): + Trace.error('Function f' + unicode(index) + ' is not defined') + return None + tag = self.translated[2 + index] + if not '$' in tag: + return tag + for variable in self.params: + if variable in tag: + param = self.params[variable] + if not param.literal: + Trace.error('Parameters in tag ' + tag + ' should be literal: {' + variable + '!}') + continue + if param.literalvalue: + value = param.literalvalue + else: + value = '' + tag = tag.replace(variable, value) + return tag + + def writebracket(self, direction, character): + "Return a new bracket looking at the given direction." + return self.factory.create(BracketCommand).create(direction, character) + + def computehybridsize(self): + "Compute the size of the hybrid function." + if not self.command in HybridSize.configsizes: + self.computesize() + return + self.size = HybridSize().getsize(self) + # set the size in all elements at first level + for element in self.contents: + element.size = self.size + +class HybridSize(object): + "The size associated with a hybrid function." + + configsizes = FormulaConfig.hybridsizes + + def getsize(self, function): + "Read the size for a function and parse it." + sizestring = self.configsizes[function.command] + for name in function.params: + if name in sizestring: + size = function.params[name].value.computesize() + sizestring = sizestring.replace(name, unicode(size)) + if '$' in sizestring: + Trace.error('Unconverted variable in hybrid size: ' + sizestring) + return 1 + return eval(sizestring) + + +FormulaCommand.types += [HybridFunction] + + + + + + + + + +class HeaderParser(Parser): + "Parses the LyX header" + + def parse(self, reader): + "Parse header parameters into a dictionary, return the preamble." + contents = [] + self.parseending(reader, lambda: self.parseline(reader, contents)) + # skip last line + reader.nextline() + return contents + + def parseline(self, reader, contents): + "Parse a single line as a parameter or as a start" + line = reader.currentline() + if line.startswith(HeaderConfig.parameters['branch']): + self.parsebranch(reader) + return + elif line.startswith(HeaderConfig.parameters['lstset']): + LstParser().parselstset(reader) + return + elif line.startswith(HeaderConfig.parameters['beginpreamble']): + contents.append(self.factory.createcontainer(reader)) + return + # no match + self.parseparameter(reader) + + def parsebranch(self, reader): + "Parse all branch definitions." + branch = reader.currentline().split()[1] + reader.nextline() + subparser = HeaderParser().complete(HeaderConfig.parameters['endbranch']) + subparser.parse(reader) + options = BranchOptions(branch) + for key in subparser.parameters: + options.set(key, subparser.parameters[key]) + Options.branches[branch] = options + + def complete(self, ending): + "Complete the parser with the given ending." + self.ending = ending + return self + +class PreambleParser(Parser): + "A parser for the LyX preamble." + + preamble = [] + + def parse(self, reader): + "Parse the full preamble with all statements." + self.ending = HeaderConfig.parameters['endpreamble'] + self.parseending(reader, lambda: self.parsepreambleline(reader)) + return [] + + def parsepreambleline(self, reader): + "Parse a single preamble line." + PreambleParser.preamble.append(reader.currentline()) + reader.nextline() + +class LstParser(object): + "Parse global and local lstparams." + + globalparams = dict() + + def parselstset(self, reader): + "Parse a declaration of lstparams in lstset." + paramtext = self.extractlstset(reader) + if not '{' in paramtext: + Trace.error('Missing opening bracket in lstset: ' + paramtext) + return + lefttext = paramtext.split('{')[1] + croppedtext = lefttext[:-1] + LstParser.globalparams = self.parselstparams(croppedtext) + + def extractlstset(self, reader): + "Extract the global lstset parameters." + paramtext = '' + while not reader.finished(): + paramtext += reader.currentline() + reader.nextline() + if paramtext.endswith('}'): + return paramtext + Trace.error('Could not find end of \\lstset settings; aborting') + + def parsecontainer(self, container): + "Parse some lstparams from elyxer.a container." + container.lstparams = LstParser.globalparams.copy() + paramlist = container.getparameterlist('lstparams') + container.lstparams.update(self.parselstparams(paramlist)) + + def parselstparams(self, paramlist): + "Process a number of lstparams from elyxer.a list." + paramdict = dict() + for param in paramlist: + if not '=' in param: + if len(param.strip()) > 0: + Trace.error('Invalid listing parameter ' + param) + else: + key, value = param.split('=', 1) + paramdict[key] = value + return paramdict + + + + +class MacroDefinition(CommandBit): + "A function that defines a new command (a macro)." + + macros = dict() + + def parsebit(self, pos): + "Parse the function that defines the macro." + self.output = EmptyOutput() + self.parameternumber = 0 + self.defaults = [] + self.factory.defining = True + self.parseparameters(pos) + self.factory.defining = False + Trace.debug('New command ' + self.newcommand + ' (' + \ + unicode(self.parameternumber) + ' parameters)') + self.macros[self.newcommand] = self + + def parseparameters(self, pos): + "Parse all optional parameters (number of parameters, default values)" + "and the mandatory definition." + self.newcommand = self.parsenewcommand(pos) + # parse number of parameters + literal = self.parsesquareliteral(pos) + if literal: + self.parameternumber = int(literal) + # parse all default values + bracket = self.parsesquare(pos) + while bracket: + self.defaults.append(bracket) + bracket = self.parsesquare(pos) + # parse mandatory definition + self.definition = self.parseparameter(pos) + + def parsenewcommand(self, pos): + "Parse the name of the new command." + self.factory.clearskipped(pos) + if self.factory.detecttype(Bracket, pos): + return self.parseliteral(pos) + if self.factory.detecttype(FormulaCommand, pos): + return self.factory.create(FormulaCommand).extractcommand(pos) + Trace.error('Unknown formula bit in defining function at ' + pos.identifier()) + return 'unknown' + + def instantiate(self): + "Return an instance of the macro." + return self.definition.clone() + +class MacroParameter(FormulaBit): + "A parameter from elyxer.a macro." + + def detect(self, pos): + "Find a macro parameter: #n." + return pos.checkfor('#') + + def parsebit(self, pos): + "Parse the parameter: #n." + if not pos.checkskip('#'): + Trace.error('Missing parameter start #.') + return + self.number = int(pos.skipcurrent()) + self.original = '#' + unicode(self.number) + self.contents = [TaggedBit().constant('#' + unicode(self.number), 'span class="unknown"')] + +class MacroFunction(CommandBit): + "A function that was defined using a macro." + + commandmap = MacroDefinition.macros + + def parsebit(self, pos): + "Parse a number of input parameters." + self.output = FilteredOutput() + self.values = [] + macro = self.translated + self.parseparameters(pos, macro) + self.completemacro(macro) + + def parseparameters(self, pos, macro): + "Parse as many parameters as are needed." + self.parseoptional(pos, list(macro.defaults)) + self.parsemandatory(pos, macro.parameternumber - len(macro.defaults)) + if len(self.values) < macro.parameternumber: + Trace.error('Missing parameters in macro ' + unicode(self)) + + def parseoptional(self, pos, defaults): + "Parse optional parameters." + optional = [] + while self.factory.detecttype(SquareBracket, pos): + optional.append(self.parsesquare(pos)) + if len(optional) > len(defaults): + break + for value in optional: + default = defaults.pop() + if len(value.contents) > 0: + self.values.append(value) + else: + self.values.append(default) + self.values += defaults + + def parsemandatory(self, pos, number): + "Parse a number of mandatory parameters." + for index in range(number): + parameter = self.parsemacroparameter(pos, number - index) + if not parameter: + return + self.values.append(parameter) + + def parsemacroparameter(self, pos, remaining): + "Parse a macro parameter. Could be a bracket or a single letter." + "If there are just two values remaining and there is a running number," + "parse as two separater numbers." + self.factory.clearskipped(pos) + if pos.finished(): + return None + if self.factory.detecttype(FormulaNumber, pos): + return self.parsenumbers(pos, remaining) + return self.parseparameter(pos) + + def parsenumbers(self, pos, remaining): + "Parse the remaining parameters as a running number." + "For example, 12 would be {1}{2}." + number = self.factory.parsetype(FormulaNumber, pos) + if not len(number.original) == remaining: + return number + for digit in number.original: + value = self.factory.create(FormulaNumber) + value.add(FormulaConstant(digit)) + value.type = number + self.values.append(value) + return None + + def completemacro(self, macro): + "Complete the macro with the parameters read." + self.contents = [macro.instantiate()] + replaced = [False] * len(self.values) + for parameter in self.searchall(MacroParameter): + index = parameter.number - 1 + if index >= len(self.values): + Trace.error('Macro parameter index out of bounds: ' + unicode(index)) + return + replaced[index] = True + parameter.contents = [self.values[index].clone()] + for index in range(len(self.values)): + if not replaced[index]: + self.addfilter(index, self.values[index]) + + def addfilter(self, index, value): + "Add a filter for the given parameter number and parameter value." + original = '#' + unicode(index + 1) + value = ''.join(self.values[0].gethtml()) + self.output.addfilter(original, value) + +class FormulaMacro(Formula): + "A math macro defined in an inset." + + def __init__(self): + self.parser = MacroParser() + self.output = EmptyOutput() + + def __unicode__(self): + "Return a printable representation." + return 'Math macro' + + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + +FormulaFactory.types += [ MacroParameter ] + +FormulaCommand.types += [ + MacroFunction, + ] + + + +def math2html(formula): + "Convert some TeX math to HTML." + factory = FormulaFactory() + whole = factory.parseformula(formula) + FormulaProcessor().process(whole) + whole.process() + return ''.join(whole.gethtml()) + +def main(): + "Main function, called if invoked from elyxer.the command line" + args = sys.argv + Options().parseoptions(args) + if len(args) != 1: + Trace.error('Usage: math2html.py escaped_string') + exit() + result = math2html(args[0]) + Trace.message(result) + +if __name__ == '__main__': + main() + diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/tex2mathml_extern.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/tex2mathml_extern.py new file mode 100644 index 0000000..8545890 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/tex2mathml_extern.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# :Id: $Id: tex2mathml_extern.py 8376 2019-08-27 19:49:29Z milde $ +# :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 + +# Wrappers for TeX->MathML conversion by external tools +# ===================================================== + +from __future__ import print_function +import subprocess + +document_template = r"""\documentclass{article} +\usepackage{amsmath} +\begin{document} +%s +\end{document} +""" + +def latexml(math_code, reporter=None): + """Convert LaTeX math code to MathML with LaTeXML_ + + .. _LaTeXML: http://dlmf.nist.gov/LaTeXML/ + """ + p = subprocess.Popen(['latexml', + '-', # read from stdin + # '--preload=amsmath', + '--inputencoding=utf8', + ], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + close_fds=True) + p.stdin.write((document_template % math_code).encode('utf8')) + p.stdin.close() + latexml_code = p.stdout.read() + latexml_err = p.stderr.read().decode('utf8') + if reporter and (latexml_err.find('Error') >= 0 or not latexml_code): + reporter.error(latexml_err) + + post_p = subprocess.Popen(['latexmlpost', + '-', + '--nonumbersections', + '--format=xhtml', + # '--linelength=78', # experimental + '--' + ], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + close_fds=True) + post_p.stdin.write(latexml_code) + post_p.stdin.close() + result = post_p.stdout.read().decode('utf8') + post_p_err = post_p.stderr.read().decode('utf8') + if reporter and (post_p_err.find('Error') >= 0 or not result): + reporter.error(post_p_err) + + # extract MathML code: + start, end = result.find('<math'), result.find('</math>')+7 + result = result[start:end] + if 'class="ltx_ERROR' in result: + raise SyntaxError(result) + return result + +def ttm(math_code, reporter=None): + """Convert LaTeX math code to MathML with TtM_ + + .. _TtM: http://hutchinson.belmont.ma.us/tth/mml/ + """ + p = subprocess.Popen(['ttm', + # '-i', # italic font for equations. Default roman. + '-u', # unicode character encoding. (Default iso-8859-1). + '-r', # output raw MathML (no preamble or postlude) + ], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + close_fds=True) + p.stdin.write((document_template % math_code).encode('utf8')) + p.stdin.close() + result = p.stdout.read() + err = p.stderr.read().decode('utf8') + if err.find('**** Unknown') >= 0: + msg = '\n'.join([line for line in err.splitlines() + if line.startswith('****')]) + raise SyntaxError('\nMessage from external converter TtM:\n'+ msg) + if reporter and err.find('**** Error') >= 0 or not result: + reporter.error(err) + start, end = result.find('<math'), result.find('</math>')+7 + result = result[start:end] + return result + +def blahtexml(math_code, inline=True, reporter=None): + """Convert LaTeX math code to MathML with blahtexml_ + + .. _blahtexml: http://gva.noekeon.org/blahtexml/ + """ + options = ['--mathml', + '--indented', + '--spacing', 'moderate', + '--mathml-encoding', 'raw', + '--other-encoding', 'raw', + '--doctype-xhtml+mathml', + '--annotate-TeX', + ] + if inline: + mathmode_arg = '' + else: + mathmode_arg = 'mode="display"' + options.append('--displaymath') + + p = subprocess.Popen(['blahtexml']+options, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + close_fds=True) + p.stdin.write(math_code.encode('utf8')) + p.stdin.close() + result = p.stdout.read().decode('utf8') + err = p.stderr.read().decode('utf8') + + if result.find('<error>') >= 0: + raise SyntaxError('\nMessage from external converter blahtexml:\n' + +result[result.find('<message>')+9:result.find('</message>')]) + if reporter and (err.find('**** Error') >= 0 or not result): + reporter.error(err) + start, end = result.find('<markup>')+9, result.find('</markup>') + result = ('<math xmlns="http://www.w3.org/1998/Math/MathML"%s>\n' + '%s</math>\n') % (mathmode_arg, result[start:end]) + return result + +# self-test + +if __name__ == "__main__": + example = (u'\\frac{\\partial \\sin^2(\\alpha)}{\\partial \\vec r}' + u'\\varpi \\, \\text{Grüße}') + # print(latexml(example).encode('utf8')) + # print(ttm(example)) + print(blahtexml(example).encode('utf8')) diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/tex2unichar.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/tex2unichar.py new file mode 100644 index 0000000..434c0e8 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/tex2unichar.py @@ -0,0 +1,662 @@ +# -*- coding: utf-8 -*- + +# LaTeX math to Unicode symbols translation dictionaries. +# Generated with ``write_tex2unichar.py`` from the data in +# http://milde.users.sourceforge.net/LUCR/Math/ + +# Includes commands from: wasysym, stmaryrd, mathdots, mathabx, esint, bbold, amsxtra, amsmath, amssymb, standard LaTeX + +mathaccent = { + 'acute': u'\u0301', # x́ COMBINING ACUTE ACCENT + 'bar': u'\u0304', # x̄ COMBINING MACRON + 'breve': u'\u0306', # x̆ COMBINING BREVE + 'check': u'\u030c', # x̌ COMBINING CARON + 'ddddot': u'\u20dc', # x⃜ COMBINING FOUR DOTS ABOVE + 'dddot': u'\u20db', # x⃛ COMBINING THREE DOTS ABOVE + 'ddot': u'\u0308', # ẍ COMBINING DIAERESIS + 'dot': u'\u0307', # ẋ COMBINING DOT ABOVE + 'grave': u'\u0300', # x̀ COMBINING GRAVE ACCENT + 'hat': u'\u0302', # x̂ COMBINING CIRCUMFLEX ACCENT + 'mathring': u'\u030a', # x̊ COMBINING RING ABOVE + 'not': u'\u0338', # x̸ COMBINING LONG SOLIDUS OVERLAY + 'overleftarrow': u'\u20d6', # x⃖ COMBINING LEFT ARROW ABOVE + 'overleftrightarrow': u'\u20e1', # x⃡ COMBINING LEFT RIGHT ARROW ABOVE + 'overline': u'\u0305', # x̅ COMBINING OVERLINE + 'overrightarrow': u'\u20d7', # x⃗ COMBINING RIGHT ARROW ABOVE + 'tilde': u'\u0303', # x̃ COMBINING TILDE + 'underbar': u'\u0331', # x̱ COMBINING MACRON BELOW + 'underleftarrow': u'\u20ee', # x⃮ COMBINING LEFT ARROW BELOW + 'underline': u'\u0332', # x̲ COMBINING LOW LINE + 'underrightarrow': u'\u20ef', # x⃯ COMBINING RIGHT ARROW BELOW + 'vec': u'\u20d7', # x⃗ COMBINING RIGHT ARROW ABOVE + 'widehat': u'\u0302', # x̂ COMBINING CIRCUMFLEX ACCENT + 'widetilde': u'\u0303', # x̃ COMBINING TILDE + } +mathalpha = { + 'Bbbk': u'\U0001d55c', # 𝕜 MATHEMATICAL DOUBLE-STRUCK SMALL K + 'Delta': u'\u0394', # Δ GREEK CAPITAL LETTER DELTA + 'Gamma': u'\u0393', # Γ GREEK CAPITAL LETTER GAMMA + 'Im': u'\u2111', # ℑ BLACK-LETTER CAPITAL I + 'Lambda': u'\u039b', # Λ GREEK CAPITAL LETTER LAMDA + 'Omega': u'\u03a9', # Ω GREEK CAPITAL LETTER OMEGA + 'Phi': u'\u03a6', # Φ GREEK CAPITAL LETTER PHI + 'Pi': u'\u03a0', # Π GREEK CAPITAL LETTER PI + 'Psi': u'\u03a8', # Ψ GREEK CAPITAL LETTER PSI + 'Re': u'\u211c', # ℜ BLACK-LETTER CAPITAL R + 'Sigma': u'\u03a3', # Σ GREEK CAPITAL LETTER SIGMA + 'Theta': u'\u0398', # Θ GREEK CAPITAL LETTER THETA + 'Upsilon': u'\u03a5', # Υ GREEK CAPITAL LETTER UPSILON + 'Xi': u'\u039e', # Ξ GREEK CAPITAL LETTER XI + 'aleph': u'\u2135', # ℵ ALEF SYMBOL + 'alpha': u'\u03b1', # α GREEK SMALL LETTER ALPHA + 'beta': u'\u03b2', # β GREEK SMALL LETTER BETA + 'beth': u'\u2136', # ℶ BET SYMBOL + 'chi': u'\u03c7', # χ GREEK SMALL LETTER CHI + 'daleth': u'\u2138', # ℸ DALET SYMBOL + 'delta': u'\u03b4', # δ GREEK SMALL LETTER DELTA + 'digamma': u'\u03dc', # Ϝ GREEK LETTER DIGAMMA + 'ell': u'\u2113', # ℓ SCRIPT SMALL L + 'epsilon': u'\u03f5', # ϵ GREEK LUNATE EPSILON SYMBOL + 'eta': u'\u03b7', # η GREEK SMALL LETTER ETA + 'eth': u'\xf0', # ð LATIN SMALL LETTER ETH + 'gamma': u'\u03b3', # γ GREEK SMALL LETTER GAMMA + 'gimel': u'\u2137', # ℷ GIMEL SYMBOL + 'hbar': u'\u210f', # ℏ PLANCK CONSTANT OVER TWO PI + 'hslash': u'\u210f', # ℏ PLANCK CONSTANT OVER TWO PI + 'imath': u'\u0131', # ı LATIN SMALL LETTER DOTLESS I + 'iota': u'\u03b9', # ι GREEK SMALL LETTER IOTA + 'jmath': u'\u0237', # ȷ LATIN SMALL LETTER DOTLESS J + 'kappa': u'\u03ba', # κ GREEK SMALL LETTER KAPPA + 'lambda': u'\u03bb', # λ GREEK SMALL LETTER LAMDA + 'mu': u'\u03bc', # μ GREEK SMALL LETTER MU + 'nu': u'\u03bd', # ν GREEK SMALL LETTER NU + 'omega': u'\u03c9', # ω GREEK SMALL LETTER OMEGA + 'phi': u'\u03d5', # ϕ GREEK PHI SYMBOL + 'pi': u'\u03c0', # π GREEK SMALL LETTER PI + 'psi': u'\u03c8', # ψ GREEK SMALL LETTER PSI + 'rho': u'\u03c1', # ρ GREEK SMALL LETTER RHO + 'sigma': u'\u03c3', # σ GREEK SMALL LETTER SIGMA + 'tau': u'\u03c4', # τ GREEK SMALL LETTER TAU + 'theta': u'\u03b8', # θ GREEK SMALL LETTER THETA + 'upsilon': u'\u03c5', # υ GREEK SMALL LETTER UPSILON + 'varDelta': u'\U0001d6e5', # 𝛥 MATHEMATICAL ITALIC CAPITAL DELTA + 'varGamma': u'\U0001d6e4', # 𝛤 MATHEMATICAL ITALIC CAPITAL GAMMA + 'varLambda': u'\U0001d6ec', # 𝛬 MATHEMATICAL ITALIC CAPITAL LAMDA + 'varOmega': u'\U0001d6fa', # 𝛺 MATHEMATICAL ITALIC CAPITAL OMEGA + 'varPhi': u'\U0001d6f7', # 𝛷 MATHEMATICAL ITALIC CAPITAL PHI + 'varPi': u'\U0001d6f1', # 𝛱 MATHEMATICAL ITALIC CAPITAL PI + 'varPsi': u'\U0001d6f9', # 𝛹 MATHEMATICAL ITALIC CAPITAL PSI + 'varSigma': u'\U0001d6f4', # 𝛴 MATHEMATICAL ITALIC CAPITAL SIGMA + 'varTheta': u'\U0001d6e9', # 𝛩 MATHEMATICAL ITALIC CAPITAL THETA + 'varUpsilon': u'\U0001d6f6', # 𝛶 MATHEMATICAL ITALIC CAPITAL UPSILON + 'varXi': u'\U0001d6ef', # 𝛯 MATHEMATICAL ITALIC CAPITAL XI + 'varepsilon': u'\u03b5', # ε GREEK SMALL LETTER EPSILON + 'varkappa': u'\U0001d718', # 𝜘 MATHEMATICAL ITALIC KAPPA SYMBOL + 'varphi': u'\u03c6', # φ GREEK SMALL LETTER PHI + 'varpi': u'\u03d6', # ϖ GREEK PI SYMBOL + 'varrho': u'\u03f1', # ϱ GREEK RHO SYMBOL + 'varsigma': u'\u03c2', # ς GREEK SMALL LETTER FINAL SIGMA + 'vartheta': u'\u03d1', # ϑ GREEK THETA SYMBOL + 'wp': u'\u2118', # ℘ SCRIPT CAPITAL P + 'xi': u'\u03be', # ξ GREEK SMALL LETTER XI + 'zeta': u'\u03b6', # ζ GREEK SMALL LETTER ZETA + } +mathbin = { + 'Cap': u'\u22d2', # ⋒ DOUBLE INTERSECTION + 'Circle': u'\u25cb', # ○ WHITE CIRCLE + 'Cup': u'\u22d3', # ⋓ DOUBLE UNION + 'LHD': u'\u25c0', # ◀ BLACK LEFT-POINTING TRIANGLE + 'RHD': u'\u25b6', # ▶ BLACK RIGHT-POINTING TRIANGLE + 'amalg': u'\u2a3f', # ⨿ AMALGAMATION OR COPRODUCT + 'ast': u'\u2217', # ∗ ASTERISK OPERATOR + 'barwedge': u'\u22bc', # ⊼ NAND + 'bigtriangledown': u'\u25bd', # ▽ WHITE DOWN-POINTING TRIANGLE + 'bigtriangleup': u'\u25b3', # △ WHITE UP-POINTING TRIANGLE + 'bindnasrepma': u'\u214b', # ⅋ TURNED AMPERSAND + 'blacklozenge': u'\u29eb', # ⧫ BLACK LOZENGE + 'blacktriangledown': u'\u25be', # ▾ BLACK DOWN-POINTING SMALL TRIANGLE + 'blacktriangleleft': u'\u25c2', # ◂ BLACK LEFT-POINTING SMALL TRIANGLE + 'blacktriangleright': u'\u25b8', # ▸ BLACK RIGHT-POINTING SMALL TRIANGLE + 'blacktriangleup': u'\u25b4', # ▴ BLACK UP-POINTING SMALL TRIANGLE + 'boxast': u'\u29c6', # ⧆ SQUARED ASTERISK + 'boxbar': u'\u25eb', # ◫ WHITE SQUARE WITH VERTICAL BISECTING LINE + 'boxbox': u'\u29c8', # ⧈ SQUARED SQUARE + 'boxbslash': u'\u29c5', # ⧅ SQUARED FALLING DIAGONAL SLASH + 'boxcircle': u'\u29c7', # ⧇ SQUARED SMALL CIRCLE + 'boxdot': u'\u22a1', # ⊡ SQUARED DOT OPERATOR + 'boxminus': u'\u229f', # ⊟ SQUARED MINUS + 'boxplus': u'\u229e', # ⊞ SQUARED PLUS + 'boxslash': u'\u29c4', # ⧄ SQUARED RISING DIAGONAL SLASH + 'boxtimes': u'\u22a0', # ⊠ SQUARED TIMES + 'bullet': u'\u2219', # ∙ BULLET OPERATOR + 'cap': u'\u2229', # ∩ INTERSECTION + 'cdot': u'\u22c5', # ⋅ DOT OPERATOR + 'circ': u'\u2218', # ∘ RING OPERATOR + 'circledast': u'\u229b', # ⊛ CIRCLED ASTERISK OPERATOR + 'circledcirc': u'\u229a', # ⊚ CIRCLED RING OPERATOR + 'circleddash': u'\u229d', # ⊝ CIRCLED DASH + 'cup': u'\u222a', # ∪ UNION + 'curlyvee': u'\u22ce', # ⋎ CURLY LOGICAL OR + 'curlywedge': u'\u22cf', # ⋏ CURLY LOGICAL AND + 'dagger': u'\u2020', # † DAGGER + 'ddagger': u'\u2021', # ‡ DOUBLE DAGGER + 'diamond': u'\u22c4', # ⋄ DIAMOND OPERATOR + 'div': u'\xf7', # ÷ DIVISION SIGN + 'divideontimes': u'\u22c7', # ⋇ DIVISION TIMES + 'dotplus': u'\u2214', # ∔ DOT PLUS + 'doublebarwedge': u'\u2a5e', # ⩞ LOGICAL AND WITH DOUBLE OVERBAR + 'intercal': u'\u22ba', # ⊺ INTERCALATE + 'interleave': u'\u2af4', # ⫴ TRIPLE VERTICAL BAR BINARY RELATION + 'land': u'\u2227', # ∧ LOGICAL AND + 'leftthreetimes': u'\u22cb', # ⋋ LEFT SEMIDIRECT PRODUCT + 'lhd': u'\u25c1', # ◁ WHITE LEFT-POINTING TRIANGLE + 'lor': u'\u2228', # ∨ LOGICAL OR + 'ltimes': u'\u22c9', # ⋉ LEFT NORMAL FACTOR SEMIDIRECT PRODUCT + 'mp': u'\u2213', # ∓ MINUS-OR-PLUS SIGN + 'odot': u'\u2299', # ⊙ CIRCLED DOT OPERATOR + 'ominus': u'\u2296', # ⊖ CIRCLED MINUS + 'oplus': u'\u2295', # ⊕ CIRCLED PLUS + 'oslash': u'\u2298', # ⊘ CIRCLED DIVISION SLASH + 'otimes': u'\u2297', # ⊗ CIRCLED TIMES + 'pm': u'\xb1', # ± PLUS-MINUS SIGN + 'rhd': u'\u25b7', # ▷ WHITE RIGHT-POINTING TRIANGLE + 'rightthreetimes': u'\u22cc', # ⋌ RIGHT SEMIDIRECT PRODUCT + 'rtimes': u'\u22ca', # ⋊ RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT + 'setminus': u'\u29f5', # ⧵ REVERSE SOLIDUS OPERATOR + 'slash': u'\u2215', # ∕ DIVISION SLASH + 'smallsetminus': u'\u2216', # ∖ SET MINUS + 'smalltriangledown': u'\u25bf', # ▿ WHITE DOWN-POINTING SMALL TRIANGLE + 'smalltriangleleft': u'\u25c3', # ◃ WHITE LEFT-POINTING SMALL TRIANGLE + 'smalltriangleright': u'\u25b9', # ▹ WHITE RIGHT-POINTING SMALL TRIANGLE + 'smalltriangleup': u'\u25b5', # ▵ WHITE UP-POINTING SMALL TRIANGLE + 'sqcap': u'\u2293', # ⊓ SQUARE CAP + 'sqcup': u'\u2294', # ⊔ SQUARE CUP + 'sslash': u'\u2afd', # ⫽ DOUBLE SOLIDUS OPERATOR + 'star': u'\u22c6', # ⋆ STAR OPERATOR + 'talloblong': u'\u2afe', # ⫾ WHITE VERTICAL BAR + 'times': u'\xd7', # × MULTIPLICATION SIGN + 'triangle': u'\u25b3', # △ WHITE UP-POINTING TRIANGLE + 'triangledown': u'\u25bf', # ▿ WHITE DOWN-POINTING SMALL TRIANGLE + 'triangleleft': u'\u25c3', # ◃ WHITE LEFT-POINTING SMALL TRIANGLE + 'triangleright': u'\u25b9', # ▹ WHITE RIGHT-POINTING SMALL TRIANGLE + 'uplus': u'\u228e', # ⊎ MULTISET UNION + 'vartriangle': u'\u25b3', # △ WHITE UP-POINTING TRIANGLE + 'vee': u'\u2228', # ∨ LOGICAL OR + 'veebar': u'\u22bb', # ⊻ XOR + 'wedge': u'\u2227', # ∧ LOGICAL AND + 'wr': u'\u2240', # ≀ WREATH PRODUCT + } +mathclose = { + 'Rbag': u'\u27c6', # ⟆ RIGHT S-SHAPED BAG DELIMITER + 'lrcorner': u'\u231f', # ⌟ BOTTOM RIGHT CORNER + 'rangle': u'\u27e9', # ⟩ MATHEMATICAL RIGHT ANGLE BRACKET + 'rbag': u'\u27c6', # ⟆ RIGHT S-SHAPED BAG DELIMITER + 'rbrace': u'}', # } RIGHT CURLY BRACKET + 'rbrack': u']', # ] RIGHT SQUARE BRACKET + 'rceil': u'\u2309', # ⌉ RIGHT CEILING + 'rfloor': u'\u230b', # ⌋ RIGHT FLOOR + 'rgroup': u'\u27ef', # ⟯ MATHEMATICAL RIGHT FLATTENED PARENTHESIS + 'rrbracket': u'\u27e7', # ⟧ MATHEMATICAL RIGHT WHITE SQUARE BRACKET + 'rrparenthesis': u'\u2988', # ⦈ Z NOTATION RIGHT IMAGE BRACKET + 'urcorner': u'\u231d', # ⌝ TOP RIGHT CORNER + '}': u'}', # } RIGHT CURLY BRACKET + } +mathfence = { + 'Vert': u'\u2016', # ‖ DOUBLE VERTICAL LINE + 'vert': u'|', # | VERTICAL LINE + '|': u'\u2016', # ‖ DOUBLE VERTICAL LINE + } +mathop = { + 'Join': u'\u2a1d', # ⨝ JOIN + 'bigcap': u'\u22c2', # ⋂ N-ARY INTERSECTION + 'bigcup': u'\u22c3', # ⋃ N-ARY UNION + 'biginterleave': u'\u2afc', # ⫼ LARGE TRIPLE VERTICAL BAR OPERATOR + 'bigodot': u'\u2a00', # ⨀ N-ARY CIRCLED DOT OPERATOR + 'bigoplus': u'\u2a01', # ⨁ N-ARY CIRCLED PLUS OPERATOR + 'bigotimes': u'\u2a02', # ⨂ N-ARY CIRCLED TIMES OPERATOR + 'bigsqcup': u'\u2a06', # ⨆ N-ARY SQUARE UNION OPERATOR + 'biguplus': u'\u2a04', # ⨄ N-ARY UNION OPERATOR WITH PLUS + 'bigvee': u'\u22c1', # ⋁ N-ARY LOGICAL OR + 'bigwedge': u'\u22c0', # ⋀ N-ARY LOGICAL AND + 'coprod': u'\u2210', # ∐ N-ARY COPRODUCT + 'fatsemi': u'\u2a1f', # ⨟ Z NOTATION SCHEMA COMPOSITION + 'fint': u'\u2a0f', # ⨏ INTEGRAL AVERAGE WITH SLASH + 'iiiint': u'\u2a0c', # ⨌ QUADRUPLE INTEGRAL OPERATOR + 'iiint': u'\u222d', # ∭ TRIPLE INTEGRAL + 'iint': u'\u222c', # ∬ DOUBLE INTEGRAL + 'int': u'\u222b', # ∫ INTEGRAL + 'oiint': u'\u222f', # ∯ SURFACE INTEGRAL + 'oint': u'\u222e', # ∮ CONTOUR INTEGRAL + 'ointctrclockwise': u'\u2233', # ∳ ANTICLOCKWISE CONTOUR INTEGRAL + 'prod': u'\u220f', # ∏ N-ARY PRODUCT + 'sqint': u'\u2a16', # ⨖ QUATERNION INTEGRAL OPERATOR + 'sum': u'\u2211', # ∑ N-ARY SUMMATION + 'varointclockwise': u'\u2232', # ∲ CLOCKWISE CONTOUR INTEGRAL + } +mathopen = { + 'Lbag': u'\u27c5', # ⟅ LEFT S-SHAPED BAG DELIMITER + 'langle': u'\u27e8', # ⟨ MATHEMATICAL LEFT ANGLE BRACKET + 'lbag': u'\u27c5', # ⟅ LEFT S-SHAPED BAG DELIMITER + 'lbrace': u'{', # { LEFT CURLY BRACKET + 'lbrack': u'[', # [ LEFT SQUARE BRACKET + 'lceil': u'\u2308', # ⌈ LEFT CEILING + 'lfloor': u'\u230a', # ⌊ LEFT FLOOR + 'lgroup': u'\u27ee', # ⟮ MATHEMATICAL LEFT FLATTENED PARENTHESIS + 'llbracket': u'\u27e6', # ⟦ MATHEMATICAL LEFT WHITE SQUARE BRACKET + 'llcorner': u'\u231e', # ⌞ BOTTOM LEFT CORNER + 'llparenthesis': u'\u2987', # ⦇ Z NOTATION LEFT IMAGE BRACKET + 'ulcorner': u'\u231c', # ⌜ TOP LEFT CORNER + '{': u'{', # { LEFT CURLY BRACKET + } +mathord = { + '#': u'#', # # NUMBER SIGN + '$': u'$', # $ DOLLAR SIGN + '%': u'%', # % PERCENT SIGN + '&': u'&', # & AMPERSAND + 'AC': u'\u223f', # ∿ SINE WAVE + 'APLcomment': u'\u235d', # ⍝ APL FUNCTIONAL SYMBOL UP SHOE JOT + 'APLdownarrowbox': u'\u2357', # ⍗ APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW + 'APLinput': u'\u235e', # ⍞ APL FUNCTIONAL SYMBOL QUOTE QUAD + 'APLinv': u'\u2339', # ⌹ APL FUNCTIONAL SYMBOL QUAD DIVIDE + 'APLleftarrowbox': u'\u2347', # ⍇ APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW + 'APLlog': u'\u235f', # ⍟ APL FUNCTIONAL SYMBOL CIRCLE STAR + 'APLrightarrowbox': u'\u2348', # ⍈ APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW + 'APLuparrowbox': u'\u2350', # ⍐ APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW + 'Aries': u'\u2648', # ♈ ARIES + 'CIRCLE': u'\u25cf', # ● BLACK CIRCLE + 'CheckedBox': u'\u2611', # ☑ BALLOT BOX WITH CHECK + 'Diamond': u'\u25c7', # ◇ WHITE DIAMOND + 'Finv': u'\u2132', # Ⅎ TURNED CAPITAL F + 'Game': u'\u2141', # ⅁ TURNED SANS-SERIF CAPITAL G + 'Gemini': u'\u264a', # ♊ GEMINI + 'Jupiter': u'\u2643', # ♃ JUPITER + 'LEFTCIRCLE': u'\u25d6', # ◖ LEFT HALF BLACK CIRCLE + 'LEFTcircle': u'\u25d0', # ◐ CIRCLE WITH LEFT HALF BLACK + 'Leo': u'\u264c', # ♌ LEO + 'Libra': u'\u264e', # ♎ LIBRA + 'Mars': u'\u2642', # ♂ MALE SIGN + 'Mercury': u'\u263f', # ☿ MERCURY + 'Neptune': u'\u2646', # ♆ NEPTUNE + 'Pluto': u'\u2647', # ♇ PLUTO + 'RIGHTCIRCLE': u'\u25d7', # ◗ RIGHT HALF BLACK CIRCLE + 'RIGHTcircle': u'\u25d1', # ◑ CIRCLE WITH RIGHT HALF BLACK + 'Saturn': u'\u2644', # ♄ SATURN + 'Scorpio': u'\u264f', # ♏ SCORPIUS + 'Square': u'\u2610', # ☐ BALLOT BOX + 'Sun': u'\u2609', # ☉ SUN + 'Taurus': u'\u2649', # ♉ TAURUS + 'Uranus': u'\u2645', # ♅ URANUS + 'Venus': u'\u2640', # ♀ FEMALE SIGN + 'XBox': u'\u2612', # ☒ BALLOT BOX WITH X + 'Yup': u'\u2144', # ⅄ TURNED SANS-SERIF CAPITAL Y + '_': u'_', # _ LOW LINE + 'angle': u'\u2220', # ∠ ANGLE + 'aquarius': u'\u2652', # ♒ AQUARIUS + 'aries': u'\u2648', # ♈ ARIES + 'ast': u'*', # * ASTERISK + 'backepsilon': u'\u03f6', # ϶ GREEK REVERSED LUNATE EPSILON SYMBOL + 'backprime': u'\u2035', # ‵ REVERSED PRIME + 'backslash': u'\\', # \ REVERSE SOLIDUS + 'because': u'\u2235', # ∵ BECAUSE + 'bigstar': u'\u2605', # ★ BLACK STAR + 'binampersand': u'&', # & AMPERSAND + 'blacklozenge': u'\u2b27', # ⬧ BLACK MEDIUM LOZENGE + 'blacksmiley': u'\u263b', # ☻ BLACK SMILING FACE + 'blacksquare': u'\u25fc', # ◼ BLACK MEDIUM SQUARE + 'bot': u'\u22a5', # ⊥ UP TACK + 'boy': u'\u2642', # ♂ MALE SIGN + 'cancer': u'\u264b', # ♋ CANCER + 'capricornus': u'\u2651', # ♑ CAPRICORN + 'cdots': u'\u22ef', # ⋯ MIDLINE HORIZONTAL ELLIPSIS + 'cent': u'\xa2', # ¢ CENT SIGN + 'centerdot': u'\u2b1d', # ⬝ BLACK VERY SMALL SQUARE + 'checkmark': u'\u2713', # ✓ CHECK MARK + 'circlearrowleft': u'\u21ba', # ↺ ANTICLOCKWISE OPEN CIRCLE ARROW + 'circlearrowright': u'\u21bb', # ↻ CLOCKWISE OPEN CIRCLE ARROW + 'circledR': u'\xae', # ® REGISTERED SIGN + 'circledcirc': u'\u25ce', # ◎ BULLSEYE + 'clubsuit': u'\u2663', # ♣ BLACK CLUB SUIT + 'complement': u'\u2201', # ∁ COMPLEMENT + 'dasharrow': u'\u21e2', # ⇢ RIGHTWARDS DASHED ARROW + 'dashleftarrow': u'\u21e0', # ⇠ LEFTWARDS DASHED ARROW + 'dashrightarrow': u'\u21e2', # ⇢ RIGHTWARDS DASHED ARROW + 'diameter': u'\u2300', # ⌀ DIAMETER SIGN + 'diamondsuit': u'\u2662', # ♢ WHITE DIAMOND SUIT + 'earth': u'\u2641', # ♁ EARTH + 'exists': u'\u2203', # ∃ THERE EXISTS + 'female': u'\u2640', # ♀ FEMALE SIGN + 'flat': u'\u266d', # ♭ MUSIC FLAT SIGN + 'forall': u'\u2200', # ∀ FOR ALL + 'fourth': u'\u2057', # ⁗ QUADRUPLE PRIME + 'frownie': u'\u2639', # ☹ WHITE FROWNING FACE + 'gemini': u'\u264a', # ♊ GEMINI + 'girl': u'\u2640', # ♀ FEMALE SIGN + 'heartsuit': u'\u2661', # ♡ WHITE HEART SUIT + 'infty': u'\u221e', # ∞ INFINITY + 'invneg': u'\u2310', # ⌐ REVERSED NOT SIGN + 'jupiter': u'\u2643', # ♃ JUPITER + 'ldots': u'\u2026', # … HORIZONTAL ELLIPSIS + 'leftmoon': u'\u263e', # ☾ LAST QUARTER MOON + 'leftturn': u'\u21ba', # ↺ ANTICLOCKWISE OPEN CIRCLE ARROW + 'leo': u'\u264c', # ♌ LEO + 'libra': u'\u264e', # ♎ LIBRA + 'lnot': u'\xac', # ¬ NOT SIGN + 'lozenge': u'\u25ca', # ◊ LOZENGE + 'male': u'\u2642', # ♂ MALE SIGN + 'maltese': u'\u2720', # ✠ MALTESE CROSS + 'mathdollar': u'$', # $ DOLLAR SIGN + 'measuredangle': u'\u2221', # ∡ MEASURED ANGLE + 'mercury': u'\u263f', # ☿ MERCURY + 'mho': u'\u2127', # ℧ INVERTED OHM SIGN + 'nabla': u'\u2207', # ∇ NABLA + 'natural': u'\u266e', # ♮ MUSIC NATURAL SIGN + 'neg': u'\xac', # ¬ NOT SIGN + 'neptune': u'\u2646', # ♆ NEPTUNE + 'nexists': u'\u2204', # ∄ THERE DOES NOT EXIST + 'notbackslash': u'\u2340', # ⍀ APL FUNCTIONAL SYMBOL BACKSLASH BAR + 'partial': u'\u2202', # ∂ PARTIAL DIFFERENTIAL + 'pisces': u'\u2653', # ♓ PISCES + 'pluto': u'\u2647', # ♇ PLUTO + 'pounds': u'\xa3', # £ POUND SIGN + 'prime': u'\u2032', # ′ PRIME + 'quarternote': u'\u2669', # ♩ QUARTER NOTE + 'rightmoon': u'\u263d', # ☽ FIRST QUARTER MOON + 'rightturn': u'\u21bb', # ↻ CLOCKWISE OPEN CIRCLE ARROW + 'sagittarius': u'\u2650', # ♐ SAGITTARIUS + 'saturn': u'\u2644', # ♄ SATURN + 'scorpio': u'\u264f', # ♏ SCORPIUS + 'second': u'\u2033', # ″ DOUBLE PRIME + 'sharp': u'\u266f', # ♯ MUSIC SHARP SIGN + 'sim': u'~', # ~ TILDE + 'slash': u'/', # / SOLIDUS + 'smiley': u'\u263a', # ☺ WHITE SMILING FACE + 'spadesuit': u'\u2660', # ♠ BLACK SPADE SUIT + 'spddot': u'\xa8', # ¨ DIAERESIS + 'sphat': u'^', # ^ CIRCUMFLEX ACCENT + 'sphericalangle': u'\u2222', # ∢ SPHERICAL ANGLE + 'sptilde': u'~', # ~ TILDE + 'square': u'\u25fb', # ◻ WHITE MEDIUM SQUARE + 'sun': u'\u263c', # ☼ WHITE SUN WITH RAYS + 'taurus': u'\u2649', # ♉ TAURUS + 'therefore': u'\u2234', # ∴ THEREFORE + 'third': u'\u2034', # ‴ TRIPLE PRIME + 'top': u'\u22a4', # ⊤ DOWN TACK + 'triangleleft': u'\u25c5', # ◅ WHITE LEFT-POINTING POINTER + 'triangleright': u'\u25bb', # ▻ WHITE RIGHT-POINTING POINTER + 'twonotes': u'\u266b', # ♫ BEAMED EIGHTH NOTES + 'uranus': u'\u2645', # ♅ URANUS + 'varEarth': u'\u2641', # ♁ EARTH + 'varnothing': u'\u2205', # ∅ EMPTY SET + 'virgo': u'\u264d', # ♍ VIRGO + 'wasylozenge': u'\u2311', # ⌑ SQUARE LOZENGE + 'wasytherefore': u'\u2234', # ∴ THEREFORE + 'yen': u'\xa5', # ¥ YEN SIGN + } +mathover = { + 'overbrace': u'\u23de', # ⏞ TOP CURLY BRACKET + 'wideparen': u'\u23dc', # ⏜ TOP PARENTHESIS + } +mathradical = { + 'sqrt': u'\u221a', # √ SQUARE ROOT + 'sqrt[3]': u'\u221b', # ∛ CUBE ROOT + 'sqrt[4]': u'\u221c', # ∜ FOURTH ROOT + } +mathrel = { + 'Bumpeq': u'\u224e', # ≎ GEOMETRICALLY EQUIVALENT TO + 'Doteq': u'\u2251', # ≑ GEOMETRICALLY EQUAL TO + 'Downarrow': u'\u21d3', # ⇓ DOWNWARDS DOUBLE ARROW + 'Leftarrow': u'\u21d0', # ⇐ LEFTWARDS DOUBLE ARROW + 'Leftrightarrow': u'\u21d4', # ⇔ LEFT RIGHT DOUBLE ARROW + 'Lleftarrow': u'\u21da', # ⇚ LEFTWARDS TRIPLE ARROW + 'Longleftarrow': u'\u27f8', # ⟸ LONG LEFTWARDS DOUBLE ARROW + 'Longleftrightarrow': u'\u27fa', # ⟺ LONG LEFT RIGHT DOUBLE ARROW + 'Longmapsfrom': u'\u27fd', # ⟽ LONG LEFTWARDS DOUBLE ARROW FROM BAR + 'Longmapsto': u'\u27fe', # ⟾ LONG RIGHTWARDS DOUBLE ARROW FROM BAR + 'Longrightarrow': u'\u27f9', # ⟹ LONG RIGHTWARDS DOUBLE ARROW + 'Lsh': u'\u21b0', # ↰ UPWARDS ARROW WITH TIP LEFTWARDS + 'Mapsfrom': u'\u2906', # ⤆ LEFTWARDS DOUBLE ARROW FROM BAR + 'Mapsto': u'\u2907', # ⤇ RIGHTWARDS DOUBLE ARROW FROM BAR + 'Rightarrow': u'\u21d2', # ⇒ RIGHTWARDS DOUBLE ARROW + 'Rrightarrow': u'\u21db', # ⇛ RIGHTWARDS TRIPLE ARROW + 'Rsh': u'\u21b1', # ↱ UPWARDS ARROW WITH TIP RIGHTWARDS + 'Subset': u'\u22d0', # ⋐ DOUBLE SUBSET + 'Supset': u'\u22d1', # ⋑ DOUBLE SUPERSET + 'Uparrow': u'\u21d1', # ⇑ UPWARDS DOUBLE ARROW + 'Updownarrow': u'\u21d5', # ⇕ UP DOWN DOUBLE ARROW + 'VDash': u'\u22ab', # ⊫ DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE + 'Vdash': u'\u22a9', # ⊩ FORCES + 'Vvdash': u'\u22aa', # ⊪ TRIPLE VERTICAL BAR RIGHT TURNSTILE + 'apprge': u'\u2273', # ≳ GREATER-THAN OR EQUIVALENT TO + 'apprle': u'\u2272', # ≲ LESS-THAN OR EQUIVALENT TO + 'approx': u'\u2248', # ≈ ALMOST EQUAL TO + 'approxeq': u'\u224a', # ≊ ALMOST EQUAL OR EQUAL TO + 'asymp': u'\u224d', # ≍ EQUIVALENT TO + 'backsim': u'\u223d', # ∽ REVERSED TILDE + 'backsimeq': u'\u22cd', # ⋍ REVERSED TILDE EQUALS + 'barin': u'\u22f6', # ⋶ ELEMENT OF WITH OVERBAR + 'barleftharpoon': u'\u296b', # ⥫ LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH + 'barrightharpoon': u'\u296d', # ⥭ RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH + 'between': u'\u226c', # ≬ BETWEEN + 'bowtie': u'\u22c8', # ⋈ BOWTIE + 'bumpeq': u'\u224f', # ≏ DIFFERENCE BETWEEN + 'circeq': u'\u2257', # ≗ RING EQUAL TO + 'coloneq': u'\u2254', # ≔ COLON EQUALS + 'cong': u'\u2245', # ≅ APPROXIMATELY EQUAL TO + 'corresponds': u'\u2259', # ≙ ESTIMATES + 'curlyeqprec': u'\u22de', # ⋞ EQUAL TO OR PRECEDES + 'curlyeqsucc': u'\u22df', # ⋟ EQUAL TO OR SUCCEEDS + 'curvearrowleft': u'\u21b6', # ↶ ANTICLOCKWISE TOP SEMICIRCLE ARROW + 'curvearrowright': u'\u21b7', # ↷ CLOCKWISE TOP SEMICIRCLE ARROW + 'dashv': u'\u22a3', # ⊣ LEFT TACK + 'ddots': u'\u22f1', # ⋱ DOWN RIGHT DIAGONAL ELLIPSIS + 'dlsh': u'\u21b2', # ↲ DOWNWARDS ARROW WITH TIP LEFTWARDS + 'doteq': u'\u2250', # ≐ APPROACHES THE LIMIT + 'doteqdot': u'\u2251', # ≑ GEOMETRICALLY EQUAL TO + 'downarrow': u'\u2193', # ↓ DOWNWARDS ARROW + 'downdownarrows': u'\u21ca', # ⇊ DOWNWARDS PAIRED ARROWS + 'downdownharpoons': u'\u2965', # ⥥ DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT + 'downharpoonleft': u'\u21c3', # ⇃ DOWNWARDS HARPOON WITH BARB LEFTWARDS + 'downharpoonright': u'\u21c2', # ⇂ DOWNWARDS HARPOON WITH BARB RIGHTWARDS + 'downuparrows': u'\u21f5', # ⇵ DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW + 'downupharpoons': u'\u296f', # ⥯ DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT + 'drsh': u'\u21b3', # ↳ DOWNWARDS ARROW WITH TIP RIGHTWARDS + 'eqcirc': u'\u2256', # ≖ RING IN EQUAL TO + 'eqcolon': u'\u2255', # ≕ EQUALS COLON + 'eqsim': u'\u2242', # ≂ MINUS TILDE + 'eqslantgtr': u'\u2a96', # ⪖ SLANTED EQUAL TO OR GREATER-THAN + 'eqslantless': u'\u2a95', # ⪕ SLANTED EQUAL TO OR LESS-THAN + 'equiv': u'\u2261', # ≡ IDENTICAL TO + 'fallingdotseq': u'\u2252', # ≒ APPROXIMATELY EQUAL TO OR THE IMAGE OF + 'frown': u'\u2322', # ⌢ FROWN + 'ge': u'\u2265', # ≥ GREATER-THAN OR EQUAL TO + 'geq': u'\u2265', # ≥ GREATER-THAN OR EQUAL TO + 'geqq': u'\u2267', # ≧ GREATER-THAN OVER EQUAL TO + 'geqslant': u'\u2a7e', # ⩾ GREATER-THAN OR SLANTED EQUAL TO + 'gets': u'\u2190', # ← LEFTWARDS ARROW + 'gg': u'\u226b', # ≫ MUCH GREATER-THAN + 'ggcurly': u'\u2abc', # ⪼ DOUBLE SUCCEEDS + 'ggg': u'\u22d9', # ⋙ VERY MUCH GREATER-THAN + 'gnapprox': u'\u2a8a', # ⪊ GREATER-THAN AND NOT APPROXIMATE + 'gneq': u'\u2a88', # ⪈ GREATER-THAN AND SINGLE-LINE NOT EQUAL TO + 'gneqq': u'\u2269', # ≩ GREATER-THAN BUT NOT EQUAL TO + 'gnsim': u'\u22e7', # ⋧ GREATER-THAN BUT NOT EQUIVALENT TO + 'gtrapprox': u'\u2a86', # ⪆ GREATER-THAN OR APPROXIMATE + 'gtrdot': u'\u22d7', # ⋗ GREATER-THAN WITH DOT + 'gtreqless': u'\u22db', # ⋛ GREATER-THAN EQUAL TO OR LESS-THAN + 'gtreqqless': u'\u2a8c', # ⪌ GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN + 'gtrless': u'\u2277', # ≷ GREATER-THAN OR LESS-THAN + 'gtrsim': u'\u2273', # ≳ GREATER-THAN OR EQUIVALENT TO + 'hash': u'\u22d5', # ⋕ EQUAL AND PARALLEL TO + 'hookleftarrow': u'\u21a9', # ↩ LEFTWARDS ARROW WITH HOOK + 'hookrightarrow': u'\u21aa', # ↪ RIGHTWARDS ARROW WITH HOOK + 'iddots': u'\u22f0', # ⋰ UP RIGHT DIAGONAL ELLIPSIS + 'impliedby': u'\u27f8', # ⟸ LONG LEFTWARDS DOUBLE ARROW + 'implies': u'\u27f9', # ⟹ LONG RIGHTWARDS DOUBLE ARROW + 'in': u'\u2208', # ∈ ELEMENT OF + 'le': u'\u2264', # ≤ LESS-THAN OR EQUAL TO + 'leftarrow': u'\u2190', # ← LEFTWARDS ARROW + 'leftarrowtail': u'\u21a2', # ↢ LEFTWARDS ARROW WITH TAIL + 'leftarrowtriangle': u'\u21fd', # ⇽ LEFTWARDS OPEN-HEADED ARROW + 'leftbarharpoon': u'\u296a', # ⥪ LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH + 'leftharpoondown': u'\u21bd', # ↽ LEFTWARDS HARPOON WITH BARB DOWNWARDS + 'leftharpoonup': u'\u21bc', # ↼ LEFTWARDS HARPOON WITH BARB UPWARDS + 'leftleftarrows': u'\u21c7', # ⇇ LEFTWARDS PAIRED ARROWS + 'leftleftharpoons': u'\u2962', # ⥢ LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN + 'leftrightarrow': u'\u2194', # ↔ LEFT RIGHT ARROW + 'leftrightarrows': u'\u21c6', # ⇆ LEFTWARDS ARROW OVER RIGHTWARDS ARROW + 'leftrightarrowtriangle': u'\u21ff', # ⇿ LEFT RIGHT OPEN-HEADED ARROW + 'leftrightharpoon': u'\u294a', # ⥊ LEFT BARB UP RIGHT BARB DOWN HARPOON + 'leftrightharpoons': u'\u21cb', # ⇋ LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON + 'leftrightsquigarrow': u'\u21ad', # ↭ LEFT RIGHT WAVE ARROW + 'leftslice': u'\u2aa6', # ⪦ LESS-THAN CLOSED BY CURVE + 'leftsquigarrow': u'\u21dc', # ⇜ LEFTWARDS SQUIGGLE ARROW + 'leq': u'\u2264', # ≤ LESS-THAN OR EQUAL TO + 'leqq': u'\u2266', # ≦ LESS-THAN OVER EQUAL TO + 'leqslant': u'\u2a7d', # ⩽ LESS-THAN OR SLANTED EQUAL TO + 'lessapprox': u'\u2a85', # ⪅ LESS-THAN OR APPROXIMATE + 'lessdot': u'\u22d6', # ⋖ LESS-THAN WITH DOT + 'lesseqgtr': u'\u22da', # ⋚ LESS-THAN EQUAL TO OR GREATER-THAN + 'lesseqqgtr': u'\u2a8b', # ⪋ LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN + 'lessgtr': u'\u2276', # ≶ LESS-THAN OR GREATER-THAN + 'lesssim': u'\u2272', # ≲ LESS-THAN OR EQUIVALENT TO + 'lightning': u'\u21af', # ↯ DOWNWARDS ZIGZAG ARROW + 'll': u'\u226a', # ≪ MUCH LESS-THAN + 'llcurly': u'\u2abb', # ⪻ DOUBLE PRECEDES + 'lll': u'\u22d8', # ⋘ VERY MUCH LESS-THAN + 'lnapprox': u'\u2a89', # ⪉ LESS-THAN AND NOT APPROXIMATE + 'lneq': u'\u2a87', # ⪇ LESS-THAN AND SINGLE-LINE NOT EQUAL TO + 'lneqq': u'\u2268', # ≨ LESS-THAN BUT NOT EQUAL TO + 'lnsim': u'\u22e6', # ⋦ LESS-THAN BUT NOT EQUIVALENT TO + 'longleftarrow': u'\u27f5', # ⟵ LONG LEFTWARDS ARROW + 'longleftrightarrow': u'\u27f7', # ⟷ LONG LEFT RIGHT ARROW + 'longmapsfrom': u'\u27fb', # ⟻ LONG LEFTWARDS ARROW FROM BAR + 'longmapsto': u'\u27fc', # ⟼ LONG RIGHTWARDS ARROW FROM BAR + 'longrightarrow': u'\u27f6', # ⟶ LONG RIGHTWARDS ARROW + 'looparrowleft': u'\u21ab', # ↫ LEFTWARDS ARROW WITH LOOP + 'looparrowright': u'\u21ac', # ↬ RIGHTWARDS ARROW WITH LOOP + 'mapsfrom': u'\u21a4', # ↤ LEFTWARDS ARROW FROM BAR + 'mapsto': u'\u21a6', # ↦ RIGHTWARDS ARROW FROM BAR + 'mid': u'\u2223', # ∣ DIVIDES + 'models': u'\u22a7', # ⊧ MODELS + 'multimap': u'\u22b8', # ⊸ MULTIMAP + 'nLeftarrow': u'\u21cd', # ⇍ LEFTWARDS DOUBLE ARROW WITH STROKE + 'nLeftrightarrow': u'\u21ce', # ⇎ LEFT RIGHT DOUBLE ARROW WITH STROKE + 'nRightarrow': u'\u21cf', # ⇏ RIGHTWARDS DOUBLE ARROW WITH STROKE + 'nVDash': u'\u22af', # ⊯ NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE + 'nVdash': u'\u22ae', # ⊮ DOES NOT FORCE + 'ncong': u'\u2247', # ≇ NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO + 'ne': u'\u2260', # ≠ NOT EQUAL TO + 'nearrow': u'\u2197', # ↗ NORTH EAST ARROW + 'neq': u'\u2260', # ≠ NOT EQUAL TO + 'ngeq': u'\u2271', # ≱ NEITHER GREATER-THAN NOR EQUAL TO + 'ngtr': u'\u226f', # ≯ NOT GREATER-THAN + 'ni': u'\u220b', # ∋ CONTAINS AS MEMBER + 'nleftarrow': u'\u219a', # ↚ LEFTWARDS ARROW WITH STROKE + 'nleftrightarrow': u'\u21ae', # ↮ LEFT RIGHT ARROW WITH STROKE + 'nleq': u'\u2270', # ≰ NEITHER LESS-THAN NOR EQUAL TO + 'nless': u'\u226e', # ≮ NOT LESS-THAN + 'nmid': u'\u2224', # ∤ DOES NOT DIVIDE + 'notasymp': u'\u226d', # ≭ NOT EQUIVALENT TO + 'notin': u'\u2209', # ∉ NOT AN ELEMENT OF + 'notowner': u'\u220c', # ∌ DOES NOT CONTAIN AS MEMBER + 'notslash': u'\u233f', # ⌿ APL FUNCTIONAL SYMBOL SLASH BAR + 'nparallel': u'\u2226', # ∦ NOT PARALLEL TO + 'nprec': u'\u2280', # ⊀ DOES NOT PRECEDE + 'npreceq': u'\u22e0', # ⋠ DOES NOT PRECEDE OR EQUAL + 'nrightarrow': u'\u219b', # ↛ RIGHTWARDS ARROW WITH STROKE + 'nsim': u'\u2241', # ≁ NOT TILDE + 'nsubseteq': u'\u2288', # ⊈ NEITHER A SUBSET OF NOR EQUAL TO + 'nsucc': u'\u2281', # ⊁ DOES NOT SUCCEED + 'nsucceq': u'\u22e1', # ⋡ DOES NOT SUCCEED OR EQUAL + 'nsupseteq': u'\u2289', # ⊉ NEITHER A SUPERSET OF NOR EQUAL TO + 'ntriangleleft': u'\u22ea', # ⋪ NOT NORMAL SUBGROUP OF + 'ntrianglelefteq': u'\u22ec', # ⋬ NOT NORMAL SUBGROUP OF OR EQUAL TO + 'ntriangleright': u'\u22eb', # ⋫ DOES NOT CONTAIN AS NORMAL SUBGROUP + 'ntrianglerighteq': u'\u22ed', # ⋭ DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL + 'nvDash': u'\u22ad', # ⊭ NOT TRUE + 'nvdash': u'\u22ac', # ⊬ DOES NOT PROVE + 'nwarrow': u'\u2196', # ↖ NORTH WEST ARROW + 'owns': u'\u220b', # ∋ CONTAINS AS MEMBER + 'parallel': u'\u2225', # ∥ PARALLEL TO + 'perp': u'\u27c2', # ⟂ PERPENDICULAR + 'pitchfork': u'\u22d4', # ⋔ PITCHFORK + 'prec': u'\u227a', # ≺ PRECEDES + 'precapprox': u'\u2ab7', # ⪷ PRECEDES ABOVE ALMOST EQUAL TO + 'preccurlyeq': u'\u227c', # ≼ PRECEDES OR EQUAL TO + 'preceq': u'\u2aaf', # ⪯ PRECEDES ABOVE SINGLE-LINE EQUALS SIGN + 'precnapprox': u'\u2ab9', # ⪹ PRECEDES ABOVE NOT ALMOST EQUAL TO + 'precnsim': u'\u22e8', # ⋨ PRECEDES BUT NOT EQUIVALENT TO + 'precsim': u'\u227e', # ≾ PRECEDES OR EQUIVALENT TO + 'propto': u'\u221d', # ∝ PROPORTIONAL TO + 'restriction': u'\u21be', # ↾ UPWARDS HARPOON WITH BARB RIGHTWARDS + 'rightarrow': u'\u2192', # → RIGHTWARDS ARROW + 'rightarrowtail': u'\u21a3', # ↣ RIGHTWARDS ARROW WITH TAIL + 'rightarrowtriangle': u'\u21fe', # ⇾ RIGHTWARDS OPEN-HEADED ARROW + 'rightbarharpoon': u'\u296c', # ⥬ RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH + 'rightharpoondown': u'\u21c1', # ⇁ RIGHTWARDS HARPOON WITH BARB DOWNWARDS + 'rightharpoonup': u'\u21c0', # ⇀ RIGHTWARDS HARPOON WITH BARB UPWARDS + 'rightleftarrows': u'\u21c4', # ⇄ RIGHTWARDS ARROW OVER LEFTWARDS ARROW + 'rightleftharpoon': u'\u294b', # ⥋ LEFT BARB DOWN RIGHT BARB UP HARPOON + 'rightleftharpoons': u'\u21cc', # ⇌ RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON + 'rightrightarrows': u'\u21c9', # ⇉ RIGHTWARDS PAIRED ARROWS + 'rightrightharpoons': u'\u2964', # ⥤ RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN + 'rightslice': u'\u2aa7', # ⪧ GREATER-THAN CLOSED BY CURVE + 'rightsquigarrow': u'\u21dd', # ⇝ RIGHTWARDS SQUIGGLE ARROW + 'risingdotseq': u'\u2253', # ≓ IMAGE OF OR APPROXIMATELY EQUAL TO + 'searrow': u'\u2198', # ↘ SOUTH EAST ARROW + 'sim': u'\u223c', # ∼ TILDE OPERATOR + 'simeq': u'\u2243', # ≃ ASYMPTOTICALLY EQUAL TO + 'smallfrown': u'\u2322', # ⌢ FROWN + 'smallsmile': u'\u2323', # ⌣ SMILE + 'smile': u'\u2323', # ⌣ SMILE + 'sqsubset': u'\u228f', # ⊏ SQUARE IMAGE OF + 'sqsubseteq': u'\u2291', # ⊑ SQUARE IMAGE OF OR EQUAL TO + 'sqsupset': u'\u2290', # ⊐ SQUARE ORIGINAL OF + 'sqsupseteq': u'\u2292', # ⊒ SQUARE ORIGINAL OF OR EQUAL TO + 'subset': u'\u2282', # ⊂ SUBSET OF + 'subseteq': u'\u2286', # ⊆ SUBSET OF OR EQUAL TO + 'subseteqq': u'\u2ac5', # ⫅ SUBSET OF ABOVE EQUALS SIGN + 'subsetneq': u'\u228a', # ⊊ SUBSET OF WITH NOT EQUAL TO + 'subsetneqq': u'\u2acb', # ⫋ SUBSET OF ABOVE NOT EQUAL TO + 'succ': u'\u227b', # ≻ SUCCEEDS + 'succapprox': u'\u2ab8', # ⪸ SUCCEEDS ABOVE ALMOST EQUAL TO + 'succcurlyeq': u'\u227d', # ≽ SUCCEEDS OR EQUAL TO + 'succeq': u'\u2ab0', # ⪰ SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN + 'succnapprox': u'\u2aba', # ⪺ SUCCEEDS ABOVE NOT ALMOST EQUAL TO + 'succnsim': u'\u22e9', # ⋩ SUCCEEDS BUT NOT EQUIVALENT TO + 'succsim': u'\u227f', # ≿ SUCCEEDS OR EQUIVALENT TO + 'supset': u'\u2283', # ⊃ SUPERSET OF + 'supseteq': u'\u2287', # ⊇ SUPERSET OF OR EQUAL TO + 'supseteqq': u'\u2ac6', # ⫆ SUPERSET OF ABOVE EQUALS SIGN + 'supsetneq': u'\u228b', # ⊋ SUPERSET OF WITH NOT EQUAL TO + 'supsetneqq': u'\u2acc', # ⫌ SUPERSET OF ABOVE NOT EQUAL TO + 'swarrow': u'\u2199', # ↙ SOUTH WEST ARROW + 'to': u'\u2192', # → RIGHTWARDS ARROW + 'trianglelefteq': u'\u22b4', # ⊴ NORMAL SUBGROUP OF OR EQUAL TO + 'triangleq': u'\u225c', # ≜ DELTA EQUAL TO + 'trianglerighteq': u'\u22b5', # ⊵ CONTAINS AS NORMAL SUBGROUP OR EQUAL TO + 'twoheadleftarrow': u'\u219e', # ↞ LEFTWARDS TWO HEADED ARROW + 'twoheadrightarrow': u'\u21a0', # ↠ RIGHTWARDS TWO HEADED ARROW + 'uparrow': u'\u2191', # ↑ UPWARDS ARROW + 'updownarrow': u'\u2195', # ↕ UP DOWN ARROW + 'updownarrows': u'\u21c5', # ⇅ UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW + 'updownharpoons': u'\u296e', # ⥮ UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT + 'upharpoonleft': u'\u21bf', # ↿ UPWARDS HARPOON WITH BARB LEFTWARDS + 'upharpoonright': u'\u21be', # ↾ UPWARDS HARPOON WITH BARB RIGHTWARDS + 'upuparrows': u'\u21c8', # ⇈ UPWARDS PAIRED ARROWS + 'upupharpoons': u'\u2963', # ⥣ UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT + 'vDash': u'\u22a8', # ⊨ TRUE + 'varpropto': u'\u221d', # ∝ PROPORTIONAL TO + 'vartriangleleft': u'\u22b2', # ⊲ NORMAL SUBGROUP OF + 'vartriangleright': u'\u22b3', # ⊳ CONTAINS AS NORMAL SUBGROUP + 'vdash': u'\u22a2', # ⊢ RIGHT TACK + 'vdots': u'\u22ee', # ⋮ VERTICAL ELLIPSIS + } +mathunder = { + 'underbrace': u'\u23df', # ⏟ BOTTOM CURLY BRACKET + } +space = { + ':': u'\u205f', #   MEDIUM MATHEMATICAL SPACE + 'medspace': u'\u205f', #   MEDIUM MATHEMATICAL SPACE + 'quad': u'\u2001', #   EM QUAD + } diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/unichar2tex.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/unichar2tex.py new file mode 100644 index 0000000..0e0b808 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/math/unichar2tex.py @@ -0,0 +1,788 @@ +# LaTeX math to Unicode symbols translation table +# for use with the translate() method of unicode objects. +# Generated with ``write_unichar2tex.py`` from the data in +# http://milde.users.sourceforge.net/LUCR/Math/ + +# Includes commands from: standard LaTeX, amssymb, amsmath + +uni2tex_table = { +160: u'~', +163: u'\\pounds ', +165: u'\\yen ', +172: u'\\neg ', +174: u'\\circledR ', +177: u'\\pm ', +215: u'\\times ', +240: u'\\eth ', +247: u'\\div ', +305: u'\\imath ', +567: u'\\jmath ', +915: u'\\Gamma ', +916: u'\\Delta ', +920: u'\\Theta ', +923: u'\\Lambda ', +926: u'\\Xi ', +928: u'\\Pi ', +931: u'\\Sigma ', +933: u'\\Upsilon ', +934: u'\\Phi ', +936: u'\\Psi ', +937: u'\\Omega ', +945: u'\\alpha ', +946: u'\\beta ', +947: u'\\gamma ', +948: u'\\delta ', +949: u'\\varepsilon ', +950: u'\\zeta ', +951: u'\\eta ', +952: u'\\theta ', +953: u'\\iota ', +954: u'\\kappa ', +955: u'\\lambda ', +956: u'\\mu ', +957: u'\\nu ', +958: u'\\xi ', +960: u'\\pi ', +961: u'\\rho ', +962: u'\\varsigma ', +963: u'\\sigma ', +964: u'\\tau ', +965: u'\\upsilon ', +966: u'\\varphi ', +967: u'\\chi ', +968: u'\\psi ', +969: u'\\omega ', +977: u'\\vartheta ', +981: u'\\phi ', +982: u'\\varpi ', +989: u'\\digamma ', +1014: u'\\backepsilon ', +8193: u'\\quad ', +8214: u'\\| ', +8224: u'\\dagger ', +8225: u'\\ddagger ', +8230: u'\\ldots ', +8242: u'\\prime ', +8245: u'\\backprime ', +8287: u'\\: ', +8450: u'\\mathbb{C}', +8459: u'\\mathcal{H}', +8460: u'\\mathfrak{H}', +8461: u'\\mathbb{H}', +8463: u'\\hslash ', +8464: u'\\mathcal{I}', +8465: u'\\Im ', +8466: u'\\mathcal{L}', +8467: u'\\ell ', +8469: u'\\mathbb{N}', +8472: u'\\wp ', +8473: u'\\mathbb{P}', +8474: u'\\mathbb{Q}', +8475: u'\\mathcal{R}', +8476: u'\\Re ', +8477: u'\\mathbb{R}', +8484: u'\\mathbb{Z}', +8487: u'\\mho ', +8488: u'\\mathfrak{Z}', +8492: u'\\mathcal{B}', +8493: u'\\mathfrak{C}', +8496: u'\\mathcal{E}', +8497: u'\\mathcal{F}', +8498: u'\\Finv ', +8499: u'\\mathcal{M}', +8501: u'\\aleph ', +8502: u'\\beth ', +8503: u'\\gimel ', +8504: u'\\daleth ', +8592: u'\\leftarrow ', +8593: u'\\uparrow ', +8594: u'\\rightarrow ', +8595: u'\\downarrow ', +8596: u'\\leftrightarrow ', +8597: u'\\updownarrow ', +8598: u'\\nwarrow ', +8599: u'\\nearrow ', +8600: u'\\searrow ', +8601: u'\\swarrow ', +8602: u'\\nleftarrow ', +8603: u'\\nrightarrow ', +8606: u'\\twoheadleftarrow ', +8608: u'\\twoheadrightarrow ', +8610: u'\\leftarrowtail ', +8611: u'\\rightarrowtail ', +8614: u'\\mapsto ', +8617: u'\\hookleftarrow ', +8618: u'\\hookrightarrow ', +8619: u'\\looparrowleft ', +8620: u'\\looparrowright ', +8621: u'\\leftrightsquigarrow ', +8622: u'\\nleftrightarrow ', +8624: u'\\Lsh ', +8625: u'\\Rsh ', +8630: u'\\curvearrowleft ', +8631: u'\\curvearrowright ', +8634: u'\\circlearrowleft ', +8635: u'\\circlearrowright ', +8636: u'\\leftharpoonup ', +8637: u'\\leftharpoondown ', +8638: u'\\upharpoonright ', +8639: u'\\upharpoonleft ', +8640: u'\\rightharpoonup ', +8641: u'\\rightharpoondown ', +8642: u'\\downharpoonright ', +8643: u'\\downharpoonleft ', +8644: u'\\rightleftarrows ', +8646: u'\\leftrightarrows ', +8647: u'\\leftleftarrows ', +8648: u'\\upuparrows ', +8649: u'\\rightrightarrows ', +8650: u'\\downdownarrows ', +8651: u'\\leftrightharpoons ', +8652: u'\\rightleftharpoons ', +8653: u'\\nLeftarrow ', +8654: u'\\nLeftrightarrow ', +8655: u'\\nRightarrow ', +8656: u'\\Leftarrow ', +8657: u'\\Uparrow ', +8658: u'\\Rightarrow ', +8659: u'\\Downarrow ', +8660: u'\\Leftrightarrow ', +8661: u'\\Updownarrow ', +8666: u'\\Lleftarrow ', +8667: u'\\Rrightarrow ', +8669: u'\\rightsquigarrow ', +8672: u'\\dashleftarrow ', +8674: u'\\dashrightarrow ', +8704: u'\\forall ', +8705: u'\\complement ', +8706: u'\\partial ', +8707: u'\\exists ', +8708: u'\\nexists ', +8709: u'\\varnothing ', +8711: u'\\nabla ', +8712: u'\\in ', +8713: u'\\notin ', +8715: u'\\ni ', +8719: u'\\prod ', +8720: u'\\coprod ', +8721: u'\\sum ', +8722: u'-', +8723: u'\\mp ', +8724: u'\\dotplus ', +8725: u'\\slash ', +8726: u'\\smallsetminus ', +8727: u'\\ast ', +8728: u'\\circ ', +8729: u'\\bullet ', +8730: u'\\sqrt ', +8731: u'\\sqrt[3] ', +8732: u'\\sqrt[4] ', +8733: u'\\propto ', +8734: u'\\infty ', +8736: u'\\angle ', +8737: u'\\measuredangle ', +8738: u'\\sphericalangle ', +8739: u'\\mid ', +8740: u'\\nmid ', +8741: u'\\parallel ', +8742: u'\\nparallel ', +8743: u'\\wedge ', +8744: u'\\vee ', +8745: u'\\cap ', +8746: u'\\cup ', +8747: u'\\int ', +8748: u'\\iint ', +8749: u'\\iiint ', +8750: u'\\oint ', +8756: u'\\therefore ', +8757: u'\\because ', +8758: u':', +8764: u'\\sim ', +8765: u'\\backsim ', +8768: u'\\wr ', +8769: u'\\nsim ', +8770: u'\\eqsim ', +8771: u'\\simeq ', +8773: u'\\cong ', +8775: u'\\ncong ', +8776: u'\\approx ', +8778: u'\\approxeq ', +8781: u'\\asymp ', +8782: u'\\Bumpeq ', +8783: u'\\bumpeq ', +8784: u'\\doteq ', +8785: u'\\Doteq ', +8786: u'\\fallingdotseq ', +8787: u'\\risingdotseq ', +8790: u'\\eqcirc ', +8791: u'\\circeq ', +8796: u'\\triangleq ', +8800: u'\\neq ', +8801: u'\\equiv ', +8804: u'\\leq ', +8805: u'\\geq ', +8806: u'\\leqq ', +8807: u'\\geqq ', +8808: u'\\lneqq ', +8809: u'\\gneqq ', +8810: u'\\ll ', +8811: u'\\gg ', +8812: u'\\between ', +8814: u'\\nless ', +8815: u'\\ngtr ', +8816: u'\\nleq ', +8817: u'\\ngeq ', +8818: u'\\lesssim ', +8819: u'\\gtrsim ', +8822: u'\\lessgtr ', +8823: u'\\gtrless ', +8826: u'\\prec ', +8827: u'\\succ ', +8828: u'\\preccurlyeq ', +8829: u'\\succcurlyeq ', +8830: u'\\precsim ', +8831: u'\\succsim ', +8832: u'\\nprec ', +8833: u'\\nsucc ', +8834: u'\\subset ', +8835: u'\\supset ', +8838: u'\\subseteq ', +8839: u'\\supseteq ', +8840: u'\\nsubseteq ', +8841: u'\\nsupseteq ', +8842: u'\\subsetneq ', +8843: u'\\supsetneq ', +8846: u'\\uplus ', +8847: u'\\sqsubset ', +8848: u'\\sqsupset ', +8849: u'\\sqsubseteq ', +8850: u'\\sqsupseteq ', +8851: u'\\sqcap ', +8852: u'\\sqcup ', +8853: u'\\oplus ', +8854: u'\\ominus ', +8855: u'\\otimes ', +8856: u'\\oslash ', +8857: u'\\odot ', +8858: u'\\circledcirc ', +8859: u'\\circledast ', +8861: u'\\circleddash ', +8862: u'\\boxplus ', +8863: u'\\boxminus ', +8864: u'\\boxtimes ', +8865: u'\\boxdot ', +8866: u'\\vdash ', +8867: u'\\dashv ', +8868: u'\\top ', +8869: u'\\bot ', +8871: u'\\models ', +8872: u'\\vDash ', +8873: u'\\Vdash ', +8874: u'\\Vvdash ', +8876: u'\\nvdash ', +8877: u'\\nvDash ', +8878: u'\\nVdash ', +8879: u'\\nVDash ', +8882: u'\\vartriangleleft ', +8883: u'\\vartriangleright ', +8884: u'\\trianglelefteq ', +8885: u'\\trianglerighteq ', +8888: u'\\multimap ', +8890: u'\\intercal ', +8891: u'\\veebar ', +8892: u'\\barwedge ', +8896: u'\\bigwedge ', +8897: u'\\bigvee ', +8898: u'\\bigcap ', +8899: u'\\bigcup ', +8900: u'\\diamond ', +8901: u'\\cdot ', +8902: u'\\star ', +8903: u'\\divideontimes ', +8904: u'\\bowtie ', +8905: u'\\ltimes ', +8906: u'\\rtimes ', +8907: u'\\leftthreetimes ', +8908: u'\\rightthreetimes ', +8909: u'\\backsimeq ', +8910: u'\\curlyvee ', +8911: u'\\curlywedge ', +8912: u'\\Subset ', +8913: u'\\Supset ', +8914: u'\\Cap ', +8915: u'\\Cup ', +8916: u'\\pitchfork ', +8918: u'\\lessdot ', +8919: u'\\gtrdot ', +8920: u'\\lll ', +8921: u'\\ggg ', +8922: u'\\lesseqgtr ', +8923: u'\\gtreqless ', +8926: u'\\curlyeqprec ', +8927: u'\\curlyeqsucc ', +8928: u'\\npreceq ', +8929: u'\\nsucceq ', +8934: u'\\lnsim ', +8935: u'\\gnsim ', +8936: u'\\precnsim ', +8937: u'\\succnsim ', +8938: u'\\ntriangleleft ', +8939: u'\\ntriangleright ', +8940: u'\\ntrianglelefteq ', +8941: u'\\ntrianglerighteq ', +8942: u'\\vdots ', +8943: u'\\cdots ', +8945: u'\\ddots ', +8968: u'\\lceil ', +8969: u'\\rceil ', +8970: u'\\lfloor ', +8971: u'\\rfloor ', +8988: u'\\ulcorner ', +8989: u'\\urcorner ', +8990: u'\\llcorner ', +8991: u'\\lrcorner ', +8994: u'\\frown ', +8995: u'\\smile ', +9182: u'\\overbrace ', +9183: u'\\underbrace ', +9651: u'\\bigtriangleup ', +9655: u'\\rhd ', +9661: u'\\bigtriangledown ', +9665: u'\\lhd ', +9671: u'\\Diamond ', +9674: u'\\lozenge ', +9723: u'\\square ', +9724: u'\\blacksquare ', +9733: u'\\bigstar ', +9824: u'\\spadesuit ', +9825: u'\\heartsuit ', +9826: u'\\diamondsuit ', +9827: u'\\clubsuit ', +9837: u'\\flat ', +9838: u'\\natural ', +9839: u'\\sharp ', +10003: u'\\checkmark ', +10016: u'\\maltese ', +10178: u'\\perp ', +10216: u'\\langle ', +10217: u'\\rangle ', +10222: u'\\lgroup ', +10223: u'\\rgroup ', +10229: u'\\longleftarrow ', +10230: u'\\longrightarrow ', +10231: u'\\longleftrightarrow ', +10232: u'\\Longleftarrow ', +10233: u'\\Longrightarrow ', +10234: u'\\Longleftrightarrow ', +10236: u'\\longmapsto ', +10731: u'\\blacklozenge ', +10741: u'\\setminus ', +10752: u'\\bigodot ', +10753: u'\\bigoplus ', +10754: u'\\bigotimes ', +10756: u'\\biguplus ', +10758: u'\\bigsqcup ', +10764: u'\\iiiint ', +10781: u'\\Join ', +10815: u'\\amalg ', +10846: u'\\doublebarwedge ', +10877: u'\\leqslant ', +10878: u'\\geqslant ', +10885: u'\\lessapprox ', +10886: u'\\gtrapprox ', +10887: u'\\lneq ', +10888: u'\\gneq ', +10889: u'\\lnapprox ', +10890: u'\\gnapprox ', +10891: u'\\lesseqqgtr ', +10892: u'\\gtreqqless ', +10901: u'\\eqslantless ', +10902: u'\\eqslantgtr ', +10927: u'\\preceq ', +10928: u'\\succeq ', +10935: u'\\precapprox ', +10936: u'\\succapprox ', +10937: u'\\precnapprox ', +10938: u'\\succnapprox ', +10949: u'\\subseteqq ', +10950: u'\\supseteqq ', +10955: u'\\subsetneqq ', +10956: u'\\supsetneqq ', +119808: u'\\mathbf{A}', +119809: u'\\mathbf{B}', +119810: u'\\mathbf{C}', +119811: u'\\mathbf{D}', +119812: u'\\mathbf{E}', +119813: u'\\mathbf{F}', +119814: u'\\mathbf{G}', +119815: u'\\mathbf{H}', +119816: u'\\mathbf{I}', +119817: u'\\mathbf{J}', +119818: u'\\mathbf{K}', +119819: u'\\mathbf{L}', +119820: u'\\mathbf{M}', +119821: u'\\mathbf{N}', +119822: u'\\mathbf{O}', +119823: u'\\mathbf{P}', +119824: u'\\mathbf{Q}', +119825: u'\\mathbf{R}', +119826: u'\\mathbf{S}', +119827: u'\\mathbf{T}', +119828: u'\\mathbf{U}', +119829: u'\\mathbf{V}', +119830: u'\\mathbf{W}', +119831: u'\\mathbf{X}', +119832: u'\\mathbf{Y}', +119833: u'\\mathbf{Z}', +119834: u'\\mathbf{a}', +119835: u'\\mathbf{b}', +119836: u'\\mathbf{c}', +119837: u'\\mathbf{d}', +119838: u'\\mathbf{e}', +119839: u'\\mathbf{f}', +119840: u'\\mathbf{g}', +119841: u'\\mathbf{h}', +119842: u'\\mathbf{i}', +119843: u'\\mathbf{j}', +119844: u'\\mathbf{k}', +119845: u'\\mathbf{l}', +119846: u'\\mathbf{m}', +119847: u'\\mathbf{n}', +119848: u'\\mathbf{o}', +119849: u'\\mathbf{p}', +119850: u'\\mathbf{q}', +119851: u'\\mathbf{r}', +119852: u'\\mathbf{s}', +119853: u'\\mathbf{t}', +119854: u'\\mathbf{u}', +119855: u'\\mathbf{v}', +119856: u'\\mathbf{w}', +119857: u'\\mathbf{x}', +119858: u'\\mathbf{y}', +119859: u'\\mathbf{z}', +119860: u'A', +119861: u'B', +119862: u'C', +119863: u'D', +119864: u'E', +119865: u'F', +119866: u'G', +119867: u'H', +119868: u'I', +119869: u'J', +119870: u'K', +119871: u'L', +119872: u'M', +119873: u'N', +119874: u'O', +119875: u'P', +119876: u'Q', +119877: u'R', +119878: u'S', +119879: u'T', +119880: u'U', +119881: u'V', +119882: u'W', +119883: u'X', +119884: u'Y', +119885: u'Z', +119886: u'a', +119887: u'b', +119888: u'c', +119889: u'd', +119890: u'e', +119891: u'f', +119892: u'g', +119894: u'i', +119895: u'j', +119896: u'k', +119897: u'l', +119898: u'm', +119899: u'n', +119900: u'o', +119901: u'p', +119902: u'q', +119903: u'r', +119904: u's', +119905: u't', +119906: u'u', +119907: u'v', +119908: u'w', +119909: u'x', +119910: u'y', +119911: u'z', +119964: u'\\mathcal{A}', +119966: u'\\mathcal{C}', +119967: u'\\mathcal{D}', +119970: u'\\mathcal{G}', +119973: u'\\mathcal{J}', +119974: u'\\mathcal{K}', +119977: u'\\mathcal{N}', +119978: u'\\mathcal{O}', +119979: u'\\mathcal{P}', +119980: u'\\mathcal{Q}', +119982: u'\\mathcal{S}', +119983: u'\\mathcal{T}', +119984: u'\\mathcal{U}', +119985: u'\\mathcal{V}', +119986: u'\\mathcal{W}', +119987: u'\\mathcal{X}', +119988: u'\\mathcal{Y}', +119989: u'\\mathcal{Z}', +120068: u'\\mathfrak{A}', +120069: u'\\mathfrak{B}', +120071: u'\\mathfrak{D}', +120072: u'\\mathfrak{E}', +120073: u'\\mathfrak{F}', +120074: u'\\mathfrak{G}', +120077: u'\\mathfrak{J}', +120078: u'\\mathfrak{K}', +120079: u'\\mathfrak{L}', +120080: u'\\mathfrak{M}', +120081: u'\\mathfrak{N}', +120082: u'\\mathfrak{O}', +120083: u'\\mathfrak{P}', +120084: u'\\mathfrak{Q}', +120086: u'\\mathfrak{S}', +120087: u'\\mathfrak{T}', +120088: u'\\mathfrak{U}', +120089: u'\\mathfrak{V}', +120090: u'\\mathfrak{W}', +120091: u'\\mathfrak{X}', +120092: u'\\mathfrak{Y}', +120094: u'\\mathfrak{a}', +120095: u'\\mathfrak{b}', +120096: u'\\mathfrak{c}', +120097: u'\\mathfrak{d}', +120098: u'\\mathfrak{e}', +120099: u'\\mathfrak{f}', +120100: u'\\mathfrak{g}', +120101: u'\\mathfrak{h}', +120102: u'\\mathfrak{i}', +120103: u'\\mathfrak{j}', +120104: u'\\mathfrak{k}', +120105: u'\\mathfrak{l}', +120106: u'\\mathfrak{m}', +120107: u'\\mathfrak{n}', +120108: u'\\mathfrak{o}', +120109: u'\\mathfrak{p}', +120110: u'\\mathfrak{q}', +120111: u'\\mathfrak{r}', +120112: u'\\mathfrak{s}', +120113: u'\\mathfrak{t}', +120114: u'\\mathfrak{u}', +120115: u'\\mathfrak{v}', +120116: u'\\mathfrak{w}', +120117: u'\\mathfrak{x}', +120118: u'\\mathfrak{y}', +120119: u'\\mathfrak{z}', +120120: u'\\mathbb{A}', +120121: u'\\mathbb{B}', +120123: u'\\mathbb{D}', +120124: u'\\mathbb{E}', +120125: u'\\mathbb{F}', +120126: u'\\mathbb{G}', +120128: u'\\mathbb{I}', +120129: u'\\mathbb{J}', +120130: u'\\mathbb{K}', +120131: u'\\mathbb{L}', +120132: u'\\mathbb{M}', +120134: u'\\mathbb{O}', +120138: u'\\mathbb{S}', +120139: u'\\mathbb{T}', +120140: u'\\mathbb{U}', +120141: u'\\mathbb{V}', +120142: u'\\mathbb{W}', +120143: u'\\mathbb{X}', +120144: u'\\mathbb{Y}', +120156: u'\\Bbbk ', +120224: u'\\mathsf{A}', +120225: u'\\mathsf{B}', +120226: u'\\mathsf{C}', +120227: u'\\mathsf{D}', +120228: u'\\mathsf{E}', +120229: u'\\mathsf{F}', +120230: u'\\mathsf{G}', +120231: u'\\mathsf{H}', +120232: u'\\mathsf{I}', +120233: u'\\mathsf{J}', +120234: u'\\mathsf{K}', +120235: u'\\mathsf{L}', +120236: u'\\mathsf{M}', +120237: u'\\mathsf{N}', +120238: u'\\mathsf{O}', +120239: u'\\mathsf{P}', +120240: u'\\mathsf{Q}', +120241: u'\\mathsf{R}', +120242: u'\\mathsf{S}', +120243: u'\\mathsf{T}', +120244: u'\\mathsf{U}', +120245: u'\\mathsf{V}', +120246: u'\\mathsf{W}', +120247: u'\\mathsf{X}', +120248: u'\\mathsf{Y}', +120249: u'\\mathsf{Z}', +120250: u'\\mathsf{a}', +120251: u'\\mathsf{b}', +120252: u'\\mathsf{c}', +120253: u'\\mathsf{d}', +120254: u'\\mathsf{e}', +120255: u'\\mathsf{f}', +120256: u'\\mathsf{g}', +120257: u'\\mathsf{h}', +120258: u'\\mathsf{i}', +120259: u'\\mathsf{j}', +120260: u'\\mathsf{k}', +120261: u'\\mathsf{l}', +120262: u'\\mathsf{m}', +120263: u'\\mathsf{n}', +120264: u'\\mathsf{o}', +120265: u'\\mathsf{p}', +120266: u'\\mathsf{q}', +120267: u'\\mathsf{r}', +120268: u'\\mathsf{s}', +120269: u'\\mathsf{t}', +120270: u'\\mathsf{u}', +120271: u'\\mathsf{v}', +120272: u'\\mathsf{w}', +120273: u'\\mathsf{x}', +120274: u'\\mathsf{y}', +120275: u'\\mathsf{z}', +120432: u'\\mathtt{A}', +120433: u'\\mathtt{B}', +120434: u'\\mathtt{C}', +120435: u'\\mathtt{D}', +120436: u'\\mathtt{E}', +120437: u'\\mathtt{F}', +120438: u'\\mathtt{G}', +120439: u'\\mathtt{H}', +120440: u'\\mathtt{I}', +120441: u'\\mathtt{J}', +120442: u'\\mathtt{K}', +120443: u'\\mathtt{L}', +120444: u'\\mathtt{M}', +120445: u'\\mathtt{N}', +120446: u'\\mathtt{O}', +120447: u'\\mathtt{P}', +120448: u'\\mathtt{Q}', +120449: u'\\mathtt{R}', +120450: u'\\mathtt{S}', +120451: u'\\mathtt{T}', +120452: u'\\mathtt{U}', +120453: u'\\mathtt{V}', +120454: u'\\mathtt{W}', +120455: u'\\mathtt{X}', +120456: u'\\mathtt{Y}', +120457: u'\\mathtt{Z}', +120458: u'\\mathtt{a}', +120459: u'\\mathtt{b}', +120460: u'\\mathtt{c}', +120461: u'\\mathtt{d}', +120462: u'\\mathtt{e}', +120463: u'\\mathtt{f}', +120464: u'\\mathtt{g}', +120465: u'\\mathtt{h}', +120466: u'\\mathtt{i}', +120467: u'\\mathtt{j}', +120468: u'\\mathtt{k}', +120469: u'\\mathtt{l}', +120470: u'\\mathtt{m}', +120471: u'\\mathtt{n}', +120472: u'\\mathtt{o}', +120473: u'\\mathtt{p}', +120474: u'\\mathtt{q}', +120475: u'\\mathtt{r}', +120476: u'\\mathtt{s}', +120477: u'\\mathtt{t}', +120478: u'\\mathtt{u}', +120479: u'\\mathtt{v}', +120480: u'\\mathtt{w}', +120481: u'\\mathtt{x}', +120482: u'\\mathtt{y}', +120483: u'\\mathtt{z}', +120484: u'\\imath ', +120485: u'\\jmath ', +120490: u'\\mathbf{\\Gamma}', +120491: u'\\mathbf{\\Delta}', +120495: u'\\mathbf{\\Theta}', +120498: u'\\mathbf{\\Lambda}', +120501: u'\\mathbf{\\Xi}', +120503: u'\\mathbf{\\Pi}', +120506: u'\\mathbf{\\Sigma}', +120508: u'\\mathbf{\\Upsilon}', +120509: u'\\mathbf{\\Phi}', +120511: u'\\mathbf{\\Psi}', +120512: u'\\mathbf{\\Omega}', +120548: u'\\mathit{\\Gamma}', +120549: u'\\mathit{\\Delta}', +120553: u'\\mathit{\\Theta}', +120556: u'\\mathit{\\Lambda}', +120559: u'\\mathit{\\Xi}', +120561: u'\\mathit{\\Pi}', +120564: u'\\mathit{\\Sigma}', +120566: u'\\mathit{\\Upsilon}', +120567: u'\\mathit{\\Phi}', +120569: u'\\mathit{\\Psi}', +120570: u'\\mathit{\\Omega}', +120572: u'\\alpha ', +120573: u'\\beta ', +120574: u'\\gamma ', +120575: u'\\delta ', +120576: u'\\varepsilon ', +120577: u'\\zeta ', +120578: u'\\eta ', +120579: u'\\theta ', +120580: u'\\iota ', +120581: u'\\kappa ', +120582: u'\\lambda ', +120583: u'\\mu ', +120584: u'\\nu ', +120585: u'\\xi ', +120587: u'\\pi ', +120588: u'\\rho ', +120589: u'\\varsigma ', +120590: u'\\sigma ', +120591: u'\\tau ', +120592: u'\\upsilon ', +120593: u'\\varphi ', +120594: u'\\chi ', +120595: u'\\psi ', +120596: u'\\omega ', +120597: u'\\partial ', +120598: u'\\epsilon ', +120599: u'\\vartheta ', +120600: u'\\varkappa ', +120601: u'\\phi ', +120602: u'\\varrho ', +120603: u'\\varpi ', +120782: u'\\mathbf{0}', +120783: u'\\mathbf{1}', +120784: u'\\mathbf{2}', +120785: u'\\mathbf{3}', +120786: u'\\mathbf{4}', +120787: u'\\mathbf{5}', +120788: u'\\mathbf{6}', +120789: u'\\mathbf{7}', +120790: u'\\mathbf{8}', +120791: u'\\mathbf{9}', +120802: u'\\mathsf{0}', +120803: u'\\mathsf{1}', +120804: u'\\mathsf{2}', +120805: u'\\mathsf{3}', +120806: u'\\mathsf{4}', +120807: u'\\mathsf{5}', +120808: u'\\mathsf{6}', +120809: u'\\mathsf{7}', +120810: u'\\mathsf{8}', +120811: u'\\mathsf{9}', +120822: u'\\mathtt{0}', +120823: u'\\mathtt{1}', +120824: u'\\mathtt{2}', +120825: u'\\mathtt{3}', +120826: u'\\mathtt{4}', +120827: u'\\mathtt{5}', +120828: u'\\mathtt{6}', +120829: u'\\mathtt{7}', +120830: u'\\mathtt{8}', +120831: u'\\mathtt{9}', +} diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/punctuation_chars.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/punctuation_chars.py new file mode 100644 index 0000000..041cf9c --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/punctuation_chars.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# :Id: $Id: punctuation_chars.py 8016 2017-01-17 15:06:17Z milde $ +# :Copyright: © 2011, 2017 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 +# +# This file is generated by +# ``docutils/tools/dev/generate_punctuation_chars.py``. +# :: + +import sys, re +import unicodedata + +"""Docutils character category patterns. + + Patterns for the implementation of the `inline markup recognition rules`_ + in the reStructuredText parser `docutils.parsers.rst.states.py` based + on Unicode character categories. + The patterns are used inside ``[ ]`` in regular expressions. + + Rule (5) requires determination of matching open/close pairs. However, the + pairing of open/close quotes is ambiguous due to different typographic + conventions in different languages. The ``quote_pairs`` function tests + whether two characters form an open/close pair. + + The patterns are generated by + ``docutils/tools/dev/generate_punctuation_chars.py`` to prevent dependence + on the Python version and avoid the time-consuming generation with every + Docutils run. See there for motives and implementation details. + + The category of some characters changed with the development of the + Unicode standard. The current lists are generated with the help of the + "unicodedata" module of Python 2.7.13 (based on Unicode version 5.2.0). + + .. _inline markup recognition rules: + http://docutils.sf.net/docs/ref/rst/restructuredtext.html#inline-markup-recognition-rules +""" + +openers = (u'"\'(<\\[{\u0f3a\u0f3c\u169b\u2045\u207d\u208d\u2329\u2768' + u'\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea' + u'\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991' + u'\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28' + u'\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d' + u'\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41' + u'\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62' + u'\xab\u2018\u201c\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20' + u'\u201a\u201e\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d' + u'\u2e1d\u2e21\u201b\u201f') +closers = (u'"\')>\\]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u232a\u2769' + u'\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb' + u'\u27ed\u27ef\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992' + u'\u2994\u2996\u2998\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29' + u'\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e' + u'\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42' + u'\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63' + u'\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21' + u'\u201b\u201f\xab\u2018\u201c\u2039\u2e02\u2e04\u2e09\u2e0c' + u'\u2e1c\u2e20\u201a\u201e') +delimiters = (u'\\-/:\u058a\xa1\xb7\xbf\u037e\u0387\u055a-\u055f\u0589' + u'\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c' + u'\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d' + u'\u07f7-\u07f9\u0830-\u083e\u0964\u0965\u0970\u0df4\u0e4f' + u'\u0e5a\u0e5b\u0f04-\u0f12\u0f85\u0fd0-\u0fd4\u104a-\u104f' + u'\u10fb\u1361-\u1368\u1400\u166d\u166e\u16eb-\u16ed\u1735' + u'\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945' + u'\u19de\u19df\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-' + u'\u1b60\u1c3b-\u1c3f\u1c7e\u1c7f\u1cd3\u2010-\u2017\u2020-' + u'\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-' + u'\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2e00' + u'\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e1b\u2e1e\u2e1f\u2e2a-' + u'\u2e2e\u2e30\u2e31\u3001-\u3003\u301c\u3030\u303d\u30a0' + u'\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7' + u'\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f' + u'\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uabeb' + u'\ufe10-\ufe16\ufe19\ufe30-\ufe32\ufe45\ufe46\ufe49-\ufe4c' + u'\ufe50-\ufe52\ufe54-\ufe58\ufe5f-\ufe61\ufe63\ufe68\ufe6a' + u'\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c-\uff0f\uff1a' + u'\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65') +if sys.maxunicode >= 0x10FFFF: # "wide" build + delimiters += (u'\U00010100\U00010101\U0001039f\U000103d0\U00010857' + u'\U0001091f\U0001093f\U00010a50-\U00010a58\U00010a7f' + u'\U00010b39-\U00010b3f\U000110bb\U000110bc\U000110be-' + u'\U000110c1\U00012470-\U00012473') +closing_delimiters = u'\\\\.,;!?' + + +# Matching open/close quotes +# -------------------------- + +quote_pairs = {# open char: matching closing characters # usage example + u'\xbb': u'\xbb', # » » Swedish + u'\u2018': u'\u201a', # ‘ ‚ Albanian/Greek/Turkish + u'\u2019': u'\u2019', # ’ ’ Swedish + u'\u201a': u'\u2018\u2019', # ‚ ‘ German ‚ ’ Polish + u'\u201c': u'\u201e', # “ „ Albanian/Greek/Turkish + u'\u201e': u'\u201c\u201d', # „ “ German „ ” Polish + u'\u201d': u'\u201d', # ” ” Swedish + u'\u203a': u'\u203a', # › › Swedish + } +"""Additional open/close quote pairs.""" + +def match_chars(c1, c2): + """Test whether `c1` and `c2` are a matching open/close character pair. + + Matching open/close pairs are at the same position in + `punctuation_chars.openers` and `punctuation_chars.closers`. + The pairing of open/close quotes is ambiguous due to different + typographic conventions in different languages, + so we test for additional matches stored in `quote_pairs`. + """ + try: + i = openers.index(c1) + except ValueError: # c1 not in openers + return False + return c2 == closers[i] or c2 in quote_pairs.get(c1, u'') diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/roman.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/roman.py new file mode 100644 index 0000000..dce927f --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/roman.py @@ -0,0 +1,82 @@ +"""Convert to and from Roman numerals""" + +__author__ = "Mark Pilgrim (f8dy@diveintopython.org)" +__version__ = "1.4" +__date__ = "8 August 2001" +__copyright__ = """Copyright (c) 2001 Mark Pilgrim + +This program is part of "Dive Into Python", a free Python tutorial for +experienced programmers. Visit http://diveintopython.org/ for the +latest version. + +This program is free software; you can redistribute it and/or modify +it under the terms of the Python 2.1.1 license, available at +http://www.python.org/2.1.1/license.html +""" + +import re + +#Define exceptions +class RomanError(Exception): pass +class OutOfRangeError(RomanError): pass +class NotIntegerError(RomanError): pass +class InvalidRomanNumeralError(RomanError): pass + +#Define digit mapping +romanNumeralMap = (('M', 1000), + ('CM', 900), + ('D', 500), + ('CD', 400), + ('C', 100), + ('XC', 90), + ('L', 50), + ('XL', 40), + ('X', 10), + ('IX', 9), + ('V', 5), + ('IV', 4), + ('I', 1)) + +def toRoman(n): + """convert integer to Roman numeral""" + if not (0 < n < 5000): + raise OutOfRangeError("number out of range (must be 1..4999)") + if int(n) != n: + raise NotIntegerError("decimals can not be converted") + + result = "" + for numeral, integer in romanNumeralMap: + while n >= integer: + result += numeral + n -= integer + return result + +#Define pattern to detect valid Roman numerals +romanNumeralPattern = re.compile(""" + ^ # beginning of string + M{0,4} # thousands - 0 to 4 M's + (CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's), + # or 500-800 (D, followed by 0 to 3 C's) + (XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's), + # or 50-80 (L, followed by 0 to 3 X's) + (IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's), + # or 5-8 (V, followed by 0 to 3 I's) + $ # end of string + """, re.VERBOSE) + +def fromRoman(s): + """convert Roman numeral to integer""" + if not s: + raise InvalidRomanNumeralError('Input can not be blank') + + if not romanNumeralPattern.search(s): + raise InvalidRomanNumeralError('Invalid Roman numeral: %s' % s) + + result = 0 + index = 0 + for numeral, integer in romanNumeralMap: + while s[index:index+len(numeral)] == numeral: + result += integer + index += len(numeral) + return result + diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/smartquotes.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/smartquotes.py new file mode 100644 index 0000000..518ae09 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/smartquotes.py @@ -0,0 +1,1014 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# :Id: $Id: smartquotes.py 8376 2019-08-27 19:49:29Z milde $ +# :Copyright: © 2010 Günter Milde, +# original `SmartyPants`_: © 2003 John Gruber +# smartypants.py: © 2004, 2007 Chad Miller +# :Maintainer: docutils-develop@lists.sourceforge.net +# :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 +# notices 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 + + +r""" +========================= +Smart Quotes for Docutils +========================= + +Synopsis +======== + +"SmartyPants" is a free web publishing plug-in for Movable Type, Blosxom, and +BBEdit that easily translates plain ASCII punctuation characters into "smart" +typographic punctuation characters. + +``smartquotes.py`` is an adaption of "SmartyPants" to Docutils_. + +* Using Unicode instead of HTML entities for typographic punctuation + characters, it works for any output format that supports Unicode. +* Supports `language specific quote characters`__. + +__ http://en.wikipedia.org/wiki/Non-English_usage_of_quotation_marks + + +Authors +======= + +`John Gruber`_ did all of the hard work of writing this software in Perl for +`Movable Type`_ and almost all of this useful documentation. `Chad Miller`_ +ported it to Python to use with Pyblosxom_. +Adapted to Docutils_ by Günter Milde. + +Additional Credits +================== + +Portions of the SmartyPants original work are based on Brad Choate's nifty +MTRegex plug-in. `Brad Choate`_ also contributed a few bits of source code to +this plug-in. Brad Choate is a fine hacker indeed. + +`Jeremy Hedley`_ and `Charles Wiltgen`_ deserve mention for exemplary beta +testing of the original SmartyPants. + +`Rael Dornfest`_ ported SmartyPants to Blosxom. + +.. _Brad Choate: http://bradchoate.com/ +.. _Jeremy Hedley: http://antipixel.com/ +.. _Charles Wiltgen: http://playbacktime.com/ +.. _Rael Dornfest: http://raelity.org/ + + +Copyright and License +===================== + +SmartyPants_ license (3-Clause BSD license): + + Copyright (c) 2003 John Gruber (http://daringfireball.net/) + 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 "SmartyPants" 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. + +smartypants.py license (2-Clause BSD license): + + smartypants.py is a derivative work of SmartyPants. + + 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. + +.. _John Gruber: http://daringfireball.net/ +.. _Chad Miller: http://web.chad.org/ + +.. _Pyblosxom: http://pyblosxom.bluesock.org/ +.. _SmartyPants: http://daringfireball.net/projects/smartypants/ +.. _Movable Type: http://www.movabletype.org/ +.. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause +.. _Docutils: http://docutils.sf.net/ + +Description +=========== + +SmartyPants can perform the following transformations: + +- Straight quotes ( " and ' ) into "curly" quote characters +- Backticks-style quotes (\`\`like this'') into "curly" quote characters +- Dashes (``--`` and ``---``) into en- and em-dash entities +- Three consecutive dots (``...`` or ``. . .``) into an ellipsis entity + +This means you can write, edit, and save your posts using plain old +ASCII straight quotes, plain dashes, and plain dots, but your published +posts (and final HTML output) will appear with smart quotes, em-dashes, +and proper ellipses. + +SmartyPants does not modify characters within ``<pre>``, ``<code>``, ``<kbd>``, +``<math>`` or ``<script>`` tag blocks. Typically, these tags are used to +display text where smart quotes and other "smart punctuation" would not be +appropriate, such as source code or example markup. + + +Backslash Escapes +================= + +If you need to use literal straight quotes (or plain hyphens and periods), +`smartquotes` accepts the following backslash escape sequences to force +ASCII-punctuation. Mind, that you need two backslashes as Docutils expands it, +too. + +======== ========= +Escape Character +======== ========= +``\\`` \\ +``\\"`` \\" +``\\'`` \\' +``\\.`` \\. +``\\-`` \\- +``\\``` \\` +======== ========= + +This is useful, for example, when you want to use straight quotes as +foot and inch marks: 6\\'2\\" tall; a 17\\" iMac. + + +Caveats +======= + +Why You Might Not Want to Use Smart Quotes in Your Weblog +--------------------------------------------------------- + +For one thing, you might not care. + +Most normal, mentally stable individuals do not take notice of proper +typographic punctuation. Many design and typography nerds, however, break +out in a nasty rash when they encounter, say, a restaurant sign that uses +a straight apostrophe to spell "Joe's". + +If you're the sort of person who just doesn't care, you might well want to +continue not caring. Using straight quotes -- and sticking to the 7-bit +ASCII character set in general -- is certainly a simpler way to live. + +Even if you *do* care about accurate typography, you still might want to +think twice before educating the quote characters in your weblog. One side +effect of publishing curly quote characters is that it makes your +weblog a bit harder for others to quote from using copy-and-paste. What +happens is that when someone copies text from your blog, the copied text +contains the 8-bit curly quote characters (as well as the 8-bit characters +for em-dashes and ellipses, if you use these options). These characters +are not standard across different text encoding methods, which is why they +need to be encoded as characters. + +People copying text from your weblog, however, may not notice that you're +using curly quotes, and they'll go ahead and paste the unencoded 8-bit +characters copied from their browser into an email message or their own +weblog. When pasted as raw "smart quotes", these characters are likely to +get mangled beyond recognition. + +That said, my own opinion is that any decent text editor or email client +makes it easy to stupefy smart quote characters into their 7-bit +equivalents, and I don't consider it my problem if you're using an +indecent text editor or email client. + + +Algorithmic Shortcomings +------------------------ + +One situation in which quotes will get curled the wrong way is when +apostrophes are used at the start of leading contractions. For example:: + + 'Twas the night before Christmas. + +In the case above, SmartyPants will turn the apostrophe into an opening +single-quote, when in fact it should be the `right single quotation mark` +character which is also "the preferred character to use for apostrophe" +(Unicode). I don't think this problem can be solved in the general case -- +every word processor I've tried gets this wrong as well. In such cases, it's +best to use the proper character for closing single-quotes (’) by hand. + +In English, the same character is used for apostrophe and closing single +quote (both plain and "smart" ones). For other locales (French, Italean, +Swiss, ...) "smart" single closing quotes differ from the curly apostrophe. + + .. class:: language-fr + + Il dit : "C'est 'super' !" + +If the apostrophe is used at the end of a word, it cannot be distinguished +from a single quote by the algorithm. Therefore, a text like:: + + .. class:: language-de-CH + + "Er sagt: 'Ich fass' es nicht.'" + +will get a single closing guillemet instead of an apostrophe. + +This can be prevented by use use of the curly apostrophe character (’) in +the source:: + + - "Er sagt: 'Ich fass' es nicht.'" + + "Er sagt: 'Ich fass’ es nicht.'" + + +Version History +=============== + +1.8.1 2017-10-25 + - Use open quote after Unicode whitespace, ZWSP, and ZWNJ. + - Code cleanup. + +1.8: 2017-04-24 + - Command line front-end. + +1.7.1: 2017-03-19 + - Update and extend language-dependent quotes. + - Differentiate apostrophe from single quote. + +1.7: 2012-11-19 + - Internationalization: language-dependent quotes. + +1.6.1: 2012-11-06 + - Refactor code, code cleanup, + - `educate_tokens()` generator as interface for Docutils. + +1.6: 2010-08-26 + - Adaption to Docutils: + - Use Unicode instead of HTML entities, + - Remove code special to pyblosxom. + +1.5_1.6: Fri, 27 Jul 2007 07:06:40 -0400 + - Fixed bug where blocks of precious unalterable text was instead + interpreted. Thanks to Le Roux and Dirk van Oosterbosch. + +1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400 + - Fix bogus magical quotation when there is no hint that the + user wants it, e.g., in "21st century". Thanks to Nathan Hamblen. + - Be smarter about quotes before terminating numbers in an en-dash'ed + range. + +1.5_1.4: Thu, 10 Feb 2005 20:24:36 -0500 + - Fix a date-processing bug, as reported by jacob childress. + - Begin a test-suite for ensuring correct output. + - Removed import of "string", since I didn't really need it. + (This was my first every Python program. Sue me!) + +1.5_1.3: Wed, 15 Sep 2004 18:25:58 -0400 + - Abort processing if the flavour is in forbidden-list. Default of + [ "rss" ] (Idea of Wolfgang SCHNERRING.) + - Remove stray virgules from en-dashes. Patch by Wolfgang SCHNERRING. + +1.5_1.2: Mon, 24 May 2004 08:14:54 -0400 + - Some single quotes weren't replaced properly. Diff-tesuji played + by Benjamin GEIGER. + +1.5_1.1: Sun, 14 Mar 2004 14:38:28 -0500 + - Support upcoming pyblosxom 0.9 plugin verification feature. + +1.5_1.0: Tue, 09 Mar 2004 08:08:35 -0500 + - Initial release +""" +from __future__ import print_function + +options = r""" +Options +======= + +Numeric values are the easiest way to configure SmartyPants' behavior: + +:0: Suppress all transformations. (Do nothing.) + +:1: Performs default SmartyPants transformations: quotes (including + \`\`backticks'' -style), em-dashes, and ellipses. "``--``" (dash dash) + is used to signify an em-dash; there is no support for en-dashes + +:2: Same as smarty_pants="1", except that it uses the old-school typewriter + shorthand for dashes: "``--``" (dash dash) for en-dashes, "``---``" + (dash dash dash) + for em-dashes. + +:3: Same as smarty_pants="2", but inverts the shorthand for dashes: + "``--``" (dash dash) for em-dashes, and "``---``" (dash dash dash) for + en-dashes. + +:-1: Stupefy mode. Reverses the SmartyPants transformation process, turning + the characters produced by SmartyPants into their ASCII equivalents. + E.g. the LEFT DOUBLE QUOTATION MARK (“) is turned into a simple + double-quote (\"), "—" is turned into two dashes, etc. + + +The following single-character attribute values can be combined to toggle +individual transformations from within the smarty_pants attribute. For +example, ``"1"`` is equivalent to ``"qBde"``. + +:q: Educates normal quote characters: (") and ('). + +:b: Educates \`\`backticks'' -style double quotes. + +:B: Educates \`\`backticks'' -style double quotes and \`single' quotes. + +:d: Educates em-dashes. + +:D: Educates em-dashes and en-dashes, using old-school typewriter shorthand: + (dash dash) for en-dashes, (dash dash dash) for em-dashes. + +:i: Educates em-dashes and en-dashes, using inverted old-school typewriter + shorthand: (dash dash) for em-dashes, (dash dash dash) for en-dashes. + +:e: Educates ellipses. + +:w: Translates any instance of ``"`` into a normal double-quote character. + This should be of no interest to most people, but of particular interest + to anyone who writes their posts using Dreamweaver, as Dreamweaver + inexplicably uses this entity to represent a literal double-quote + character. SmartyPants only educates normal quotes, not entities (because + ordinarily, entities are used for the explicit purpose of representing the + specific character they represent). The "w" option must be used in + conjunction with one (or both) of the other quote options ("q" or "b"). + Thus, if you wish to apply all SmartyPants transformations (quotes, en- + and em-dashes, and ellipses) and also translate ``"`` entities into + regular quotes so SmartyPants can educate them, you should pass the + following to the smarty_pants attribute: +""" + + +default_smartypants_attr = "1" + + +import re, sys + +class smartchars(object): + """Smart quotes and dashes + """ + + endash = u'–' # "–" EN DASH + emdash = u'—' # "—" EM DASH + ellipsis = u'…' # "…" HORIZONTAL ELLIPSIS + apostrophe = u'’' # "’" RIGHT SINGLE QUOTATION MARK + + # quote characters (language-specific, set in __init__()) + # [1] http://en.wikipedia.org/wiki/Non-English_usage_of_quotation_marks + # [2] http://de.wikipedia.org/wiki/Anf%C3%BChrungszeichen#Andere_Sprachen + # [3] https://fr.wikipedia.org/wiki/Guillemet + # [4] http://typographisme.net/post/Les-espaces-typographiques-et-le-web + # [5] http://www.btb.termiumplus.gc.ca/tpv2guides/guides/redac/index-fra.html + # [6] https://en.wikipedia.org/wiki/Hebrew_punctuation#Quotation_marks + # [7] http://www.tustep.uni-tuebingen.de/bi/bi00/bi001t1-anfuehrung.pdf + # [8] http://www.korrekturavdelingen.no/anforselstegn.htm + # [9] Typografisk håndbok. Oslo: Spartacus. 2000. s. 67. ISBN 8243001530. + # [10] http://www.typografi.org/sitat/sitatart.html + # + # See also configuration option "smartquote-locales". + quotes = {'af': u'“”‘’', + 'af-x-altquot': u'„”‚’', + 'bg': u'„“‚‘', # Bulgarian, https://bg.wikipedia.org/wiki/Кавички + 'ca': u'«»“”', + 'ca-x-altquot': u'“”‘’', + 'cs': u'„“‚‘', + 'cs-x-altquot': u'»«›‹', + 'da': u'»«›‹', + 'da-x-altquot': u'„“‚‘', + # 'da-x-altquot2': u'””’’', + 'de': u'„“‚‘', + 'de-x-altquot': u'»«›‹', + 'de-ch': u'«»‹›', + 'el': u'«»“”', + 'en': u'“”‘’', + 'en-uk-x-altquot': u'‘’“”', # Attention: " → ‘ and ' → “ ! + 'eo': u'“”‘’', + 'es': u'«»“”', + 'es-x-altquot': u'“”‘’', + 'et': u'„“‚‘', # no secondary quote listed in + 'et-x-altquot': u'«»‹›', # the sources above (wikipedia.org) + 'eu': u'«»‹›', + 'fi': u'””’’', + 'fi-x-altquot': u'»»››', + 'fr': (u'« ', u' »', u'“', u'”'), # full no-break space + 'fr-x-altquot': (u'« ', u' »', u'“', u'”'), # narrow no-break space + 'fr-ch': u'«»‹›', + 'fr-ch-x-altquot': (u'« ', u' »', u'‹ ', u' ›'), # narrow no-break space, http://typoguide.ch/ + 'gl': u'«»“”', + 'he': u'”“»«', # Hebrew is RTL, test position: + 'he-x-altquot': u'„”‚’', # low quotation marks are opening. + # 'he-x-altquot': u'“„‘‚', # RTL: low quotation marks opening + 'hr': u'„”‘’', # http://hrvatska-tipografija.com/polunavodnici/ + 'hr-x-altquot': u'»«›‹', + 'hsb': u'„“‚‘', + 'hsb-x-altquot': u'»«›‹', + 'hu': u'„”«»', + 'is': u'„“‚‘', + 'it': u'«»“”', + 'it-ch': u'«»‹›', + 'it-x-altquot': u'“”‘’', + # 'it-x-altquot2': u'“„‘‚', # [7] in headlines + 'ja': u'「」『』', + 'ko': u'《》〈〉', + 'lt': u'„“‚‘', + 'lv': u'„“‚‘', + 'mk': u'„“‚‘', # Macedonian, https://mk.wikipedia.org/wiki/Правопис_и_правоговор_на_македонскиот_јазик + 'nl': u'“”‘’', + 'nl-x-altquot': u'„”‚’', + # 'nl-x-altquot2': u'””’’', + 'nb': u'«»’’', # Norsk bokmål (canonical form 'no') + 'nn': u'«»’’', # Nynorsk [10] + 'nn-x-altquot': u'«»‘’', # [8], [10] + # 'nn-x-altquot2': u'«»«»', # [9], [10 + # 'nn-x-altquot3': u'„“‚‘', # [10] + 'no': u'«»’’', # Norsk bokmål [10] + 'no-x-altquot': u'«»‘’', # [8], [10] + # 'no-x-altquot2': u'«»«»', # [9], [10 + # 'no-x-altquot3': u'„“‚‘', # [10] + 'pl': u'„”«»', + 'pl-x-altquot': u'«»‚’', + # 'pl-x-altquot2': u'„”‚’', # https://pl.wikipedia.org/wiki/Cudzys%C5%82%C3%B3w + 'pt': u'«»“”', + 'pt-br': u'“”‘’', + 'ro': u'„”«»', + 'ru': u'«»„“', + 'sh': u'„”‚’', # Serbo-Croatian + 'sh-x-altquot': u'»«›‹', + 'sk': u'„“‚‘', # Slovak + 'sk-x-altquot': u'»«›‹', + 'sl': u'„“‚‘', # Slovenian + 'sl-x-altquot': u'»«›‹', + 'sq': u'«»‹›', # Albanian + 'sq-x-altquot': u'“„‘‚', + 'sr': u'„”’’', + 'sr-x-altquot': u'»«›‹', + 'sv': u'””’’', + 'sv-x-altquot': u'»»››', + 'tr': u'“”‘’', + 'tr-x-altquot': u'«»‹›', + # 'tr-x-altquot2': u'“„‘‚', # [7] antiquated? + 'uk': u'«»„“', + 'uk-x-altquot': u'„“‚‘', + 'zh-cn': u'“”‘’', + 'zh-tw': u'「」『』', + } + + def __init__(self, language='en'): + self.language = language + try: + (self.opquote, self.cpquote, + self.osquote, self.csquote) = self.quotes[language.lower()] + except KeyError: + self.opquote, self.cpquote, self.osquote, self.csquote = u'""\'\'' + + +def smartyPants(text, attr=default_smartypants_attr, language='en'): + """Main function for "traditional" use.""" + + return "".join([t for t in educate_tokens(tokenize(text), + attr, language)]) + + +def educate_tokens(text_tokens, attr=default_smartypants_attr, language='en'): + """Return iterator that "educates" the items of `text_tokens`. + """ + + # Parse attributes: + # 0 : do nothing + # 1 : set all + # 2 : set all, using old school en- and em- dash shortcuts + # 3 : set all, using inverted old school en and em- dash shortcuts + # + # q : quotes + # b : backtick quotes (``double'' only) + # B : backtick quotes (``double'' and `single') + # d : dashes + # D : old school dashes + # i : inverted old school dashes + # e : ellipses + # w : convert " entities to " for Dreamweaver users + + convert_quot = False # translate " entities into normal quotes? + do_dashes = False + do_backticks = False + do_quotes = False + do_ellipses = False + do_stupefy = False + + # if attr == "0": # pass tokens unchanged (see below). + if attr == "1": # Do everything, turn all options on. + do_quotes = True + do_backticks = True + do_dashes = 1 + do_ellipses = True + elif attr == "2": + # Do everything, turn all options on, use old school dash shorthand. + do_quotes = True + do_backticks = True + do_dashes = 2 + do_ellipses = True + elif attr == "3": + # Do everything, use inverted old school dash shorthand. + do_quotes = True + do_backticks = True + do_dashes = 3 + do_ellipses = True + elif attr == "-1": # Special "stupefy" mode. + do_stupefy = True + else: + if "q" in attr: do_quotes = True + if "b" in attr: do_backticks = True + if "B" in attr: do_backticks = 2 + if "d" in attr: do_dashes = 1 + if "D" in attr: do_dashes = 2 + if "i" in attr: do_dashes = 3 + if "e" in attr: do_ellipses = True + if "w" in attr: convert_quot = True + + prev_token_last_char = " " + # Last character of the previous text token. Used as + # context to curl leading quote characters correctly. + + for (ttype, text) in text_tokens: + + # skip HTML and/or XML tags as well as emtpy text tokens + # without updating the last character + if ttype == 'tag' or not text: + yield text + continue + + # skip literal text (math, literal, raw, ...) + if ttype == 'literal': + prev_token_last_char = text[-1:] + yield text + continue + + last_char = text[-1:] # Remember last char before processing. + + text = processEscapes(text) + + if convert_quot: + text = re.sub('"', '"', text) + + if do_dashes == 1: + text = educateDashes(text) + elif do_dashes == 2: + text = educateDashesOldSchool(text) + elif do_dashes == 3: + text = educateDashesOldSchoolInverted(text) + + if do_ellipses: + text = educateEllipses(text) + + # Note: backticks need to be processed before quotes. + if do_backticks: + text = educateBackticks(text, language) + + if do_backticks == 2: + text = educateSingleBackticks(text, language) + + if do_quotes: + # Replace plain quotes in context to prevent converstion to + # 2-character sequence in French. + context = prev_token_last_char.replace('"', ';').replace("'", ';') + text = educateQuotes(context+text, language)[1:] + + if do_stupefy: + text = stupefyEntities(text, language) + + # Remember last char as context for the next token + prev_token_last_char = last_char + + text = processEscapes(text, restore=True) + + yield text + + + +def educateQuotes(text, language='en'): + """ + Parameter: - text string (unicode or bytes). + - language (`BCP 47` language tag.) + Returns: The `text`, with "educated" curly quote characters. + + Example input: "Isn't this fun?" + Example output: “Isn’t this fun?“; + """ + + smart = smartchars(language) + + punct_class = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]""" + close_class = r"""[^\ \t\r\n\[\{\(\-]""" + open_class = u'[\u200B\u200C]' # ZWSP, ZWNJ + dec_dashes = r"""–|—""" + + # Special case if the very first character is a quote + # followed by punctuation at a non-word-break. + # Close the quotes by brute force: + text = re.sub(r"^'(?=%s\\B)" % (punct_class,), smart.csquote, text) + text = re.sub(r'^"(?=%s\\B)' % (punct_class,), smart.cpquote, text) + + # Special case for double sets of quotes, e.g.: + # <p>He said, "'Quoted' words in a larger quote."</p> + text = re.sub(r""""'(?=\w)""", smart.opquote+smart.osquote, text) + text = re.sub(r"""'"(?=\w)""", smart.osquote+smart.opquote, text) + + # Special case for decade abbreviations (the '80s): + if language.startswith('en'): # TODO similar cases in other languages? + text = re.sub(r"'(?=\d{2}s)", smart.apostrophe, text) + + # Get most opening single quotes: + opening_single_quotes_regex = re.compile(u""" + (# ?<= # look behind fails: requires fixed-width pattern + \\s | # a whitespace char, or + %s | # another separating char, or +   | # a non-breaking space entity, or + [\u2013 \u2014 ] | # literal dashes, or + -- | # dumb dashes, or + &[mn]dash; | # dash entities (named or + %s | # decimal or + &\\#x201[34]; # hex) + ) + ' # the quote + (?=\\w) # followed by a word character + """ % (open_class, dec_dashes), re.VERBOSE | re.UNICODE) + + text = opening_single_quotes_regex.sub(r'\1'+smart.osquote, text) + + # In many locales, single closing quotes are different from apostrophe: + if smart.csquote != smart.apostrophe: + apostrophe_regex = re.compile(r"(?<=(\w|\d))'(?=\w)", re.UNICODE) + text = apostrophe_regex.sub(smart.apostrophe, text) + # TODO: keep track of quoting level to recognize apostrophe in, e.g., + # "Ich fass' es nicht." + + closing_single_quotes_regex = re.compile(r""" + (?<=%s) + ' + """ % close_class, re.VERBOSE) + text = closing_single_quotes_regex.sub(smart.csquote, text) + + # Any remaining single quotes should be opening ones: + text = re.sub(r"""'""", smart.osquote, text) + + # Get most opening double quotes: + opening_double_quotes_regex = re.compile(u""" + ( + \\s | # a whitespace char, or + %s | # another separating char, or +   | # a non-breaking space entity, or + [\u2013 \u2014 ] | # literal dashes, or + -- | # dumb dashes, or + &[mn]dash; | # dash entities (named or + %s | # decimal or + &\\#x201[34]; # hex) + ) + " # the quote + (?=\\w) # followed by a word character + """ % (open_class, dec_dashes), re.VERBOSE | re.UNICODE) + + text = opening_double_quotes_regex.sub(r'\1'+smart.opquote, text) + + # Double closing quotes: + closing_double_quotes_regex = re.compile(r""" + ( + (?<=%s)" | # char indicating the quote should be closing + "(?=\s) # whitespace behind + ) + """ % (close_class,), re.VERBOSE | re.UNICODE) + text = closing_double_quotes_regex.sub(smart.cpquote, text) + + # Any remaining quotes should be opening ones. + text = re.sub(r'"', smart.opquote, text) + + return text + + +def educateBackticks(text, language='en'): + """ + Parameter: String (unicode or bytes). + Returns: The `text`, with ``backticks'' -style double quotes + translated into HTML curly quote entities. + Example input: ``Isn't this fun?'' + Example output: “Isn't this fun?“; + """ + smart = smartchars(language) + + text = re.sub(r"""``""", smart.opquote, text) + text = re.sub(r"""''""", smart.cpquote, text) + return text + + +def educateSingleBackticks(text, language='en'): + """ + Parameter: String (unicode or bytes). + Returns: The `text`, with `backticks' -style single quotes + translated into HTML curly quote entities. + + Example input: `Isn't this fun?' + Example output: ‘Isn’t this fun?’ + """ + smart = smartchars(language) + + text = re.sub(r"""`""", smart.osquote, text) + text = re.sub(r"""'""", smart.csquote, text) + return text + + +def educateDashes(text): + """ + Parameter: String (unicode or bytes). + Returns: The `text`, with each instance of "--" translated to + an em-dash character. + """ + + text = re.sub(r"""---""", smartchars.endash, text) # en (yes, backwards) + text = re.sub(r"""--""", smartchars.emdash, text) # em (yes, backwards) + return text + + +def educateDashesOldSchool(text): + """ + Parameter: String (unicode or bytes). + Returns: The `text`, with each instance of "--" translated to + an en-dash character, and each "---" translated to + an em-dash character. + """ + + text = re.sub(r"""---""", smartchars.emdash, text) + text = re.sub(r"""--""", smartchars.endash, text) + return text + + +def educateDashesOldSchoolInverted(text): + """ + Parameter: String (unicode or bytes). + Returns: The `text`, with each instance of "--" translated to + an em-dash character, and each "---" translated to + an en-dash character. Two reasons why: First, unlike the + en- and em-dash syntax supported by + EducateDashesOldSchool(), it's compatible with existing + entries written before SmartyPants 1.1, back when "--" was + only used for em-dashes. Second, em-dashes are more + common than en-dashes, and so it sort of makes sense that + the shortcut should be shorter to type. (Thanks to Aaron + Swartz for the idea.) + """ + text = re.sub(r"""---""", smartchars.endash, text) # em + text = re.sub(r"""--""", smartchars.emdash, text) # en + return text + + + +def educateEllipses(text): + """ + Parameter: String (unicode or bytes). + Returns: The `text`, with each instance of "..." translated to + an ellipsis character. + + Example input: Huh...? + Example output: Huh…? + """ + + text = re.sub(r"""\.\.\.""", smartchars.ellipsis, text) + text = re.sub(r"""\. \. \.""", smartchars.ellipsis, text) + return text + + +def stupefyEntities(text, language='en'): + """ + Parameter: String (unicode or bytes). + Returns: The `text`, with each SmartyPants character translated to + its ASCII counterpart. + + Example input: “Hello — world.” + Example output: "Hello -- world." + """ + smart = smartchars(language) + + text = re.sub(smart.endash, "-", text) # en-dash + text = re.sub(smart.emdash, "--", text) # em-dash + + text = re.sub(smart.osquote, "'", text) # open single quote + text = re.sub(smart.csquote, "'", text) # close single quote + + text = re.sub(smart.opquote, '"', text) # open double quote + text = re.sub(smart.cpquote, '"', text) # close double quote + + text = re.sub(smart.ellipsis, '...', text)# ellipsis + + return text + + +def processEscapes(text, restore=False): + r""" + Parameter: String (unicode or bytes). + Returns: The `text`, with after processing the following backslash + escape sequences. This is useful if you want to force a "dumb" + quote or other character to appear. + + Escape Value + ------ ----- + \\ \ + \" " + \' ' + \. . + \- - + \` ` + """ + replacements = ((r'\\', r'\'), + (r'\"', r'"'), + (r"\'", r'''), + (r'\.', r'.'), + (r'\-', r'-'), + (r'\`', r'`')) + if restore: + for (ch, rep) in replacements: + text = text.replace(rep, ch[1]) + else: + for (ch, rep) in replacements: + text = text.replace(ch, rep) + + return text + + +def tokenize(text): + """ + Parameter: String containing HTML markup. + Returns: An iterator that yields the tokens comprising the input + string. Each token is either a tag (possibly with nested, + tags contained therein, such as <a href="<MTFoo>">, or a + run of text between tags. Each yielded element is a + two-element tuple; the first is either 'tag' or 'text'; + the second is the actual value. + + Based on the _tokenize() subroutine from Brad Choate's MTRegex plugin. + <http://www.bradchoate.com/past/mtregex.php> + """ + + pos = 0 + length = len(text) + # tokens = [] + + depth = 6 + nested_tags = "|".join(['(?:<(?:[^<>]',] * depth) + (')*>)' * depth) + #match = r"""(?: <! ( -- .*? -- \s* )+ > ) | # comments + # (?: <\? .*? \?> ) | # directives + # %s # nested tags """ % (nested_tags,) + tag_soup = re.compile(r"""([^<]*)(<[^>]*>)""") + + token_match = tag_soup.search(text) + + previous_end = 0 + while token_match is not None: + if token_match.group(1): + yield ('text', token_match.group(1)) + + yield ('tag', token_match.group(2)) + + previous_end = token_match.end() + token_match = tag_soup.search(text, token_match.end()) + + if previous_end < len(text): + yield ('text', text[previous_end:]) + + + +if __name__ == "__main__": + + import itertools + try: + import locale # module missing in Jython + locale.setlocale(locale.LC_ALL, '') # set to user defaults + defaultlanguage = locale.getdefaultlocale()[0] + except: + defaultlanguage = 'en' + + # Normalize and drop unsupported subtags: + defaultlanguage = defaultlanguage.lower().replace('-', '_') + # split (except singletons, which mark the following tag as non-standard): + defaultlanguage = re.sub(r'_([a-zA-Z0-9])_', r'_\1-', defaultlanguage) + _subtags = [subtag for subtag in defaultlanguage.split('_')] + _basetag = _subtags.pop(0) + # find all combinations of subtags + for n in range(len(_subtags), 0, -1): + for tags in itertools.combinations(_subtags, n): + _tag = '-'.join((_basetag,)+tags) + if _tag in smartchars.quotes: + defaultlanguage = _tag + break + else: + if _basetag in smartchars.quotes: + defaultlanguage = _basetag + else: + defaultlanguage = 'en' + + + import argparse + parser = argparse.ArgumentParser( + description='Filter stdin making ASCII punctuation "smart".') + # parser.add_argument("text", help="text to be acted on") + parser.add_argument("-a", "--action", default="1", + help="what to do with the input (see --actionhelp)") + parser.add_argument("-e", "--encoding", default="utf8", + help="text encoding") + parser.add_argument("-l", "--language", default=defaultlanguage, + help="text language (BCP47 tag), " + "Default: %s"% defaultlanguage) + parser.add_argument("-q", "--alternative-quotes", action="store_true", + help="use alternative quote style") + parser.add_argument("--doc", action="store_true", + help="print documentation") + parser.add_argument("--actionhelp", action="store_true", + help="list available actions") + parser.add_argument("--stylehelp", action="store_true", + help="list available quote styles") + parser.add_argument("--test", action="store_true", + help="perform short self-test") + args = parser.parse_args() + + if args.doc: + print(__doc__) + elif args.actionhelp: + print(options) + elif args.stylehelp: + print() + print("Available styles (primary open/close, secondary open/close)") + print("language tag quotes") + print("============ ======") + for key in sorted(smartchars.quotes.keys()): + print("%-14s %s" % (key, smartchars.quotes[key])) + elif args.test: + # Unit test output goes to stderr. + import unittest + + class TestSmartypantsAllAttributes(unittest.TestCase): + # the default attribute is "1", which means "all". + def test_dates(self): + self.assertEqual(smartyPants("1440-80's"), u"1440-80’s") + self.assertEqual(smartyPants("1440-'80s"), u"1440-’80s") + self.assertEqual(smartyPants("1440---'80s"), u"1440–’80s") + self.assertEqual(smartyPants("1960's"), u"1960’s") + self.assertEqual(smartyPants("one two '60s"), u"one two ’60s") + self.assertEqual(smartyPants("'60s"), u"’60s") + + def test_educated_quotes(self): + self.assertEqual(smartyPants('"Isn\'t this fun?"'), u'“Isn’t this fun?”') + + def test_html_tags(self): + text = '<a src="foo">more</a>' + self.assertEqual(smartyPants(text), text) + + suite = unittest.TestLoader().loadTestsFromTestCase( + TestSmartypantsAllAttributes) + unittest.TextTestRunner().run(suite) + + else: + if args.alternative_quotes: + if '-x-altquot' in args.language: + args.language = args.language.replace('-x-altquot', '') + else: + args.language += '-x-altquot' + text = sys.stdin.read().decode(args.encoding) + print(smartyPants(text, attr=args.action, + language=args.language).encode(args.encoding)) diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/urischemes.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/urischemes.py new file mode 100644 index 0000000..d9309ed --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/utils/urischemes.py @@ -0,0 +1,136 @@ +# $Id: urischemes.py 8376 2019-08-27 19:49:29Z milde $ +# Author: David Goodger <goodger@python.org> +# Copyright: This module has been placed in the public domain. + +""" +`schemes` is a dictionary with lowercase URI addressing schemes as +keys and descriptions as values. It was compiled from the index at +http://www.iana.org/assignments/uri-schemes (revised 2005-11-28) +and an older list at http://www.w3.org/Addressing/schemes.html. +""" + +# Many values are blank and should be filled in with useful descriptions. + +schemes = { + 'about': 'provides information on Navigator', + 'acap': 'Application Configuration Access Protocol; RFC 2244', + 'addbook': "To add vCard entries to Communicator's Address Book", + 'afp': 'Apple Filing Protocol', + 'afs': 'Andrew File System global file names', + 'aim': 'AOL Instant Messenger', + 'callto': 'for NetMeeting links', + 'castanet': 'Castanet Tuner URLs for Netcaster', + 'chttp': 'cached HTTP supported by RealPlayer', + 'cid': 'content identifier; RFC 2392', + 'crid': 'TV-Anytime Content Reference Identifier; RFC 4078', + 'data': ('allows inclusion of small data items as "immediate" data; ' + 'RFC 2397'), + 'dav': 'Distributed Authoring and Versioning Protocol; RFC 2518', + 'dict': 'dictionary service protocol; RFC 2229', + 'dns': 'Domain Name System resources', + 'eid': ('External ID; non-URL data; general escape mechanism to allow ' + 'access to information for applications that are too ' + 'specialized to justify their own schemes'), + 'fax': ('a connection to a terminal that can handle telefaxes ' + '(facsimiles); RFC 2806'), + 'feed': 'NetNewsWire feed', + 'file': 'Host-specific file names; RFC 1738', + 'finger': '', + 'freenet': '', + 'ftp': 'File Transfer Protocol; RFC 1738', + 'go': 'go; RFC 3368', + 'gopher': 'The Gopher Protocol', + 'gsm-sms': ('Global System for Mobile Communications Short Message ' + 'Service'), + 'h323': ('video (audiovisual) communication on local area networks; ' + 'RFC 3508'), + 'h324': ('video and audio communications over low bitrate connections ' + 'such as POTS modem connections'), + 'hdl': 'CNRI handle system', + 'hnews': 'an HTTP-tunneling variant of the NNTP news protocol', + 'http': 'Hypertext Transfer Protocol; RFC 2616', + 'https': 'HTTP over SSL; RFC 2818', + 'hydra': 'SubEthaEdit URI. See http://www.codingmonkeys.de/subethaedit.', + 'iioploc': 'Internet Inter-ORB Protocol Location?', + 'ilu': 'Inter-Language Unification', + 'im': 'Instant Messaging; RFC 3860', + 'imap': 'Internet Message Access Protocol; RFC 2192', + 'info': 'Information Assets with Identifiers in Public Namespaces', + 'ior': 'CORBA interoperable object reference', + 'ipp': 'Internet Printing Protocol; RFC 3510', + 'irc': 'Internet Relay Chat', + 'iris.beep': 'iris.beep; RFC 3983', + 'iseek': 'See www.ambrosiasw.com; a little util for OS X.', + 'jar': 'Java archive', + 'javascript': ('JavaScript code; evaluates the expression after the ' + 'colon'), + 'jdbc': 'JDBC connection URI.', + 'ldap': 'Lightweight Directory Access Protocol', + 'lifn': '', + 'livescript': '', + 'lrq': '', + 'mailbox': 'Mail folder access', + 'mailserver': 'Access to data available from mail servers', + 'mailto': 'Electronic mail address; RFC 2368', + 'md5': '', + 'mid': 'message identifier; RFC 2392', + 'mocha': '', + 'modem': ('a connection to a terminal that can handle incoming data ' + 'calls; RFC 2806'), + 'mtqp': 'Message Tracking Query Protocol; RFC 3887', + 'mupdate': 'Mailbox Update (MUPDATE) Protocol; RFC 3656', + 'news': 'USENET news; RFC 1738', + 'nfs': 'Network File System protocol; RFC 2224', + 'nntp': 'USENET news using NNTP access; RFC 1738', + 'opaquelocktoken': 'RFC 2518', + 'phone': '', + 'pop': 'Post Office Protocol; RFC 2384', + 'pop3': 'Post Office Protocol v3', + 'pres': 'Presence; RFC 3859', + 'printer': '', + 'prospero': 'Prospero Directory Service; RFC 4157', + 'rdar': ('URLs found in Darwin source ' + '(http://www.opensource.apple.com/darwinsource/).'), + 'res': '', + 'rtsp': 'real time streaming protocol; RFC 2326', + 'rvp': '', + 'rwhois': '', + 'rx': 'Remote Execution', + 'sdp': '', + 'service': 'service location; RFC 2609', + 'shttp': 'secure hypertext transfer protocol', + 'sip': 'Session Initiation Protocol; RFC 3261', + 'sips': 'secure session intitiaion protocol; RFC 3261', + 'smb': 'SAMBA filesystems.', + 'snews': 'For NNTP postings via SSL', + 'snmp': 'Simple Network Management Protocol; RFC 4088', + 'soap.beep': 'RFC 3288', + 'soap.beeps': 'RFC 3288', + 'ssh': 'Reference to interactive sessions via ssh.', + 't120': 'real time data conferencing (audiographics)', + 'tag': 'RFC 4151', + 'tcp': '', + 'tel': ('a connection to a terminal that handles normal voice ' + 'telephone calls, a voice mailbox or another voice messaging ' + 'system or a service that can be operated using DTMF tones; ' + 'RFC 3966.'), + 'telephone': 'telephone', + 'telnet': 'Reference to interactive sessions; RFC 4248', + 'tftp': 'Trivial File Transfer Protocol; RFC 3617', + 'tip': 'Transaction Internet Protocol; RFC 2371', + 'tn3270': 'Interactive 3270 emulation sessions', + 'tv': '', + 'urn': 'Uniform Resource Name; RFC 2141', + 'uuid': '', + 'vemmi': 'versatile multimedia interface; RFC 2122', + 'videotex': '', + 'view-source': 'displays HTML code that was generated with JavaScript', + 'wais': 'Wide Area Information Servers; RFC 4156', + 'whodp': '', + 'whois++': 'Distributed directory service.', + 'x-man-page': ('Opens man page in Terminal.app on OS X ' + '(see macosxhints.com)'), + 'xmlrpc.beep': 'RFC 3529', + 'xmlrpc.beeps': 'RFC 3529', + 'z39.50r': 'Z39.50 Retrieval; RFC 2056', + 'z39.50s': 'Z39.50 Session; RFC 2056',} diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__init__.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__init__.py new file mode 100644 index 0000000..a29bd8c --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__init__.py @@ -0,0 +1,143 @@ +# $Id: __init__.py 8239 2018-11-21 21:46:00Z milde $ +# Author: David Goodger <goodger@python.org> +# Copyright: This module has been placed in the public domain. + +""" +This package contains Docutils Writer modules. +""" + +__docformat__ = 'reStructuredText' + +import os.path +import sys + +import docutils +from docutils import languages, Component +from docutils.transforms import universal + + +class Writer(Component): + + """ + Abstract base class for docutils Writers. + + Each writer module or package must export a subclass also called 'Writer'. + Each writer must support all standard node types listed in + `docutils.nodes.node_class_names`. + + The `write()` method is the main entry point. + """ + + component_type = 'writer' + config_section = 'writers' + + def get_transforms(self): + return Component.get_transforms(self) + [ + universal.Messages, + universal.FilterMessages, + universal.StripClassesAndElements,] + + document = None + """The document to write (Docutils doctree); set by `write`.""" + + output = None + """Final translated form of `document` (Unicode string for text, binary + string for other forms); set by `translate`.""" + + language = None + """Language module for the document; set by `write`.""" + + destination = None + """`docutils.io` Output object; where to write the document. + Set by `write`.""" + + def __init__(self): + + # Used by HTML and LaTeX writer for output fragments: + self.parts = {} + """Mapping of document part names to fragments of `self.output`. + Values are Unicode strings; encoding is up to the client. The 'whole' + key should contain the entire document output. + """ + + def write(self, document, destination): + """ + Process a document into its final form. + + Translate `document` (a Docutils document tree) into the Writer's + native format, and write it out to its `destination` (a + `docutils.io.Output` subclass object). + + Normally not overridden or extended in subclasses. + """ + self.document = document + self.language = languages.get_language( + document.settings.language_code, + document.reporter) + self.destination = destination + self.translate() + output = self.destination.write(self.output) + return output + + def translate(self): + """ + Do final translation of `self.document` into `self.output`. Called + from `write`. Override in subclasses. + + Usually done with a `docutils.nodes.NodeVisitor` subclass, in + combination with a call to `docutils.nodes.Node.walk()` or + `docutils.nodes.Node.walkabout()`. The ``NodeVisitor`` subclass must + support all standard elements (listed in + `docutils.nodes.node_class_names`) and possibly non-standard elements + used by the current Reader as well. + """ + raise NotImplementedError('subclass must override this method') + + def assemble_parts(self): + """Assemble the `self.parts` dictionary. Extend in subclasses.""" + self.parts['whole'] = self.output + self.parts['encoding'] = self.document.settings.output_encoding + self.parts['version'] = docutils.__version__ + + +class UnfilteredWriter(Writer): + + """ + A writer that passes the document tree on unchanged (e.g. a + serializer.) + + Documents written by UnfilteredWriters are typically reused at a + later date using a subclass of `readers.ReReader`. + """ + + def get_transforms(self): + # Do not add any transforms. When the document is reused + # later, the then-used writer will add the appropriate + # transforms. + return Component.get_transforms(self) + + +_writer_aliases = { + 'html': 'html4css1', # may change to html5 some day + 'html4': 'html4css1', + 'html5': 'html5_polyglot', + 'latex': 'latex2e', + 'pprint': 'pseudoxml', + 'pformat': 'pseudoxml', + 'pdf': 'rlpdf', + 's5': 's5_html', + 'xelatex': 'xetex', + 'xhtml': 'html5_polyglot', + 'xhtml10': 'html4css1', + 'xml': 'docutils_xml'} + +def get_writer_class(writer_name): + """Return the Writer class from the `writer_name` module.""" + writer_name = writer_name.lower() + if writer_name in _writer_aliases: + writer_name = _writer_aliases[writer_name] + try: + module = __import__(writer_name, globals(), locals(), level=1) + except ImportError: + module = __import__(writer_name, globals(), locals(), level=0) + return module.Writer diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/__init__.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f029ea58d94b159deefb3e795a62f707c5949ad2 GIT binary patch literal 4062 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 EfAs@Uo&W#< literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/_html_base.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/_html_base.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e71baa2279fb0aa1120814c3cbe09f4e21a8c50 GIT binary patch literal 57667 zcmc(|37lL<buQlfHa)9G`_>vQ*4WZW-fej_UL?zwu?J%bFKyYa)>O|-k9xXC_x5OM zW`H0AW-*v0Y+)H012zdeA%u{G#bFJEB|vh+OCA^kCV5%N3rY0A`hVZ4dvD*q-954c z|MzBox2pQyT27tXPMve=)bl$#Qvv*a{qUXlU-zGZz?1yp{p-Mw>+qP@1p@&U$OcqU zg-XF}Q2bCfEPf;#sih?p&BpEuly8p&3h|>U<76<v|Js0jOJox_1yoo?9tfyNA$dBS zjTI7wST2DSE9?}8PN72C*gb)A=<a}aC4DNJf*&oVraQ77)9Gw_x-;83-IeW{?#^}x z30bVvGu@l*m2kY&H@zggM8b(u|Mb%A(&=T{Wz);E%coalS4^+Wt_%hW!Kqa$c{FPL z45?G4)zfRTYl49?>yj$1)xVrL4+o7{VO@4T>d>Lms6)EYIh8>zGI-Oey6~o}&@r_E zZwBzDTlL^g58iCVn@uWoATZcl+cs92p01QLsxV$G7puie+02YrjLhE3*le{}GBY<H zyzSP^38Ppo80J%KiP15--aoX2Zj&?ug#g+jkPWFI@()?z+xOo(IvBPRxm-CvUC8CE zR4zANQL`n6)4ANS*?dWVc|2gmkbyX7uia6dp4l-|oY_8Gp2?3LEvW4$CJTkq_S~h$ zbm7<)r*<eC!W}knJ93lN=~C`U-Yg8woH9blYAqg<fkZ%l4@RwMxuOcD6_v_aaXYP* zEal4+v-t^p3Kc7ZK`V72KVCRcHHzg4{?hSs`Pq}mqhq#Q9GlD=msATUt)(-?v7@=^ ze04HcC?78xmGX3<T(y#Xa|t1`(xp5iUcwjn)msne3MYZp@?hwxFzZb;qOA0+QMzOX zk%^TiT(dUU;W2N8Q^z&>eJC4YUoHl-QH5TwV%fNgtHc9=Y(gbf3Vu@e6ZBf?9oY`u zC$eePi?-^sVs}Y1qtzk=JR3bpua>SBre|1(q3X$Mc5P+0Ix|~EWydNC*vS<PqhjPH z^JP^k7*_Ae=@M~c6vmALQjHY`Lk5R*EzQiFo;0|`>X<C#Rc;0miziVaepo59da6_~ z(au$?<48rFaz6JsKXPdGVtKq`#hpNepX}J?>^L)vR*ThA!Ah93M|3F0+yPu{yix(i zt;lqtnzs_;Mt(vXtAn7StV*deVI}2<hDU-rk4_1@S?X9UdyMVo{4vbN+=IvLhf@tq z1s6hdfiuBscq%dxTpl<Ocsw{d7!{-#%MiutnkZCrRU=<EG4iHOqYE#y9oH+2OFbeV z4_XnkP#Uj~4<n8^#&$US@kk#J1Zzum0}eIj*8m`aV_E_576j%33wWl2XMz#<xzK!& zzZSxCcoXE8$lkzx%jQGX=v-hfRE^CA=R&7Lr^CU(u}w%DKf_cBg=!hwklkQ1+apy$ zhe5X(E9FhoN^q<SrsKzpW)UB<$rJg~(fko~CaceWm&;c%-j2*xF$m)(S_nU_IO-yS zuKdhQ=~T|?i&jkc!@;nz1H~E_!?7Za=|hs0bigTa$e6Oc1p9*NU@F)jto7I^b0ali zD}oemb6$ZTRl(I%XbS7hY2d0FnF}sN&jb{3G9N-Xb_VN<#>;$oE;JWj2FwhGN3D=? z<Sb^L@$FX)Cag$hrcgF^66OSITE#d5mfX6<Il*9_vLXhDMRcrGF$-2-v5d|;Qvqf% zP3Kf`tU4Hx+GjhRq`C1TM&WK|96?_-eaJ8_$Cm?mY&7%)yMhV)yFI57$xXQ6{OtCe zVnF%|dJAeEm<pkvteXd37Q(<vU@m+*bOyLlaM5SN!+~RcbD=5pABAu=K9xWyG8~xW zIuRYU0#-0(C7fBsiXX>%gK7>Y1x>~<N;WQmV@0Ma#j<f3gE7NIkD0N$eRGoTa9qBu zj$F>pDVMXcW!%8LB*QBiau*#vsIJGmEFP1?Fc6FYJ*nUtJgH!9rQKVaTcQC~oTOb; z5$O6XAVVq)RIQo^$+8fUVTG;)Bn5~ZqKSj)@zAJ2Ob^Dr69ooSVfqM`&Y8SXH3c8W zO^Bt@5tX-?Z#g2Y2!Hu2cN@Np;V}tbKn6j*?He*59qcsN^$m^zBMQe#nzJ)A6{A{E z*&fgf`PmYtEqiUq_B#DIXMZxYtH&zk@!~|zER5+MTR^W@XyRhQhMg0baTOhQOoOO5 z2%-mUX&ssEI9C#xGOs2=k!U262uDJZcp{vL<3B00DQnm8#{qvG9<wXaYQ@Y(3tTND zSS_PiDPveA<5(dRSRIpC8B^KLLf1mK>Npe3_DCpQ=$h(16Uz3f&g_yxzv?<2RNe4< z;P=AsgU|Q<@R!1027h@mnq8_^sFhfSm#I~1HT>mjjamzTg<7Z9!(XW~Y6JXLQp&)Y z;CN7NRGS_MW>>4tY74%sc{r%vrv}x9c()ee$J9k?8^Y@leq0Ty9SE;iJJrRAn^Bjj zOW|)&m#NF)52!2DmGC#JtJKx-H>q9f8u**lu-XlOiyBea!oNUWr>=*;6?wj2?NNJ? z=b*Y#?Zf{~>gKmcvKOlT>K4SfNIgg03V)lrO^w3euAZxIhd-pAr|y8iLmf~D;qO$> zS9ij{Sly-WhJT5=M`ht(s_s>X;9sWhQ}@HaT;<eZ_*baBIs*SnHKr8&t5iXa!@pWh zs7d&{R8dXAzeXKZCHTW?T9x7NRuwe^e?%Qq2K;N4sjBd=6MW8|2~J%Pj2>4fP@@~v zNp%X}_NbbA0sOscPR+x=QN2*T2>w3xV)a|_Z&EK&r{UkM9#AiZzhAvfy&V26>Ou7i z_|H+VRIh@6t9rG12>xyAHR`qSN7cjXb?~37Ua#H&|9168_1o~Dr{1LA4F3-G7WG#6 z2h`it@4!E(-mcyO|M}{j>Rs^fR14}1{JYd6>fP|~Mr-`8dXIW9V7~`_;4!?*qRrnA z|6Y9gJ@|*z2h<1Q-={vLJ`DeU^%3<^_&N14^>O%z)$glMz|X5cP@jZ<ME#-q6#Oyu zN9xn?mHK1#C-4jEPt|AOkE_qB&%vKipI1-7pHzRQz5u_dzNo$ge@cB>eFgqe^;Pxf z@Js4z>g({Q)nBM@z%Q$Bs&B!ssBf#kgg>LcqrMCOnEIajEBJ=`Yh}SV)!(S^!>_9U zq5c;Btol3kKj9x&KTtn}e?mQ}egyxd`my?ZP`9VlPt;HGyQZE}KZE}Q^$+SF;m@i6 zrTz*2y!vPLFYsTe{#E@P{)^PVss9cC#p>VHFW~={`VaM=@L!_-OPz&(TKymOOZX3{ zU#X|zzf_$AwgU*g41N$#2;rB*595g-{2=@&o*2TffFH+`K=_sLlXy}HzY2Z_o;03L zJY9IYF?wDN|M&3p;^{+cJ_LUWo_?fx4g95emLdFF_{;IEK=@(!EAgyC_;v7C<5`37 z>)~@AScmW%;IGG%LHLdEH{cmS__yJ2#Ip(EH^JYGXA8n_hJOK`tq8vb{ve(U5q>ND zi|}ki_-*jF;~7Huci`{9vlHRB!@n5MB?!L*{-t;>L-?KWFUNBQ!ta8AC7!DgUVwi! zo?Qr^fqxC2VT2!nzZ=g8!taKEEuQNTeiZ)ocy2)WJ@EJ7*^BUd;opd7AHwg0e-oaY z5q=E*emu7z{5bsQ;JFpy_rt#p&nUvb3;(%zZbz8-e;%GY5dHxC19%Q1{6YB7$8#sb zAA)}up1TqLF#LP)WD))d{Cn{nLinTb@56IH!XJa5!*dwnkHgR7IfC%-!ym(=5dH-G z0-kY%{{a33o=Jp13BQPE3gJJ5e-uv%;ZMPz##2W4kKkAE%pm+}_{Z=V2>&sB6HgW4 zKY>4s=QzTD3jYM2lL&tX{wX{)gg*=a1$gEV{v7;yJTFA}^YCAU=fwy=0spt~yaeGt zgMS*&0|<Ws{!8(^4B;=re>t895&jbVSKxUi!e55}Dm<@7_$%-q!t)x0zY71gcpgUh z&*8rg&+8HX8vHllc_YGKhyUAn-h}X9z<)EIw;=ot_;1DYHiW+k|99}b9pP`me+Qm- zBK&Rm@4~Zy@L$3|gXa;1zXSi>cpgRgyYSzG=e-DjPu*}Ju=NAjuUTDWaUA6KOZF`J zBB+g227fmd$_1l1R_BFOE1DhRY!)iUP)cGRC=@c)$wKBZH;I>xndZfZGuRO8-<Rh= zv!9wMRjP-b?XR#{#%D{V%y=PRoiz$dvhng-?3{;&GW&14{keA>yngiHu3Zu<lR3zu zWY?6t&@M<7Nbd0`_O_E1WoBm0LMCq~m@HuDP?<n|Dzj$Btb(DkEpwP#$|2Bb;7C*t z57|-gnk<wv*gDA04f~R9nd$t|0^S&?VkL8=kU<KwXjZ}H$P~+&VpWRTpb?SD+;}n% zZb3nFk&McbS+j~1<P_|3qT~lN&jnF#6jdQ}q*9$cZ(X)!RHb|Y^2q~Zz_Sf1nh2F9 z9OJWPAu&xGYnjZEK|lf+l`esefjE`2k{vbjIpyZolnL-$FCjzLSVkkepzF4kh})JS zCuz`W680DQD~_XaD^0KYP4G>Y!4S4t0B!39!>V{ZBbeSjfK&q`7Yuq!W+Jyo4K;St zp|&730dMz>X99iO(%R?Y2l&|`U<WY3THCpdH8k5cX(MzU8C?FhMuUQ>BcDvL%Ia{q z&20WZY{^t}Qx-~QVOM5jQ^(UIwhlj=UH^Gln*TRi|G&|6|36oAk#1+>OSwI!QZCq& zUuLT_Q`lpBa9aj^C3_aZj8ia96fr$=ifoup8mB}(QMTwq?V)NK_w8G-eJ1{%ut>9P z%oI7>lD8&Yq3z~OVXQcgMT`6+e@5(78&TstQGqGCT&W5U8mrwZRg0-hMlPG*j(>2n zXl732Phrr484ON3R|i>Yq>K|q%-t;T2t)~)Q<Yi0;M6t`UkjFT#%9v&9=LdD=Rn3` z1MMEzYz}0u9ZA)ChBxee?w*79+<v3Xh<J0?Fej@F5|_>01C!P2%&r|fPMkO~bmG#X ziZQX{;;XN|dWUeZ2N-D=IsC|PEB!&_>ia#C8Ya&d8800sdziH_z|#;AcHs3L`Zc-o zy9c<G8su;ea5>~!xO-r)BQn`+?gEek4;i22Lk*dgS!1jK{_aF!s9dP-7|1ZsONPxc zFtDnb>Zuvz%7u8xRQ`Bgza7Y!#+Z~pGQ2~-LYnPl@$K3%YZ^ODfLQP(*g+Y?RQ}|S z+u+}lKRGmI)-D?^70X96MxnHOpw3<&$V`IquF>l$8<dL%Z1b?h^}@w(BdOG8GX-GC zrw1&Z_uij5RKD+`xy(g#hsw3?p^FaPb?C04i{|d#e(ilj7g-S^`D}1YExH9%!8K=t z!?nnkQWb%LT5QX)*$RUrcsIeob!VenHePYrHDlzTIe%n7Ic!+-m7v!&FYQ4v4$p+Z zO$$ziBY_74xiFZJp{dAxxEfuE&4GPA6+aWg`^1BRsbn=Z)v+uv5ybEG1Y>uK+l3U} zMintS7kc1!<9F{e@altzGu5Tv*}u{X;>MSTRx)+p%L8B~aATOLE?MZG1NUxk;52hz zs=`vrGRc3rxGTh6Defu-835v~R#CWXs%uf=I!U<>q4f)yGt7TIN?)&HZh0HzcXVZ7 zVL*SEyf%uvN!-mUj&xfTYMZ-2+^ymcihH5B7fH-*;%*mrNZcLBeWyTmvHZS7+)Ks1 zOyIm+(qAF&mGb^7@+b$BqfKm2G76XAG0Cl)04Myuu6a}#G6u*KUKctRft-LWJqWtG z>)kQO`5JPk(9lluEvu8p5aMVqAbEdQ3cc8@LRL95^0)YHvPZ;%p>ws1eCuK^M=@qD zH#A(TAX9S$0Vidxdw7Q)<HMxF(0_Y|cjyp4U@{p=i4g87^s>OgeS=pU;1~w1j!{gd zcWSu><(RqvVIW(b?BJ9e<~ZLPlul>U6u&s{tpvni<e3^)!hM%?rw@Z77~?r~Hq%*2 z=K?rZH|8v`Qb8PIo&h7=ifN+JpuopiMJEX-yM(2AFv;2)tND2i9g0AWb#&I#*+M4+ z$Le&rvZccDLdgn)rET?#2smHLX?a;rf9l|@lG7}9D{9V^idAcg=UuKcBXVOaTB@8t zJ>xPXo~&A()e3~8S_TA}PGYQ5;__r#Nj7ADteTs#x}2aX3t6_$`8{4NlvIwj$)<{s zcGz-1hD~f7j^qui2VqL|u&NX!rm=z58=$k1&L&ngZBNiS&U40Az8|D>A)SjDqgUrI z5~`e*_9gLZI$tbRE7{)sEH+dInjPX_h9Fds+G`{^LInzQq)%j{CFu*oxR!1#-0K{^ z{{<fNFq{D7F6m$_*n|I={HKDEbFoMley4(obBRzQ6btDu34Bk7(u^C5#q_&oH)ZFe zztonu85RxWmED{JX%8Ng(k&I#vOr36mQ&Id7B?bpRNR=jad8vNF;!wbQ?3R%%}wxh z2bSL1whv|)uRgwA20wZ@c9kcqDZphi3t}m9F2pAkd0L)u<X0g)wWYrL>68r%2Nw|v zFr;=`6gw9@9fZs(xIkeGCT&b%!P@p4u`k3<R4Au>N!ESzO^BaJz#Nv%ab^n^Q0&vo zLy$L)AX5=qSbcVy9BBoe#+AM>okxrzvsg^%nnDjNNW=%C6utSXqT@7G#cilG(xD2X z_;Q9y9O2r92aQwQoKJE`oyUfq9d}pe`FGr!88<4^89;Zu0NfhpkZ~81pAB!mY$t@u z@w$j!L`LCRqv(e@4dG*+3J%P31tFK!Ia*uogWDUgJ@lNE>d;GLhziab3Z6w2Si8ns z8<6K2Az+BlOl2I^D-ag_vR*q#0;PI)BmY|8usM@2j|edVVufKVI8=Xq*%jB=uZ?-c zciSwlRFn9)L)S|RUC-*XzXl>{jNjU-mMD;@wfMcM&SXdWzA^Se=Z}rZ^wK9OffVU` zXaU3o$(b`j$c)i5jjK5JrXujel%T3G&=Zz$L`8KN4Iisrv8Pl3->R@p^QCmx*(R(f z-Cr}5h>J`;b39*~#dZg196B4!7;`AS*1cuprB`0FW#i?Sz`5+IYmDFGTTo%Z&|u7X z0e)FwFoTTa2<a7XsRti9BCG(hp=rDj5uB;8#$>4zlOXhg`>}!**MKR1---b`fOP@U zDsuU7U$6^P9Z>5Z6*^`^zapu@RD#S8A^@a87;U_)wy6pMJ;ckP&>jjcM9u_6KpmJO zWhiP5Q1BX!KnM+$uv#!MABIZUPK6ZJ#9VkPc{(^AS{9gx5PJ%A<3f5aLK;v-<|50` zdUrtu>=BGR6`c>iFzhIVA#Ud!QXSAxbQ$lgb}#e@M7?ZU5ta9$xt9<EQ3{CFuDU}e z71^tC{DLGefS)y1$Up-Ng5H9{2FlTh$&l{P942*i*w}^Yf?n#-+X{$-K{DNlceM?B z@@4L_no?h|*}Py^X0tg|>m1&`eLF%Kcq6IN!G67L^+*yADPeG?$tL%q*!^Xw{215b zx3$D5j8zQC>O8_+D~yg{#rHq=M(P3?os5?N86v7dT7IAByQsXdmPknu>v;;xdZ|IF z4yhZf6Z;mBKgTKYu1;ptDAt6wgr<nRNjOJHe}!g^D1_Y0<eC%#WfMlpR(RT+@O44s z9z?sC{f|^bAe0D(u#kq%r9ypJa6`dRAaO1h>I$w4rm!UU1Z(SjL%!ZVLc<z+k;}d@ zc1`Dx)G)g#i99od$#X8W5MY;_2+YTzLlK9cn2Rn1&jg?r(0?d2pPWz4rRL&uNydXh zz#7Epz>~(r3B9_Bz?slod;uC?oEO-=mow$?eCJ#zW(#yy<K$c#UA<F9Rg7B}cHd)n z;w!Xu4ES>$N8|827{~sWHr_jzR`HbqlpB~zKrf@i_@qiKB<CRco{Ou{a6l#J;z#4= z6V=p9f^&(54uK{`Xk>T*;-fL+=kg`4Qo2;6OzjTLC7`Q#WG<oeS4rfafG(QA2FP!p z@0yD|95ipJqK4JZsV+R-czW>k;_1V)1W*5X{B#I8-7yzih^h2km)@$C({o|{>q-pe zhl9s@s!M?%;1jDowsaH0`JTCMlyls{t%@B@qP*9zCMYviT_*Ydxz>xDOK~$d-#gcX zQo403VBjtnZ1kSN@a6QtI+rv4IMo$%snebqfaWCYX8cn1%=eX{p*P>B!oX_m3}k?k zV-N7##~eXZf!@Nr-dB5_%Y)eiW_#6`9ji7>>g1~!;2Pv7G7}gaWvq(iMrXDb6-X6f zDA#9x)6ERrf(*$Lk}3*3F{UR!L$4T`j0Xket{GsbXY4-=C8}~!by5PNoKkbuCbvJu z;W{eYCy1pm^g>02O@%Uz`|t}q6|TaWqH@_8T$CHAQIZv0A4NTh^qTA*)6lU3!Em~9 z?<h1FmhCK}S;6D}L463XU%)}F*V|B_X`3kcL-kv36XTn~Py*wr7Rv0X#fCSVo6V8I zl}3q$MX{(&n^qXRE-O4!nK7pL7K)2h$T?BOG+dBqS~01MTfVwpn~=y>*Y&`o!7Y<a zmsSi-0%?Gi!WI*aoyYudZ#<7cLd3l!w{+aYS>1ItU3qJD7s}YSV26mwl+mnIecxnt z=oZx<qSZVUhpd<>3OwM<Fw<8cQ;o|dw$c#0krfAK*e?*<)~JM*PxX|Qs`m^l=4fu> zooT#{&_yIoR0s{@P0X76VJkdVGL5$~6h~Ysca*<k64A^?q0m`8>1#u-A3!Mp*~^BU zL;_OF5&5Uu8bYBAHcS1Or_%`Y4L4PN(AVmc%@DRsF>I!SkpSZI`Bms#EY=fYd~B)0 zj4jW(R2VeJximLip-8Z4^W;D>#_r_⁡_}nbub!z_p&rk#phkFe#5>a4z!Z&}&H3 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 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/docutils_xml.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/docutils_xml.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3576e586781fa00264eebea396d223769594906f GIT binary patch literal 5717 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%0Did(hiBju2wEJu8oz^eofakUff@*rb) z#(ftue=o~rv%HKfTLb_y*Xo4ZT-{aGOs*=xklS|S%n>UEP!j(Ey>x}Z9RgG5qk1Z_ zp-SO0T0+cL<<JwViCmO8xa1QQIWM5tL1;tyV>%UQ-pM<rsxKONVdh6Fy@94Y`?Ty~ z1_~2XeQdGB8<?N*CG-+C<x9w^P;?8XP7DS8Pk<elsMJ4n54wU}0IxPjrOTB}^Zp9_ z*r}ZyWrOQqC)=u7M`hHU-C)WnI{9D5%Q}X-No`r?g8+$X5cp-)$*esH#7&UODwQTk zaj2;@CzJVWv<F=}``VyHdyD9eR#%Y0!8lVPZlLE^FZ5v5Feivtedtr4*i_w#uc1`i zv>Id>w?;`k$ul$6{P@#JWj5DUCqKl)$rYt@KKp3+wv9y+TFJ^;hNC-Zi?E1_Q6k$g L7tDp)!q5K)Uyzw1 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/manpage.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/manpage.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b1ef3604c56d1ef64f02abb4833f66eba8e241f GIT binary patch literal 41926 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 XgA~7ri3v8W^yXh8aq;5Cz3cxU_R#Te literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/null.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/null.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cb544ed075dd9a57e6d30787c3bed33b548c77e GIT binary patch literal 620 zcmY*WyKdVs6eTHImR+aFP-MyCselJtLx2DQf+9tRY+i~q0Ee)GE|aLGD20>|#B1|2 z`Hg-+KR|1z{z9hSE9K!{;9T%rO6Ty9=Q}%7hV}c~*UMj=u|Gt%OCmWzgpb&ODFz&b z<)u)9voi(}$Oi_}i0{$QNJ$udVT*XPH~l<^YU!%xrf}Eu3tu$Gucm)dgFW(YeAf>` zPJFurk`qLjV>3)~bQHi<1Ol}qH3D>aU@C?fea2lpC@**?U2E;;9rgL3?nx}iOs_?2 z!YLw9Fkq;{*N@mb8H~O1F;4sTbd)w_oz_LYY+aq@KMXAIZj7-@ec(%Tdw8EhmA6e{ zL;9R1CG%B%-%T2yxnQ%#d>|(}2jiRF;jF9I%{2x{w02o(wC<)_mld>@)-$bd+sr=i zOhQ}Nm2V8F_j%>6ifbKA-V~Kn`~PzdrZx_Y%L^0y<R!~nDxc7dqR$Y4SR!O3xfK0$ xy%=?4tudL_DtQU$Bm7S7o};zJcQi00>HpZ$?(dEyyX1I?@@YgaWGCe;`Umd+mKFd2 literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/pseudoxml.cpython-38.pyc b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/__pycache__/pseudoxml.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f29b879549d4afed0b79eb2ee3c0e9fab19493cc GIT binary patch literal 938 zcmY*X&2G~`5MFyXjuZNmGYHAopeB((;)JS7J#c|sT7KjMi{+hAm$kj!U8`-xjXnq* z`!YO$ubg-VPR!Uz6-L_6Gdts%Z)W!0{{EPu{QCU<li-Z~CSz9w8Yg(%GX%v_rh+t3 zq2f9$dCCL!nkk_McT5d{UyAQM6)HMo)8YDbd{&f3LsC>8Y?bLm)p=7w<r8lKk`K1P z`=jKVz7C@lx<DnyL8I!~$G30h<8)%-%-bgSjRkcMH~tUOVD~{g?0&N@Cwo^yG*0li zBLrYbmZc$*<|;&LJRK;JMrxp<JC+XBP{sI-l|ag)HtIP|c^esHk#{>ZtJ;>CPe(ni zn^LbQ4{FcdTB^Cs1H`S6PPeCc+yvnpyJSCtpZJxbVpuI$Vwre55*uMm8`X_Bjh_as zaG+QB%+hlH9xr@p7N#(>rZQRn71Zqd0zl8?3tPg~%i9H|@r8Da%~Tc-6zAr)9eJBo zPG=q-6CL8kg7u_tcK+bZI|n&YNT(*c2Ivu}07-}I=jRuN+w`5d#+cfAmt<Ne{h(&f zKwhkhJOK@~Y&Spex|oJ`glXESkL&JwctqFnHrG?MdWzxta6@tH!xhC+R#^#Bwqq&F zS~Z&VJt?o6Om94+O+2XdAg`-c@kKhweNk8GlmBh0zyLkGyZ~ooEN%A)4hU%WJ3uro zP2v!bqp&y>Tm%9!=ACCb9kfF!aT`*m`<>Evi)OcK+L7hkL_5j5TKyni^<5ngs0=*| JAq3y!{{VmO@mBx< literal 0 HcmV?d00001 diff --git a/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/_html_base.py b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/_html_base.py new file mode 100644 index 0000000..c58aef7 --- /dev/null +++ b/blog-generator/venv/lib/python3.8/site-packages/docutils/writers/_html_base.py @@ -0,0 +1,1670 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# :Author: David Goodger, Günter Milde +# Based on the html4css1 writer by David Goodger. +# :Maintainer: docutils-develop@lists.sourceforge.net +# :Revision: $Revision: 8412 $ +# :Date: $Date: 2005-06-28$ +# :Copyright: © 2016 David Goodger, 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 + +"""common definitions for Docutils HTML writers""" + +import sys +import os.path +import re + +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 + +import docutils +from docutils import nodes, utils, writers, languages, io +from docutils.utils.error_reporting import SafeString +from docutils.transforms import writer_aux +from docutils.utils.math import (unichar2tex, pick_math_environment, + math2html, latex2mathml, tex2mathml_extern) + +if sys.version_info >= (3, 0): + from urllib.request import url2pathname +else: + from urllib import url2pathname + +if sys.version_info >= (3, 0): + unicode = str # noqa + + +class Writer(writers.Writer): + + supported = ('html', 'xhtml') # update in subclass + """Formats this writer supports.""" + + # default_stylesheets = [] # set in subclass! + # default_stylesheet_dirs = ['.'] # set in subclass! + default_template = 'template.txt' + # default_template_path = ... # set in subclass! + # settings_spec = ... # set in subclass! + + settings_defaults = {'output_encoding_error_handler': 'xmlcharrefreplace'} + + # config_section = ... # set in subclass! + config_section_dependencies = ('writers', 'html writers') + + visitor_attributes = ( + 'head_prefix', 'head', 'stylesheet', 'body_prefix', + 'body_pre_docinfo', 'docinfo', 'body', 'body_suffix', + 'title', 'subtitle', 'header', 'footer', 'meta', 'fragment', + 'html_prolog', 'html_head', 'html_title', 'html_subtitle', + 'html_body') + + def get_transforms(self): + return writers.Writer.get_transforms(self) + [writer_aux.Admonitions] + + def translate(self): + self.visitor = visitor = self.translator_class(self.document) + self.document.walkabout(visitor) + for attr in self.visitor_attributes: + setattr(self, attr, getattr(visitor, attr)) + self.output = self.apply_template() + + def apply_template(self): + template_file = open(self.document.settings.template, 'rb') + template = unicode(template_file.read(), 'utf-8') + template_file.close() + subs = self.interpolation_dict() + return template % subs + + def interpolation_dict(self): + subs = {} + settings = self.document.settings + for attr in self.visitor_attributes: + subs[attr] = ''.join(getattr(self, attr)).rstrip('\n') + subs['encoding'] = settings.output_encoding + subs['version'] = docutils.__version__ + return subs + + def assemble_parts(self): + writers.Writer.assemble_parts(self) + for part in self.visitor_attributes: + self.parts[part] = ''.join(getattr(self, part)) + + +class HTMLTranslator(nodes.NodeVisitor): + + """ + Generic Docutils to HTML translator. + + See the `html4css1` and `html5_polyglot` writers for full featured + HTML writers. + + .. IMPORTANT:: + The `visit_*` and `depart_*` methods use a + heterogeneous stack, `self.context`. + When subclassing, make sure to be consistent in its use! + + Examples for robust coding: + + a) Override both `visit_*` and `depart_*` methods, don't call the + parent functions. + + b) Extend both and unconditionally call the parent functions:: + + def visit_example(self, node): + if foo: + self.body.append('<div class="foo">') + html4css1.HTMLTranslator.visit_example(self, node) + + def depart_example(self, node): + html4css1.HTMLTranslator.depart_example(self, node) + if foo: + self.body.append('</div>') + + c) Extend both, calling the parent functions under the same + conditions:: + + def visit_example(self, node): + if foo: + self.body.append('<div class="foo">\n') + else: # call the parent method + _html_base.HTMLTranslator.visit_example(self, node) + + def depart_example(self, node): + if foo: + self.body.append('</div>\n') + else: # call the parent method + _html_base.HTMLTranslator.depart_example(self, node) + + d) Extend one method (call the parent), but don't otherwise use the + `self.context` stack:: + + def depart_example(self, node): + _html_base.HTMLTranslator.depart_example(self, node) + if foo: + # implementation-specific code + # that does not use `self.context` + self.body.append('</div>\n') + + This way, changes in stack use will not bite you. + """ + + xml_declaration = '<?xml version="1.0" encoding="%s" ?>\n' + doctype = '<!DOCTYPE html>\n' + doctype_mathml = doctype + + head_prefix_template = ('<html xmlns="http://www.w3.org/1999/xhtml"' + ' xml:lang="%(lang)s" lang="%(lang)s">\n<head>\n') + content_type = ('<meta charset="%s"/>\n') + generator = ('<meta name="generator" content="Docutils %s: ' + 'http://docutils.sourceforge.net/" />\n') + + # Template for the MathJax script in the header: + mathjax_script = '<script type="text/javascript" src="%s"></script>\n' + + mathjax_url = 'file:/usr/share/javascript/mathjax/MathJax.js' + """ + URL of the MathJax javascript library. + + The MathJax library ought to be installed on the same + server as the rest of the deployed site files and specified + in the `math-output` setting appended to "mathjax". + See `Docutils Configuration`__. + + __ http://docutils.sourceforge.net/docs/user/config.html#math-output + + The fallback tries a local MathJax installation at + ``/usr/share/javascript/mathjax/MathJax.js``. + """ + + stylesheet_link = '<link rel="stylesheet" href="%s" type="text/css" />\n' + embedded_stylesheet = '<style type="text/css">\n\n%s\n</style>\n' + words_and_spaces = re.compile(r'[^ \n]+| +|\n') + # wrap point inside word: + in_word_wrap_point = re.compile(r'.+\W\W.+|[-?].+', re.U) + lang_attribute = 'lang' # name changes to 'xml:lang' in XHTML 1.1 + + special_characters = {ord('&'): u'&', + ord('<'): u'<', + ord('"'): u'"', + ord('>'): u'>', + ord('@'): u'@', # may thwart address harvesters + } + """Character references for characters with a special meaning in HTML.""" + + + def __init__(self, document): + nodes.NodeVisitor.__init__(self, document) + self.settings = settings = document.settings + lcode = settings.language_code + self.language = languages.get_language(lcode, document.reporter) + self.meta = [self.generator % docutils.__version__] + self.head_prefix = [] + self.html_prolog = [] + if settings.xml_declaration: + self.head_prefix.append(self.xml_declaration + % settings.output_encoding) + # self.content_type = "" + # encoding not interpolated: + self.html_prolog.append(self.xml_declaration) + self.head = self.meta[:] + self.stylesheet = [self.stylesheet_call(path) + for path in utils.get_stylesheet_list(settings)] + self.body_prefix = ['</head>\n<body>\n'] + # document title, subtitle display + self.body_pre_docinfo = [] + # author, date, etc. + self.docinfo = [] + self.body = [] + self.fragment = [] + self.body_suffix = ['</body>\n</html>\n'] + self.section_level = 0 + self.initial_header_level = int(settings.initial_header_level) + + self.math_output = settings.math_output.split() + self.math_output_options = self.math_output[1:] + self.math_output = self.math_output[0].lower() + + self.context = [] + """Heterogeneous stack. + + Used by visit_* and depart_* functions in conjunction with the tree + traversal. Make sure that the pops correspond to the pushes.""" + + self.topic_classes = [] # TODO: replace with self_in_contents + self.colspecs = [] + self.compact_p = True + self.compact_simple = False + self.compact_field_list = False + self.in_docinfo = False + self.in_sidebar = False + self.in_footnote_list = False + self.title = [] + self.subtitle = [] + self.header = [] + self.footer = [] + self.html_head = [self.content_type] # charset not interpolated + self.html_title = [] + self.html_subtitle = [] + self.html_body = [] + self.in_document_title = 0 # len(self.body) or 0 + self.in_mailto = False + self.author_in_authors = False # for html4css1 + self.math_header = [] + + def astext(self): + return ''.join(self.head_prefix + self.head + + self.stylesheet + self.body_prefix + + self.body_pre_docinfo + self.docinfo + + self.body + self.body_suffix) + + def encode(self, text): + """Encode special characters in `text` & return.""" + # Use only named entities known in both XML and HTML + # other characters are automatically encoded "by number" if required. + # @@@ A codec to do these and all other HTML entities would be nice. + text = unicode(text) + return text.translate(self.special_characters) + + def cloak_mailto(self, uri): + """Try to hide a mailto: URL from harvesters.""" + # Encode "@" using a URL octet reference (see RFC 1738). + # Further cloaking with HTML entities will be done in the + # `attval` function. + return uri.replace('@', '%40') + + def cloak_email(self, addr): + """Try to hide the link text of a email link from harversters.""" + # Surround at-signs and periods with <span> tags. ("@" has + # already been encoded to "@" by the `encode` method.) + addr = addr.replace('@', '<span>@</span>') + addr = addr.replace('.', '<span>.</span>') + return addr + + def attval(self, text, + whitespace=re.compile('[\n\r\t\v\f]')): + """Cleanse, HTML encode, and return attribute value text.""" + encoded = self.encode(whitespace.sub(' ', text)) + if self.in_mailto and self.settings.cloak_email_addresses: + # Cloak at-signs ("%40") and periods with HTML entities. + encoded = encoded.replace('%40', '%40') + encoded = encoded.replace('.', '.') + return encoded + + def stylesheet_call(self, path): + """Return code to reference or embed stylesheet file `path`""" + if self.settings.embed_stylesheet: + try: + content = io.FileInput(source_path=path, + encoding='utf-8').read() + self.settings.record_dependencies.add(path) + except IOError as err: + msg = u"Cannot embed stylesheet '%s': %s." % ( + path, SafeString(err.strerror)) + self.document.reporter.error(msg) + return '<--- %s --->\n' % msg + return self.embedded_stylesheet % content + # else link to style file: + if self.settings.stylesheet_path: + # adapt path relative to output (cf. config.html#stylesheet-path) + path = utils.relative_path(self.settings._destination, path) + return self.stylesheet_link % self.encode(path) + + def starttag(self, node, tagname, suffix='\n', empty=False, **attributes): + """ + Construct and return a start tag given a node (id & class attributes + are extracted), tag name, and optional attributes. + """ + tagname = tagname.lower() + prefix = [] + atts = {} + ids = [] + for (name, value) in attributes.items(): + atts[name.lower()] = value + classes = [] + languages = [] + # unify class arguments and move language specification + for cls in node.get('classes', []) + atts.pop('class', '').split(): + if cls.startswith('language-'): + languages.append(cls[9:]) + elif cls.strip() and cls not in classes: + classes.append(cls) + if languages: + # attribute name is 'lang' in XHTML 1.0 but 'xml:lang' in 1.1 + atts[self.lang_attribute] = languages[0] + if classes: + atts['class'] = ' '.join(classes) + assert 'id' not in atts + ids.extend(node.get('ids', [])) + if 'ids' in atts: + ids.extend(atts['ids']) + del atts['ids'] + if ids: + atts['id'] = ids[0] + for id in ids[1:]: + # Add empty "span" elements for additional IDs. Note + # that we cannot use empty "a" elements because there + # may be targets inside of references, but nested "a" + # elements aren't allowed in XHTML (even if they do + # not all have a "href" attribute). + if empty or isinstance(node, + (nodes.bullet_list, nodes.docinfo, + nodes.definition_list, nodes.enumerated_list, + nodes.field_list, nodes.option_list, + nodes.table)): + # Insert target right in front of element. + prefix.append('<span id="%s"></span>' % id) + else: + # Non-empty tag. Place the auxiliary <span> tag + # *inside* the element, as the first child. + suffix += '<span id="%s"></span>' % id + attlist = sorted(atts.items()) + parts = [tagname] + for name, value in attlist: + # value=None was used for boolean attributes without + # value, but this isn't supported by XHTML. + assert value is not None + if isinstance(value, list): + values = [unicode(v) for v in value] + parts.append('%s="%s"' % (name.lower(), + self.attval(' '.join(values)))) + else: + parts.append('%s="%s"' % (name.lower(), + self.attval(unicode(value)))) + if empty: + infix = ' /' + else: + infix = '' + return ''.join(prefix) + '<%s%s>' % (' '.join(parts), infix) + suffix + + def emptytag(self, node, tagname, suffix='\n', **attributes): + """Construct and return an XML-compatible empty tag.""" + return self.starttag(node, tagname, suffix, empty=True, **attributes) + + def set_class_on_child(self, node, class_, index=0): + """ + Set class `class_` on the visible child no. index of `node`. + Do nothing if node has fewer children than `index`. + """ + children = [n for n in node if not isinstance(n, nodes.Invisible)] + try: + child = children[index] + except IndexError: + return + child['classes'].append(class_) + + def visit_Text(self, node): + text = node.astext() + encoded = self.encode(text) + if self.in_mailto and self.settings.cloak_email_addresses: + encoded = self.cloak_email(encoded) + self.body.append(encoded) + + def depart_Text(self, node): + pass + + def visit_abbreviation(self, node): + # @@@ implementation incomplete ("title" attribute) + self.body.append(self.starttag(node, 'abbr', '')) + + def depart_abbreviation(self, node): + self.body.append('</abbr>') + + def visit_acronym(self, node): + # @@@ implementation incomplete ("title" attribute) + self.body.append(self.starttag(node, 'acronym', '')) + + def depart_acronym(self, node): + self.body.append('</acronym>') + + def visit_address(self, node): + self.visit_docinfo_item(node, 'address', meta=False) + self.body.append(self.starttag(node, 'pre', + suffix= '', CLASS='address')) + + def depart_address(self, node): + self.body.append('\n</pre>\n') + self.depart_docinfo_item() + + def visit_admonition(self, node): + node['classes'].insert(0, 'admonition') + self.body.append(self.starttag(node, 'div')) + + def depart_admonition(self, node=None): + self.body.append('</div>\n') + + attribution_formats = {'dash': (u'\u2014', ''), + 'parentheses': ('(', ')'), + 'parens': ('(', ')'), + 'none': ('', '')} + + def visit_attribution(self, node): + prefix, suffix = self.attribution_formats[self.settings.attribution] + self.context.append(suffix) + self.body.append( + self.starttag(node, 'p', prefix, CLASS='attribution')) + + def depart_attribution(self, node): + self.body.append(self.context.pop() + '</p>\n') + + def visit_author(self, node): + if not(isinstance(node.parent, nodes.authors)): + self.visit_docinfo_item(node, 'author') + self.body.append('<p>') + + def depart_author(self, node): + self.body.append('</p>') + if isinstance(node.parent, nodes.authors): + self.body.append('\n') + else: + self.depart_docinfo_item() + + def visit_authors(self, node): + self.visit_docinfo_item(node, 'authors') + + def depart_authors(self, node): + self.depart_docinfo_item() + + def visit_block_quote(self, node): + self.body.append(self.starttag(node, 'blockquote')) + + def depart_block_quote(self, node): + self.body.append('</blockquote>\n') + + def check_simple_list(self, node): + """Check for a simple list that can be rendered compactly.""" + visitor = SimpleListChecker(self.document) + try: + node.walk(visitor) + except nodes.NodeFound: + return False + else: + return True + + # Compact lists + # ------------ + # Include definition lists and field lists (in addition to ordered + # and unordered lists) in the test if a list is "simple" (cf. the + # html4css1.HTMLTranslator docstring and the SimpleListChecker class at + # the end of this file). + + def is_compactable(self, node): + # explicite class arguments have precedence + if 'compact' in node['classes']: + return True + if 'open' in node['classes']: + return False + # check config setting: + if (isinstance(node, (nodes.field_list, nodes.definition_list)) + and not self.settings.compact_field_lists): + return False + if (isinstance(node, (nodes.enumerated_list, nodes.bullet_list)) + and not self.settings.compact_lists): + return False + # more special cases: + if (self.topic_classes == ['contents']): # TODO: self.in_contents + return True + # check the list items: + return self.check_simple_list(node) + + def visit_bullet_list(self, node): + atts = {} + old_compact_simple = self.compact_simple + self.context.append((self.compact_simple, self.compact_p)) + self.compact_p = None + self.compact_simple = self.is_compactable(node) + if self.compact_simple and not old_compact_simple: + atts['class'] = 'simple' + self.body.append(self.starttag(node, 'ul', **atts)) + + def depart_bullet_list(self, node): + self.compact_simple, self.compact_p = self.context.pop() + self.body.append('</ul>\n') + + def visit_caption(self, node): + self.body.append(self.starttag(node, 'p', '', CLASS='caption')) + + def depart_caption(self, node): + self.body.append('</p>\n') + + # citations + # --------- + # Use definition list instead of table for bibliographic references. + # Join adjacent citation entries. + + def visit_citation(self, node): + if not self.in_footnote_list: + self.body.append('<dl class="citation">\n') + self.in_footnote_list = True + + def depart_citation(self, node): + self.body.append('</dd>\n') + if not isinstance(node.next_node(descend=False, siblings=True), + nodes.citation): + self.body.append('</dl>\n') + self.in_footnote_list = False + + def visit_citation_reference(self, node): + href = '#' + if 'refid' in node: + href += node['refid'] + elif 'refname' in node: + href += self.document.nameids[node['refname']] + # else: # TODO system message (or already in the transform)? + # 'Citation reference missing.' + self.body.append(self.starttag( + node, 'a', '[', CLASS='citation-reference', href=href)) + + def depart_citation_reference(self, node): + self.body.append(']</a>') + + # classifier + # ---------- + # don't insert classifier-delimiter here (done by CSS) + + def visit_classifier(self, node): + self.body.append(self.starttag(node, 'span', '', CLASS='classifier')) + + def depart_classifier(self, node): + self.body.append('</span>') + + def visit_colspec(self, node): + self.colspecs.append(node) + # "stubs" list is an attribute of the tgroup element: + node.parent.stubs.append(node.attributes.get('stub')) + + def depart_colspec(self, node): + # write out <colgroup> when all colspecs are processed + if isinstance(node.next_node(descend=False, siblings=True), + nodes.colspec): + return + if 'colwidths-auto' in node.parent.parent['classes'] or ( + 'colwidths-auto' in self.settings.table_style and + ('colwidths-given' not in node.parent.parent['classes'])): + return + total_width = sum(node['colwidth'] for node in self.colspecs) + self.body.append(self.starttag(node, 'colgroup')) + for node in self.colspecs: + colwidth = int(node['colwidth'] * 100.0 / total_width + 0.5) + self.body.append(self.emptytag(node, 'col', + style='width: %i%%' % colwidth)) + self.body.append('</colgroup>\n') + + def visit_comment(self, node, + sub=re.compile('-(?=-)').sub): + """Escape double-dashes in comment text.""" + self.body.append('<!-- %s -->\n' % sub('- ', node.astext())) + # Content already processed: + raise nodes.SkipNode + + def visit_compound(self, node): + self.body.append(self.starttag(node, 'div', CLASS='compound')) + if len(node) > 1: + node[0]['classes'].append('compound-first') + node[-1]['classes'].append('compound-last') + for child in node[1:-1]: + child['classes'].append('compound-middle') + + def depart_compound(self, node): + self.body.append('</div>\n') + + def visit_container(self, node): + self.body.append(self.starttag(node, 'div', CLASS='docutils container')) + + def depart_container(self, node): + self.body.append('</div>\n') + + def visit_contact(self, node): + self.visit_docinfo_item(node, 'contact', meta=False) + + def depart_contact(self, node): + self.depart_docinfo_item() + + def visit_copyright(self, node): + self.visit_docinfo_item(node, 'copyright') + + def depart_copyright(self, node): + self.depart_docinfo_item() + + def visit_date(self, node): + self.visit_docinfo_item(node, 'date') + + def depart_date(self, node): + self.depart_docinfo_item() + + def visit_decoration(self, node): + pass + + def depart_decoration(self, node): + pass + + def visit_definition(self, node): + self.body.append('</dt>\n') + self.body.append(self.starttag(node, 'dd', '')) + + def depart_definition(self, node): + self.body.append('</dd>\n') + + def visit_definition_list(self, node): + classes = node.setdefault('classes', []) + if self.is_compactable(node): + classes.append('simple') + self.body.append(self.starttag(node, 'dl')) + + def depart_definition_list(self, node): + self.body.append('</dl>\n') + + def visit_definition_list_item(self, node): + # pass class arguments, ids and names to definition term: + node.children[0]['classes'] = ( + node.get('classes', []) + node.children[0].get('classes', [])) + node.children[0]['ids'] = ( + node.get('ids', []) + node.children[0].get('ids', [])) + node.children[0]['names'] = ( + node.get('names', []) + node.children[0].get('names', [])) + + def depart_definition_list_item(self, node): + pass + + def visit_description(self, node): + self.body.append(self.starttag(node, 'dd', '')) + + def depart_description(self, node): + self.body.append('</dd>\n') + + def visit_docinfo(self, node): + self.context.append(len(self.body)) + classes = 'docinfo' + if (self.is_compactable(node)): + classes += ' simple' + self.body.append(self.starttag(node, 'dl', CLASS=classes)) + + def depart_docinfo(self, node): + self.body.append('</dl>\n') + start = self.context.pop() + self.docinfo = self.body[start:] + self.body = [] + + def visit_docinfo_item(self, node, name, meta=True): + if meta: + meta_tag = '<meta name="%s" content="%s" />\n' \ + % (name, self.attval(node.astext())) + self.add_meta(meta_tag) + self.body.append('<dt class="%s">%s</dt>\n' + % (name, self.language.labels[name])) + self.body.append(self.starttag(node, 'dd', '', CLASS=name)) + + def depart_docinfo_item(self): + self.body.append('</dd>\n') + + def visit_doctest_block(self, node): + self.body.append(self.starttag(node, 'pre', suffix='', + CLASS='code python doctest')) + + def depart_doctest_block(self, node): + self.body.append('\n</pre>\n') + + def visit_document(self, node): + title = (node.get('title', '') or os.path.basename(node['source']) + or 'docutils document without title') + self.head.append('<title>%s\n' % self.encode(title)) + + def depart_document(self, node): + self.head_prefix.extend([self.doctype, + self.head_prefix_template % + {'lang': self.settings.language_code}]) + self.html_prolog.append(self.doctype) + self.meta.insert(0, self.content_type % self.settings.output_encoding) + self.head.insert(0, self.content_type % self.settings.output_encoding) + if 'name="dcterms.' in ''.join(self.meta): + self.head.append( + '') + if self.math_header: + if self.math_output == 'mathjax': + self.head.extend(self.math_header) + else: + self.stylesheet.extend(self.math_header) + # skip content-type meta tag with interpolated charset value: + self.html_head.extend(self.head[1:]) + self.body_prefix.append(self.starttag(node, 'div', CLASS='document')) + self.body_suffix.insert(0, '\n') + self.fragment.extend(self.body) # self.fragment is the "naked" body + self.html_body.extend(self.body_prefix[1:] + self.body_pre_docinfo + + self.docinfo + self.body + + self.body_suffix[:-1]) + assert not self.context, 'len(context) = %s' % len(self.context) + + def visit_emphasis(self, node): + self.body.append(self.starttag(node, 'em', '')) + + def depart_emphasis(self, node): + self.body.append('') + + def visit_entry(self, node): + atts = {'class': []} + if isinstance(node.parent.parent, nodes.thead): + atts['class'].append('head') + if node.parent.parent.parent.stubs[node.parent.column]: + # "stubs" list is an attribute of the tgroup element + atts['class'].append('stub') + if atts['class']: + tagname = 'th' + atts['class'] = ' '.join(atts['class']) + else: + tagname = 'td' + del atts['class'] + node.parent.column += 1 + if 'morerows' in node: + atts['rowspan'] = node['morerows'] + 1 + if 'morecols' in node: + atts['colspan'] = node['morecols'] + 1 + node.parent.column += node['morecols'] + self.body.append(self.starttag(node, tagname, '', **atts)) + self.context.append('\n' % tagname.lower()) + # TODO: why does the html4css1 writer insert an NBSP into empty cells? + # if len(node) == 0: # empty cell + # self.body.append(' ') # no-break space + + def depart_entry(self, node): + self.body.append(self.context.pop()) + + def visit_enumerated_list(self, node): + atts = {} + if 'start' in node: + atts['start'] = node['start'] + if 'enumtype' in node: + atts['class'] = node['enumtype'] + if self.is_compactable(node): + atts['class'] = (atts.get('class', '') + ' simple').strip() + self.body.append(self.starttag(node, 'ol', **atts)) + + def depart_enumerated_list(self, node): + self.body.append('\n') + + def visit_field_list(self, node): + # Keep simple paragraphs in the field_body to enable CSS + # rule to start body on new line if the label is too long + classes = 'field-list' + if (self.is_compactable(node)): + classes += ' simple' + self.body.append(self.starttag(node, 'dl', CLASS=classes)) + + def depart_field_list(self, node): + self.body.append('\n') + + def visit_field(self, node): + pass + + def depart_field(self, node): + pass + + # as field is ignored, pass class arguments to field-name and field-body: + + def visit_field_name(self, node): + self.body.append(self.starttag(node, 'dt', '', + CLASS=''.join(node.parent['classes']))) + + def depart_field_name(self, node): + self.body.append('\n') + + def visit_field_body(self, node): + self.body.append(self.starttag(node, 'dd', '', + CLASS=''.join(node.parent['classes']))) + # prevent misalignment of following content if the field is empty: + if not node.children: + self.body.append('

') + + def depart_field_body(self, node): + self.body.append('\n') + + def visit_figure(self, node): + atts = {'class': 'figure'} + if node.get('width'): + atts['style'] = 'width: %s' % node['width'] + if node.get('align'): + atts['class'] += " align-" + node['align'] + self.body.append(self.starttag(node, 'div', **atts)) + + def depart_figure(self, node): + self.body.append('\n') + + # use HTML 5
element? + def visit_footer(self, node): + self.context.append(len(self.body)) + + def depart_footer(self, node): + start = self.context.pop() + footer = [self.starttag(node, 'div', CLASS='footer'), + '\n'] + footer.extend(self.body[start:]) + footer.append('\n\n') + self.footer.extend(footer) + self.body_suffix[:0] = footer + del self.body[start:] + + # footnotes + # --------- + # use definition list instead of table for footnote text + + # TODO: use the new HTML5 element

\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