diff --git a/.gitignore b/.gitignore
index ffd0f9faf145..d5470cfce5d5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,11 +14,16 @@ ID
!id/
.DS_Store*
*.pdb
-*.egg-info
.eslintcache
# Filesystem temporaries
.fuse_hidden*
+# Ignore Python .egg-info directories for first-party modules (but,
+# still add vendored packages' .egg-info directories)
+*.egg-info
+!third_party/python/**/*.egg-info
+!testing/web-platform/tests/tools/third_party/**/*.egg-info
+
# Vim swap files.
.*.sw[a-z]
.sw[a-z]
diff --git a/.hgignore b/.hgignore
index e5d248a0175b..5dff49ad47b3 100644
--- a/.hgignore
+++ b/.hgignore
@@ -7,13 +7,16 @@
(^|/)ID$
(^|/)\.DS_Store$
\.pdb
-\.egg-info
\.eslintcache
\.gcda
\.gcno
\.gcov
compile_commands\.json
+# Ignore Python .egg-info directories for first-party modules (but,
+# still add vendored packages' .egg-info directories)
+^(?=.*\.egg-info/)(?!^third_party/python/)(?!^testing/web-platform/tests/tools/third_party/)
+
# Vim swap files.
^\.sw.$
.[^/]*\.sw.$
diff --git a/python/mozbuild/mozbuild/test/test_vendor.py b/python/mozbuild/mozbuild/test/test_vendor.py
index 860da7d21e6f..f91390ab324a 100644
--- a/python/mozbuild/mozbuild/test/test_vendor.py
+++ b/python/mozbuild/mozbuild/test/test_vendor.py
@@ -53,7 +53,6 @@ def test_up_to_date_vendor():
existing_vendored,
work_vendored,
"--exclude=__pycache__",
- "--exclude=*.egg-info",
]
)
diff --git a/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/PKG-INFO b/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/PKG-INFO
new file mode 100644
index 000000000000..9defab7de904
--- /dev/null
+++ b/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/PKG-INFO
@@ -0,0 +1,101 @@
+Metadata-Version: 1.2
+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
+Description: 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
+
+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.*
diff --git a/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/SOURCES.txt b/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..70108af00ee6
--- /dev/null
+++ b/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/SOURCES.txt
@@ -0,0 +1,31 @@
+CHANGES.rst
+LICENSE.rst
+MANIFEST.in
+README.rst
+setup.cfg
+setup.py
+tox.ini
+docs/Makefile
+docs/changes.rst
+docs/conf.py
+docs/escaping.rst
+docs/formatting.rst
+docs/html.rst
+docs/index.rst
+docs/license.rst
+docs/make.bat
+docs/requirements.txt
+src/MarkupSafe.egg-info/PKG-INFO
+src/MarkupSafe.egg-info/SOURCES.txt
+src/MarkupSafe.egg-info/dependency_links.txt
+src/MarkupSafe.egg-info/top_level.txt
+src/markupsafe/__init__.py
+src/markupsafe/_compat.py
+src/markupsafe/_constants.py
+src/markupsafe/_native.py
+src/markupsafe/_speedups.c
+tests/conftest.py
+tests/test_escape.py
+tests/test_exception_custom_html.py
+tests/test_leak.py
+tests/test_markupsafe.py
\ No newline at end of file
diff --git a/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/dependency_links.txt b/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/top_level.txt b/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/top_level.txt
new file mode 100644
index 000000000000..75bf729258f9
--- /dev/null
+++ b/third_party/python/MarkupSafe/src/MarkupSafe.egg-info/top_level.txt
@@ -0,0 +1 @@
+markupsafe
diff --git a/third_party/python/PyYAML/lib3/PyYAML.egg-info/PKG-INFO b/third_party/python/PyYAML/lib3/PyYAML.egg-info/PKG-INFO
new file mode 100644
index 000000000000..04d0abf6e5f7
--- /dev/null
+++ b/third_party/python/PyYAML/lib3/PyYAML.egg-info/PKG-INFO
@@ -0,0 +1,44 @@
+Metadata-Version: 1.2
+Name: PyYAML
+Version: 5.4.1
+Summary: YAML parser and emitter for Python
+Home-page: https://pyyaml.org/
+Author: Kirill Simonov
+Author-email: xi@resolvent.net
+License: MIT
+Download-URL: https://pypi.org/project/PyYAML/
+Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues
+Project-URL: CI, https://github.com/yaml/pyyaml/actions
+Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation
+Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core
+Project-URL: Source Code, https://github.com/yaml/pyyaml
+Description: YAML is a data serialization format designed for human readability
+ and interaction with scripting languages. PyYAML is a YAML parser
+ and emitter for Python.
+
+ PyYAML features a complete YAML 1.1 parser, Unicode support, pickle
+ support, capable extension API, and sensible error messages. PyYAML
+ supports standard YAML tags and provides Python-specific tags that
+ allow to represent an arbitrary Python object.
+
+ PyYAML is applicable for a broad range of tasks from complex
+ configuration files to object serialization and persistence.
+Platform: Any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Cython
+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.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing :: Markup
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
diff --git a/third_party/python/PyYAML/lib3/PyYAML.egg-info/SOURCES.txt b/third_party/python/PyYAML/lib3/PyYAML.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..89f5a63c0928
--- /dev/null
+++ b/third_party/python/PyYAML/lib3/PyYAML.egg-info/SOURCES.txt
@@ -0,0 +1,670 @@
+CHANGES
+LICENSE
+MANIFEST.in
+Makefile
+README
+pyproject.toml
+setup.cfg
+setup.py
+examples/pygments-lexer/example.yaml
+examples/pygments-lexer/yaml.py
+examples/yaml-highlight/yaml_hl.cfg
+examples/yaml-highlight/yaml_hl.py
+lib/_yaml/__init__.py
+lib/yaml/__init__.py
+lib/yaml/composer.py
+lib/yaml/constructor.py
+lib/yaml/cyaml.py
+lib/yaml/dumper.py
+lib/yaml/emitter.py
+lib/yaml/error.py
+lib/yaml/events.py
+lib/yaml/loader.py
+lib/yaml/nodes.py
+lib/yaml/parser.py
+lib/yaml/reader.py
+lib/yaml/representer.py
+lib/yaml/resolver.py
+lib/yaml/scanner.py
+lib/yaml/serializer.py
+lib/yaml/tokens.py
+lib3/PyYAML.egg-info/PKG-INFO
+lib3/PyYAML.egg-info/SOURCES.txt
+lib3/PyYAML.egg-info/dependency_links.txt
+lib3/PyYAML.egg-info/top_level.txt
+lib3/_yaml/__init__.py
+lib3/yaml/__init__.py
+lib3/yaml/composer.py
+lib3/yaml/constructor.py
+lib3/yaml/cyaml.py
+lib3/yaml/dumper.py
+lib3/yaml/emitter.py
+lib3/yaml/error.py
+lib3/yaml/events.py
+lib3/yaml/loader.py
+lib3/yaml/nodes.py
+lib3/yaml/parser.py
+lib3/yaml/reader.py
+lib3/yaml/representer.py
+lib3/yaml/resolver.py
+lib3/yaml/scanner.py
+lib3/yaml/serializer.py
+lib3/yaml/tokens.py
+tests/data/a-nasty-libyaml-bug.loader-error
+tests/data/aliases-cdumper-bug.code
+tests/data/aliases.events
+tests/data/bool.data
+tests/data/bool.detect
+tests/data/construct-binary-py2.code
+tests/data/construct-binary-py2.data
+tests/data/construct-binary-py3.code
+tests/data/construct-binary-py3.data
+tests/data/construct-bool.code
+tests/data/construct-bool.data
+tests/data/construct-custom.code
+tests/data/construct-custom.data
+tests/data/construct-float.code
+tests/data/construct-float.data
+tests/data/construct-int.code
+tests/data/construct-int.data
+tests/data/construct-map.code
+tests/data/construct-map.data
+tests/data/construct-merge.code
+tests/data/construct-merge.data
+tests/data/construct-null.code
+tests/data/construct-null.data
+tests/data/construct-omap.code
+tests/data/construct-omap.data
+tests/data/construct-pairs.code
+tests/data/construct-pairs.data
+tests/data/construct-python-bool.code
+tests/data/construct-python-bool.data
+tests/data/construct-python-bytes-py3.code
+tests/data/construct-python-bytes-py3.data
+tests/data/construct-python-complex.code
+tests/data/construct-python-complex.data
+tests/data/construct-python-float.code
+tests/data/construct-python-float.data
+tests/data/construct-python-int.code
+tests/data/construct-python-int.data
+tests/data/construct-python-long-short-py2.code
+tests/data/construct-python-long-short-py2.data
+tests/data/construct-python-long-short-py3.code
+tests/data/construct-python-long-short-py3.data
+tests/data/construct-python-name-module.code
+tests/data/construct-python-name-module.data
+tests/data/construct-python-none.code
+tests/data/construct-python-none.data
+tests/data/construct-python-object.code
+tests/data/construct-python-object.data
+tests/data/construct-python-str-ascii.code
+tests/data/construct-python-str-ascii.data
+tests/data/construct-python-str-utf8-py2.code
+tests/data/construct-python-str-utf8-py2.data
+tests/data/construct-python-str-utf8-py3.code
+tests/data/construct-python-str-utf8-py3.data
+tests/data/construct-python-tuple-list-dict.code
+tests/data/construct-python-tuple-list-dict.data
+tests/data/construct-python-unicode-ascii-py2.code
+tests/data/construct-python-unicode-ascii-py2.data
+tests/data/construct-python-unicode-ascii-py3.code
+tests/data/construct-python-unicode-ascii-py3.data
+tests/data/construct-python-unicode-utf8-py2.code
+tests/data/construct-python-unicode-utf8-py2.data
+tests/data/construct-python-unicode-utf8-py3.code
+tests/data/construct-python-unicode-utf8-py3.data
+tests/data/construct-seq.code
+tests/data/construct-seq.data
+tests/data/construct-set.code
+tests/data/construct-set.data
+tests/data/construct-str-ascii.code
+tests/data/construct-str-ascii.data
+tests/data/construct-str-utf8-py2.code
+tests/data/construct-str-utf8-py2.data
+tests/data/construct-str-utf8-py3.code
+tests/data/construct-str-utf8-py3.data
+tests/data/construct-str.code
+tests/data/construct-str.data
+tests/data/construct-timestamp.code
+tests/data/construct-timestamp.data
+tests/data/construct-value.code
+tests/data/construct-value.data
+tests/data/document-separator-in-quoted-scalar.loader-error
+tests/data/documents.events
+tests/data/duplicate-anchor-1.loader-error
+tests/data/duplicate-anchor-2.loader-error
+tests/data/duplicate-key.former-loader-error.code
+tests/data/duplicate-key.former-loader-error.data
+tests/data/duplicate-mapping-key.former-loader-error.code
+tests/data/duplicate-mapping-key.former-loader-error.data
+tests/data/duplicate-merge-key.former-loader-error.code
+tests/data/duplicate-merge-key.former-loader-error.data
+tests/data/duplicate-tag-directive.loader-error
+tests/data/duplicate-value-key.former-loader-error.code
+tests/data/duplicate-value-key.former-loader-error.data
+tests/data/duplicate-yaml-directive.loader-error
+tests/data/emit-block-scalar-in-simple-key-context-bug.canonical
+tests/data/emit-block-scalar-in-simple-key-context-bug.data
+tests/data/emitting-unacceptable-unicode-character-bug-py3.code
+tests/data/emitting-unacceptable-unicode-character-bug-py3.data
+tests/data/emitting-unacceptable-unicode-character-bug-py3.skip-ext
+tests/data/emitting-unacceptable-unicode-character-bug.code
+tests/data/emitting-unacceptable-unicode-character-bug.data
+tests/data/emitting-unacceptable-unicode-character-bug.skip-ext
+tests/data/emoticons.unicode
+tests/data/emoticons2.unicode
+tests/data/empty-anchor.emitter-error
+tests/data/empty-document-bug.canonical
+tests/data/empty-document-bug.data
+tests/data/empty-document-bug.empty
+tests/data/empty-documents.single-loader-error
+tests/data/empty-python-module.loader-error
+tests/data/empty-python-name.loader-error
+tests/data/empty-tag-handle.emitter-error
+tests/data/empty-tag-prefix.emitter-error
+tests/data/empty-tag.emitter-error
+tests/data/expected-document-end.emitter-error
+tests/data/expected-document-start.emitter-error
+tests/data/expected-mapping.loader-error
+tests/data/expected-node-1.emitter-error
+tests/data/expected-node-2.emitter-error
+tests/data/expected-nothing.emitter-error
+tests/data/expected-scalar.loader-error
+tests/data/expected-sequence.loader-error
+tests/data/expected-stream-start.emitter-error
+tests/data/explicit-document.single-loader-error
+tests/data/fetch-complex-value-bug.loader-error
+tests/data/float-representer-2.3-bug.code
+tests/data/float-representer-2.3-bug.data
+tests/data/float.data
+tests/data/float.detect
+tests/data/forbidden-entry.loader-error
+tests/data/forbidden-key.loader-error
+tests/data/forbidden-value.loader-error
+tests/data/implicit-document.single-loader-error
+tests/data/int.data
+tests/data/int.detect
+tests/data/invalid-anchor-1.loader-error
+tests/data/invalid-anchor-2.loader-error
+tests/data/invalid-anchor.emitter-error
+tests/data/invalid-base64-data-2.loader-error
+tests/data/invalid-base64-data.loader-error
+tests/data/invalid-block-scalar-indicator.loader-error
+tests/data/invalid-character.loader-error
+tests/data/invalid-character.stream-error
+tests/data/invalid-directive-line.loader-error
+tests/data/invalid-directive-name-1.loader-error
+tests/data/invalid-directive-name-2.loader-error
+tests/data/invalid-escape-character.loader-error
+tests/data/invalid-escape-numbers.loader-error
+tests/data/invalid-indentation-indicator-1.loader-error
+tests/data/invalid-indentation-indicator-2.loader-error
+tests/data/invalid-item-without-trailing-break.loader-error
+tests/data/invalid-merge-1.loader-error
+tests/data/invalid-merge-2.loader-error
+tests/data/invalid-omap-1.loader-error
+tests/data/invalid-omap-2.loader-error
+tests/data/invalid-omap-3.loader-error
+tests/data/invalid-pairs-1.loader-error
+tests/data/invalid-pairs-2.loader-error
+tests/data/invalid-pairs-3.loader-error
+tests/data/invalid-python-bytes-2-py3.loader-error
+tests/data/invalid-python-bytes-py3.loader-error
+tests/data/invalid-python-module-kind.loader-error
+tests/data/invalid-python-module-value.loader-error
+tests/data/invalid-python-module.loader-error
+tests/data/invalid-python-name-kind.loader-error
+tests/data/invalid-python-name-module.loader-error
+tests/data/invalid-python-name-object.loader-error
+tests/data/invalid-python-name-value.loader-error
+tests/data/invalid-simple-key.loader-error
+tests/data/invalid-single-quote-bug.code
+tests/data/invalid-single-quote-bug.data
+tests/data/invalid-starting-character.loader-error
+tests/data/invalid-tag-1.loader-error
+tests/data/invalid-tag-2.loader-error
+tests/data/invalid-tag-directive-handle.loader-error
+tests/data/invalid-tag-directive-prefix.loader-error
+tests/data/invalid-tag-handle-1.emitter-error
+tests/data/invalid-tag-handle-1.loader-error
+tests/data/invalid-tag-handle-2.emitter-error
+tests/data/invalid-tag-handle-2.loader-error
+tests/data/invalid-uri-escapes-1.loader-error
+tests/data/invalid-uri-escapes-2.loader-error
+tests/data/invalid-uri-escapes-3.loader-error
+tests/data/invalid-uri.loader-error
+tests/data/invalid-utf8-byte.loader-error
+tests/data/invalid-utf8-byte.stream-error
+tests/data/invalid-yaml-directive-version-1.loader-error
+tests/data/invalid-yaml-directive-version-2.loader-error
+tests/data/invalid-yaml-directive-version-3.loader-error
+tests/data/invalid-yaml-directive-version-4.loader-error
+tests/data/invalid-yaml-directive-version-5.loader-error
+tests/data/invalid-yaml-directive-version-6.loader-error
+tests/data/invalid-yaml-version.loader-error
+tests/data/latin.unicode
+tests/data/mapping.sort
+tests/data/mapping.sorted
+tests/data/mappings.events
+tests/data/merge.data
+tests/data/merge.detect
+tests/data/more-floats.code
+tests/data/more-floats.data
+tests/data/multi-constructor.code
+tests/data/multi-constructor.multi
+tests/data/myfullloader.subclass_blacklist
+tests/data/negative-float-bug.code
+tests/data/negative-float-bug.data
+tests/data/no-alias-anchor.emitter-error
+tests/data/no-alias-anchor.skip-ext
+tests/data/no-block-collection-end.loader-error
+tests/data/no-block-mapping-end-2.loader-error
+tests/data/no-block-mapping-end.loader-error
+tests/data/no-document-start.loader-error
+tests/data/no-flow-mapping-end.loader-error
+tests/data/no-flow-sequence-end.loader-error
+tests/data/no-node-1.loader-error
+tests/data/no-node-2.loader-error
+tests/data/no-tag.emitter-error
+tests/data/null.data
+tests/data/null.detect
+tests/data/odd-utf16.stream-error
+tests/data/overwrite-state-new-constructor.loader-error
+tests/data/recursive-anchor.former-loader-error
+tests/data/recursive-dict.recursive
+tests/data/recursive-list.recursive
+tests/data/recursive-set.recursive
+tests/data/recursive-state.recursive
+tests/data/recursive-tuple.recursive
+tests/data/recursive.former-dumper-error
+tests/data/remove-possible-simple-key-bug.loader-error
+tests/data/resolver.data
+tests/data/resolver.path
+tests/data/run-parser-crash-bug.data
+tests/data/scalars.events
+tests/data/scan-document-end-bug.canonical
+tests/data/scan-document-end-bug.data
+tests/data/scan-line-break-bug.canonical
+tests/data/scan-line-break-bug.data
+tests/data/sequences.events
+tests/data/serializer-is-already-opened.dumper-error
+tests/data/serializer-is-closed-1.dumper-error
+tests/data/serializer-is-closed-2.dumper-error
+tests/data/serializer-is-not-opened-1.dumper-error
+tests/data/serializer-is-not-opened-2.dumper-error
+tests/data/single-dot-is-not-float-bug.code
+tests/data/single-dot-is-not-float-bug.data
+tests/data/sloppy-indentation.canonical
+tests/data/sloppy-indentation.data
+tests/data/spec-02-01.data
+tests/data/spec-02-01.structure
+tests/data/spec-02-01.tokens
+tests/data/spec-02-02.data
+tests/data/spec-02-02.structure
+tests/data/spec-02-02.tokens
+tests/data/spec-02-03.data
+tests/data/spec-02-03.structure
+tests/data/spec-02-03.tokens
+tests/data/spec-02-04.data
+tests/data/spec-02-04.structure
+tests/data/spec-02-04.tokens
+tests/data/spec-02-05.data
+tests/data/spec-02-05.structure
+tests/data/spec-02-05.tokens
+tests/data/spec-02-06.data
+tests/data/spec-02-06.structure
+tests/data/spec-02-06.tokens
+tests/data/spec-02-07.data
+tests/data/spec-02-07.structure
+tests/data/spec-02-07.tokens
+tests/data/spec-02-08.data
+tests/data/spec-02-08.structure
+tests/data/spec-02-08.tokens
+tests/data/spec-02-09.data
+tests/data/spec-02-09.structure
+tests/data/spec-02-09.tokens
+tests/data/spec-02-10.data
+tests/data/spec-02-10.structure
+tests/data/spec-02-10.tokens
+tests/data/spec-02-11.data
+tests/data/spec-02-11.structure
+tests/data/spec-02-11.tokens
+tests/data/spec-02-12.data
+tests/data/spec-02-12.structure
+tests/data/spec-02-12.tokens
+tests/data/spec-02-13.data
+tests/data/spec-02-13.structure
+tests/data/spec-02-13.tokens
+tests/data/spec-02-14.data
+tests/data/spec-02-14.structure
+tests/data/spec-02-14.tokens
+tests/data/spec-02-15.data
+tests/data/spec-02-15.structure
+tests/data/spec-02-15.tokens
+tests/data/spec-02-16.data
+tests/data/spec-02-16.structure
+tests/data/spec-02-16.tokens
+tests/data/spec-02-17.data
+tests/data/spec-02-17.structure
+tests/data/spec-02-17.tokens
+tests/data/spec-02-18.data
+tests/data/spec-02-18.structure
+tests/data/spec-02-18.tokens
+tests/data/spec-02-19.data
+tests/data/spec-02-19.structure
+tests/data/spec-02-19.tokens
+tests/data/spec-02-20.data
+tests/data/spec-02-20.structure
+tests/data/spec-02-20.tokens
+tests/data/spec-02-21.data
+tests/data/spec-02-21.structure
+tests/data/spec-02-21.tokens
+tests/data/spec-02-22.data
+tests/data/spec-02-22.structure
+tests/data/spec-02-22.tokens
+tests/data/spec-02-23.data
+tests/data/spec-02-23.structure
+tests/data/spec-02-23.tokens
+tests/data/spec-02-24.data
+tests/data/spec-02-24.structure
+tests/data/spec-02-24.tokens
+tests/data/spec-02-25.data
+tests/data/spec-02-25.structure
+tests/data/spec-02-25.tokens
+tests/data/spec-02-26.data
+tests/data/spec-02-26.structure
+tests/data/spec-02-26.tokens
+tests/data/spec-02-27.data
+tests/data/spec-02-27.structure
+tests/data/spec-02-27.tokens
+tests/data/spec-02-28.data
+tests/data/spec-02-28.structure
+tests/data/spec-02-28.tokens
+tests/data/spec-05-01-utf16be.data
+tests/data/spec-05-01-utf16be.empty
+tests/data/spec-05-01-utf16le.data
+tests/data/spec-05-01-utf16le.empty
+tests/data/spec-05-01-utf8.data
+tests/data/spec-05-01-utf8.empty
+tests/data/spec-05-02-utf16be.data
+tests/data/spec-05-02-utf16be.error
+tests/data/spec-05-02-utf16le.data
+tests/data/spec-05-02-utf16le.error
+tests/data/spec-05-02-utf8.data
+tests/data/spec-05-02-utf8.error
+tests/data/spec-05-03.canonical
+tests/data/spec-05-03.data
+tests/data/spec-05-04.canonical
+tests/data/spec-05-04.data
+tests/data/spec-05-05.data
+tests/data/spec-05-05.empty
+tests/data/spec-05-06.canonical
+tests/data/spec-05-06.data
+tests/data/spec-05-07.canonical
+tests/data/spec-05-07.data
+tests/data/spec-05-08.canonical
+tests/data/spec-05-08.data
+tests/data/spec-05-09.canonical
+tests/data/spec-05-09.data
+tests/data/spec-05-10.data
+tests/data/spec-05-10.error
+tests/data/spec-05-11.canonical
+tests/data/spec-05-11.data
+tests/data/spec-05-12.data
+tests/data/spec-05-12.error
+tests/data/spec-05-13.canonical
+tests/data/spec-05-13.data
+tests/data/spec-05-14.canonical
+tests/data/spec-05-14.data
+tests/data/spec-05-15.data
+tests/data/spec-05-15.error
+tests/data/spec-06-01.canonical
+tests/data/spec-06-01.data
+tests/data/spec-06-02.data
+tests/data/spec-06-02.empty
+tests/data/spec-06-03.canonical
+tests/data/spec-06-03.data
+tests/data/spec-06-04.canonical
+tests/data/spec-06-04.data
+tests/data/spec-06-05.canonical
+tests/data/spec-06-05.data
+tests/data/spec-06-06.canonical
+tests/data/spec-06-06.data
+tests/data/spec-06-07.canonical
+tests/data/spec-06-07.data
+tests/data/spec-06-08.canonical
+tests/data/spec-06-08.data
+tests/data/spec-07-01.canonical
+tests/data/spec-07-01.data
+tests/data/spec-07-01.skip-ext
+tests/data/spec-07-02.canonical
+tests/data/spec-07-02.data
+tests/data/spec-07-02.skip-ext
+tests/data/spec-07-03.data
+tests/data/spec-07-03.error
+tests/data/spec-07-04.canonical
+tests/data/spec-07-04.data
+tests/data/spec-07-05.data
+tests/data/spec-07-05.error
+tests/data/spec-07-06.canonical
+tests/data/spec-07-06.data
+tests/data/spec-07-07a.canonical
+tests/data/spec-07-07a.data
+tests/data/spec-07-07b.canonical
+tests/data/spec-07-07b.data
+tests/data/spec-07-08.canonical
+tests/data/spec-07-08.data
+tests/data/spec-07-09.canonical
+tests/data/spec-07-09.data
+tests/data/spec-07-10.canonical
+tests/data/spec-07-10.data
+tests/data/spec-07-11.data
+tests/data/spec-07-11.empty
+tests/data/spec-07-12a.canonical
+tests/data/spec-07-12a.data
+tests/data/spec-07-12b.canonical
+tests/data/spec-07-12b.data
+tests/data/spec-07-13.canonical
+tests/data/spec-07-13.data
+tests/data/spec-08-01.canonical
+tests/data/spec-08-01.data
+tests/data/spec-08-02.canonical
+tests/data/spec-08-02.data
+tests/data/spec-08-03.canonical
+tests/data/spec-08-03.data
+tests/data/spec-08-04.data
+tests/data/spec-08-04.error
+tests/data/spec-08-05.canonical
+tests/data/spec-08-05.data
+tests/data/spec-08-06.data
+tests/data/spec-08-06.error
+tests/data/spec-08-07.canonical
+tests/data/spec-08-07.data
+tests/data/spec-08-08.canonical
+tests/data/spec-08-08.data
+tests/data/spec-08-09.canonical
+tests/data/spec-08-09.data
+tests/data/spec-08-10.canonical
+tests/data/spec-08-10.data
+tests/data/spec-08-11.canonical
+tests/data/spec-08-11.data
+tests/data/spec-08-12.canonical
+tests/data/spec-08-12.data
+tests/data/spec-08-13.canonical
+tests/data/spec-08-13.data
+tests/data/spec-08-13.skip-ext
+tests/data/spec-08-14.canonical
+tests/data/spec-08-14.data
+tests/data/spec-08-15.canonical
+tests/data/spec-08-15.data
+tests/data/spec-09-01.canonical
+tests/data/spec-09-01.data
+tests/data/spec-09-02.canonical
+tests/data/spec-09-02.data
+tests/data/spec-09-03.canonical
+tests/data/spec-09-03.data
+tests/data/spec-09-04.canonical
+tests/data/spec-09-04.data
+tests/data/spec-09-05.canonical
+tests/data/spec-09-05.data
+tests/data/spec-09-06.canonical
+tests/data/spec-09-06.data
+tests/data/spec-09-07.canonical
+tests/data/spec-09-07.data
+tests/data/spec-09-08.canonical
+tests/data/spec-09-08.data
+tests/data/spec-09-09.canonical
+tests/data/spec-09-09.data
+tests/data/spec-09-10.canonical
+tests/data/spec-09-10.data
+tests/data/spec-09-11.canonical
+tests/data/spec-09-11.data
+tests/data/spec-09-12.canonical
+tests/data/spec-09-12.data
+tests/data/spec-09-13.canonical
+tests/data/spec-09-13.data
+tests/data/spec-09-14.data
+tests/data/spec-09-14.error
+tests/data/spec-09-15.canonical
+tests/data/spec-09-15.data
+tests/data/spec-09-16.canonical
+tests/data/spec-09-16.data
+tests/data/spec-09-17.canonical
+tests/data/spec-09-17.data
+tests/data/spec-09-18.canonical
+tests/data/spec-09-18.data
+tests/data/spec-09-19.canonical
+tests/data/spec-09-19.data
+tests/data/spec-09-20.canonical
+tests/data/spec-09-20.data
+tests/data/spec-09-20.skip-ext
+tests/data/spec-09-21.data
+tests/data/spec-09-21.error
+tests/data/spec-09-22.canonical
+tests/data/spec-09-22.data
+tests/data/spec-09-23.canonical
+tests/data/spec-09-23.data
+tests/data/spec-09-24.canonical
+tests/data/spec-09-24.data
+tests/data/spec-09-25.canonical
+tests/data/spec-09-25.data
+tests/data/spec-09-26.canonical
+tests/data/spec-09-26.data
+tests/data/spec-09-27.canonical
+tests/data/spec-09-27.data
+tests/data/spec-09-28.canonical
+tests/data/spec-09-28.data
+tests/data/spec-09-29.canonical
+tests/data/spec-09-29.data
+tests/data/spec-09-30.canonical
+tests/data/spec-09-30.data
+tests/data/spec-09-31.canonical
+tests/data/spec-09-31.data
+tests/data/spec-09-32.canonical
+tests/data/spec-09-32.data
+tests/data/spec-09-33.canonical
+tests/data/spec-09-33.data
+tests/data/spec-10-01.canonical
+tests/data/spec-10-01.data
+tests/data/spec-10-02.canonical
+tests/data/spec-10-02.data
+tests/data/spec-10-03.canonical
+tests/data/spec-10-03.data
+tests/data/spec-10-04.canonical
+tests/data/spec-10-04.data
+tests/data/spec-10-05.canonical
+tests/data/spec-10-05.data
+tests/data/spec-10-06.canonical
+tests/data/spec-10-06.data
+tests/data/spec-10-07.canonical
+tests/data/spec-10-07.data
+tests/data/spec-10-08.data
+tests/data/spec-10-08.error
+tests/data/spec-10-09.canonical
+tests/data/spec-10-09.data
+tests/data/spec-10-10.canonical
+tests/data/spec-10-10.data
+tests/data/spec-10-11.canonical
+tests/data/spec-10-11.data
+tests/data/spec-10-12.canonical
+tests/data/spec-10-12.data
+tests/data/spec-10-13.canonical
+tests/data/spec-10-13.data
+tests/data/spec-10-14.canonical
+tests/data/spec-10-14.data
+tests/data/spec-10-15.canonical
+tests/data/spec-10-15.data
+tests/data/str.data
+tests/data/str.detect
+tests/data/tags.events
+tests/data/test_mark.marks
+tests/data/timestamp-bugs.code
+tests/data/timestamp-bugs.data
+tests/data/timestamp.data
+tests/data/timestamp.detect
+tests/data/unacceptable-key.loader-error
+tests/data/unclosed-bracket.loader-error
+tests/data/unclosed-quoted-scalar.loader-error
+tests/data/undefined-anchor.loader-error
+tests/data/undefined-constructor.loader-error
+tests/data/undefined-tag-handle.loader-error
+tests/data/unknown.dumper-error
+tests/data/unsupported-version.emitter-error
+tests/data/utf16be.code
+tests/data/utf16be.data
+tests/data/utf16le.code
+tests/data/utf16le.data
+tests/data/utf8-implicit.code
+tests/data/utf8-implicit.data
+tests/data/utf8.code
+tests/data/utf8.data
+tests/data/value.data
+tests/data/value.detect
+tests/data/yaml.data
+tests/data/yaml.detect
+tests/lib/canonical.py
+tests/lib/test_all.py
+tests/lib/test_appliance.py
+tests/lib/test_build.py
+tests/lib/test_build_ext.py
+tests/lib/test_canonical.py
+tests/lib/test_constructor.py
+tests/lib/test_emitter.py
+tests/lib/test_errors.py
+tests/lib/test_input_output.py
+tests/lib/test_mark.py
+tests/lib/test_multi_constructor.py
+tests/lib/test_reader.py
+tests/lib/test_recursive.py
+tests/lib/test_representer.py
+tests/lib/test_resolver.py
+tests/lib/test_sort_keys.py
+tests/lib/test_structure.py
+tests/lib/test_tokens.py
+tests/lib/test_yaml.py
+tests/lib/test_yaml_ext.py
+tests/lib3/canonical.py
+tests/lib3/test_all.py
+tests/lib3/test_appliance.py
+tests/lib3/test_build.py
+tests/lib3/test_build_ext.py
+tests/lib3/test_canonical.py
+tests/lib3/test_constructor.py
+tests/lib3/test_emitter.py
+tests/lib3/test_errors.py
+tests/lib3/test_input_output.py
+tests/lib3/test_mark.py
+tests/lib3/test_multi_constructor.py
+tests/lib3/test_reader.py
+tests/lib3/test_recursive.py
+tests/lib3/test_representer.py
+tests/lib3/test_resolver.py
+tests/lib3/test_sort_keys.py
+tests/lib3/test_structure.py
+tests/lib3/test_tokens.py
+tests/lib3/test_yaml.py
+tests/lib3/test_yaml_ext.py
+yaml/__init__.pxd
+yaml/_yaml.h
+yaml/_yaml.pxd
+yaml/_yaml.pyx
\ No newline at end of file
diff --git a/third_party/python/PyYAML/lib3/PyYAML.egg-info/dependency_links.txt b/third_party/python/PyYAML/lib3/PyYAML.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/PyYAML/lib3/PyYAML.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/PyYAML/lib3/PyYAML.egg-info/top_level.txt b/third_party/python/PyYAML/lib3/PyYAML.egg-info/top_level.txt
new file mode 100644
index 000000000000..e6475e911f62
--- /dev/null
+++ b/third_party/python/PyYAML/lib3/PyYAML.egg-info/top_level.txt
@@ -0,0 +1,2 @@
+_yaml
+yaml
diff --git a/third_party/python/aiohttp/aiohttp.egg-info/PKG-INFO b/third_party/python/aiohttp/aiohttp.egg-info/PKG-INFO
new file mode 100644
index 000000000000..a0c00158c790
--- /dev/null
+++ b/third_party/python/aiohttp/aiohttp.egg-info/PKG-INFO
@@ -0,0 +1,966 @@
+Metadata-Version: 2.1
+Name: aiohttp
+Version: 3.7.4.post0
+Summary: Async http client/server framework (asyncio)
+Home-page: https://github.com/aio-libs/aiohttp
+Author: Nikolay Kim
+Author-email: fafhrd91@gmail.com
+Maintainer: Nikolay Kim , Andrew Svetlov
+Maintainer-email: aio-libs@googlegroups.com
+License: Apache 2
+Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby
+Project-URL: CI: Azure Pipelines, https://dev.azure.com/aio-libs/aiohttp/_build
+Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp
+Project-URL: Docs: RTD, https://docs.aiohttp.org
+Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues
+Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp
+Description: ==================================
+ Async http client/server framework
+ ==================================
+
+ .. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/_static/aiohttp-icon-128x128.png
+ :height: 64px
+ :width: 64px
+ :alt: aiohttp logo
+
+ |
+
+ .. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg
+ :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI
+ :alt: GitHub Actions status for master branch
+
+ .. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/aio-libs/aiohttp
+ :alt: codecov.io status for master branch
+
+ .. image:: https://badge.fury.io/py/aiohttp.svg
+ :target: https://pypi.org/project/aiohttp
+ :alt: Latest PyPI package version
+
+ .. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest
+ :target: https://docs.aiohttp.org/
+ :alt: Latest Read The Docs
+
+ .. image:: https://img.shields.io/discourse/status?server=https%3A%2F%2Faio-libs.discourse.group
+ :target: https://aio-libs.discourse.group
+ :alt: Discourse status
+
+ .. image:: https://badges.gitter.im/Join%20Chat.svg
+ :target: https://gitter.im/aio-libs/Lobby
+ :alt: Chat on Gitter
+
+
+ Key Features
+ ============
+
+ - Supports both client and server side of HTTP protocol.
+ - Supports both client and server Web-Sockets out-of-the-box and avoids
+ Callback Hell.
+ - Provides Web-server with middlewares and plugable routing.
+
+
+ Getting started
+ ===============
+
+ Client
+ ------
+
+ To get something from the web:
+
+ .. code-block:: python
+
+ import aiohttp
+ import asyncio
+
+ async def main():
+
+ async with aiohttp.ClientSession() as session:
+ async with session.get('http://python.org') as response:
+
+ print("Status:", response.status)
+ print("Content-type:", response.headers['content-type'])
+
+ html = await response.text()
+ print("Body:", html[:15], "...")
+
+ loop = asyncio.get_event_loop()
+ loop.run_until_complete(main())
+
+ This prints:
+
+ .. code-block::
+
+ Status: 200
+ Content-type: text/html; charset=utf-8
+ Body: ...
+
+ Coming from `requests `_ ? Read `why we need so many lines `_.
+
+ Server
+ ------
+
+ An example using a simple server:
+
+ .. code-block:: python
+
+ # examples/server_simple.py
+ from aiohttp import web
+
+ async def handle(request):
+ name = request.match_info.get('name', "Anonymous")
+ text = "Hello, " + name
+ return web.Response(text=text)
+
+ async def wshandle(request):
+ ws = web.WebSocketResponse()
+ await ws.prepare(request)
+
+ async for msg in ws:
+ if msg.type == web.WSMsgType.text:
+ await ws.send_str("Hello, {}".format(msg.data))
+ elif msg.type == web.WSMsgType.binary:
+ await ws.send_bytes(msg.data)
+ elif msg.type == web.WSMsgType.close:
+ break
+
+ return ws
+
+
+ app = web.Application()
+ app.add_routes([web.get('/', handle),
+ web.get('/echo', wshandle),
+ web.get('/{name}', handle)])
+
+ if __name__ == '__main__':
+ web.run_app(app)
+
+
+ Documentation
+ =============
+
+ https://aiohttp.readthedocs.io/
+
+
+ Demos
+ =====
+
+ https://github.com/aio-libs/aiohttp-demos
+
+
+ External links
+ ==============
+
+ * `Third party libraries
+ `_
+ * `Built with aiohttp
+ `_
+ * `Powered by aiohttp
+ `_
+
+ Feel free to make a Pull Request for adding your link to these pages!
+
+
+ Communication channels
+ ======================
+
+ *aio-libs discourse group*: https://aio-libs.discourse.group
+
+ *gitter chat* https://gitter.im/aio-libs/Lobby
+
+ We support `Stack Overflow
+ `_.
+ Please add *aiohttp* tag to your question there.
+
+ Requirements
+ ============
+
+ - Python >= 3.6
+ - async-timeout_
+ - attrs_
+ - chardet_
+ - multidict_
+ - yarl_
+
+ Optionally you may install the cChardet_ and aiodns_ libraries (highly
+ recommended for sake of speed).
+
+ .. _chardet: https://pypi.python.org/pypi/chardet
+ .. _aiodns: https://pypi.python.org/pypi/aiodns
+ .. _attrs: https://github.com/python-attrs/attrs
+ .. _multidict: https://pypi.python.org/pypi/multidict
+ .. _yarl: https://pypi.python.org/pypi/yarl
+ .. _async-timeout: https://pypi.python.org/pypi/async_timeout
+ .. _cChardet: https://pypi.python.org/pypi/cchardet
+
+ License
+ =======
+
+ ``aiohttp`` is offered under the Apache 2 license.
+
+
+ Keepsafe
+ ========
+
+ The aiohttp community would like to thank Keepsafe
+ (https://www.getkeepsafe.com) for its support in the early days of
+ the project.
+
+
+ Source code
+ ===========
+
+ The latest developer version is available in a GitHub repository:
+ https://github.com/aio-libs/aiohttp
+
+ Benchmarks
+ ==========
+
+ If you are interested in efficiency, the AsyncIO community maintains a
+ list of benchmarks on the official wiki:
+ https://github.com/python/asyncio/wiki/Benchmarks
+
+ =========
+ Changelog
+ =========
+
+ ..
+ You should *NOT* be adding new change log entries to this file, this
+ file is managed by towncrier. You *may* edit previous change logs to
+ fix problems like typo corrections or such.
+ To add a new change log entry, please see
+ https://pip.pypa.io/en/latest/development/#adding-a-news-entry
+ we named the news folder "changes".
+
+ WARNING: Don't drop the next directive!
+
+ .. towncrier release notes start
+
+ 3.7.4.post0 (2021-03-06)
+ ========================
+
+ Misc
+ ----
+
+ - Bumped upper bound of the ``chardet`` runtime dependency
+ to allow their v4.0 version stream.
+ `#5366 `_
+
+
+ ----
+
+
+ 3.7.4 (2021-02-25)
+ ==================
+
+ Bugfixes
+ --------
+
+ - **(SECURITY BUG)** Started preventing open redirects in the
+ ``aiohttp.web.normalize_path_middleware`` middleware. For
+ more details, see
+ https://github.com/aio-libs/aiohttp/security/advisories/GHSA-v6wp-4m6f-gcjg.
+
+ Thanks to `Beast Glatisant `__ for
+ finding the first instance of this issue and `Jelmer Vernooij
+ `__ for reporting and tracking it down
+ in aiohttp.
+ `#5497 `_
+ - Fix interpretation difference of the pure-Python and the Cython-based
+ HTTP parsers construct a ``yarl.URL`` object for HTTP request-target.
+
+ Before this fix, the Python parser would turn the URI's absolute-path
+ for ``//some-path`` into ``/`` while the Cython code preserved it as
+ ``//some-path``. Now, both do the latter.
+ `#5498 `_
+
+
+ ----
+
+
+ 3.7.3 (2020-11-18)
+ ==================
+
+ Features
+ --------
+
+ - Use Brotli instead of brotlipy
+ `#3803 `_
+ - Made exceptions pickleable. Also changed the repr of some exceptions.
+ `#4077 `_
+
+
+ Bugfixes
+ --------
+
+ - Raise a ClientResponseError instead of an AssertionError for a blank
+ HTTP Reason Phrase.
+ `#3532 `_
+ - Fix ``web_middlewares.normalize_path_middleware`` behavior for patch without slash.
+ `#3669 `_
+ - Fix overshadowing of overlapped sub-applications prefixes.
+ `#3701 `_
+ - Make `BaseConnector.close()` a coroutine and wait until the client closes all connections. Drop deprecated "with Connector():" syntax.
+ `#3736 `_
+ - Reset the ``sock_read`` timeout each time data is received for a ``aiohttp.client`` response.
+ `#3808 `_
+ - Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View
+ `#3880 `_
+ - Fixed querying the address families from DNS that the current host supports.
+ `#5156 `_
+ - Change return type of MultipartReader.__aiter__() and BodyPartReader.__aiter__() to AsyncIterator.
+ `#5163 `_
+ - Provide x86 Windows wheels.
+ `#5230 `_
+
+
+ Improved Documentation
+ ----------------------
+
+ - Add documentation for ``aiohttp.web.FileResponse``.
+ `#3958 `_
+ - Removed deprecation warning in tracing example docs
+ `#3964 `_
+ - Fixed wrong "Usage" docstring of ``aiohttp.client.request``.
+ `#4603 `_
+ - Add aiohttp-pydantic to third party libraries
+ `#5228 `_
+
+
+ Misc
+ ----
+
+ - `#4102 `_
+
+
+ ----
+
+
+ 3.7.2 (2020-10-27)
+ ==================
+
+ Bugfixes
+ --------
+
+ - Fixed static files handling for loops without ``.sendfile()`` support
+ `#5149 `_
+
+
+ ----
+
+
+ 3.7.1 (2020-10-25)
+ ==================
+
+ Bugfixes
+ --------
+
+ - Fixed a type error caused by the conditional import of `Protocol`.
+ `#5111 `_
+ - Server doesn't send Content-Length for 1xx or 204
+ `#4901 `_
+ - Fix run_app typing
+ `#4957 `_
+ - Always require ``typing_extensions`` library.
+ `#5107 `_
+ - Fix a variable-shadowing bug causing `ThreadedResolver.resolve` to
+ return the resolved IP as the ``hostname`` in each record, which prevented
+ validation of HTTPS connections.
+ `#5110 `_
+ - Added annotations to all public attributes.
+ `#5115 `_
+ - Fix flaky test_when_timeout_smaller_second
+ `#5116 `_
+ - Ensure sending a zero byte file does not throw an exception
+ `#5124 `_
+ - Fix a bug in ``web.run_app()`` about Python version checking on Windows
+ `#5127 `_
+
+
+ ----
+
+
+ 3.7.0 (2020-10-24)
+ ==================
+
+ Features
+ --------
+
+ - Response headers are now prepared prior to running ``on_response_prepare`` hooks, directly before headers are sent to the client.
+ `#1958 `_
+ - Add a ``quote_cookie`` option to ``CookieJar``, a way to skip quotation wrapping of cookies containing special characters.
+ `#2571 `_
+ - Call ``AccessLogger.log`` with the current exception available from ``sys.exc_info()``.
+ `#3557 `_
+ - `web.UrlDispatcher.add_routes` and `web.Application.add_routes` return a list
+ of registered `AbstractRoute` instances. `AbstractRouteDef.register` (and all
+ subclasses) return a list of registered resources registered resource.
+ `#3866 `_
+ - Added properties of default ClientSession params to ClientSession class so it is available for introspection
+ `#3882 `_
+ - Don't cancel web handler on peer disconnection, raise `OSError` on reading/writing instead.
+ `#4080 `_
+ - Implement BaseRequest.get_extra_info() to access a protocol transports' extra info.
+ `#4189 `_
+ - Added `ClientSession.timeout` property.
+ `#4191 `_
+ - allow use of SameSite in cookies.
+ `#4224 `_
+ - Use ``loop.sendfile()`` instead of custom implementation if available.
+ `#4269 `_
+ - Apply SO_REUSEADDR to test server's socket.
+ `#4393 `_
+ - Use .raw_host instead of slower .host in client API
+ `#4402 `_
+ - Allow configuring the buffer size of input stream by passing ``read_bufsize`` argument.
+ `#4453 `_
+ - Pass tests on Python 3.8 for Windows.
+ `#4513 `_
+ - Add `method` and `url` attributes to `TraceRequestChunkSentParams` and `TraceResponseChunkReceivedParams`.
+ `#4674 `_
+ - Add ClientResponse.ok property for checking status code under 400.
+ `#4711 `_
+ - Don't ceil timeouts that are smaller than 5 seconds.
+ `#4850 `_
+ - TCPSite now listens by default on all interfaces instead of just IPv4 when `None` is passed in as the host.
+ `#4894 `_
+ - Bump ``http_parser`` to 2.9.4
+ `#5070 `_
+
+
+ Bugfixes
+ --------
+
+ - Fix keepalive connections not being closed in time
+ `#3296 `_
+ - Fix failed websocket handshake leaving connection hanging.
+ `#3380 `_
+ - Fix tasks cancellation order on exit. The run_app task needs to be cancelled first for cleanup hooks to run with all tasks intact.
+ `#3805 `_
+ - Don't start heartbeat until _writer is set
+ `#4062 `_
+ - Fix handling of multipart file uploads without a content type.
+ `#4089 `_
+ - Preserve view handler function attributes across middlewares
+ `#4174 `_
+ - Fix the string representation of ``ServerDisconnectedError``.
+ `#4175 `_
+ - Raising RuntimeError when trying to get encoding from not read body
+ `#4214 `_
+ - Remove warning messages from noop.
+ `#4282 `_
+ - Raise ClientPayloadError if FormData re-processed.
+ `#4345 `_
+ - Fix a warning about unfinished task in ``web_protocol.py``
+ `#4408 `_
+ - Fixed 'deflate' compression. According to RFC 2616 now.
+ `#4506 `_
+ - Fixed OverflowError on platforms with 32-bit time_t
+ `#4515 `_
+ - Fixed request.body_exists returns wrong value for methods without body.
+ `#4528 `_
+ - Fix connecting to link-local IPv6 addresses.
+ `#4554 `_
+ - Fix a problem with connection waiters that are never awaited.
+ `#4562 `_
+ - Always make sure transport is not closing before reuse a connection.
+
+ Reuse a protocol based on keepalive in headers is unreliable.
+ For example, uWSGI will not support keepalive even it serves a
+ HTTP 1.1 request, except explicitly configure uWSGI with a
+ ``--http-keepalive`` option.
+
+ Servers designed like uWSGI could cause aiohttp intermittently
+ raise a ConnectionResetException when the protocol poll runs
+ out and some protocol is reused.
+ `#4587 `_
+ - Handle the last CRLF correctly even if it is received via separate TCP segment.
+ `#4630 `_
+ - Fix the register_resource function to validate route name before splitting it so that route name can include python keywords.
+ `#4691 `_
+ - Improve typing annotations for ``web.Request``, ``aiohttp.ClientResponse`` and
+ ``multipart`` module.
+ `#4736 `_
+ - Fix resolver task is not awaited when connector is cancelled
+ `#4795 `_
+ - Fix a bug "Aiohttp doesn't return any error on invalid request methods"
+ `#4798 `_
+ - Fix HEAD requests for static content.
+ `#4809 `_
+ - Fix incorrect size calculation for memoryview
+ `#4890 `_
+ - Add HTTPMove to _all__.
+ `#4897 `_
+ - Fixed the type annotations in the ``tracing`` module.
+ `#4912 `_
+ - Fix typing for multipart ``__aiter__``.
+ `#4931 `_
+ - Fix for race condition on connections in BaseConnector that leads to exceeding the connection limit.
+ `#4936 `_
+ - Add forced UTF-8 encoding for ``application/rdap+json`` responses.
+ `#4938 `_
+ - Fix inconsistency between Python and C http request parsers in parsing pct-encoded URL.
+ `#4972 `_
+ - Fix connection closing issue in HEAD request.
+ `#5012 `_
+ - Fix type hint on BaseRunner.addresses (from ``List[str]`` to ``List[Any]``)
+ `#5086 `_
+ - Make `web.run_app()` more responsive to Ctrl+C on Windows for Python < 3.8. It slightly
+ increases CPU load as a side effect.
+ `#5098 `_
+
+
+ Improved Documentation
+ ----------------------
+
+ - Fix example code in client quick-start
+ `#3376 `_
+ - Updated the docs so there is no contradiction in ``ttl_dns_cache`` default value
+ `#3512 `_
+ - Add 'Deploy with SSL' to docs.
+ `#4201 `_
+ - Change typing of the secure argument on StreamResponse.set_cookie from ``Optional[str]`` to ``Optional[bool]``
+ `#4204 `_
+ - Changes ``ttl_dns_cache`` type from int to Optional[int].
+ `#4270 `_
+ - Simplify README hello word example and add a documentation page for people coming from requests.
+ `#4272 `_
+ - Improve some code examples in the documentation involving websockets and starting a simple HTTP site with an AppRunner.
+ `#4285 `_
+ - Fix typo in code example in Multipart docs
+ `#4312 `_
+ - Fix code example in Multipart section.
+ `#4314 `_
+ - Update contributing guide so new contributors read the most recent version of that guide. Update command used to create test coverage reporting.
+ `#4810 `_
+ - Spelling: Change "canonize" to "canonicalize".
+ `#4986 `_
+ - Add ``aiohttp-sse-client`` library to third party usage list.
+ `#5084 `_
+
+
+ Misc
+ ----
+
+ - `#2856 `_, `#4218 `_, `#4250 `_
+
+
+ ----
+
+
+ 3.6.3 (2020-10-12)
+ ==================
+
+ Bugfixes
+ --------
+
+ - Pin yarl to ``<1.6.0`` to avoid buggy behavior that will be fixed by the next aiohttp
+ release.
+
+ 3.6.2 (2019-10-09)
+ ==================
+
+ Features
+ --------
+
+ - Made exceptions pickleable. Also changed the repr of some exceptions.
+ `#4077 `_
+ - Use ``Iterable`` type hint instead of ``Sequence`` for ``Application`` *middleware*
+ parameter. `#4125 `_
+
+
+ Bugfixes
+ --------
+
+ - Reset the ``sock_read`` timeout each time data is received for a
+ ``aiohttp.ClientResponse``. `#3808
+ `_
+ - Fix handling of expired cookies so they are not stored in CookieJar.
+ `#4063 `_
+ - Fix misleading message in the string representation of ``ClientConnectorError``;
+ ``self.ssl == None`` means default SSL context, not SSL disabled `#4097
+ `_
+ - Don't clobber HTTP status when using FileResponse.
+ `#4106 `_
+
+
+ Improved Documentation
+ ----------------------
+
+ - Added minimal required logging configuration to logging documentation.
+ `#2469 `_
+ - Update docs to reflect proxy support.
+ `#4100 `_
+ - Fix typo in code example in testing docs.
+ `#4108 `_
+
+
+ Misc
+ ----
+
+ - `#4102 `_
+
+
+ ----
+
+
+ 3.6.1 (2019-09-19)
+ ==================
+
+ Features
+ --------
+
+ - Compatibility with Python 3.8.
+ `#4056 `_
+
+
+ Bugfixes
+ --------
+
+ - correct some exception string format
+ `#4068 `_
+ - Emit a warning when ``ssl.OP_NO_COMPRESSION`` is
+ unavailable because the runtime is built against
+ an outdated OpenSSL.
+ `#4052 `_
+ - Update multidict requirement to >= 4.5
+ `#4057 `_
+
+
+ Improved Documentation
+ ----------------------
+
+ - Provide pytest-aiohttp namespace for pytest fixtures in docs.
+ `#3723 `_
+
+
+ ----
+
+
+ 3.6.0 (2019-09-06)
+ ==================
+
+ Features
+ --------
+
+ - Add support for Named Pipes (Site and Connector) under Windows. This feature requires
+ Proactor event loop to work. `#3629
+ `_
+ - Removed ``Transfer-Encoding: chunked`` header from websocket responses to be
+ compatible with more http proxy servers. `#3798
+ `_
+ - Accept non-GET request for starting websocket handshake on server side.
+ `#3980 `_
+
+
+ Bugfixes
+ --------
+
+ - Raise a ClientResponseError instead of an AssertionError for a blank
+ HTTP Reason Phrase.
+ `#3532 `_
+ - Fix an issue where cookies would sometimes not be set during a redirect.
+ `#3576 `_
+ - Change normalize_path_middleware to use 308 redirect instead of 301.
+
+ This behavior should prevent clients from being unable to use PUT/POST
+ methods on endpoints that are redirected because of a trailing slash.
+ `#3579 `_
+ - Drop the processed task from ``all_tasks()`` list early. It prevents logging about a
+ task with unhandled exception when the server is used in conjunction with
+ ``asyncio.run()``. `#3587 `_
+ - ``Signal`` type annotation changed from ``Signal[Callable[['TraceConfig'],
+ Awaitable[None]]]`` to ``Signal[Callable[ClientSession, SimpleNamespace, ...]``.
+ `#3595 `_
+ - Use sanitized URL as Location header in redirects
+ `#3614 `_
+ - Improve typing annotations for multipart.py along with changes required
+ by mypy in files that references multipart.py.
+ `#3621 `_
+ - Close session created inside ``aiohttp.request`` when unhandled exception occurs
+ `#3628 `_
+ - Cleanup per-chunk data in generic data read. Memory leak fixed.
+ `#3631 `_
+ - Use correct type for add_view and family
+ `#3633 `_
+ - Fix _keepalive field in __slots__ of ``RequestHandler``.
+ `#3644 `_
+ - Properly handle ConnectionResetError, to silence the "Cannot write to closing
+ transport" exception when clients disconnect uncleanly.
+ `#3648 `_
+ - Suppress pytest warnings due to ``test_utils`` classes
+ `#3660 `_
+ - Fix overshadowing of overlapped sub-application prefixes.
+ `#3701 `_
+ - Fixed return type annotation for WSMessage.json()
+ `#3720 `_
+ - Properly expose TooManyRedirects publicly as documented.
+ `#3818 `_
+ - Fix missing brackets for IPv6 in proxy CONNECT request
+ `#3841 `_
+ - Make the signature of ``aiohttp.test_utils.TestClient.request`` match
+ ``asyncio.ClientSession.request`` according to the docs `#3852
+ `_
+ - Use correct style for re-exported imports, makes mypy ``--strict`` mode happy.
+ `#3868 `_
+ - Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of
+ View `#3880 `_
+ - Made cython HTTP parser set Reason-Phrase of the response to an empty string if it is
+ missing. `#3906 `_
+ - Add URL to the string representation of ClientResponseError.
+ `#3959 `_
+ - Accept ``istr`` keys in ``LooseHeaders`` type hints.
+ `#3976 `_
+ - Fixed race conditions in _resolve_host caching and throttling when tracing is enabled.
+ `#4013 `_
+ - For URLs like "unix://localhost/..." set Host HTTP header to "localhost" instead of
+ "localhost:None". `#4039 `_
+
+
+ Improved Documentation
+ ----------------------
+
+ - Modify documentation for Background Tasks to remove deprecated usage of event loop.
+ `#3526 `_
+ - use ``if __name__ == '__main__':`` in server examples.
+ `#3775 `_
+ - Update documentation reference to the default access logger.
+ `#3783 `_
+ - Improve documentation for ``web.BaseRequest.path`` and ``web.BaseRequest.raw_path``.
+ `#3791 `_
+ - Removed deprecation warning in tracing example docs
+ `#3964 `_
+
+
+ ----
+
+
+ 3.5.4 (2019-01-12)
+ ==================
+
+ Bugfixes
+ --------
+
+ - Fix stream ``.read()`` / ``.readany()`` / ``.iter_any()`` which used to return a
+ partial content only in case of compressed content
+ `#3525 `_
+
+
+ 3.5.3 (2019-01-10)
+ ==================
+
+ Bugfixes
+ --------
+
+ - Fix type stubs for ``aiohttp.web.run_app(access_log=True)`` and fix edge case of
+ ``access_log=True`` and the event loop being in debug mode. `#3504
+ `_
+ - Fix ``aiohttp.ClientTimeout`` type annotations to accept ``None`` for fields
+ `#3511 `_
+ - Send custom per-request cookies even if session jar is empty
+ `#3515 `_
+ - Restore Linux binary wheels publishing on PyPI
+
+ ----
+
+
+ 3.5.2 (2019-01-08)
+ ==================
+
+ Features
+ --------
+
+ - ``FileResponse`` from ``web_fileresponse.py`` uses a ``ThreadPoolExecutor`` to work
+ with files asynchronously. I/O based payloads from ``payload.py`` uses a
+ ``ThreadPoolExecutor`` to work with I/O objects asynchronously. `#3313
+ `_
+ - Internal Server Errors in plain text if the browser does not support HTML.
+ `#3483 `_
+
+
+ Bugfixes
+ --------
+
+ - Preserve MultipartWriter parts headers on write. Refactor the way how
+ ``Payload.headers`` are handled. Payload instances now always have headers and
+ Content-Type defined. Fix Payload Content-Disposition header reset after initial
+ creation. `#3035 `_
+ - Log suppressed exceptions in ``GunicornWebWorker``.
+ `#3464 `_
+ - Remove wildcard imports.
+ `#3468 `_
+ - Use the same task for app initialization and web server handling in gunicorn workers.
+ It allows to use Python3.7 context vars smoothly.
+ `#3471 `_
+ - Fix handling of chunked+gzipped response when first chunk does not give uncompressed
+ data `#3477 `_
+ - Replace ``collections.MutableMapping`` with ``collections.abc.MutableMapping`` to
+ avoid a deprecation warning. `#3480
+ `_
+ - ``Payload.size`` type annotation changed from ``Optional[float]`` to
+ ``Optional[int]``. `#3484 `_
+ - Ignore done tasks when cancels pending activities on ``web.run_app`` finalization.
+ `#3497 `_
+
+
+ Improved Documentation
+ ----------------------
+
+ - Add documentation for ``aiohttp.web.HTTPException``.
+ `#3490 `_
+
+
+ Misc
+ ----
+
+ - `#3487 `_
+
+
+ ----
+
+
+ 3.5.1 (2018-12-24)
+ ====================
+
+ - Fix a regression about ``ClientSession._requote_redirect_url`` modification in debug
+ mode.
+
+ 3.5.0 (2018-12-22)
+ ====================
+
+ Features
+ --------
+
+ - The library type annotations are checked in strict mode now.
+ - Add support for setting cookies for individual request (`#2387
+ `_)
+ - Application.add_domain implementation (`#2809
+ `_)
+ - The default ``app`` in the request returned by ``test_utils.make_mocked_request`` can
+ now have objects assigned to it and retrieved using the ``[]`` operator. (`#3174
+ `_)
+ - Make ``request.url`` accessible when transport is closed. (`#3177
+ `_)
+ - Add ``zlib_executor_size`` argument to ``Response`` constructor to allow compression
+ to run in a background executor to avoid blocking the main thread and potentially
+ triggering health check failures. (`#3205
+ `_)
+ - Enable users to set ``ClientTimeout`` in ``aiohttp.request`` (`#3213
+ `_)
+ - Don't raise a warning if ``NETRC`` environment variable is not set and ``~/.netrc``
+ file doesn't exist. (`#3267 `_)
+ - Add default logging handler to web.run_app If the ``Application.debug``` flag is set
+ and the default logger ``aiohttp.access`` is used, access logs will now be output
+ using a *stderr* ``StreamHandler`` if no handlers are attached. Furthermore, if the
+ default logger has no log level set, the log level will be set to ``DEBUG``. (`#3324
+ `_)
+ - Add method argument to ``session.ws_connect()``. Sometimes server API requires a
+ different HTTP method for WebSocket connection establishment. For example, ``Docker
+ exec`` needs POST. (`#3378 `_)
+ - Create a task per request handling. (`#3406
+ `_)
+
+
+ Bugfixes
+ --------
+
+ - Enable passing ``access_log_class`` via ``handler_args`` (`#3158
+ `_)
+ - Return empty bytes with end-of-chunk marker in empty stream reader. (`#3186
+ `_)
+ - Accept ``CIMultiDictProxy`` instances for ``headers`` argument in ``web.Response``
+ constructor. (`#3207 `_)
+ - Don't uppercase HTTP method in parser (`#3233
+ `_)
+ - Make method match regexp RFC-7230 compliant (`#3235
+ `_)
+ - Add ``app.pre_frozen`` state to properly handle startup signals in
+ sub-applications. (`#3237 `_)
+ - Enhanced parsing and validation of helpers.BasicAuth.decode. (`#3239
+ `_)
+ - Change imports from collections module in preparation for 3.8. (`#3258
+ `_)
+ - Ensure Host header is added first to ClientRequest to better replicate browser (`#3265
+ `_)
+ - Fix forward compatibility with Python 3.8: importing ABCs directly from the
+ collections module will not be supported anymore. (`#3273
+ `_)
+ - Keep the query string by ``normalize_path_middleware``. (`#3278
+ `_)
+ - Fix missing parameter ``raise_for_status`` for aiohttp.request() (`#3290
+ `_)
+ - Bracket IPv6 addresses in the HOST header (`#3304
+ `_)
+ - Fix default message for server ping and pong frames. (`#3308
+ `_)
+ - Fix tests/test_connector.py typo and tests/autobahn/server.py duplicate loop
+ def. (`#3337 `_)
+ - Fix false-negative indicator end_of_HTTP_chunk in StreamReader.readchunk function
+ (`#3361 `_)
+ - Release HTTP response before raising status exception (`#3364
+ `_)
+ - Fix task cancellation when ``sendfile()`` syscall is used by static file
+ handling. (`#3383 `_)
+ - Fix stack trace for ``asyncio.TimeoutError`` which was not logged, when it is caught
+ in the handler. (`#3414 `_)
+
+
+ Improved Documentation
+ ----------------------
+
+ - Improve documentation of ``Application.make_handler`` parameters. (`#3152
+ `_)
+ - Fix BaseRequest.raw_headers doc. (`#3215
+ `_)
+ - Fix typo in TypeError exception reason in ``web.Application._handle`` (`#3229
+ `_)
+ - Make server access log format placeholder %b documentation reflect
+ behavior and docstring. (`#3307 `_)
+
+
+ Deprecations and Removals
+ -------------------------
+
+ - Deprecate modification of ``session.requote_redirect_url`` (`#2278
+ `_)
+ - Deprecate ``stream.unread_data()`` (`#3260
+ `_)
+ - Deprecated use of boolean in ``resp.enable_compression()`` (`#3318
+ `_)
+ - Encourage creation of aiohttp public objects inside a coroutine (`#3331
+ `_)
+ - Drop dead ``Connection.detach()`` and ``Connection.writer``. Both methods were broken
+ for more than 2 years. (`#3358 `_)
+ - Deprecate ``app.loop``, ``request.loop``, ``client.loop`` and ``connector.loop``
+ properties. (`#3374 `_)
+ - Deprecate explicit debug argument. Use asyncio debug mode instead. (`#3381
+ `_)
+ - Deprecate body parameter in HTTPException (and derived classes) constructor. (`#3385
+ `_)
+ - Deprecate bare connector close, use ``async with connector:`` and ``await
+ connector.close()`` instead. (`#3417
+ `_)
+ - Deprecate obsolete ``read_timeout`` and ``conn_timeout`` in ``ClientSession``
+ constructor. (`#3438 `_)
+
+
+ Misc
+ ----
+
+ - #3341, #3351
+Platform: UNKNOWN
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Framework :: AsyncIO
+Requires-Python: >=3.6
+Provides-Extra: speedups
diff --git a/third_party/python/aiohttp/aiohttp.egg-info/SOURCES.txt b/third_party/python/aiohttp/aiohttp.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..e006e2a0d816
--- /dev/null
+++ b/third_party/python/aiohttp/aiohttp.egg-info/SOURCES.txt
@@ -0,0 +1,246 @@
+CHANGES.rst
+CONTRIBUTORS.txt
+LICENSE.txt
+MANIFEST.in
+Makefile
+README.rst
+pyproject.toml
+setup.cfg
+setup.py
+aiohttp/__init__.py
+aiohttp/_cparser.pxd
+aiohttp/_find_header.c
+aiohttp/_find_header.h
+aiohttp/_find_header.pxd
+aiohttp/_frozenlist.c
+aiohttp/_frozenlist.pyx
+aiohttp/_headers.pxi
+aiohttp/_helpers.c
+aiohttp/_helpers.pyi
+aiohttp/_helpers.pyx
+aiohttp/_http_parser.c
+aiohttp/_http_parser.pyx
+aiohttp/_http_writer.c
+aiohttp/_http_writer.pyx
+aiohttp/_websocket.c
+aiohttp/_websocket.pyx
+aiohttp/abc.py
+aiohttp/base_protocol.py
+aiohttp/client.py
+aiohttp/client_exceptions.py
+aiohttp/client_proto.py
+aiohttp/client_reqrep.py
+aiohttp/client_ws.py
+aiohttp/connector.py
+aiohttp/cookiejar.py
+aiohttp/formdata.py
+aiohttp/frozenlist.py
+aiohttp/frozenlist.pyi
+aiohttp/hdrs.py
+aiohttp/helpers.py
+aiohttp/http.py
+aiohttp/http_exceptions.py
+aiohttp/http_parser.py
+aiohttp/http_websocket.py
+aiohttp/http_writer.py
+aiohttp/locks.py
+aiohttp/log.py
+aiohttp/multipart.py
+aiohttp/payload.py
+aiohttp/payload_streamer.py
+aiohttp/py.typed
+aiohttp/pytest_plugin.py
+aiohttp/resolver.py
+aiohttp/signals.py
+aiohttp/signals.pyi
+aiohttp/streams.py
+aiohttp/tcp_helpers.py
+aiohttp/test_utils.py
+aiohttp/tracing.py
+aiohttp/typedefs.py
+aiohttp/web.py
+aiohttp/web_app.py
+aiohttp/web_exceptions.py
+aiohttp/web_fileresponse.py
+aiohttp/web_log.py
+aiohttp/web_middlewares.py
+aiohttp/web_protocol.py
+aiohttp/web_request.py
+aiohttp/web_response.py
+aiohttp/web_routedef.py
+aiohttp/web_runner.py
+aiohttp/web_server.py
+aiohttp/web_urldispatcher.py
+aiohttp/web_ws.py
+aiohttp/worker.py
+aiohttp.egg-info/PKG-INFO
+aiohttp.egg-info/SOURCES.txt
+aiohttp.egg-info/dependency_links.txt
+aiohttp.egg-info/requires.txt
+aiohttp.egg-info/top_level.txt
+aiohttp/.hash/_cparser.pxd.hash
+aiohttp/.hash/_find_header.pxd.hash
+aiohttp/.hash/_frozenlist.pyx.hash
+aiohttp/.hash/_helpers.pyi.hash
+aiohttp/.hash/_helpers.pyx.hash
+aiohttp/.hash/_http_parser.pyx.hash
+aiohttp/.hash/_http_writer.pyx.hash
+aiohttp/.hash/_websocket.pyx.hash
+aiohttp/.hash/frozenlist.pyi.hash
+aiohttp/.hash/hdrs.py.hash
+aiohttp/.hash/signals.pyi.hash
+docs/Makefile
+docs/abc.rst
+docs/aiohttp-icon.svg
+docs/aiohttp-plain.svg
+docs/built_with.rst
+docs/changes.rst
+docs/client.rst
+docs/client_advanced.rst
+docs/client_quickstart.rst
+docs/client_reference.rst
+docs/conf.py
+docs/contributing.rst
+docs/deployment.rst
+docs/essays.rst
+docs/external.rst
+docs/faq.rst
+docs/favicon.ico
+docs/glossary.rst
+docs/http_request_lifecycle.rst
+docs/index.rst
+docs/logging.rst
+docs/make.bat
+docs/migration_to_2xx.rst
+docs/misc.rst
+docs/multipart.rst
+docs/multipart_reference.rst
+docs/new_router.rst
+docs/old-logo.png
+docs/old-logo.svg
+docs/powered_by.rst
+docs/signals.rst
+docs/spelling_wordlist.txt
+docs/streams.rst
+docs/structures.rst
+docs/testing.rst
+docs/third_party.rst
+docs/tracing_reference.rst
+docs/utilities.rst
+docs/web.rst
+docs/web_advanced.rst
+docs/web_lowlevel.rst
+docs/web_quickstart.rst
+docs/web_reference.rst
+docs/websocket_utilities.rst
+docs/whats_new_1_1.rst
+docs/whats_new_3_0.rst
+docs/_static/aiohttp-icon-128x128.png
+examples/background_tasks.py
+examples/cli_app.py
+examples/client_auth.py
+examples/client_json.py
+examples/client_ws.py
+examples/curl.py
+examples/fake_server.py
+examples/lowlevel_srv.py
+examples/server.crt
+examples/server.csr
+examples/server.key
+examples/server_simple.py
+examples/static_files.py
+examples/web_classview.py
+examples/web_cookies.py
+examples/web_rewrite_headers_middleware.py
+examples/web_srv.py
+examples/web_srv_route_deco.py
+examples/web_srv_route_table.py
+examples/web_ws.py
+examples/websocket.html
+examples/legacy/crawl.py
+examples/legacy/srv.py
+examples/legacy/tcp_protocol_parser.py
+tests/aiohttp.jpg
+tests/aiohttp.png
+tests/conftest.py
+tests/data.unknown_mime_type
+tests/data.zero_bytes
+tests/hello.txt.gz
+tests/test_base_protocol.py
+tests/test_classbasedview.py
+tests/test_client_connection.py
+tests/test_client_exceptions.py
+tests/test_client_fingerprint.py
+tests/test_client_functional.py
+tests/test_client_proto.py
+tests/test_client_request.py
+tests/test_client_response.py
+tests/test_client_session.py
+tests/test_client_ws.py
+tests/test_client_ws_functional.py
+tests/test_connector.py
+tests/test_cookiejar.py
+tests/test_flowcontrol_streams.py
+tests/test_formdata.py
+tests/test_frozenlist.py
+tests/test_helpers.py
+tests/test_http_exceptions.py
+tests/test_http_parser.py
+tests/test_http_writer.py
+tests/test_locks.py
+tests/test_loop.py
+tests/test_multipart.py
+tests/test_multipart_helpers.py
+tests/test_payload.py
+tests/test_proxy.py
+tests/test_proxy_functional.py
+tests/test_pytest_plugin.py
+tests/test_resolver.py
+tests/test_route_def.py
+tests/test_run_app.py
+tests/test_signals.py
+tests/test_streams.py
+tests/test_tcp_helpers.py
+tests/test_test_utils.py
+tests/test_tracing.py
+tests/test_urldispatch.py
+tests/test_web_app.py
+tests/test_web_cli.py
+tests/test_web_exceptions.py
+tests/test_web_functional.py
+tests/test_web_log.py
+tests/test_web_middleware.py
+tests/test_web_protocol.py
+tests/test_web_request.py
+tests/test_web_request_handler.py
+tests/test_web_response.py
+tests/test_web_runner.py
+tests/test_web_sendfile.py
+tests/test_web_sendfile_functional.py
+tests/test_web_server.py
+tests/test_web_urldispatcher.py
+tests/test_web_websocket.py
+tests/test_web_websocket_functional.py
+tests/test_websocket_handshake.py
+tests/test_websocket_parser.py
+tests/test_websocket_writer.py
+tests/test_worker.py
+tests/autobahn/client.py
+tests/autobahn/fuzzingclient.json
+tests/autobahn/fuzzingserver.json
+tests/autobahn/server.py
+vendor/http-parser/.git
+vendor/http-parser/.gitignore
+vendor/http-parser/.mailmap
+vendor/http-parser/.travis.yml
+vendor/http-parser/AUTHORS
+vendor/http-parser/LICENSE-MIT
+vendor/http-parser/Makefile
+vendor/http-parser/README.md
+vendor/http-parser/bench.c
+vendor/http-parser/http_parser.c
+vendor/http-parser/http_parser.gyp
+vendor/http-parser/http_parser.h
+vendor/http-parser/test.c
+vendor/http-parser/contrib/parsertrace.c
+vendor/http-parser/contrib/url_parser.c
\ No newline at end of file
diff --git a/third_party/python/aiohttp/aiohttp.egg-info/dependency_links.txt b/third_party/python/aiohttp/aiohttp.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/aiohttp/aiohttp.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/aiohttp/aiohttp.egg-info/requires.txt b/third_party/python/aiohttp/aiohttp.egg-info/requires.txt
new file mode 100644
index 000000000000..746f3f8655e4
--- /dev/null
+++ b/third_party/python/aiohttp/aiohttp.egg-info/requires.txt
@@ -0,0 +1,14 @@
+attrs>=17.3.0
+chardet<5.0,>=2.0
+multidict<7.0,>=4.5
+async_timeout<4.0,>=3.0
+yarl<2.0,>=1.0
+typing_extensions>=3.6.5
+
+[:python_version < "3.7"]
+idna-ssl>=1.0
+
+[speedups]
+aiodns
+brotlipy
+cchardet
diff --git a/third_party/python/aiohttp/aiohttp.egg-info/top_level.txt b/third_party/python/aiohttp/aiohttp.egg-info/top_level.txt
new file mode 100644
index 000000000000..ee4ba4f3d739
--- /dev/null
+++ b/third_party/python/aiohttp/aiohttp.egg-info/top_level.txt
@@ -0,0 +1 @@
+aiohttp
diff --git a/third_party/python/coverage/coverage.egg-info/PKG-INFO b/third_party/python/coverage/coverage.egg-info/PKG-INFO
new file mode 100644
index 000000000000..181e84b15c42
--- /dev/null
+++ b/third_party/python/coverage/coverage.egg-info/PKG-INFO
@@ -0,0 +1,187 @@
+Metadata-Version: 2.1
+Name: coverage
+Version: 5.1
+Summary: Code coverage measurement for Python
+Home-page: https://github.com/nedbat/coveragepy
+Author: Ned Batchelder and 131 others
+Author-email: ned@nedbatchelder.com
+License: Apache 2.0
+Project-URL: Documentation, https://coverage.readthedocs.io
+Project-URL: Funding, https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=pypi
+Project-URL: Issues, https://github.com/nedbat/coveragepy/issues
+Description: .. Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+ .. For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
+
+ ===========
+ Coverage.py
+ ===========
+
+ Code coverage testing for Python.
+
+ | |license| |versions| |status|
+ | |ci-status| |win-ci-status| |docs| |codecov|
+ | |kit| |format| |repos|
+ | |stars| |forks| |contributors|
+ | |tidelift| |twitter-coveragepy| |twitter-nedbat|
+
+ Coverage.py measures code coverage, typically during test execution. It uses
+ the code analysis tools and tracing hooks provided in the Python standard
+ library to determine which lines are executable, and which have been executed.
+
+ Coverage.py runs on many versions of Python:
+
+ * CPython 2.7.
+ * CPython 3.5 through 3.9 alpha 4.
+ * PyPy2 7.3.0 and PyPy3 7.3.0.
+
+ Documentation is on `Read the Docs`_. Code repository and issue tracker are on
+ `GitHub`_.
+
+ .. _Read the Docs: https://coverage.readthedocs.io/
+ .. _GitHub: https://github.com/nedbat/coveragepy
+
+
+ **New in 5.0:** SQLite data storage, JSON report, contexts, relative filenames,
+ dropped support for Python 2.6, 3.3 and 3.4.
+
+
+ For Enterprise
+ --------------
+
+ .. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logo_small.png
+ :width: 75
+ :alt: Tidelift
+ :target: https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=readme
+
+ .. list-table::
+ :widths: 10 100
+
+ * - |tideliftlogo|
+ - `Available as part of the Tidelift Subscription. `_
+ Coverage and thousands of other packages are working with
+ Tidelift to deliver one enterprise subscription that covers all of the open
+ source you use. If you want the flexibility of open source and the confidence
+ of commercial-grade software, this is for you.
+ `Learn more. `_
+
+
+ Getting Started
+ ---------------
+
+ See the `Quick Start section`_ of the docs.
+
+ .. _Quick Start section: https://coverage.readthedocs.io/#quick-start
+
+
+ Change history
+ --------------
+
+ The complete history of changes is on the `change history page`_.
+
+ .. _change history page: https://coverage.readthedocs.io/en/latest/changes.html
+
+
+ Contributing
+ ------------
+
+ See the `Contributing section`_ of the docs.
+
+ .. _Contributing section: https://coverage.readthedocs.io/en/latest/contributing.html
+
+
+ Security
+ --------
+
+ To report a security vulnerability, please use the `Tidelift security
+ contact`_. Tidelift will coordinate the fix and disclosure.
+
+ .. _Tidelift security contact: https://tidelift.com/security
+
+
+ License
+ -------
+
+ Licensed under the `Apache 2.0 License`_. For details, see `NOTICE.txt`_.
+
+ .. _Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
+ .. _NOTICE.txt: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
+
+
+ .. |ci-status| image:: https://travis-ci.com/nedbat/coveragepy.svg?branch=master
+ :target: https://travis-ci.com/nedbat/coveragepy
+ :alt: Build status
+ .. |win-ci-status| image:: https://ci.appveyor.com/api/projects/status/kmeqpdje7h9r6vsf/branch/master?svg=true
+ :target: https://ci.appveyor.com/project/nedbat/coveragepy
+ :alt: Windows build status
+ .. |docs| image:: https://readthedocs.org/projects/coverage/badge/?version=latest&style=flat
+ :target: https://coverage.readthedocs.io/
+ :alt: Documentation
+ .. |reqs| image:: https://requires.io/github/nedbat/coveragepy/requirements.svg?branch=master
+ :target: https://requires.io/github/nedbat/coveragepy/requirements/?branch=master
+ :alt: Requirements status
+ .. |kit| image:: https://badge.fury.io/py/coverage.svg
+ :target: https://pypi.org/project/coverage/
+ :alt: PyPI status
+ .. |format| image:: https://img.shields.io/pypi/format/coverage.svg
+ :target: https://pypi.org/project/coverage/
+ :alt: Kit format
+ .. |downloads| image:: https://img.shields.io/pypi/dw/coverage.svg
+ :target: https://pypi.org/project/coverage/
+ :alt: Weekly PyPI downloads
+ .. |versions| image:: https://img.shields.io/pypi/pyversions/coverage.svg?logo=python&logoColor=FBE072
+ :target: https://pypi.org/project/coverage/
+ :alt: Python versions supported
+ .. |status| image:: https://img.shields.io/pypi/status/coverage.svg
+ :target: https://pypi.org/project/coverage/
+ :alt: Package stability
+ .. |license| image:: https://img.shields.io/pypi/l/coverage.svg
+ :target: https://pypi.org/project/coverage/
+ :alt: License
+ .. |codecov| image:: https://codecov.io/github/nedbat/coveragepy/coverage.svg?branch=master&precision=2
+ :target: https://codecov.io/github/nedbat/coveragepy?branch=master
+ :alt: Coverage!
+ .. |repos| image:: https://repology.org/badge/tiny-repos/python:coverage.svg
+ :target: https://repology.org/metapackage/python:coverage/versions
+ :alt: Packaging status
+ .. |tidelift| image:: https://tidelift.com/badges/package/pypi/coverage
+ :target: https://tidelift.com/subscription/pkg/pypi-coverage?utm_source=pypi-coverage&utm_medium=referral&utm_campaign=readme
+ :alt: Tidelift
+ .. |stars| image:: https://img.shields.io/github/stars/nedbat/coveragepy.svg?logo=github
+ :target: https://github.com/nedbat/coveragepy/stargazers
+ :alt: Github stars
+ .. |forks| image:: https://img.shields.io/github/forks/nedbat/coveragepy.svg?logo=github
+ :target: https://github.com/nedbat/coveragepy/network/members
+ :alt: Github forks
+ .. |contributors| image:: https://img.shields.io/github/contributors/nedbat/coveragepy.svg?logo=github
+ :target: https://github.com/nedbat/coveragepy/graphs/contributors
+ :alt: Contributors
+ .. |twitter-coveragepy| image:: https://img.shields.io/twitter/follow/coveragepy.svg?label=coveragepy&style=flat&logo=twitter&logoColor=4FADFF
+ :target: https://twitter.com/coveragepy
+ :alt: coverage.py on Twitter
+ .. |twitter-nedbat| image:: https://img.shields.io/twitter/follow/nedbat.svg?label=nedbat&style=flat&logo=twitter&logoColor=4FADFF
+ :target: https://twitter.com/nedbat
+ :alt: nedbat on Twitter
+
+Keywords: code coverage testing
+Platform: UNKNOWN
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Software Development :: Quality Assurance
+Classifier: Topic :: Software Development :: Testing
+Classifier: Development Status :: 5 - Production/Stable
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4
+Description-Content-Type: text/x-rst
+Provides-Extra: toml
diff --git a/third_party/python/coverage/coverage.egg-info/SOURCES.txt b/third_party/python/coverage/coverage.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..fb09ab389f9b
--- /dev/null
+++ b/third_party/python/coverage/coverage.egg-info/SOURCES.txt
@@ -0,0 +1,287 @@
+.editorconfig
+.readthedocs.yml
+.travis.yml
+CHANGES.rst
+CONTRIBUTORS.txt
+LICENSE.txt
+MANIFEST.in
+Makefile
+NOTICE.txt
+README.rst
+__main__.py
+appveyor.yml
+howto.txt
+igor.py
+metacov.ini
+pylintrc
+setup.cfg
+setup.py
+tox.ini
+tox_wheels.ini
+ci/README.txt
+ci/download_appveyor.py
+ci/install.ps1
+ci/manylinux.sh
+ci/run_with_env.cmd
+ci/upload_relnotes.py
+coverage/__init__.py
+coverage/__main__.py
+coverage/annotate.py
+coverage/backunittest.py
+coverage/backward.py
+coverage/bytecode.py
+coverage/cmdline.py
+coverage/collector.py
+coverage/config.py
+coverage/context.py
+coverage/control.py
+coverage/data.py
+coverage/debug.py
+coverage/disposition.py
+coverage/env.py
+coverage/execfile.py
+coverage/files.py
+coverage/html.py
+coverage/inorout.py
+coverage/jsonreport.py
+coverage/misc.py
+coverage/multiproc.py
+coverage/numbits.py
+coverage/optional.py
+coverage/parser.py
+coverage/phystokens.py
+coverage/plugin.py
+coverage/plugin_support.py
+coverage/python.py
+coverage/pytracer.py
+coverage/report.py
+coverage/results.py
+coverage/sqldata.py
+coverage/summary.py
+coverage/templite.py
+coverage/tomlconfig.py
+coverage/version.py
+coverage/xmlreport.py
+coverage.egg-info/PKG-INFO
+coverage.egg-info/SOURCES.txt
+coverage.egg-info/dependency_links.txt
+coverage.egg-info/entry_points.txt
+coverage.egg-info/not-zip-safe
+coverage.egg-info/requires.txt
+coverage.egg-info/top_level.txt
+coverage/ctracer/datastack.c
+coverage/ctracer/datastack.h
+coverage/ctracer/filedisp.c
+coverage/ctracer/filedisp.h
+coverage/ctracer/module.c
+coverage/ctracer/stats.h
+coverage/ctracer/tracer.c
+coverage/ctracer/tracer.h
+coverage/ctracer/util.h
+coverage/fullcoverage/encodings.py
+coverage/htmlfiles/coverage_html.js
+coverage/htmlfiles/index.html
+coverage/htmlfiles/jquery.ba-throttle-debounce.min.js
+coverage/htmlfiles/jquery.hotkeys.js
+coverage/htmlfiles/jquery.isonscreen.js
+coverage/htmlfiles/jquery.min.js
+coverage/htmlfiles/jquery.tablesorter.min.js
+coverage/htmlfiles/keybd_closed.png
+coverage/htmlfiles/keybd_open.png
+coverage/htmlfiles/pyfile.html
+coverage/htmlfiles/style.css
+coverage/htmlfiles/style.scss
+doc/api.rst
+doc/api_coverage.rst
+doc/api_coveragedata.rst
+doc/api_module.rst
+doc/api_plugin.rst
+doc/branch.rst
+doc/changes.rst
+doc/check_copied_from.py
+doc/cmd.rst
+doc/conf.py
+doc/config.rst
+doc/contexts.rst
+doc/contributing.rst
+doc/dbschema.rst
+doc/dict.txt
+doc/excluding.rst
+doc/faq.rst
+doc/howitworks.rst
+doc/index.rst
+doc/install.rst
+doc/plugins.rst
+doc/python-coverage.1.txt
+doc/requirements.pip
+doc/sleepy.rst
+doc/source.rst
+doc/subprocess.rst
+doc/trouble.rst
+doc/whatsnew5x.rst
+doc/_static/coverage.css
+doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White.png
+doc/media/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png
+doc/media/sleepy-snake-600.png
+doc/media/sleepy-snake-circle-150.png
+doc/sample_html/keybd_closed.png
+doc/sample_html/keybd_open.png
+requirements/ci.pip
+requirements/dev.pip
+requirements/pytest.pip
+requirements/tox.pip
+requirements/wheel.pip
+tests/__init__.py
+tests/conftest.py
+tests/coveragetest.py
+tests/covmodzip1.py
+tests/goldtest.py
+tests/helpers.py
+tests/osinfo.py
+tests/plugin1.py
+tests/plugin2.py
+tests/plugin_config.py
+tests/stress_phystoken.tok
+tests/stress_phystoken_dos.tok
+tests/test_annotate.py
+tests/test_api.py
+tests/test_arcs.py
+tests/test_backward.py
+tests/test_cmdline.py
+tests/test_collector.py
+tests/test_concurrency.py
+tests/test_config.py
+tests/test_context.py
+tests/test_coverage.py
+tests/test_data.py
+tests/test_debug.py
+tests/test_execfile.py
+tests/test_filereporter.py
+tests/test_files.py
+tests/test_html.py
+tests/test_json.py
+tests/test_misc.py
+tests/test_numbits.py
+tests/test_oddball.py
+tests/test_parser.py
+tests/test_phystokens.py
+tests/test_plugins.py
+tests/test_process.py
+tests/test_python.py
+tests/test_results.py
+tests/test_setup.py
+tests/test_summary.py
+tests/test_templite.py
+tests/test_testing.py
+tests/test_version.py
+tests/test_xml.py
+tests/eggsrc/setup.py
+tests/eggsrc/egg1/__init__.py
+tests/eggsrc/egg1/egg1.py
+tests/gold/README.rst
+tests/gold/annotate/anno_dir/a___init__.py,cover
+tests/gold/annotate/anno_dir/a_a.py,cover
+tests/gold/annotate/anno_dir/b___init__.py,cover
+tests/gold/annotate/anno_dir/b_b.py,cover
+tests/gold/annotate/anno_dir/multi.py,cover
+tests/gold/annotate/annotate/white.py,cover
+tests/gold/annotate/encodings/utf8.py,cover
+tests/gold/annotate/multi/multi.py,cover
+tests/gold/annotate/multi/a/__init__.py,cover
+tests/gold/annotate/multi/a/a.py,cover
+tests/gold/annotate/multi/b/__init__.py,cover
+tests/gold/annotate/multi/b/b.py,cover
+tests/gold/html/Makefile
+tests/gold/html/a/a_py.html
+tests/gold/html/a/index.html
+tests/gold/html/b_branch/b_py.html
+tests/gold/html/b_branch/index.html
+tests/gold/html/bom/bom_py.html
+tests/gold/html/bom/index.html
+tests/gold/html/bom/2/bom_py.html
+tests/gold/html/bom/2/index.html
+tests/gold/html/isolatin1/index.html
+tests/gold/html/isolatin1/isolatin1_py.html
+tests/gold/html/omit_1/index.html
+tests/gold/html/omit_1/m1_py.html
+tests/gold/html/omit_1/m2_py.html
+tests/gold/html/omit_1/m3_py.html
+tests/gold/html/omit_1/main_py.html
+tests/gold/html/omit_2/index.html
+tests/gold/html/omit_2/m2_py.html
+tests/gold/html/omit_2/m3_py.html
+tests/gold/html/omit_2/main_py.html
+tests/gold/html/omit_3/index.html
+tests/gold/html/omit_3/m3_py.html
+tests/gold/html/omit_3/main_py.html
+tests/gold/html/omit_4/index.html
+tests/gold/html/omit_4/m1_py.html
+tests/gold/html/omit_4/m3_py.html
+tests/gold/html/omit_4/main_py.html
+tests/gold/html/omit_5/index.html
+tests/gold/html/omit_5/m1_py.html
+tests/gold/html/omit_5/main_py.html
+tests/gold/html/other/blah_blah_other_py.html
+tests/gold/html/other/here_py.html
+tests/gold/html/other/index.html
+tests/gold/html/partial/index.html
+tests/gold/html/partial/partial_py.html
+tests/gold/html/styled/a_py.html
+tests/gold/html/styled/extra.css
+tests/gold/html/styled/index.html
+tests/gold/html/styled/style.css
+tests/gold/html/support/coverage_html.js
+tests/gold/html/support/jquery.ba-throttle-debounce.min.js
+tests/gold/html/support/jquery.hotkeys.js
+tests/gold/html/support/jquery.isonscreen.js
+tests/gold/html/support/jquery.min.js
+tests/gold/html/support/jquery.tablesorter.min.js
+tests/gold/html/support/keybd_closed.png
+tests/gold/html/support/keybd_open.png
+tests/gold/html/support/style.css
+tests/gold/html/unicode/index.html
+tests/gold/html/unicode/unicode_py.html
+tests/gold/xml/x_xml/coverage.xml
+tests/gold/xml/y_xml_branch/coverage.xml
+tests/js/index.html
+tests/js/tests.js
+tests/modules/covmod1.py
+tests/modules/runmod1.py
+tests/modules/usepkgs.py
+tests/modules/aa/__init__.py
+tests/modules/aa/afile.odd.py
+tests/modules/aa/afile.py
+tests/modules/aa/zfile.py
+tests/modules/aa/bb/__init__.py
+tests/modules/aa/bb/bfile.odd.py
+tests/modules/aa/bb/bfile.py
+tests/modules/aa/bb.odd/bfile.py
+tests/modules/aa/bb/cc/__init__.py
+tests/modules/aa/bb/cc/cfile.py
+tests/modules/namespace_420/sub1/__init__.py
+tests/modules/pkg1/__init__.py
+tests/modules/pkg1/__main__.py
+tests/modules/pkg1/p1a.py
+tests/modules/pkg1/p1b.py
+tests/modules/pkg1/p1c.py
+tests/modules/pkg1/runmod2.py
+tests/modules/pkg1/sub/__init__.py
+tests/modules/pkg1/sub/__main__.py
+tests/modules/pkg1/sub/ps1a.py
+tests/modules/pkg1/sub/runmod3.py
+tests/modules/pkg2/__init__.py
+tests/modules/pkg2/p2a.py
+tests/modules/pkg2/p2b.py
+tests/modules/plugins/__init__.py
+tests/modules/plugins/a_plugin.py
+tests/modules/plugins/another.py
+tests/modules/process_test/__init__.py
+tests/modules/process_test/try_execfile.py
+tests/moremodules/namespace_420/sub2/__init__.py
+tests/moremodules/othermods/__init__.py
+tests/moremodules/othermods/othera.py
+tests/moremodules/othermods/otherb.py
+tests/moremodules/othermods/sub/__init__.py
+tests/moremodules/othermods/sub/osa.py
+tests/moremodules/othermods/sub/osb.py
+tests/qunit/jquery.tmpl.min.js
\ No newline at end of file
diff --git a/third_party/python/coverage/coverage.egg-info/dependency_links.txt b/third_party/python/coverage/coverage.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/coverage/coverage.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/coverage/coverage.egg-info/entry_points.txt b/third_party/python/coverage/coverage.egg-info/entry_points.txt
new file mode 100644
index 000000000000..58d31949dedd
--- /dev/null
+++ b/third_party/python/coverage/coverage.egg-info/entry_points.txt
@@ -0,0 +1,5 @@
+[console_scripts]
+coverage = coverage.cmdline:main
+coverage-3.8 = coverage.cmdline:main
+coverage3 = coverage.cmdline:main
+
diff --git a/third_party/python/coverage/coverage.egg-info/not-zip-safe b/third_party/python/coverage/coverage.egg-info/not-zip-safe
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/coverage/coverage.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/third_party/python/coverage/coverage.egg-info/requires.txt b/third_party/python/coverage/coverage.egg-info/requires.txt
new file mode 100644
index 000000000000..c694f11c9d76
--- /dev/null
+++ b/third_party/python/coverage/coverage.egg-info/requires.txt
@@ -0,0 +1,3 @@
+
+[toml]
+toml
diff --git a/third_party/python/coverage/coverage.egg-info/top_level.txt b/third_party/python/coverage/coverage.egg-info/top_level.txt
new file mode 100644
index 000000000000..4ebc8aea50e0
--- /dev/null
+++ b/third_party/python/coverage/coverage.egg-info/top_level.txt
@@ -0,0 +1 @@
+coverage
diff --git a/third_party/python/esprima/esprima.egg-info/PKG-INFO b/third_party/python/esprima/esprima.egg-info/PKG-INFO
new file mode 100644
index 000000000000..c2fee6ace6f6
--- /dev/null
+++ b/third_party/python/esprima/esprima.egg-info/PKG-INFO
@@ -0,0 +1,143 @@
+Metadata-Version: 1.1
+Name: esprima
+Version: 4.0.1
+Summary: ECMAScript parsing infrastructure for multipurpose analysis in Python
+Home-page: https://github.com/Kronuz/esprima-python
+Author: German M. Bravo (Kronuz)
+Author-email: german.mb@gmail.com
+License: BSD License
+Description: |Donate| |PyPI Version| |PyPI License| |PyPI Format| |PyPI Status|
+
+ **Esprima** (`esprima.org `__, BSD license) is a
+ high performance, standard-compliant
+ `ECMAScript `__
+ parser officially written in ECMAScript (also popularly known as
+ `JavaScript `__) and ported to
+ Python. Esprima is created and maintained by `Ariya
+ Hidayat `__, with the help of `many
+ contributors `__.
+
+ Python port is a line-by-line manual translation and was created and is
+ maintained by `German Mendez Bravo
+ (Kronuz) `__.
+
+ Features
+ ~~~~~~~~
+
+ - Full support for ECMAScript 2017 (`ECMA-262 8th
+ Edition `__)
+ - Sensible `syntax tree
+ format `__ as
+ standardized by `ESTree project `__
+ - Experimental support for `JSX `__, a
+ syntax extension for `React `__
+ - Optional tracking of syntax node location (index-based and
+ line-column)
+ - `Heavily tested `__ (~1500 `unit
+ tests `__
+ with `full code
+ coverage `__)
+
+ Installation
+ ~~~~~~~~~~~~
+
+ .. code:: shell
+
+ pip install esprima
+
+ API
+ ~~~
+
+ Esprima can be used to perform `lexical
+ analysis `__
+ (tokenization) or `syntactic
+ analysis `__ (parsing) of a
+ JavaScript program.
+
+ A simple example:
+
+ .. code:: javascript
+
+ >>> import esprima
+ >>> program = 'const answer = 42'
+
+ >>> esprima.tokenize(program)
+ [{
+ type: "Keyword",
+ value: "const"
+ }, {
+ type: "Identifier",
+ value: "answer"
+ }, {
+ type: "Punctuator",
+ value: "="
+ }, {
+ type: "Numeric",
+ value: "42"
+ }]
+
+ >>> esprima.parseScript(program)
+ {
+ body: [
+ {
+ kind: "const",
+ declarations: [
+ {
+ init: {
+ raw: "42",
+ type: "Literal",
+ value: 42
+ },
+ type: "VariableDeclarator",
+ id: {
+ type: "Identifier",
+ name: "answer"
+ }
+ }
+ ],
+ type: "VariableDeclaration"
+ }
+ ],
+ type: "Program",
+ sourceType: "script"
+ }
+
+ For more information, please read the `complete
+ documentation `__.
+
+ .. |Donate| image:: https://img.shields.io/badge/Donate-PayPal-green.svg
+ :target: https://www.paypal.me/Kronuz/25
+ .. |PyPI Version| image:: https://img.shields.io/pypi/v/esprima.svg
+ :target: https://pypi.python.org/pypi/esprima
+ .. |PyPI License| image:: https://img.shields.io/pypi/l/esprima.svg
+ :target: https://pypi.python.org/pypi/esprima
+ .. |PyPI Wheel| image:: https://img.shields.io/pypi/wheel/esprima.svg
+ :target: https://pypi.python.org/pypi/esprima
+ .. |PyPI Format| image:: https://img.shields.io/pypi/format/esprima.svg
+ :target: https://pypi.python.org/pypi/esprima
+ .. |PyPI Python Version| image:: https://img.shields.io/pypi/pyversions/esprima.svg
+ :target: https://pypi.python.org/pypi/esprima
+ .. |PyPI Implementation| image:: https://img.shields.io/pypi/implementation/esprima.svg
+ :target: https://pypi.python.org/pypi/esprima
+ .. |PyPI Status| image:: https://img.shields.io/pypi/status/esprima.svg
+ :target: https://pypi.python.org/pypi/esprima
+ .. |PyPI Downloads| image:: https://img.shields.io/pypi/dm/esprima.svg
+ :target: https://pypi.python.org/pypi/esprima
+Keywords: esprima ecmascript javascript parser ast
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Topic :: Software Development :: Code Generators
+Classifier: Topic :: Software Development :: Compilers
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Text Processing :: General
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
diff --git a/third_party/python/esprima/esprima.egg-info/SOURCES.txt b/third_party/python/esprima/esprima.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..16bea37b8d2e
--- /dev/null
+++ b/third_party/python/esprima/esprima.egg-info/SOURCES.txt
@@ -0,0 +1,29 @@
+README
+setup.py
+esprima/__init__.py
+esprima/__main__.py
+esprima/character.py
+esprima/comment_handler.py
+esprima/compat.py
+esprima/error_handler.py
+esprima/esprima.py
+esprima/jsx_nodes.py
+esprima/jsx_parser.py
+esprima/jsx_syntax.py
+esprima/messages.py
+esprima/nodes.py
+esprima/objects.py
+esprima/parser.py
+esprima/scanner.py
+esprima/syntax.py
+esprima/token.py
+esprima/tokenizer.py
+esprima/utils.py
+esprima/visitor.py
+esprima/xhtml_entities.py
+esprima.egg-info/PKG-INFO
+esprima.egg-info/SOURCES.txt
+esprima.egg-info/dependency_links.txt
+esprima.egg-info/entry_points.txt
+esprima.egg-info/pbr.json
+esprima.egg-info/top_level.txt
\ No newline at end of file
diff --git a/third_party/python/esprima/esprima.egg-info/dependency_links.txt b/third_party/python/esprima/esprima.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/esprima/esprima.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/esprima/esprima.egg-info/entry_points.txt b/third_party/python/esprima/esprima.egg-info/entry_points.txt
new file mode 100644
index 000000000000..0170557792e4
--- /dev/null
+++ b/third_party/python/esprima/esprima.egg-info/entry_points.txt
@@ -0,0 +1,3 @@
+[console_scripts]
+esprima = esprima.__main__:main
+
diff --git a/third_party/python/esprima/esprima.egg-info/pbr.json b/third_party/python/esprima/esprima.egg-info/pbr.json
new file mode 100644
index 000000000000..d8e931d7dd88
--- /dev/null
+++ b/third_party/python/esprima/esprima.egg-info/pbr.json
@@ -0,0 +1 @@
+{"is_release": false, "git_version": "ac65290"}
\ No newline at end of file
diff --git a/third_party/python/esprima/esprima.egg-info/top_level.txt b/third_party/python/esprima/esprima.egg-info/top_level.txt
new file mode 100644
index 000000000000..c0ba54881edf
--- /dev/null
+++ b/third_party/python/esprima/esprima.egg-info/top_level.txt
@@ -0,0 +1 @@
+esprima
diff --git a/third_party/python/fluent.migrate/fluent.migrate.egg-info/PKG-INFO b/third_party/python/fluent.migrate/fluent.migrate.egg-info/PKG-INFO
new file mode 100644
index 000000000000..e15a76d1d684
--- /dev/null
+++ b/third_party/python/fluent.migrate/fluent.migrate.egg-info/PKG-INFO
@@ -0,0 +1,18 @@
+Metadata-Version: 2.1
+Name: fluent.migrate
+Version: 0.11
+Summary: Toolchain to migrate legacy translation to Fluent.
+Home-page: https://hg.mozilla.org/l10n/fluent-migration/
+Author: Mozilla
+Author-email: l10n-drivers@mozilla.org
+License: APL 2
+Description: UNKNOWN
+Keywords: fluent,localization,l10n
+Platform: UNKNOWN
+Classifier: Development Status :: 3 - Alpha
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.7
+Description-Content-Type: text/markdown
+Provides-Extra: hg
diff --git a/third_party/python/fluent.migrate/fluent.migrate.egg-info/SOURCES.txt b/third_party/python/fluent.migrate/fluent.migrate.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..6d51c427d1e6
--- /dev/null
+++ b/third_party/python/fluent.migrate/fluent.migrate.egg-info/SOURCES.txt
@@ -0,0 +1,23 @@
+README.md
+setup.cfg
+setup.py
+fluent/__init__.py
+fluent.migrate.egg-info/PKG-INFO
+fluent.migrate.egg-info/SOURCES.txt
+fluent.migrate.egg-info/dependency_links.txt
+fluent.migrate.egg-info/entry_points.txt
+fluent.migrate.egg-info/requires.txt
+fluent.migrate.egg-info/top_level.txt
+fluent/migrate/__init__.py
+fluent/migrate/_context.py
+fluent/migrate/blame.py
+fluent/migrate/changesets.py
+fluent/migrate/context.py
+fluent/migrate/errors.py
+fluent/migrate/evaluator.py
+fluent/migrate/helpers.py
+fluent/migrate/merge.py
+fluent/migrate/tool.py
+fluent/migrate/transforms.py
+fluent/migrate/util.py
+fluent/migrate/validator.py
\ No newline at end of file
diff --git a/third_party/python/fluent.migrate/fluent.migrate.egg-info/dependency_links.txt b/third_party/python/fluent.migrate/fluent.migrate.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/fluent.migrate/fluent.migrate.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/fluent.migrate/fluent.migrate.egg-info/entry_points.txt b/third_party/python/fluent.migrate/fluent.migrate.egg-info/entry_points.txt
new file mode 100644
index 000000000000..7a1ebbf874ae
--- /dev/null
+++ b/third_party/python/fluent.migrate/fluent.migrate.egg-info/entry_points.txt
@@ -0,0 +1,4 @@
+[console_scripts]
+migrate-l10n = fluent.migrate.tool:cli
+validate-l10n-recipe = fluent.migrate.validator:cli
+
diff --git a/third_party/python/fluent.migrate/fluent.migrate.egg-info/requires.txt b/third_party/python/fluent.migrate/fluent.migrate.egg-info/requires.txt
new file mode 100644
index 000000000000..84a38c8fe23f
--- /dev/null
+++ b/third_party/python/fluent.migrate/fluent.migrate.egg-info/requires.txt
@@ -0,0 +1,6 @@
+compare-locales<9.0,>=8.1
+fluent.syntax<0.19,>=0.18.0
+six
+
+[hg]
+python-hglib
diff --git a/third_party/python/fluent.migrate/fluent.migrate.egg-info/top_level.txt b/third_party/python/fluent.migrate/fluent.migrate.egg-info/top_level.txt
new file mode 100644
index 000000000000..a3582d405aef
--- /dev/null
+++ b/third_party/python/fluent.migrate/fluent.migrate.egg-info/top_level.txt
@@ -0,0 +1 @@
+fluent
diff --git a/third_party/python/idna-ssl/idna_ssl.egg-info/PKG-INFO b/third_party/python/idna-ssl/idna_ssl.egg-info/PKG-INFO
new file mode 100644
index 000000000000..54ea22146d07
--- /dev/null
+++ b/third_party/python/idna-ssl/idna_ssl.egg-info/PKG-INFO
@@ -0,0 +1,81 @@
+Metadata-Version: 1.1
+Name: idna-ssl
+Version: 1.1.0
+Summary: Patch ssl.match_hostname for Unicode(idna) domains support
+Home-page: https://github.com/aio-libs/idna-ssl
+Author: Victor Kovtun
+Author-email: hellysmile@gmail.com
+License: UNKNOWN
+Description: idna-ssl
+ ========
+
+ :info: Patch ssl.match_hostname for Unicode(idna) domains support
+
+ .. image:: https://travis-ci.com/aio-libs/idna-ssl.svg?branch=master
+ :target: https://travis-ci.com/aio-libs/idna-ssl
+
+ .. image:: https://img.shields.io/pypi/v/idna_ssl.svg
+ :target: https://pypi.python.org/pypi/idna_ssl
+
+ .. image:: https://codecov.io/gh/aio-libs/idna-ssl/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/aio-libs/idna-ssl
+
+ Installation
+ ------------
+
+ .. code-block:: shell
+
+ pip install idna-ssl
+
+ Usage
+ -----
+
+ .. code-block:: python
+
+ from idna_ssl import patch_match_hostname # noqa isort:skip
+ patch_match_hostname() # noqa isort:skip
+
+ import asyncio
+
+ import aiohttp
+
+ URL = 'https://цфоут.мвд.рф/news/item/8065038/'
+
+
+ async def main():
+ async with aiohttp.ClientSession() as session:
+ async with session.get(URL) as response:
+ print(response)
+
+
+ loop = asyncio.get_event_loop()
+ loop.run_until_complete(main())
+
+ Motivation
+ ----------
+
+ * Here is 100% backward capability
+ * Related aiohttp `issue `_
+ * Related Python `bug `_
+ * Related Python `pull request `_
+ * It is fixed (by January 27 2018) in upcoming Python 3.7, but `IDNA2008 `_ is still broken
+
+ Thanks
+ ------
+
+ The library was donated by `Ocean S.A. `_
+
+ Thanks to the company for contribution.
+
+Keywords: ssl,Unicode,idna,match_hostname
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
diff --git a/third_party/python/idna-ssl/idna_ssl.egg-info/SOURCES.txt b/third_party/python/idna-ssl/idna_ssl.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..0ed8815e2859
--- /dev/null
+++ b/third_party/python/idna-ssl/idna_ssl.egg-info/SOURCES.txt
@@ -0,0 +1,12 @@
+LICENSE
+MANIFEST.in
+README.rst
+idna_ssl.py
+setup.cfg
+setup.py
+idna_ssl.egg-info/PKG-INFO
+idna_ssl.egg-info/SOURCES.txt
+idna_ssl.egg-info/dependency_links.txt
+idna_ssl.egg-info/not-zip-safe
+idna_ssl.egg-info/requires.txt
+idna_ssl.egg-info/top_level.txt
\ No newline at end of file
diff --git a/third_party/python/idna-ssl/idna_ssl.egg-info/dependency_links.txt b/third_party/python/idna-ssl/idna_ssl.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/idna-ssl/idna_ssl.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/idna-ssl/idna_ssl.egg-info/not-zip-safe b/third_party/python/idna-ssl/idna_ssl.egg-info/not-zip-safe
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/idna-ssl/idna_ssl.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/third_party/python/idna-ssl/idna_ssl.egg-info/requires.txt b/third_party/python/idna-ssl/idna_ssl.egg-info/requires.txt
new file mode 100644
index 000000000000..af5772da9934
--- /dev/null
+++ b/third_party/python/idna-ssl/idna_ssl.egg-info/requires.txt
@@ -0,0 +1 @@
+idna>=2.0
diff --git a/third_party/python/idna-ssl/idna_ssl.egg-info/top_level.txt b/third_party/python/idna-ssl/idna_ssl.egg-info/top_level.txt
new file mode 100644
index 000000000000..15da36aac121
--- /dev/null
+++ b/third_party/python/idna-ssl/idna_ssl.egg-info/top_level.txt
@@ -0,0 +1 @@
+idna_ssl
diff --git a/third_party/python/jsmin/jsmin.egg-info/PKG-INFO b/third_party/python/jsmin/jsmin.egg-info/PKG-INFO
new file mode 100644
index 000000000000..27f88212e575
--- /dev/null
+++ b/third_party/python/jsmin/jsmin.egg-info/PKG-INFO
@@ -0,0 +1,117 @@
+Metadata-Version: 1.1
+Name: jsmin
+Version: 2.1.0
+Summary: JavaScript minifier.
+PLEASE UPDATE TO VERSION >= 2.0.6. Older versions have a serious bug related to comments.
+Home-page: https://bitbucket.org/dcs/jsmin/
+Author: Tikitu de Jager
+Author-email: tikitu+jsmin@logophile.org
+License: MIT License
+Description: =====
+ jsmin
+ =====
+
+ JavaScript minifier.
+
+ Usage
+ =====
+
+ .. code:: python
+
+ from jsmin import jsmin
+ with open('myfile.js') as js_file:
+ minified = jsmin(js_file.read())
+
+ You can run it as a commandline tool also::
+
+ python -m jsmin myfile.js
+
+ As yet, ``jsmin`` makes no attempt to be compatible with
+ `ECMAScript 6 / ES.next / Harmony `_.
+ If you're using it on Harmony code, though, you might find the ``quote_chars``
+ parameter useful:
+
+ .. code:: python
+
+ from jsmin import jsmin
+ with open('myfile.js') as js_file:
+ minified = jsmin(js_file.read(), quote_chars="'\"`")
+
+
+ Where to get it
+ ===============
+
+ * install the package `from pypi `_
+ * get the latest release `from the stable branch on bitbucket `_
+ * get the development version `from the default branch on bitbucket `_
+
+ Contributing
+ ============
+
+ `Issues `_ and `Pull requests `_
+ will be gratefully received on Bitbucket. Pull requests on github are great too, but the issue tracker lives on
+ bitbucket.
+
+ If possible, please make separate pull requests for tests and for code: tests will be committed on the stable branch
+ (which tracks the latest released version) while code will go to default by, erm, default.
+
+ Unless you request otherwise, your Bitbucket identity will be added to the contributor's list below; if you prefer a
+ different name feel free to add it in your pull request instead. (If you prefer not to be mentioned you'll have to let
+ the maintainer know somehow.)
+
+ Build/test status
+ =================
+
+ Both default and stable branches are tested with Travis: https://travis-ci.org/tikitu/jsmin
+
+ Stable (latest released version plus any new tests) is tested against CPython 2.6, 2.7, 3.2, and 3.3.
+ Currently:
+
+ .. image:: https://travis-ci.org/tikitu/jsmin.png?branch=ghstable
+
+ If stable is failing that means there's a new test that fails on *the latest released version on pypi*, with no fix yet
+ released.
+
+ Default (development version, might be ahead of latest released version) is tested against CPython 2.6, 2.7, 3.2, and
+ 3.3. Currently:
+
+ .. image:: https://travis-ci.org/tikitu/jsmin.png?branch=master
+
+ If default is failing don't use it, but as long as stable is passing the pypi release should be ok.
+
+ Contributors (chronological commit order)
+ =========================================
+
+ * `Dave St.Germain `_ (original author)
+ * `Hans weltar `_
+ * `Tikitu de Jager `_ (current maintainer)
+ * https://bitbucket.org/rennat
+ * `Nick Alexander `_
+
+ Changelog
+ =========
+
+ v2.1.0 (2014-12-24) Tikitu de Jager
+ -----------------------------------
+
+ * First changelog entries; see README.rst for prior contributors.
+
+ * Expose quote_chars parameter to provide just enough unofficial Harmony
+ support to be useful.
+
+
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.2
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
+Classifier: Topic :: Software Development :: Pre-processors
+Classifier: Topic :: Text Processing :: Filters
diff --git a/third_party/python/jsmin/jsmin.egg-info/SOURCES.txt b/third_party/python/jsmin/jsmin.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..ae208f4b6065
--- /dev/null
+++ b/third_party/python/jsmin/jsmin.egg-info/SOURCES.txt
@@ -0,0 +1,13 @@
+CHANGELOG.txt
+LICENSE.txt
+MANIFEST.in
+README.rst
+setup.cfg
+setup.py
+jsmin/__init__.py
+jsmin/__main__.py
+jsmin/test.py
+jsmin.egg-info/PKG-INFO
+jsmin.egg-info/SOURCES.txt
+jsmin.egg-info/dependency_links.txt
+jsmin.egg-info/top_level.txt
\ No newline at end of file
diff --git a/third_party/python/jsmin/jsmin.egg-info/dependency_links.txt b/third_party/python/jsmin/jsmin.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/jsmin/jsmin.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/jsmin/jsmin.egg-info/top_level.txt b/third_party/python/jsmin/jsmin.egg-info/top_level.txt
new file mode 100644
index 000000000000..79abaa99eece
--- /dev/null
+++ b/third_party/python/jsmin/jsmin.egg-info/top_level.txt
@@ -0,0 +1 @@
+jsmin
diff --git a/third_party/python/json-e/json_e.egg-info/PKG-INFO b/third_party/python/json-e/json_e.egg-info/PKG-INFO
new file mode 100644
index 000000000000..bf41f8216701
--- /dev/null
+++ b/third_party/python/json-e/json_e.egg-info/PKG-INFO
@@ -0,0 +1,11 @@
+Metadata-Version: 2.1
+Name: json-e
+Version: 2.7.0
+Summary: A data-structure parameterization system written for embedding context in JSON objects
+Home-page: https://taskcluster.github.io/json-e/
+Author: Dustin J. Mitchell
+Author-email: dustin@mozilla.com
+License: MPL2
+Description: UNKNOWN
+Platform: UNKNOWN
+Provides-Extra: release
diff --git a/third_party/python/json-e/json_e.egg-info/SOURCES.txt b/third_party/python/json-e/json_e.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..ec2e4f666bf7
--- /dev/null
+++ b/third_party/python/json-e/json_e.egg-info/SOURCES.txt
@@ -0,0 +1,17 @@
+MANIFEST.in
+README.md
+package.json
+setup.cfg
+setup.py
+json_e.egg-info/PKG-INFO
+json_e.egg-info/SOURCES.txt
+json_e.egg-info/dependency_links.txt
+json_e.egg-info/requires.txt
+json_e.egg-info/top_level.txt
+jsone/__init__.py
+jsone/builtins.py
+jsone/interpreter.py
+jsone/prattparser.py
+jsone/render.py
+jsone/shared.py
+jsone/six.py
\ No newline at end of file
diff --git a/third_party/python/json-e/json_e.egg-info/dependency_links.txt b/third_party/python/json-e/json_e.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/json-e/json_e.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/json-e/json_e.egg-info/requires.txt b/third_party/python/json-e/json_e.egg-info/requires.txt
new file mode 100644
index 000000000000..f25a637d715a
--- /dev/null
+++ b/third_party/python/json-e/json_e.egg-info/requires.txt
@@ -0,0 +1,3 @@
+
+[release]
+towncrier
diff --git a/third_party/python/json-e/json_e.egg-info/top_level.txt b/third_party/python/json-e/json_e.egg-info/top_level.txt
new file mode 100644
index 000000000000..afe8caa74cad
--- /dev/null
+++ b/third_party/python/json-e/json_e.egg-info/top_level.txt
@@ -0,0 +1 @@
+jsone
diff --git a/third_party/python/mohawk/mohawk.egg-info/PKG-INFO b/third_party/python/mohawk/mohawk.egg-info/PKG-INFO
new file mode 100644
index 000000000000..131f03cfc50d
--- /dev/null
+++ b/third_party/python/mohawk/mohawk.egg-info/PKG-INFO
@@ -0,0 +1,19 @@
+Metadata-Version: 1.1
+Name: mohawk
+Version: 0.3.4
+Summary: Library for Hawk HTTP authorization
+Home-page: https://github.com/kumar303/mohawk
+Author: Kumar McMillan, Austin King
+Author-email: kumar.mcmillan@gmail.com
+License: MPL 2.0 (Mozilla Public License)
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Intended Audience :: Developers
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Topic :: Internet :: WWW/HTTP
diff --git a/third_party/python/mohawk/mohawk.egg-info/SOURCES.txt b/third_party/python/mohawk/mohawk.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..880beddbc40f
--- /dev/null
+++ b/third_party/python/mohawk/mohawk.egg-info/SOURCES.txt
@@ -0,0 +1,15 @@
+README.rst
+setup.py
+mohawk/__init__.py
+mohawk/base.py
+mohawk/bewit.py
+mohawk/exc.py
+mohawk/receiver.py
+mohawk/sender.py
+mohawk/tests.py
+mohawk/util.py
+mohawk.egg-info/PKG-INFO
+mohawk.egg-info/SOURCES.txt
+mohawk.egg-info/dependency_links.txt
+mohawk.egg-info/requires.txt
+mohawk.egg-info/top_level.txt
\ No newline at end of file
diff --git a/third_party/python/mohawk/mohawk.egg-info/dependency_links.txt b/third_party/python/mohawk/mohawk.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/mohawk/mohawk.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/mohawk/mohawk.egg-info/requires.txt b/third_party/python/mohawk/mohawk.egg-info/requires.txt
new file mode 100644
index 000000000000..ffe2fce49895
--- /dev/null
+++ b/third_party/python/mohawk/mohawk.egg-info/requires.txt
@@ -0,0 +1 @@
+six
diff --git a/third_party/python/mohawk/mohawk.egg-info/top_level.txt b/third_party/python/mohawk/mohawk.egg-info/top_level.txt
new file mode 100644
index 000000000000..2b859fd06c73
--- /dev/null
+++ b/third_party/python/mohawk/mohawk.egg-info/top_level.txt
@@ -0,0 +1 @@
+mohawk
diff --git a/third_party/python/multidict/multidict.egg-info/PKG-INFO b/third_party/python/multidict/multidict.egg-info/PKG-INFO
new file mode 100644
index 000000000000..bbd48649479a
--- /dev/null
+++ b/third_party/python/multidict/multidict.egg-info/PKG-INFO
@@ -0,0 +1,128 @@
+Metadata-Version: 1.2
+Name: multidict
+Version: 5.1.0
+Summary: multidict implementation
+Home-page: https://github.com/aio-libs/multidict
+Author: Andrew Svetlov
+Author-email: andrew.svetlov@gmail.com
+License: Apache 2
+Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby
+Project-URL: CI: Azure Pipelines, https://dev.azure.com/aio-libs/multidict/_build
+Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/multidict
+Project-URL: Docs: RTD, https://multidict.readthedocs.io
+Project-URL: GitHub: issues, https://github.com/aio-libs/multidict/issues
+Project-URL: GitHub: repo, https://github.com/aio-libs/multidict
+Description: =========
+ multidict
+ =========
+
+ .. image:: https://github.com/aio-libs/multidict/workflows/CI/badge.svg
+ :target: https://github.com/aio-libs/multidict/actions?query=workflow%3ACI
+ :alt: GitHub status for master branch
+
+ .. image:: https://codecov.io/gh/aio-libs/multidict/branch/master/graph/badge.svg
+ :target: https://codecov.io/gh/aio-libs/multidict
+ :alt: Coverage metrics
+
+ .. image:: https://img.shields.io/pypi/v/multidict.svg
+ :target: https://pypi.org/project/multidict
+ :alt: PyPI
+
+ .. image:: https://readthedocs.org/projects/multidict/badge/?version=latest
+ :target: http://multidict.readthedocs.org/en/latest/?badge=latest
+ :alt: Documentationb
+
+ .. image:: https://img.shields.io/pypi/pyversions/multidict.svg
+ :target: https://pypi.org/project/multidict
+ :alt: Python versions
+
+ .. image:: https://badges.gitter.im/Join%20Chat.svg
+ :target: https://gitter.im/aio-libs/Lobby
+ :alt: Chat on Gitter
+
+ Multidict is dict-like collection of *key-value pairs* where key
+ might be occurred more than once in the container.
+
+ Introduction
+ ------------
+
+ *HTTP Headers* and *URL query string* require specific data structure:
+ *multidict*. It behaves mostly like a regular ``dict`` but it may have
+ several *values* for the same *key* and *preserves insertion ordering*.
+
+ The *key* is ``str`` (or ``istr`` for case-insensitive dictionaries).
+
+ ``multidict`` has four multidict classes:
+ ``MultiDict``, ``MultiDictProxy``, ``CIMultiDict``
+ and ``CIMultiDictProxy``.
+
+ Immutable proxies (``MultiDictProxy`` and
+ ``CIMultiDictProxy``) provide a dynamic view for the
+ proxied multidict, the view reflects underlying collection changes. They
+ implement the ``collections.abc.Mapping`` interface.
+
+ Regular mutable (``MultiDict`` and ``CIMultiDict``) classes
+ implement ``collections.abc.MutableMapping`` and allows to change
+ their own content.
+
+
+ *Case insensitive* (``CIMultiDict`` and
+ ``CIMultiDictProxy``) ones assume the *keys* are case
+ insensitive, e.g.::
+
+ >>> dct = CIMultiDict(key='val')
+ >>> 'Key' in dct
+ True
+ >>> dct['Key']
+ 'val'
+
+ *Keys* should be ``str`` or ``istr`` instances.
+
+ The library has optional C Extensions for sake of speed.
+
+
+ License
+ -------
+
+ Apache 2
+
+ Library Installation
+ --------------------
+
+ .. code-block:: bash
+
+ $ pip install multidict
+
+ The library is Python 3 only!
+
+ PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install
+ ``multidict`` on another operation system (or *Alpine Linux* inside a Docker) the
+ Tarball will be used to compile the library from sources. It requires C compiler and
+ Python headers installed.
+
+ To skip the compilation please use `MULTIDICT_NO_EXTENSIONS` environment variable,
+ e.g.:
+
+ .. code-block:: bash
+
+ $ MULTIDICT_NO_EXTENSIONS=1 pip install multidict
+
+ Please note, Pure Python (uncompiled) version is about 20-50 times slower depending on
+ the usage scenario!!!
+
+
+
+ Changelog
+ ---------
+ See `RTD page `_.
+Platform: UNKNOWN
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Development Status :: 5 - Production/Stable
+Requires-Python: >=3.6
diff --git a/third_party/python/multidict/multidict.egg-info/SOURCES.txt b/third_party/python/multidict/multidict.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..6c6257ea9b0b
--- /dev/null
+++ b/third_party/python/multidict/multidict.egg-info/SOURCES.txt
@@ -0,0 +1,71 @@
+CHANGES.rst
+LICENSE
+MANIFEST.in
+Makefile
+README.rst
+pyproject.toml
+setup.cfg
+setup.py
+docs/Makefile
+docs/benchmark.rst
+docs/changes.rst
+docs/conf.py
+docs/index.rst
+docs/make.bat
+docs/multidict.rst
+docs/spelling_wordlist.txt
+multidict/__init__.py
+multidict/__init__.pyi
+multidict/_abc.py
+multidict/_compat.py
+multidict/_multidict.c
+multidict/_multidict_base.py
+multidict/_multidict_py.py
+multidict/py.typed
+multidict.egg-info/PKG-INFO
+multidict.egg-info/SOURCES.txt
+multidict.egg-info/dependency_links.txt
+multidict.egg-info/top_level.txt
+multidict/_multilib/defs.h
+multidict/_multilib/dict.h
+multidict/_multilib/istr.h
+multidict/_multilib/iter.h
+multidict/_multilib/pair_list.h
+multidict/_multilib/views.h
+tests/cimultidict.pickle.0
+tests/cimultidict.pickle.1
+tests/cimultidict.pickle.2
+tests/cimultidict.pickle.3
+tests/cimultidict.pickle.4
+tests/cimultidict.pickle.5
+tests/conftest.py
+tests/gen_pickles.py
+tests/multidict.pickle.0
+tests/multidict.pickle.1
+tests/multidict.pickle.2
+tests/multidict.pickle.3
+tests/multidict.pickle.4
+tests/multidict.pickle.5
+tests/pycimultidict.pickle.0
+tests/pycimultidict.pickle.1
+tests/pycimultidict.pickle.2
+tests/pycimultidict.pickle.3
+tests/pycimultidict.pickle.4
+tests/pycimultidict.pickle.5
+tests/pymultidict.pickle.0
+tests/pymultidict.pickle.1
+tests/pymultidict.pickle.2
+tests/pymultidict.pickle.3
+tests/pymultidict.pickle.4
+tests/pymultidict.pickle.5
+tests/test_abc.py
+tests/test_copy.py
+tests/test_guard.py
+tests/test_istr.py
+tests/test_multidict.py
+tests/test_mutable_multidict.py
+tests/test_mypy.py
+tests/test_pickle.py
+tests/test_types.py
+tests/test_update.py
+tests/test_version.py
\ No newline at end of file
diff --git a/third_party/python/multidict/multidict.egg-info/dependency_links.txt b/third_party/python/multidict/multidict.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/multidict/multidict.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/multidict/multidict.egg-info/top_level.txt b/third_party/python/multidict/multidict.egg-info/top_level.txt
new file mode 100644
index 000000000000..afcecdff0822
--- /dev/null
+++ b/third_party/python/multidict/multidict.egg-info/top_level.txt
@@ -0,0 +1 @@
+multidict
diff --git a/third_party/python/ply/ply.egg-info/PKG-INFO b/third_party/python/ply/ply.egg-info/PKG-INFO
new file mode 100644
index 000000000000..6eedf4259539
--- /dev/null
+++ b/third_party/python/ply/ply.egg-info/PKG-INFO
@@ -0,0 +1,22 @@
+Metadata-Version: 1.1
+Name: ply
+Version: 3.10
+Summary: Python Lex & Yacc
+Home-page: http://www.dabeaz.com/ply/
+Author: David Beazley
+Author-email: dave@dabeaz.com
+License: BSD
+Description:
+ PLY is yet another implementation of lex and yacc for Python. Some notable
+ features include the fact that its implemented entirely in Python and it
+ uses LALR(1) parsing which is efficient and well suited for larger grammars.
+
+ PLY provides most of the standard lex/yacc features including support for empty
+ productions, precedence rules, error recovery, and support for ambiguous grammars.
+
+ PLY is extremely easy to use and provides very extensive error checking.
+ It is compatible with both Python 2 and Python 3.
+
+Platform: UNKNOWN
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 2
diff --git a/third_party/python/ply/ply.egg-info/SOURCES.txt b/third_party/python/ply/ply.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..2dff7dd29b8f
--- /dev/null
+++ b/third_party/python/ply/ply.egg-info/SOURCES.txt
@@ -0,0 +1,172 @@
+ANNOUNCE
+CHANGES
+MANIFEST.in
+README.md
+TODO
+setup.cfg
+setup.py
+doc/internal.html
+doc/makedoc.py
+doc/ply.html
+example/README
+example/cleanup.sh
+example/BASIC/README
+example/BASIC/basic.py
+example/BASIC/basiclex.py
+example/BASIC/basiclog.py
+example/BASIC/basinterp.py
+example/BASIC/basparse.py
+example/BASIC/dim.bas
+example/BASIC/func.bas
+example/BASIC/gcd.bas
+example/BASIC/gosub.bas
+example/BASIC/hello.bas
+example/BASIC/linear.bas
+example/BASIC/maxsin.bas
+example/BASIC/powers.bas
+example/BASIC/rand.bas
+example/BASIC/sales.bas
+example/BASIC/sears.bas
+example/BASIC/sqrt1.bas
+example/BASIC/sqrt2.bas
+example/GardenSnake/GardenSnake.py
+example/GardenSnake/README
+example/ansic/README
+example/ansic/clex.py
+example/ansic/cparse.py
+example/calc/calc.py
+example/calcdebug/calc.py
+example/calceof/calc.py
+example/classcalc/calc.py
+example/closurecalc/calc.py
+example/hedit/hedit.py
+example/newclasscalc/calc.py
+example/optcalc/README
+example/optcalc/calc.py
+example/unicalc/calc.py
+example/yply/README
+example/yply/ylex.py
+example/yply/yparse.py
+example/yply/yply.py
+ply/__init__.py
+ply/cpp.py
+ply/ctokens.py
+ply/lex.py
+ply/yacc.py
+ply/ygen.py
+ply.egg-info/PKG-INFO
+ply.egg-info/SOURCES.txt
+ply.egg-info/dependency_links.txt
+ply.egg-info/top_level.txt
+test/README
+test/calclex.py
+test/cleanup.sh
+test/lex_closure.py
+test/lex_doc1.py
+test/lex_dup1.py
+test/lex_dup2.py
+test/lex_dup3.py
+test/lex_empty.py
+test/lex_error1.py
+test/lex_error2.py
+test/lex_error3.py
+test/lex_error4.py
+test/lex_hedit.py
+test/lex_ignore.py
+test/lex_ignore2.py
+test/lex_literal1.py
+test/lex_literal2.py
+test/lex_literal3.py
+test/lex_many_tokens.py
+test/lex_module.py
+test/lex_module_import.py
+test/lex_object.py
+test/lex_opt_alias.py
+test/lex_optimize.py
+test/lex_optimize2.py
+test/lex_optimize3.py
+test/lex_re1.py
+test/lex_re2.py
+test/lex_re3.py
+test/lex_rule1.py
+test/lex_rule2.py
+test/lex_rule3.py
+test/lex_state1.py
+test/lex_state2.py
+test/lex_state3.py
+test/lex_state4.py
+test/lex_state5.py
+test/lex_state_noerror.py
+test/lex_state_norule.py
+test/lex_state_try.py
+test/lex_token1.py
+test/lex_token2.py
+test/lex_token3.py
+test/lex_token4.py
+test/lex_token5.py
+test/lex_token_dup.py
+test/testlex.py
+test/testyacc.py
+test/yacc_badargs.py
+test/yacc_badid.py
+test/yacc_badprec.py
+test/yacc_badprec2.py
+test/yacc_badprec3.py
+test/yacc_badrule.py
+test/yacc_badtok.py
+test/yacc_dup.py
+test/yacc_error1.py
+test/yacc_error2.py
+test/yacc_error3.py
+test/yacc_error4.py
+test/yacc_error5.py
+test/yacc_error6.py
+test/yacc_error7.py
+test/yacc_inf.py
+test/yacc_literal.py
+test/yacc_misplaced.py
+test/yacc_missing1.py
+test/yacc_nested.py
+test/yacc_nodoc.py
+test/yacc_noerror.py
+test/yacc_nop.py
+test/yacc_notfunc.py
+test/yacc_notok.py
+test/yacc_prec1.py
+test/yacc_rr.py
+test/yacc_rr_unused.py
+test/yacc_simple.py
+test/yacc_sr.py
+test/yacc_term1.py
+test/yacc_unicode_literals.py
+test/yacc_unused.py
+test/yacc_unused_rule.py
+test/yacc_uprec.py
+test/yacc_uprec2.py
+test/pkg_test1/__init__.py
+test/pkg_test1/parsing/__init__.py
+test/pkg_test1/parsing/calclex.py
+test/pkg_test1/parsing/calcparse.py
+test/pkg_test2/__init__.py
+test/pkg_test2/parsing/__init__.py
+test/pkg_test2/parsing/calclex.py
+test/pkg_test2/parsing/calcparse.py
+test/pkg_test3/__init__.py
+test/pkg_test3/generated/__init__.py
+test/pkg_test3/parsing/__init__.py
+test/pkg_test3/parsing/calclex.py
+test/pkg_test3/parsing/calcparse.py
+test/pkg_test4/__init__.py
+test/pkg_test4/parsing/__init__.py
+test/pkg_test4/parsing/calclex.py
+test/pkg_test4/parsing/calcparse.py
+test/pkg_test5/__init__.py
+test/pkg_test5/parsing/__init__.py
+test/pkg_test5/parsing/calclex.py
+test/pkg_test5/parsing/calcparse.py
+test/pkg_test6/__init__.py
+test/pkg_test6/parsing/__init__.py
+test/pkg_test6/parsing/calclex.py
+test/pkg_test6/parsing/calcparse.py
+test/pkg_test6/parsing/expression.py
+test/pkg_test6/parsing/statement.py
\ No newline at end of file
diff --git a/third_party/python/ply/ply.egg-info/dependency_links.txt b/third_party/python/ply/ply.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/ply/ply.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/ply/ply.egg-info/top_level.txt b/third_party/python/ply/ply.egg-info/top_level.txt
new file mode 100644
index 000000000000..90412f06833c
--- /dev/null
+++ b/third_party/python/ply/ply.egg-info/top_level.txt
@@ -0,0 +1 @@
+ply
diff --git a/third_party/python/pyrsistent/pyrsistent.egg-info/PKG-INFO b/third_party/python/pyrsistent/pyrsistent.egg-info/PKG-INFO
new file mode 100644
index 000000000000..1d1c15903475
--- /dev/null
+++ b/third_party/python/pyrsistent/pyrsistent.egg-info/PKG-INFO
@@ -0,0 +1,742 @@
+Metadata-Version: 1.1
+Name: pyrsistent
+Version: 0.16.0
+Summary: Persistent/Functional/Immutable data structures
+Home-page: http://github.com/tobgu/pyrsistent/
+Author: Tobias Gustafsson
+Author-email: tobias.l.gustafsson@gmail.com
+License: MIT
+Description: Pyrsistent
+ ==========
+ .. image:: https://travis-ci.org/tobgu/pyrsistent.png?branch=master
+ :target: https://travis-ci.org/tobgu/pyrsistent
+
+ .. image:: https://badge.fury.io/py/pyrsistent.svg
+ :target: https://badge.fury.io/py/pyrsistent
+
+ .. image:: https://coveralls.io/repos/tobgu/pyrsistent/badge.svg?branch=master&service=github
+ :target: https://coveralls.io/github/tobgu/pyrsistent?branch=master
+
+
+ .. _Pyrthon: https://www.github.com/tobgu/pyrthon/
+
+ Pyrsistent is a number of persistent collections (by some referred to as functional data structures). Persistent in
+ the sense that they are immutable.
+
+ All methods on a data structure that would normally mutate it instead return a new copy of the structure containing the
+ requested updates. The original structure is left untouched.
+
+ This will simplify the reasoning about what a program does since no hidden side effects ever can take place to these
+ data structures. You can rest assured that the object you hold a reference to will remain the same throughout its
+ lifetime and need not worry that somewhere five stack levels below you in the darkest corner of your application
+ someone has decided to remove that element that you expected to be there.
+
+ Pyrsistent is influenced by persistent data structures such as those found in the standard library of Clojure. The
+ data structures are designed to share common elements through path copying.
+ It aims at taking these concepts and make them as pythonic as possible so that they can be easily integrated into any python
+ program without hassle.
+
+ If you want to go all in on persistent data structures and use literal syntax to define them in your code rather
+ than function calls check out Pyrthon_.
+
+ Examples
+ --------
+ .. _Sequence: collections_
+ .. _Hashable: collections_
+ .. _Mapping: collections_
+ .. _Mappings: collections_
+ .. _Set: collections_
+ .. _collections: https://docs.python.org/3/library/collections.abc.html
+ .. _documentation: http://pyrsistent.readthedocs.org/
+
+ The collection types and key features currently implemented are:
+
+ * PVector_, similar to a python list
+ * PMap_, similar to dict
+ * PSet_, similar to set
+ * PRecord_, a PMap on steroids with fixed fields, optional type and invariant checking and much more
+ * PClass_, a Python class fixed fields, optional type and invariant checking and much more
+ * `Checked collections`_, PVector, PMap and PSet with optional type and invariance checks and more
+ * PBag, similar to collections.Counter
+ * PList, a classic singly linked list
+ * PDeque, similar to collections.deque
+ * Immutable object type (immutable) built on the named tuple
+ * freeze_ and thaw_ functions to convert between pythons standard collections and pyrsistent collections.
+ * Flexible transformations_ of arbitrarily complex structures built from PMaps and PVectors.
+
+ Below are examples of common usage patterns for some of the structures and features. More information and
+ full documentation for all data structures is available in the documentation_.
+
+ .. _PVector:
+
+ PVector
+ ~~~~~~~
+ With full support for the Sequence_ protocol PVector is meant as a drop in replacement to the built in list from a readers
+ point of view. Write operations of course differ since no in place mutation is done but naming should be in line
+ with corresponding operations on the built in list.
+
+ Support for the Hashable_ protocol also means that it can be used as key in Mappings_.
+
+ Appends are amortized O(1). Random access and insert is log32(n) where n is the size of the vector.
+
+ .. code:: python
+
+ >>> from pyrsistent import v, pvector
+
+ # No mutation of vectors once created, instead they
+ # are "evolved" leaving the original untouched
+ >>> v1 = v(1, 2, 3)
+ >>> v2 = v1.append(4)
+ >>> v3 = v2.set(1, 5)
+ >>> v1
+ pvector([1, 2, 3])
+ >>> v2
+ pvector([1, 2, 3, 4])
+ >>> v3
+ pvector([1, 5, 3, 4])
+
+ # Random access and slicing
+ >>> v3[1]
+ 5
+ >>> v3[1:3]
+ pvector([5, 3])
+
+ # Iteration
+ >>> list(x + 1 for x in v3)
+ [2, 6, 4, 5]
+ >>> pvector(2 * x for x in range(3))
+ pvector([0, 2, 4])
+
+ .. _PMap:
+
+ PMap
+ ~~~~
+ With full support for the Mapping_ protocol PMap is meant as a drop in replacement to the built in dict from a readers point
+ of view. Support for the Hashable_ protocol also means that it can be used as key in other Mappings_.
+
+ Random access and insert is log32(n) where n is the size of the map.
+
+ .. code:: python
+
+ >>> from pyrsistent import m, pmap, v
+
+ # No mutation of maps once created, instead they are
+ # "evolved" leaving the original untouched
+ >>> m1 = m(a=1, b=2)
+ >>> m2 = m1.set('c', 3)
+ >>> m3 = m2.set('a', 5)
+ >>> m1
+ pmap({'a': 1, 'b': 2})
+ >>> m2
+ pmap({'a': 1, 'c': 3, 'b': 2})
+ >>> m3
+ pmap({'a': 5, 'c': 3, 'b': 2})
+ >>> m3['a']
+ 5
+
+ # Evolution of nested persistent structures
+ >>> m4 = m(a=5, b=6, c=v(1, 2))
+ >>> m4.transform(('c', 1), 17)
+ pmap({'a': 5, 'c': pvector([1, 17]), 'b': 6})
+ >>> m5 = m(a=1, b=2)
+
+ # Evolve by merging with other mappings
+ >>> m5.update(m(a=2, c=3), {'a': 17, 'd': 35})
+ pmap({'a': 17, 'c': 3, 'b': 2, 'd': 35})
+ >>> pmap({'x': 1, 'y': 2}) + pmap({'y': 3, 'z': 4})
+ pmap({'y': 3, 'x': 1, 'z': 4})
+
+ # Dict-like methods to convert to list and iterate
+ >>> m3.items()
+ pvector([('a', 5), ('c', 3), ('b', 2)])
+ >>> list(m3)
+ ['a', 'c', 'b']
+
+ .. _PSet:
+
+ PSet
+ ~~~~
+ With full support for the Set_ protocol PSet is meant as a drop in replacement to the built in set from a readers point
+ of view. Support for the Hashable_ protocol also means that it can be used as key in Mappings_.
+
+ Random access and insert is log32(n) where n is the size of the set.
+
+ .. code:: python
+
+ >>> from pyrsistent import s
+
+ # No mutation of sets once created, you know the story...
+ >>> s1 = s(1, 2, 3, 2)
+ >>> s2 = s1.add(4)
+ >>> s3 = s1.remove(1)
+ >>> s1
+ pset([1, 2, 3])
+ >>> s2
+ pset([1, 2, 3, 4])
+ >>> s3
+ pset([2, 3])
+
+ # Full support for set operations
+ >>> s1 | s(3, 4, 5)
+ pset([1, 2, 3, 4, 5])
+ >>> s1 & s(3, 4, 5)
+ pset([3])
+ >>> s1 < s2
+ True
+ >>> s1 < s(3, 4, 5)
+ False
+
+ .. _PRecord:
+
+ PRecord
+ ~~~~~~~
+ A PRecord is a PMap with a fixed set of specified fields. Records are declared as python classes inheriting
+ from PRecord. Because it is a PMap it has full support for all Mapping methods such as iteration and element
+ access using subscript notation.
+
+ .. code:: python
+
+ >>> from pyrsistent import PRecord, field
+ >>> class ARecord(PRecord):
+ ... x = field()
+ ...
+ >>> r = ARecord(x=3)
+ >>> r
+ ARecord(x=3)
+ >>> r.x
+ 3
+ >>> r.set(x=2)
+ ARecord(x=2)
+ >>> r.set(y=2)
+ Traceback (most recent call last):
+ AttributeError: 'y' is not among the specified fields for ARecord
+
+ Type information
+ ****************
+ It is possible to add type information to the record to enforce type checks. Multiple allowed types can be specified
+ by providing an iterable of types.
+
+ .. code:: python
+
+ >>> class BRecord(PRecord):
+ ... x = field(type=int)
+ ... y = field(type=(int, type(None)))
+ ...
+ >>> BRecord(x=3, y=None)
+ BRecord(y=None, x=3)
+ >>> BRecord(x=3.0)
+ Traceback (most recent call last):
+ PTypeError: Invalid type for field BRecord.x, was float
+
+
+ Custom types (classes) that are iterable should be wrapped in a tuple to prevent their
+ members being added to the set of valid types. Although Enums in particular are now
+ supported without wrapping, see #83 for more information.
+
+ Mandatory fields
+ ****************
+ Fields are not mandatory by default but can be specified as such. If fields are missing an
+ *InvariantException* will be thrown which contains information about the missing fields.
+
+ .. code:: python
+
+ >>> from pyrsistent import InvariantException
+ >>> class CRecord(PRecord):
+ ... x = field(mandatory=True)
+ ...
+ >>> r = CRecord(x=3)
+ >>> try:
+ ... r.discard('x')
+ ... except InvariantException as e:
+ ... print(e.missing_fields)
+ ...
+ ('CRecord.x',)
+
+ Invariants
+ **********
+ It is possible to add invariants that must hold when evolving the record. Invariants can be
+ specified on both field and record level. If invariants fail an *InvariantException* will be
+ thrown which contains information about the failing invariants. An invariant function should
+ return a tuple consisting of a boolean that tells if the invariant holds or not and an object
+ describing the invariant. This object can later be used to identify which invariant that failed.
+
+ The global invariant function is only executed if all field invariants hold.
+
+ Global invariants are inherited to subclasses.
+
+ .. code:: python
+
+ >>> class RestrictedVector(PRecord):
+ ... __invariant__ = lambda r: (r.y >= r.x, 'x larger than y')
+ ... x = field(invariant=lambda x: (x > 0, 'x negative'))
+ ... y = field(invariant=lambda y: (y > 0, 'y negative'))
+ ...
+ >>> r = RestrictedVector(y=3, x=2)
+ >>> try:
+ ... r.set(x=-1, y=-2)
+ ... except InvariantException as e:
+ ... print(e.invariant_errors)
+ ...
+ ('y negative', 'x negative')
+ >>> try:
+ ... r.set(x=2, y=1)
+ ... except InvariantException as e:
+ ... print(e.invariant_errors)
+ ...
+ ('x larger than y',)
+
+ Invariants may also contain multiple assertions. For those cases the invariant function should
+ return a tuple of invariant tuples as described above. This structure is reflected in the
+ invariant_errors attribute of the exception which will contain tuples with data from all failed
+ invariants. Eg:
+
+ .. code:: python
+
+ >>> class EvenX(PRecord):
+ ... x = field(invariant=lambda x: ((x > 0, 'x negative'), (x % 2 == 0, 'x odd')))
+ ...
+ >>> try:
+ ... EvenX(x=-1)
+ ... except InvariantException as e:
+ ... print(e.invariant_errors)
+ ...
+ (('x negative', 'x odd'),)
+
+
+ Factories
+ *********
+ It's possible to specify factory functions for fields. The factory function receives whatever
+ is supplied as field value and the actual returned by the factory is assigned to the field
+ given that any type and invariant checks hold.
+ PRecords have a default factory specified as a static function on the class, create(). It takes
+ a *Mapping* as argument and returns an instance of the specific record.
+ If a record has fields of type PRecord the create() method of that record will
+ be called to create the "sub record" if no factory has explicitly been specified to override
+ this behaviour.
+
+ .. code:: python
+
+ >>> class DRecord(PRecord):
+ ... x = field(factory=int)
+ ...
+ >>> class ERecord(PRecord):
+ ... d = field(type=DRecord)
+ ...
+ >>> ERecord.create({'d': {'x': '1'}})
+ ERecord(d=DRecord(x=1))
+
+ Collection fields
+ *****************
+ It is also possible to have fields with ``pyrsistent`` collections.
+
+ .. code:: python
+
+ >>> from pyrsistent import pset_field, pmap_field, pvector_field
+ >>> class MultiRecord(PRecord):
+ ... set_of_ints = pset_field(int)
+ ... map_int_to_str = pmap_field(int, str)
+ ... vector_of_strs = pvector_field(str)
+ ...
+
+ Serialization
+ *************
+ PRecords support serialization back to dicts. Default serialization will take keys and values
+ "as is" and output them into a dict. It is possible to specify custom serialization functions
+ to take care of fields that require special treatment.
+
+ .. code:: python
+
+ >>> from datetime import date
+ >>> class Person(PRecord):
+ ... name = field(type=unicode)
+ ... birth_date = field(type=date,
+ ... serializer=lambda format, d: d.strftime(format['date']))
+ ...
+ >>> john = Person(name=u'John', birth_date=date(1985, 10, 21))
+ >>> john.serialize({'date': '%Y-%m-%d'})
+ {'birth_date': '1985-10-21', 'name': u'John'}
+
+
+ .. _instar: https://github.com/boxed/instar/
+
+ .. _PClass:
+
+ PClass
+ ~~~~~~
+ A PClass is a python class with a fixed set of specified fields. PClasses are declared as python classes inheriting
+ from PClass. It is defined the same way that PRecords are and behaves like a PRecord in all aspects except that it
+ is not a PMap and hence not a collection but rather a plain Python object.
+
+ .. code:: python
+
+ >>> from pyrsistent import PClass, field
+ >>> class AClass(PClass):
+ ... x = field()
+ ...
+ >>> a = AClass(x=3)
+ >>> a
+ AClass(x=3)
+ >>> a.x
+ 3
+
+
+ Checked collections
+ ~~~~~~~~~~~~~~~~~~~
+ Checked collections currently come in three flavors: CheckedPVector, CheckedPMap and CheckedPSet.
+
+ .. code:: python
+
+ >>> from pyrsistent import CheckedPVector, CheckedPMap, CheckedPSet, thaw
+ >>> class Positives(CheckedPSet):
+ ... __type__ = (long, int)
+ ... __invariant__ = lambda n: (n >= 0, 'Negative')
+ ...
+ >>> class Lottery(PRecord):
+ ... name = field(type=str)
+ ... numbers = field(type=Positives, invariant=lambda p: (len(p) > 0, 'No numbers'))
+ ...
+ >>> class Lotteries(CheckedPVector):
+ ... __type__ = Lottery
+ ...
+ >>> class LotteriesByDate(CheckedPMap):
+ ... __key_type__ = date
+ ... __value_type__ = Lotteries
+ ...
+ >>> lotteries = LotteriesByDate.create({date(2015, 2, 15): [{'name': 'SuperLotto', 'numbers': {1, 2, 3}},
+ ... {'name': 'MegaLotto', 'numbers': {4, 5, 6}}],
+ ... date(2015, 2, 16): [{'name': 'SuperLotto', 'numbers': {3, 2, 1}},
+ ... {'name': 'MegaLotto', 'numbers': {6, 5, 4}}]})
+ >>> lotteries
+ LotteriesByDate({datetime.date(2015, 2, 15): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')]), datetime.date(2015, 2, 16): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])})
+
+ # The checked versions support all operations that the corresponding
+ # unchecked types do
+ >>> lottery_0215 = lotteries[date(2015, 2, 15)]
+ >>> lottery_0215.transform([0, 'name'], 'SuperDuperLotto')
+ Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperDuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])
+
+ # But also makes asserts that types and invariants hold
+ >>> lottery_0215.transform([0, 'name'], 999)
+ Traceback (most recent call last):
+ PTypeError: Invalid type for field Lottery.name, was int
+
+ >>> lottery_0215.transform([0, 'numbers'], set())
+ Traceback (most recent call last):
+ InvariantException: Field invariant failed
+
+ # They can be converted back to python built ins with either thaw()
+ # or serialize() (which provides possibilities to customize serialization)
+ >>> thaw(lottery_0215)
+ [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]
+ >>> lottery_0215.serialize()
+ [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]
+
+ .. _transformations:
+
+ Transformations
+ ~~~~~~~~~~~~~~~
+ Transformations are inspired by the cool library instar_ for Clojure. They let you evolve PMaps and PVectors
+ with arbitrarily deep/complex nesting using simple syntax and flexible matching syntax.
+
+ The first argument to transformation is the path that points out the value to transform. The
+ second is the transformation to perform. If the transformation is callable it will be applied
+ to the value(s) matching the path. The path may also contain callables. In that case they are
+ treated as matchers. If the matcher returns True for a specific key it is considered for transformation.
+
+ .. code:: python
+
+ # Basic examples
+ >>> from pyrsistent import inc, freeze, thaw, rex, ny, discard
+ >>> v1 = freeze([1, 2, 3, 4, 5])
+ >>> v1.transform([2], inc)
+ pvector([1, 2, 4, 4, 5])
+ >>> v1.transform([lambda ix: 0 < ix < 4], 8)
+ pvector([1, 8, 8, 8, 5])
+ >>> v1.transform([lambda ix, v: ix == 0 or v == 5], 0)
+ pvector([0, 2, 3, 4, 0])
+
+ # The (a)ny matcher can be used to match anything
+ >>> v1.transform([ny], 8)
+ pvector([8, 8, 8, 8, 8])
+
+ # Regular expressions can be used for matching
+ >>> scores = freeze({'John': 12, 'Joseph': 34, 'Sara': 23})
+ >>> scores.transform([rex('^Jo')], 0)
+ pmap({'Joseph': 0, 'Sara': 23, 'John': 0})
+
+ # Transformations can be done on arbitrarily deep structures
+ >>> news_paper = freeze({'articles': [{'author': 'Sara', 'content': 'A short article'},
+ ... {'author': 'Steve', 'content': 'A slightly longer article'}],
+ ... 'weather': {'temperature': '11C', 'wind': '5m/s'}})
+ >>> short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:25] + '...' if len(c) > 25 else c)
+ >>> very_short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:15] + '...' if len(c) > 15 else c)
+ >>> very_short_news.articles[0].content
+ 'A short article'
+ >>> very_short_news.articles[1].content
+ 'A slightly long...'
+
+ # When nothing has been transformed the original data structure is kept
+ >>> short_news is news_paper
+ True
+ >>> very_short_news is news_paper
+ False
+ >>> very_short_news.articles[0] is news_paper.articles[0]
+ True
+
+ # There is a special transformation that can be used to discard elements. Also
+ # multiple transformations can be applied in one call
+ >>> thaw(news_paper.transform(['weather'], discard, ['articles', ny, 'content'], discard))
+ {'articles': [{'author': 'Sara'}, {'author': 'Steve'}]}
+
+ Evolvers
+ ~~~~~~~~
+ PVector, PMap and PSet all have support for a concept dubbed *evolvers*. An evolver acts like a mutable
+ view of the underlying persistent data structure with "transaction like" semantics. No updates of the original
+ data structure is ever performed, it is still fully immutable.
+
+ The evolvers have a very limited API by design to discourage excessive, and inappropriate, usage as that would
+ take us down the mutable road. In principle only basic mutation and element access functions are supported.
+ Check out the documentation_ of each data structure for specific examples.
+
+ Examples of when you may want to use an evolver instead of working directly with the data structure include:
+
+ * Multiple updates are done to the same data structure and the intermediate results are of no
+ interest. In this case using an evolver may be a more efficient and easier to work with.
+ * You need to pass a vector into a legacy function or a function that you have no control
+ over which performs in place mutations. In this case pass an evolver instance
+ instead and then create a new pvector from the evolver once the function returns.
+
+ .. code:: python
+
+ >>> from pyrsistent import v
+
+ # In place mutation as when working with the built in counterpart
+ >>> v1 = v(1, 2, 3)
+ >>> e = v1.evolver()
+ >>> e[1] = 22
+ >>> e = e.append(4)
+ >>> e = e.extend([5, 6])
+ >>> e[5] += 1
+ >>> len(e)
+ 6
+
+ # The evolver is considered *dirty* when it contains changes compared to the underlying vector
+ >>> e.is_dirty()
+ True
+
+ # But the underlying pvector still remains untouched
+ >>> v1
+ pvector([1, 2, 3])
+
+ # Once satisfied with the updates you can produce a new pvector containing the updates.
+ # The new pvector will share data with the original pvector in the same way that would have
+ # been done if only using operations on the pvector.
+ >>> v2 = e.persistent()
+ >>> v2
+ pvector([1, 22, 3, 4, 5, 7])
+
+ # The evolver is now no longer considered *dirty* as it contains no differences compared to the
+ # pvector just produced.
+ >>> e.is_dirty()
+ False
+
+ # You may continue to work with the same evolver without affecting the content of v2
+ >>> e[0] = 11
+
+ # Or create a new evolver from v2. The two evolvers can be updated independently but will both
+ # share data with v2 where possible.
+ >>> e2 = v2.evolver()
+ >>> e2[0] = 1111
+ >>> e.persistent()
+ pvector([11, 22, 3, 4, 5, 7])
+ >>> e2.persistent()
+ pvector([1111, 22, 3, 4, 5, 7])
+
+ .. _freeze:
+ .. _thaw:
+
+ freeze and thaw
+ ~~~~~~~~~~~~~~~
+ These functions are great when your cozy immutable world has to interact with the evil mutable world outside.
+
+ .. code:: python
+
+ >>> from pyrsistent import freeze, thaw, v, m
+ >>> freeze([1, {'a': 3}])
+ pvector([1, pmap({'a': 3})])
+ >>> thaw(v(1, m(a=3)))
+ [1, {'a': 3}]
+
+ Compatibility
+ -------------
+
+ Pyrsistent is developed and tested on Python 2.7, 3.5, 3.6, 3.7 and PyPy (Python 2 and 3 compatible). It will most
+ likely work on all other versions >= 3.4 but no guarantees are given. :)
+
+ Compatibility issues
+ ~~~~~~~~~~~~~~~~~~~~
+
+ .. _27: https://github.com/tobgu/pyrsistent/issues/27
+
+ There is currently one known compatibility issue when comparing built in sets and frozensets to PSets as discussed in 27_.
+ It affects python 2 versions < 2.7.8 and python 3 versions < 3.4.0 and is due to a bug described in
+ http://bugs.python.org/issue8743.
+
+ Comparisons will fail or be incorrect when using the set/frozenset as left hand side of the comparison. As a workaround
+ you need to either upgrade Python to a more recent version, avoid comparing sets/frozensets with PSets or always make
+ sure to convert both sides of the comparison to the same type before performing the comparison.
+
+ Performance
+ -----------
+
+ Pyrsistent is developed with performance in mind. Still, while some operations are nearly on par with their built in,
+ mutable, counterparts in terms of speed, other operations are slower. In the cases where attempts at
+ optimizations have been done, speed has generally been valued over space.
+
+ Pyrsistent comes with two API compatible flavors of PVector (on which PMap and PSet are based), one pure Python
+ implementation and one implemented as a C extension. The latter generally being 2 - 20 times faster than the former.
+ The C extension will be used automatically when possible.
+
+ The pure python implementation is fully PyPy compatible. Running it under PyPy speeds operations up considerably if
+ the structures are used heavily (if JITed), for some cases the performance is almost on par with the built in counterparts.
+
+ Type hints
+ ----------
+
+ PEP 561 style type hints for use with mypy and various editors are available for most types and functions in pyrsistent.
+
+ Type classes for annotating your own code with pyrsistent types are also available under pyrsistent.typing.
+
+ Installation
+ ------------
+
+ pip install pyrsistent
+
+ Documentation
+ -------------
+
+ Available at http://pyrsistent.readthedocs.org/
+
+ Brief presentation available at http://slides.com/tobiasgustafsson/immutability-and-python/
+
+ Contributors
+ ------------
+
+ Tobias Gustafsson https://github.com/tobgu
+
+ Christopher Armstrong https://github.com/radix
+
+ Anders Hovmöller https://github.com/boxed
+
+ Itamar Turner-Trauring https://github.com/itamarst
+
+ Jonathan Lange https://github.com/jml
+
+ Richard Futrell https://github.com/Futrell
+
+ Jakob Hollenstein https://github.com/jkbjh
+
+ David Honour https://github.com/foolswood
+
+ David R. MacIver https://github.com/DRMacIver
+
+ Marcus Ewert https://github.com/sarum90
+
+ Jean-Paul Calderone https://github.com/exarkun
+
+ Douglas Treadwell https://github.com/douglas-treadwell
+
+ Travis Parker https://github.com/teepark
+
+ Julian Berman https://github.com/Julian
+
+ Dennis Tomas https://github.com/dtomas
+
+ Neil Vyas https://github.com/neilvyas
+
+ doozr https://github.com/doozr
+
+ Kamil Galuszka https://github.com/galuszkak
+
+ Tsuyoshi Hombashi https://github.com/thombashi
+
+ nattofriends https://github.com/nattofriends
+
+ agberk https://github.com/agberk
+
+ Waleed Khan https://github.com/arxanas
+
+ Jean-Louis Fuchs https://github.com/ganwell
+
+ Carlos Corbacho https://github.com/ccorbacho
+
+ Felix Yan https://github.com/felixonmars
+
+ benrg https://github.com/benrg
+
+ Jere Lahelma https://github.com/je-l
+
+ Max Taggart https://github.com/MaxTaggart
+
+ Vincent Philippon https://github.com/vphilippon
+
+ Semen Zhydenko https://github.com/ss18
+
+ Till Varoquaux https://github.com/till-varoquaux
+
+ Michal Kowalik https://github.com/michalvi
+
+ ossdev07 https://github.com/ossdev07
+
+ Kerry Olesen https://github.com/qhesz
+
+ johnthagen https://github.com/johnthagen
+
+ Contributing
+ ------------
+
+ Want to contribute? That's great! If you experience problems please log them on GitHub. If you want to contribute code,
+ please fork the repository and submit a pull request.
+
+ Run tests
+ ~~~~~~~~~
+ .. _tox: https://tox.readthedocs.io/en/latest/
+
+ Tests can be executed using tox_.
+
+ Install tox: ``pip install tox``
+
+ Run test for Python 2.7: ``tox -epy27``
+
+ Release
+ ~~~~~~~
+ * Update CHANGES.txt
+ * Update README with any new contributors and potential info needed.
+ * Update _pyrsistent_version.py
+ * python setup.py sdist upload
+ * Commit and tag with new version: git add -u . && git commit -m 'Prepare version vX.Y.Z' && git tag -a vX.Y.Z -m 'vX.Y.Z'
+ * Push commit and tags: git push && git push --tags
+
+ Project status
+ --------------
+ Pyrsistent can be considered stable and mature (who knows, there may even be a 1.0 some day :-)). The project is
+ maintained, bugs fixed, PRs reviewed and merged and new releases made. I currently do not have time for development
+ of new features or functionality which I don't have use for myself. I'm more than happy to take PRs for new
+ functionality though!
+
+ There are a bunch of issues marked with ``enhancement`` and ``help wanted`` that contain requests for new functionality
+ that would be nice to include. The level of difficulty and extend of the issues varies, please reach out to me if you're
+ interested in working on any of them.
+
+ If you feel that you have a grand master plan for where you would like Pyrsistent to go and have the time to put into
+ it please don't hesitate to discuss this with me and submit PRs for it. If all goes well I'd be more than happy to add
+ additional maintainers to the project!
+
+Platform: UNKNOWN
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: Implementation :: PyPy
diff --git a/third_party/python/pyrsistent/pyrsistent.egg-info/SOURCES.txt b/third_party/python/pyrsistent/pyrsistent.egg-info/SOURCES.txt
new file mode 100644
index 000000000000..9d3cc0a8d6ae
--- /dev/null
+++ b/third_party/python/pyrsistent/pyrsistent.egg-info/SOURCES.txt
@@ -0,0 +1,53 @@
+CHANGES.txt
+LICENCE.mit
+MANIFEST.in
+README
+README.rst
+_pyrsistent_version.py
+pvectorcmodule.c
+setup.cfg
+setup.py
+pyrsistent/__init__.py
+pyrsistent/__init__.pyi
+pyrsistent/_checked_types.py
+pyrsistent/_compat.py
+pyrsistent/_field_common.py
+pyrsistent/_helpers.py
+pyrsistent/_immutable.py
+pyrsistent/_pbag.py
+pyrsistent/_pclass.py
+pyrsistent/_pdeque.py
+pyrsistent/_plist.py
+pyrsistent/_pmap.py
+pyrsistent/_precord.py
+pyrsistent/_pset.py
+pyrsistent/_pvector.py
+pyrsistent/_toolz.py
+pyrsistent/_transformations.py
+pyrsistent/py.typed
+pyrsistent/typing.py
+pyrsistent/typing.pyi
+pyrsistent.egg-info/PKG-INFO
+pyrsistent.egg-info/SOURCES.txt
+pyrsistent.egg-info/dependency_links.txt
+pyrsistent.egg-info/requires.txt
+pyrsistent.egg-info/top_level.txt
+tests/bag_test.py
+tests/checked_map_test.py
+tests/checked_set_test.py
+tests/checked_vector_test.py
+tests/class_test.py
+tests/deque_test.py
+tests/field_test.py
+tests/freeze_test.py
+tests/hypothesis_vector_test.py
+tests/immutable_object_test.py
+tests/list_test.py
+tests/map_test.py
+tests/memory_profiling.py
+tests/record_test.py
+tests/regression_test.py
+tests/set_test.py
+tests/toolz_test.py
+tests/transform_test.py
+tests/vector_test.py
\ No newline at end of file
diff --git a/third_party/python/pyrsistent/pyrsistent.egg-info/dependency_links.txt b/third_party/python/pyrsistent/pyrsistent.egg-info/dependency_links.txt
new file mode 100644
index 000000000000..8b137891791f
--- /dev/null
+++ b/third_party/python/pyrsistent/pyrsistent.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/third_party/python/pyrsistent/pyrsistent.egg-info/requires.txt b/third_party/python/pyrsistent/pyrsistent.egg-info/requires.txt
new file mode 100644
index 000000000000..ffe2fce49895
--- /dev/null
+++ b/third_party/python/pyrsistent/pyrsistent.egg-info/requires.txt
@@ -0,0 +1 @@
+six
diff --git a/third_party/python/pyrsistent/pyrsistent.egg-info/top_level.txt b/third_party/python/pyrsistent/pyrsistent.egg-info/top_level.txt
new file mode 100644
index 000000000000..f2460728a9d5
--- /dev/null
+++ b/third_party/python/pyrsistent/pyrsistent.egg-info/top_level.txt
@@ -0,0 +1,3 @@
+_pyrsistent_version
+pvectorc
+pyrsistent
diff --git a/third_party/python/pystache/pystache.egg-info/PKG-INFO b/third_party/python/pystache/pystache.egg-info/PKG-INFO
new file mode 100644
index 000000000000..92e0c7f8ed24
--- /dev/null
+++ b/third_party/python/pystache/pystache.egg-info/PKG-INFO
@@ -0,0 +1,536 @@
+Metadata-Version: 1.1
+Name: pystache
+Version: 0.5.4
+Summary: Mustache for Python
+Home-page: http://github.com/defunkt/pystache
+Author: Chris Jerdonek
+Author-email: chris.jerdonek@gmail.com
+License: MIT
+Description: .. Do not edit this file. This file is auto-generated for PyPI by setup.py
+ .. using pandoc, so edits should go in the source files rather than here.
+
+ Pystache
+ ========
+
+ .. figure:: http://defunkt.github.com/pystache/images/logo_phillips.png
+ :alt: mustachioed, monocled snake by David Phillips
+
+ .. figure:: https://secure.travis-ci.org/defunkt/pystache.png
+ :alt: Travis CI current build status
+
+ `Pystache `__ is a Python
+ implementation of `Mustache `__. Mustache
+ is a framework-agnostic, logic-free templating system inspired by
+ `ctemplate `__ and
+ `et `__.
+ Like ctemplate, Mustache "emphasizes separating logic from presentation:
+ it is impossible to embed application logic in this template language."
+
+ The `mustache(5) `__ man
+ page provides a good introduction to Mustache's syntax. For a more
+ complete (and more current) description of Mustache's behavior, see the
+ official `Mustache spec `__.
+
+ Pystache is `semantically versioned `__ and can be
+ found on `PyPI `__. This version
+ of Pystache passes all tests in `version
+ 1.1.2 `__ of the spec.
+
+ Requirements
+ ------------
+
+ Pystache is tested with--
+
+ - Python 2.4 (requires simplejson `version
+ 2.0.9 `__ or earlier)
+ - Python 2.5 (requires
+ `simplejson `__)
+ - Python 2.6
+ - Python 2.7
+ - Python 3.1
+ - Python 3.2
+ - Python 3.3
+ - `PyPy `__
+
+ `Distribute `__ (the setuptools
+ fork) is recommended over
+ `setuptools `__, and is required
+ in some cases (e.g. for Python 3 support). If you use
+ `pip `__, you probably already satisfy
+ this requirement.
+
+ JSON support is needed only for the command-line interface and to run
+ the spec tests. We require simplejson for earlier versions of Python
+ since Python's `json `__
+ module was added in Python 2.6.
+
+ For Python 2.4 we require an earlier version of simplejson since
+ simplejson stopped officially supporting Python 2.4 in simplejson
+ version 2.1.0. Earlier versions of simplejson can be installed manually,
+ as follows:
+
+ ::
+
+ pip install 'simplejson<2.1.0'
+
+ Official support for Python 2.4 will end with Pystache version 0.6.0.
+
+ Install It
+ ----------
+
+ ::
+
+ pip install pystache
+
+ And test it--
+
+ ::
+
+ pystache-test
+
+ To install and test from source (e.g. from GitHub), see the Develop
+ section.
+
+ Use It
+ ------
+
+ ::
+
+ >>> import pystache
+ >>> print pystache.render('Hi {{person}}!', {'person': 'Mom'})
+ Hi Mom!
+
+ You can also create dedicated view classes to hold your view logic.
+
+ Here's your view class (in .../examples/readme.py):
+
+ ::
+
+ class SayHello(object):
+ def to(self):
+ return "Pizza"
+
+ Instantiating like so:
+
+ ::
+
+ >>> from pystache.tests.examples.readme import SayHello
+ >>> hello = SayHello()
+
+ Then your template, say\_hello.mustache (by default in the same
+ directory as your class definition):
+
+ ::
+
+ Hello, {{to}}!
+
+ Pull it together:
+
+ ::
+
+ >>> renderer = pystache.Renderer()
+ >>> print renderer.render(hello)
+ Hello, Pizza!
+
+ For greater control over rendering (e.g. to specify a custom template
+ directory), use the ``Renderer`` class like above. One can pass
+ attributes to the Renderer class constructor or set them on a Renderer
+ instance. To customize template loading on a per-view basis, subclass
+ ``TemplateSpec``. See the docstrings of the
+ `Renderer `__
+ class and
+ `TemplateSpec