Bug 1680802: Bump vendored virtualenv package r=firefox-build-system-reviewers,sheehan,glandium
☠☠ backed out by 3d3dde90bdbd ☠ ☠
authorMitchell Hentges <mhentges@mozilla.com>
Tue, 15 Dec 2020 18:17:53 +0000
changeset 560835 3fbd3ae18e3fb25f11f0add79947ba3417dcdc3a
parent 560834 b2d6946fb3a200465cb00d746806cc8a66a3ad44
child 560836 14747923c401f3a717a6bd5675c2561508d4822b
push id132870
push usermhentges@mozilla.com
push dateTue, 15 Dec 2020 20:14:45 +0000
treeherderautoland@14747923c401 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersfirefox-build-system-reviewers, sheehan, glandium
bugs1680802
milestone86.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1680802: Bump vendored virtualenv package r=firefox-build-system-reviewers,sheehan,glandium The `wheel` package was failing with Mac Big Sur. It's been updated, but our `virtualenv` package has its own vendored `wheel` package that is out-of-date. This updates `virtualenv` to "20.2.2". This should solve "assert len(base_version) == 2" and "would build wheel with unsupported tag" errors. Differential Revision: https://phabricator.services.mozilla.com/D99482
third_party/python/virtualenv/__main__.py
third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/py.typed
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_common.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py2.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py3.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/abc.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/py.typed
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/readers.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/trees.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/__init__.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_common.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_compat.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py2.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py3.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/abc.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/py.typed
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/readers.py
third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/trees.py
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir.py
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/LICENSE
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/METADATA
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/RECORD
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/WHEEL
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/top_level.txt
third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp.py
third_party/python/virtualenv/distributions.json
third_party/python/virtualenv/modules.json
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/LICENSE
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/METADATA
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/RECORD
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/WHEEL
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/entry_points.txt
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/top_level.txt
third_party/python/virtualenv/virtualenv-20.0.31.dist-info/zip-safe
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/LICENSE
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/METADATA
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/RECORD
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/WHEEL
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/entry_points.txt
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/top_level.txt
third_party/python/virtualenv/virtualenv-20.2.2.dist-info/zip-safe
third_party/python/virtualenv/virtualenv/activation/bash/activate.sh
third_party/python/virtualenv/virtualenv/activation/powershell/activate.ps1
third_party/python/virtualenv/virtualenv/activation/via_template.py
third_party/python/virtualenv/virtualenv/app_data/__init__.py
third_party/python/virtualenv/virtualenv/app_data/base.py
third_party/python/virtualenv/virtualenv/app_data/na.py
third_party/python/virtualenv/virtualenv/app_data/read_only.py
third_party/python/virtualenv/virtualenv/app_data/via_disk_folder.py
third_party/python/virtualenv/virtualenv/app_data/via_tempdir.py
third_party/python/virtualenv/virtualenv/config/convert.py
third_party/python/virtualenv/virtualenv/create/creator.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/api.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/common.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/mac_os.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/common.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/site.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/ref.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/via_global_self_do.py
third_party/python/virtualenv/virtualenv/create/via_global_ref/venv.py
third_party/python/virtualenv/virtualenv/discovery/builtin.py
third_party/python/virtualenv/virtualenv/discovery/cached_py_info.py
third_party/python/virtualenv/virtualenv/discovery/py_info.py
third_party/python/virtualenv/virtualenv/run/__init__.py
third_party/python/virtualenv/virtualenv/run/plugin/creators.py
third_party/python/virtualenv/virtualenv/run/plugin/discovery.py
third_party/python/virtualenv/virtualenv/run/plugin/seeders.py
third_party/python/virtualenv/virtualenv/run/session.py
third_party/python/virtualenv/virtualenv/seed/embed/base_embed.py
third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/via_app_data.py
third_party/python/virtualenv/virtualenv/seed/wheels/acquire.py
third_party/python/virtualenv/virtualenv/seed/wheels/bundle.py
third_party/python/virtualenv/virtualenv/seed/wheels/embed/__init__.py
third_party/python/virtualenv/virtualenv/seed/wheels/embed/pip-20.2.2-py2.py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/pip-20.3.1-py2.py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/setuptools-49.6.0-py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/setuptools-50.3.2-py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/setuptools-51.0.0-py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/wheel-0.35.1-py2.py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/embed/wheel-0.36.1-py2.py3-none-any.whl
third_party/python/virtualenv/virtualenv/seed/wheels/periodic_update.py
third_party/python/virtualenv/virtualenv/util/lock.py
third_party/python/virtualenv/virtualenv/util/path/_pathlib/__init__.py
third_party/python/virtualenv/virtualenv/util/path/_pathlib/via_os_path.py
third_party/python/virtualenv/virtualenv/util/path/_sync.py
third_party/python/virtualenv/virtualenv/util/subprocess/__init__.py
third_party/python/virtualenv/virtualenv/util/subprocess/_win_subprocess.py
third_party/python/virtualenv/virtualenv/version.py
--- a/third_party/python/virtualenv/__main__.py
+++ b/third_party/python/virtualenv/__main__.py
@@ -1,15 +1,15 @@
 import json
 import os
 import sys
 import zipfile
 
 ABS_HERE = os.path.abspath(os.path.dirname(__file__))
-NEW_IMPORT_SYSTEM = sys.version_info[0:2] > (3, 4)
+NEW_IMPORT_SYSTEM = sys.version_info[0] == 3
 
 
 class VersionPlatformSelect(object):
     def __init__(self):
         self.archive = ABS_HERE
         self._zip_file = zipfile.ZipFile(ABS_HERE, "r")
         self.modules = self._load("modules.json")
         self.distributions = self._load("distributions.json")
--- a/third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/RECORD
+++ b/third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/RECORD
@@ -1,6 +1,6 @@
 filelock.py,sha256=5DQTtOaQq7-vgLkZzvOhqhVMh_umfydWgSA8Vuzmf8M,13229
 filelock-3.0.12.dist-info/LICENSE,sha256=iNm062BXnBkew5HKBMFhMFctfu3EqG2qWL8oxuFMm80,1210
 filelock-3.0.12.dist-info/METADATA,sha256=gjzbv9nxtD-Rj2ysjUuG7SLZCHUQl5hMy68Jij8soPw,4343
-filelock-3.0.12.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
+filelock-3.0.12.dist-info/WHEEL,sha256=EVRjI69F5qVjm_YgqcTXPnTAv3BfSUr0WVAHuSP3Xoo,92
 filelock-3.0.12.dist-info/top_level.txt,sha256=NDrf9i5BNogz4hEdsr6Hi7Ws3TlSSKY4Q2Y9_-i2GwU,9
 filelock-3.0.12.dist-info/RECORD,,
--- a/third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/WHEEL
+++ b/third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/WHEEL
@@ -1,5 +1,5 @@
 Wheel-Version: 1.0
-Generator: bdist_wheel (0.34.2)
+Generator: bdist_wheel (0.35.1)
 Root-Is-Purelib: true
 Tag: py3-none-any
 
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/METADATA
+++ /dev/null
@@ -1,66 +0,0 @@
-Metadata-Version: 2.1
-Name: importlib-metadata
-Version: 1.7.0
-Summary: Read metadata from Python packages
-Home-page: http://importlib-metadata.readthedocs.io/
-Author: Barry Warsaw
-Author-email: barry@python.org
-License: Apache Software License
-Platform: UNKNOWN
-Classifier: Development Status :: 3 - Alpha
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 2
-Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
-Requires-Dist: zipp (>=0.5)
-Requires-Dist: pathlib2 ; python_version < "3"
-Requires-Dist: contextlib2 ; python_version < "3"
-Requires-Dist: configparser (>=3.5) ; python_version < "3"
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: rst.linker ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: packaging ; extra == 'testing'
-Requires-Dist: pep517 ; extra == 'testing'
-Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing'
-
-=========================
- ``importlib_metadata``
-=========================
-
-``importlib_metadata`` is a library to access the metadata for a Python
-package.  It is intended to be ported to Python 3.8.
-
-
-Usage
-=====
-
-See the `online documentation <https://importlib_metadata.readthedocs.io/>`_
-for usage details.
-
-`Finder authors
-<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can
-also add support for custom package installers.  See the above documentation
-for details.
-
-
-Caveats
-=======
-
-This project primarily supports third-party packages installed by PyPA
-tools (or other conforming packages). It does not support:
-
-- Packages in the stdlib.
-- Packages installed without metadata.
-
-Project details
-===============
-
- * Project home: https://gitlab.com/python-devs/importlib_metadata
- * Report bugs at: https://gitlab.com/python-devs/importlib_metadata/issues
- * Code hosting: https://gitlab.com/python-devs/importlib_metadata.git
- * Documentation: http://importlib_metadata.readthedocs.io/
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/RECORD
+++ /dev/null
@@ -1,21 +0,0 @@
-importlib_metadata/__init__.py,sha256=phnrEcGP-8cF-_ZZ5peJL4cUVAANOK0CpSWC-0-IVAs,18961
-importlib_metadata/_compat.py,sha256=DnM55BbJKFCcZmJOkArmyO76-0g7pA6HEfzSYWXN88k,4417
-importlib_metadata/docs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_metadata/docs/changelog.rst,sha256=6EZfl84T0SQHzAXNlTiTegG0cBTa9wiMt0od0ht2n_8,8739
-importlib_metadata/docs/conf.py,sha256=m-b6Mju5gFkpSHh-lyJ4iwqf_8t4LjYYFRumtutQSZc,5578
-importlib_metadata/docs/index.rst,sha256=rbXrDkLAKLIDccqME5u9CCMEfMKprqzQOkIOuwOnfz4,1907
-importlib_metadata/docs/using.rst,sha256=k_L4Hwwsf10ap9xWejyC-_gLz_WtvRfDOzuJA3o7Zw0,9504
-importlib_metadata/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_metadata/tests/fixtures.py,sha256=Ua_PqyqBhFqkkNGFsXtgMah6vXKQjeqKo1KhhzYdn-w,5752
-importlib_metadata/tests/test_api.py,sha256=YMAGTsRENrtvpw2CSLmRndJMBeT4q_M0GSe-QsnnMZ4,5544
-importlib_metadata/tests/test_integration.py,sha256=ykJpwjSkVwvWHG4gUw4RUrZzU_7JKX8vZyPf_kFIrLE,1579
-importlib_metadata/tests/test_main.py,sha256=dcsDqyxTRtard2j5ysDDvVwfK6vvXdRtZCaQ0QljSR8,9026
-importlib_metadata/tests/test_zip.py,sha256=lOCNPyfJSm9nz0-2RQndM7OQV-_gRjJzyRnvMqXqRSI,2675
-importlib_metadata/tests/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_metadata/tests/data/example-21.12-py3-none-any.whl,sha256=I-kYufETid-tDYyR8f1OFJ3t5u_Io23k0cbQxJTUN4I,1455
-importlib_metadata/tests/data/example-21.12-py3.6.egg,sha256=-EeugFAijkdUO9xyQHTZkQwZoFXK0_QxICBj6R5AAJo,1497
-importlib_metadata-1.7.0.dist-info/LICENSE,sha256=wNe6dAchmJ1VvVB8D9oTc-gHHadCuaSBAev36sYEM6U,571
-importlib_metadata-1.7.0.dist-info/METADATA,sha256=AvM2AcUhNbF_2Yyo8ttyVBCh_qGbRHaRE3MVgrHYDVw,2144
-importlib_metadata-1.7.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
-importlib_metadata-1.7.0.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19
-importlib_metadata-1.7.0.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.34.2)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py
+++ /dev/null
@@ -1,623 +0,0 @@
-from __future__ import unicode_literals, absolute_import
-
-import io
-import os
-import re
-import abc
-import csv
-import sys
-import zipp
-import operator
-import functools
-import itertools
-import posixpath
-import collections
-
-from ._compat import (
-    install,
-    NullFinder,
-    ConfigParser,
-    suppress,
-    map,
-    FileNotFoundError,
-    IsADirectoryError,
-    NotADirectoryError,
-    PermissionError,
-    pathlib,
-    ModuleNotFoundError,
-    MetaPathFinder,
-    email_message_from_string,
-    PyPy_repr,
-    unique_ordered,
-    str,
-    )
-from importlib import import_module
-from itertools import starmap
-
-
-__metaclass__ = type
-
-
-__all__ = [
-    'Distribution',
-    'DistributionFinder',
-    'PackageNotFoundError',
-    'distribution',
-    'distributions',
-    'entry_points',
-    'files',
-    'metadata',
-    'requires',
-    'version',
-    ]
-
-
-class PackageNotFoundError(ModuleNotFoundError):
-    """The package was not found."""
-
-    def __str__(self):
-        tmpl = "No package metadata was found for {self.name}"
-        return tmpl.format(**locals())
-
-    @property
-    def name(self):
-        name, = self.args
-        return name
-
-
-class EntryPoint(
-        PyPy_repr,
-        collections.namedtuple('EntryPointBase', 'name value group')):
-    """An entry point as defined by Python packaging conventions.
-
-    See `the packaging docs on entry points
-    <https://packaging.python.org/specifications/entry-points/>`_
-    for more information.
-    """
-
-    pattern = re.compile(
-        r'(?P<module>[\w.]+)\s*'
-        r'(:\s*(?P<attr>[\w.]+))?\s*'
-        r'(?P<extras>\[.*\])?\s*$'
-        )
-    """
-    A regular expression describing the syntax for an entry point,
-    which might look like:
-
-        - module
-        - package.module
-        - package.module:attribute
-        - package.module:object.attribute
-        - package.module:attr [extra1, extra2]
-
-    Other combinations are possible as well.
-
-    The expression is lenient about whitespace around the ':',
-    following the attr, and following any extras.
-    """
-
-    def load(self):
-        """Load the entry point from its definition. If only a module
-        is indicated by the value, return that module. Otherwise,
-        return the named object.
-        """
-        match = self.pattern.match(self.value)
-        module = import_module(match.group('module'))
-        attrs = filter(None, (match.group('attr') or '').split('.'))
-        return functools.reduce(getattr, attrs, module)
-
-    @property
-    def module(self):
-        match = self.pattern.match(self.value)
-        return match.group('module')
-
-    @property
-    def attr(self):
-        match = self.pattern.match(self.value)
-        return match.group('attr')
-
-    @property
-    def extras(self):
-        match = self.pattern.match(self.value)
-        return list(re.finditer(r'\w+', match.group('extras') or ''))
-
-    @classmethod
-    def _from_config(cls, config):
-        return [
-            cls(name, value, group)
-            for group in config.sections()
-            for name, value in config.items(group)
-            ]
-
-    @classmethod
-    def _from_text(cls, text):
-        config = ConfigParser(delimiters='=')
-        # case sensitive: https://stackoverflow.com/q/1611799/812183
-        config.optionxform = str
-        try:
-            config.read_string(text)
-        except AttributeError:  # pragma: nocover
-            # Python 2 has no read_string
-            config.readfp(io.StringIO(text))
-        return EntryPoint._from_config(config)
-
-    def __iter__(self):
-        """
-        Supply iter so one may construct dicts of EntryPoints easily.
-        """
-        return iter((self.name, self))
-
-    def __reduce__(self):
-        return (
-            self.__class__,
-            (self.name, self.value, self.group),
-            )
-
-
-class PackagePath(pathlib.PurePosixPath):
-    """A reference to a path in a package"""
-
-    def read_text(self, encoding='utf-8'):
-        with self.locate().open(encoding=encoding) as stream:
-            return stream.read()
-
-    def read_binary(self):
-        with self.locate().open('rb') as stream:
-            return stream.read()
-
-    def locate(self):
-        """Return a path-like object for this path"""
-        return self.dist.locate_file(self)
-
-
-class FileHash:
-    def __init__(self, spec):
-        self.mode, _, self.value = spec.partition('=')
-
-    def __repr__(self):
-        return '<FileHash mode: {} value: {}>'.format(self.mode, self.value)
-
-
-class Distribution:
-    """A Python distribution package."""
-
-    @abc.abstractmethod
-    def read_text(self, filename):
-        """Attempt to load metadata file given by the name.
-
-        :param filename: The name of the file in the distribution info.
-        :return: The text if found, otherwise None.
-        """
-
-    @abc.abstractmethod
-    def locate_file(self, path):
-        """
-        Given a path to a file in this distribution, return a path
-        to it.
-        """
-
-    @classmethod
-    def from_name(cls, name):
-        """Return the Distribution for the given package name.
-
-        :param name: The name of the distribution package to search for.
-        :return: The Distribution instance (or subclass thereof) for the named
-            package, if found.
-        :raises PackageNotFoundError: When the named package's distribution
-            metadata cannot be found.
-        """
-        for resolver in cls._discover_resolvers():
-            dists = resolver(DistributionFinder.Context(name=name))
-            dist = next(iter(dists), None)
-            if dist is not None:
-                return dist
-        else:
-            raise PackageNotFoundError(name)
-
-    @classmethod
-    def discover(cls, **kwargs):
-        """Return an iterable of Distribution objects for all packages.
-
-        Pass a ``context`` or pass keyword arguments for constructing
-        a context.
-
-        :context: A ``DistributionFinder.Context`` object.
-        :return: Iterable of Distribution objects for all packages.
-        """
-        context = kwargs.pop('context', None)
-        if context and kwargs:
-            raise ValueError("cannot accept context and kwargs")
-        context = context or DistributionFinder.Context(**kwargs)
-        return itertools.chain.from_iterable(
-            resolver(context)
-            for resolver in cls._discover_resolvers()
-            )
-
-    @staticmethod
-    def at(path):
-        """Return a Distribution for the indicated metadata path
-
-        :param path: a string or path-like object
-        :return: a concrete Distribution instance for the path
-        """
-        return PathDistribution(pathlib.Path(path))
-
-    @staticmethod
-    def _discover_resolvers():
-        """Search the meta_path for resolvers."""
-        declared = (
-            getattr(finder, 'find_distributions', None)
-            for finder in sys.meta_path
-            )
-        return filter(None, declared)
-
-    @classmethod
-    def _local(cls, root='.'):
-        from pep517 import build, meta
-        system = build.compat_system(root)
-        builder = functools.partial(
-            meta.build,
-            source_dir=root,
-            system=system,
-            )
-        return PathDistribution(zipp.Path(meta.build_as_zip(builder)))
-
-    @property
-    def metadata(self):
-        """Return the parsed metadata for this Distribution.
-
-        The returned object will have keys that name the various bits of
-        metadata.  See PEP 566 for details.
-        """
-        text = (
-            self.read_text('METADATA')
-            or self.read_text('PKG-INFO')
-            # This last clause is here to support old egg-info files.  Its
-            # effect is to just end up using the PathDistribution's self._path
-            # (which points to the egg-info file) attribute unchanged.
-            or self.read_text('')
-            )
-        return email_message_from_string(text)
-
-    @property
-    def version(self):
-        """Return the 'Version' metadata for the distribution package."""
-        return self.metadata['Version']
-
-    @property
-    def entry_points(self):
-        return EntryPoint._from_text(self.read_text('entry_points.txt'))
-
-    @property
-    def files(self):
-        """Files in this distribution.
-
-        :return: List of PackagePath for this distribution or None
-
-        Result is `None` if the metadata file that enumerates files
-        (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is
-        missing.
-        Result may be empty if the metadata exists but is empty.
-        """
-        file_lines = self._read_files_distinfo() or self._read_files_egginfo()
-
-        def make_file(name, hash=None, size_str=None):
-            result = PackagePath(name)
-            result.hash = FileHash(hash) if hash else None
-            result.size = int(size_str) if size_str else None
-            result.dist = self
-            return result
-
-        return file_lines and list(starmap(make_file, csv.reader(file_lines)))
-
-    def _read_files_distinfo(self):
-        """
-        Read the lines of RECORD
-        """
-        text = self.read_text('RECORD')
-        return text and text.splitlines()
-
-    def _read_files_egginfo(self):
-        """
-        SOURCES.txt might contain literal commas, so wrap each line
-        in quotes.
-        """
-        text = self.read_text('SOURCES.txt')
-        return text and map('"{}"'.format, text.splitlines())
-
-    @property
-    def requires(self):
-        """Generated requirements specified for this Distribution"""
-        reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs()
-        return reqs and list(reqs)
-
-    def _read_dist_info_reqs(self):
-        return self.metadata.get_all('Requires-Dist')
-
-    def _read_egg_info_reqs(self):
-        source = self.read_text('requires.txt')
-        return source and self._deps_from_requires_text(source)
-
-    @classmethod
-    def _deps_from_requires_text(cls, source):
-        section_pairs = cls._read_sections(source.splitlines())
-        sections = {
-            section: list(map(operator.itemgetter('line'), results))
-            for section, results in
-            itertools.groupby(section_pairs, operator.itemgetter('section'))
-            }
-        return cls._convert_egg_info_reqs_to_simple_reqs(sections)
-
-    @staticmethod
-    def _read_sections(lines):
-        section = None
-        for line in filter(None, lines):
-            section_match = re.match(r'\[(.*)\]$', line)
-            if section_match:
-                section = section_match.group(1)
-                continue
-            yield locals()
-
-    @staticmethod
-    def _convert_egg_info_reqs_to_simple_reqs(sections):
-        """
-        Historically, setuptools would solicit and store 'extra'
-        requirements, including those with environment markers,
-        in separate sections. More modern tools expect each
-        dependency to be defined separately, with any relevant
-        extras and environment markers attached directly to that
-        requirement. This method converts the former to the
-        latter. See _test_deps_from_requires_text for an example.
-        """
-        def make_condition(name):
-            return name and 'extra == "{name}"'.format(name=name)
-
-        def parse_condition(section):
-            section = section or ''
-            extra, sep, markers = section.partition(':')
-            if extra and markers:
-                markers = '({markers})'.format(markers=markers)
-            conditions = list(filter(None, [markers, make_condition(extra)]))
-            return '; ' + ' and '.join(conditions) if conditions else ''
-
-        for section, deps in sections.items():
-            for dep in deps:
-                yield dep + parse_condition(section)
-
-
-class DistributionFinder(MetaPathFinder):
-    """
-    A MetaPathFinder capable of discovering installed distributions.
-    """
-
-    class Context:
-        """
-        Keyword arguments presented by the caller to
-        ``distributions()`` or ``Distribution.discover()``
-        to narrow the scope of a search for distributions
-        in all DistributionFinders.
-
-        Each DistributionFinder may expect any parameters
-        and should attempt to honor the canonical
-        parameters defined below when appropriate.
-        """
-
-        name = None
-        """
-        Specific name for which a distribution finder should match.
-        A name of ``None`` matches all distributions.
-        """
-
-        def __init__(self, **kwargs):
-            vars(self).update(kwargs)
-
-        @property
-        def path(self):
-            """
-            The path that a distribution finder should search.
-
-            Typically refers to Python package paths and defaults
-            to ``sys.path``.
-            """
-            return vars(self).get('path', sys.path)
-
-    @abc.abstractmethod
-    def find_distributions(self, context=Context()):
-        """
-        Find distributions.
-
-        Return an iterable of all Distribution instances capable of
-        loading the metadata for packages matching the ``context``,
-        a DistributionFinder.Context instance.
-        """
-
-
-class FastPath:
-    """
-    Micro-optimized class for searching a path for
-    children.
-    """
-
-    def __init__(self, root):
-        self.root = str(root)
-        self.base = os.path.basename(self.root).lower()
-
-    def joinpath(self, child):
-        return pathlib.Path(self.root, child)
-
-    def children(self):
-        with suppress(Exception):
-            return os.listdir(self.root or '')
-        with suppress(Exception):
-            return self.zip_children()
-        return []
-
-    def zip_children(self):
-        zip_path = zipp.Path(self.root)
-        names = zip_path.root.namelist()
-        self.joinpath = zip_path.joinpath
-
-        return unique_ordered(
-            child.split(posixpath.sep, 1)[0]
-            for child in names
-            )
-
-    def is_egg(self, search):
-        base = self.base
-        return (
-            base == search.versionless_egg_name
-            or base.startswith(search.prefix)
-            and base.endswith('.egg'))
-
-    def search(self, name):
-        for child in self.children():
-            n_low = child.lower()
-            if (n_low in name.exact_matches
-                    or n_low.startswith(name.prefix)
-                    and n_low.endswith(name.suffixes)
-                    # legacy case:
-                    or self.is_egg(name) and n_low == 'egg-info'):
-                yield self.joinpath(child)
-
-
-class Prepared:
-    """
-    A prepared search for metadata on a possibly-named package.
-    """
-    normalized = ''
-    prefix = ''
-    suffixes = '.dist-info', '.egg-info'
-    exact_matches = [''][:0]
-    versionless_egg_name = ''
-
-    def __init__(self, name):
-        self.name = name
-        if name is None:
-            return
-        self.normalized = name.lower().replace('-', '_')
-        self.prefix = self.normalized + '-'
-        self.exact_matches = [
-            self.normalized + suffix for suffix in self.suffixes]
-        self.versionless_egg_name = self.normalized + '.egg'
-
-
-@install
-class MetadataPathFinder(NullFinder, DistributionFinder):
-    """A degenerate finder for distribution packages on the file system.
-
-    This finder supplies only a find_distributions() method for versions
-    of Python that do not have a PathFinder find_distributions().
-    """
-
-    def find_distributions(self, context=DistributionFinder.Context()):
-        """
-        Find distributions.
-
-        Return an iterable of all Distribution instances capable of
-        loading the metadata for packages matching ``context.name``
-        (or all names if ``None`` indicated) along the paths in the list
-        of directories ``context.path``.
-        """
-        found = self._search_paths(context.name, context.path)
-        return map(PathDistribution, found)
-
-    @classmethod
-    def _search_paths(cls, name, paths):
-        """Find metadata directories in paths heuristically."""
-        return itertools.chain.from_iterable(
-            path.search(Prepared(name))
-            for path in map(FastPath, paths)
-            )
-
-
-class PathDistribution(Distribution):
-    def __init__(self, path):
-        """Construct a distribution from a path to the metadata directory.
-
-        :param path: A pathlib.Path or similar object supporting
-                     .joinpath(), __div__, .parent, and .read_text().
-        """
-        self._path = path
-
-    def read_text(self, filename):
-        with suppress(FileNotFoundError, IsADirectoryError, KeyError,
-                      NotADirectoryError, PermissionError):
-            return self._path.joinpath(filename).read_text(encoding='utf-8')
-    read_text.__doc__ = Distribution.read_text.__doc__
-
-    def locate_file(self, path):
-        return self._path.parent / path
-
-
-def distribution(distribution_name):
-    """Get the ``Distribution`` instance for the named package.
-
-    :param distribution_name: The name of the distribution package as a string.
-    :return: A ``Distribution`` instance (or subclass thereof).
-    """
-    return Distribution.from_name(distribution_name)
-
-
-def distributions(**kwargs):
-    """Get all ``Distribution`` instances in the current environment.
-
-    :return: An iterable of ``Distribution`` instances.
-    """
-    return Distribution.discover(**kwargs)
-
-
-def metadata(distribution_name):
-    """Get the metadata for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: An email.Message containing the parsed metadata.
-    """
-    return Distribution.from_name(distribution_name).metadata
-
-
-def version(distribution_name):
-    """Get the version string for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: The version string for the package as defined in the package's
-        "Version" metadata key.
-    """
-    return distribution(distribution_name).version
-
-
-def entry_points():
-    """Return EntryPoint objects for all installed packages.
-
-    :return: EntryPoint objects for all installed packages.
-    """
-    eps = itertools.chain.from_iterable(
-        dist.entry_points for dist in distributions())
-    by_group = operator.attrgetter('group')
-    ordered = sorted(eps, key=by_group)
-    grouped = itertools.groupby(ordered, by_group)
-    return {
-        group: tuple(eps)
-        for group, eps in grouped
-        }
-
-
-def files(distribution_name):
-    """Return a list of files for the named package.
-
-    :param distribution_name: The name of the distribution package to query.
-    :return: List of files composing the distribution.
-    """
-    return distribution(distribution_name).files
-
-
-def requires(distribution_name):
-    """
-    Return a list of requirements for the named package.
-
-    :return: An iterator of requirements, suitable for
-    packaging.requirement.Requirement.
-    """
-    return distribution(distribution_name).requires
-
-
-__version__ = version(__name__)
rename from third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/LICENSE
rename to third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/METADATA
@@ -0,0 +1,73 @@
+Metadata-Version: 2.1
+Name: importlib-metadata
+Version: 2.1.1
+Summary: Read metadata from Python packages
+Home-page: http://importlib-metadata.readthedocs.io/
+Author: Jason R. Coombs
+Author-email: jaraco@jaraco.com
+License: Apache Software License
+Platform: UNKNOWN
+Classifier: Development Status :: 3 - Alpha
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 2
+Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
+Requires-Dist: zipp (>=0.5)
+Requires-Dist: pathlib2 ; python_version < "3"
+Requires-Dist: contextlib2 ; python_version < "3"
+Requires-Dist: configparser (>=3.5) ; python_version < "3"
+Provides-Extra: docs
+Requires-Dist: sphinx ; extra == 'docs'
+Requires-Dist: rst.linker ; extra == 'docs'
+Provides-Extra: testing
+Requires-Dist: packaging ; extra == 'testing'
+Requires-Dist: pep517 ; extra == 'testing'
+Requires-Dist: unittest2 ; (python_version < "3") and extra == 'testing'
+Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing'
+
+=========================
+ ``importlib_metadata``
+=========================
+
+``importlib_metadata`` is a library to access the metadata for a
+Python package.
+
+As of Python 3.8, this functionality has been added to the
+`Python standard library
+<https://docs.python.org/3/library/importlib.metadata.html>`_.
+This package supplies backports of that functionality including
+improvements added to subsequent Python versions.
+
+
+Usage
+=====
+
+See the `online documentation <https://importlib_metadata.readthedocs.io/>`_
+for usage details.
+
+`Finder authors
+<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can
+also add support for custom package installers.  See the above documentation
+for details.
+
+
+Caveats
+=======
+
+This project primarily supports third-party packages installed by PyPA
+tools (or other conforming packages). It does not support:
+
+- Packages in the stdlib.
+- Packages installed without metadata.
+
+Project details
+===============
+
+ * Project home: https://github.com/python/importlib_metadata
+ * Report bugs at: https://github.com/python/importlib_metadata/issues
+ * Code hosting: https://github.com/python/importlib_metadata
+ * Documentation: https://importlib_metadata.readthedocs.io/
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/RECORD
@@ -0,0 +1,7 @@
+importlib_metadata/__init__.py,sha256=uaN7KDLs3-irvgwsxg4VZIuY3ZEo3jhu1dShjE7fR88,19587
+importlib_metadata/_compat.py,sha256=DnM55BbJKFCcZmJOkArmyO76-0g7pA6HEfzSYWXN88k,4417
+importlib_metadata-2.1.1.dist-info/LICENSE,sha256=wNe6dAchmJ1VvVB8D9oTc-gHHadCuaSBAev36sYEM6U,571
+importlib_metadata-2.1.1.dist-info/METADATA,sha256=gBf5nX-Ff6_Ue9dSH4dkWg2FCNHHtQrs6mhunTAac8k,2421
+importlib_metadata-2.1.1.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
+importlib_metadata-2.1.1.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19
+importlib_metadata-2.1.1.dist-info/RECORD,,
rename from third_party/python/virtualenv/virtualenv-20.0.31.dist-info/WHEEL
rename to third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/WHEEL
rename from third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/top_level.txt
rename to third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info/top_level.txt
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/__init__.py
@@ -0,0 +1,644 @@
+from __future__ import unicode_literals, absolute_import
+
+import io
+import os
+import re
+import abc
+import csv
+import sys
+import zipp
+import operator
+import functools
+import itertools
+import posixpath
+import collections
+
+from ._compat import (
+    install,
+    NullFinder,
+    ConfigParser,
+    suppress,
+    map,
+    FileNotFoundError,
+    IsADirectoryError,
+    NotADirectoryError,
+    PermissionError,
+    pathlib,
+    ModuleNotFoundError,
+    MetaPathFinder,
+    email_message_from_string,
+    PyPy_repr,
+    unique_ordered,
+    str,
+    )
+from importlib import import_module
+from itertools import starmap
+
+
+__metaclass__ = type
+
+
+__all__ = [
+    'Distribution',
+    'DistributionFinder',
+    'PackageNotFoundError',
+    'distribution',
+    'distributions',
+    'entry_points',
+    'files',
+    'metadata',
+    'requires',
+    'version',
+    ]
+
+
+class PackageNotFoundError(ModuleNotFoundError):
+    """The package was not found."""
+
+    def __str__(self):
+        tmpl = "No package metadata was found for {self.name}"
+        return tmpl.format(**locals())
+
+    @property
+    def name(self):
+        name, = self.args
+        return name
+
+
+class EntryPoint(
+        PyPy_repr,
+        collections.namedtuple('EntryPointBase', 'name value group')):
+    """An entry point as defined by Python packaging conventions.
+
+    See `the packaging docs on entry points
+    <https://packaging.python.org/specifications/entry-points/>`_
+    for more information.
+    """
+
+    pattern = re.compile(
+        r'(?P<module>[\w.]+)\s*'
+        r'(:\s*(?P<attr>[\w.]+))?\s*'
+        r'(?P<extras>\[.*\])?\s*$'
+        )
+    """
+    A regular expression describing the syntax for an entry point,
+    which might look like:
+
+        - module
+        - package.module
+        - package.module:attribute
+        - package.module:object.attribute
+        - package.module:attr [extra1, extra2]
+
+    Other combinations are possible as well.
+
+    The expression is lenient about whitespace around the ':',
+    following the attr, and following any extras.
+    """
+
+    def load(self):
+        """Load the entry point from its definition. If only a module
+        is indicated by the value, return that module. Otherwise,
+        return the named object.
+        """
+        match = self.pattern.match(self.value)
+        module = import_module(match.group('module'))
+        attrs = filter(None, (match.group('attr') or '').split('.'))
+        return functools.reduce(getattr, attrs, module)
+
+    @property
+    def module(self):
+        match = self.pattern.match(self.value)
+        return match.group('module')
+
+    @property
+    def attr(self):
+        match = self.pattern.match(self.value)
+        return match.group('attr')
+
+    @property
+    def extras(self):
+        match = self.pattern.match(self.value)
+        return list(re.finditer(r'\w+', match.group('extras') or ''))
+
+    @classmethod
+    def _from_config(cls, config):
+        return [
+            cls(name, value, group)
+            for group in config.sections()
+            for name, value in config.items(group)
+            ]
+
+    @classmethod
+    def _from_text(cls, text):
+        config = ConfigParser(delimiters='=')
+        # case sensitive: https://stackoverflow.com/q/1611799/812183
+        config.optionxform = str
+        try:
+            config.read_string(text)
+        except AttributeError:  # pragma: nocover
+            # Python 2 has no read_string
+            config.readfp(io.StringIO(text))
+        return EntryPoint._from_config(config)
+
+    def __iter__(self):
+        """
+        Supply iter so one may construct dicts of EntryPoints easily.
+        """
+        return iter((self.name, self))
+
+    def __reduce__(self):
+        return (
+            self.__class__,
+            (self.name, self.value, self.group),
+            )
+
+
+class PackagePath(pathlib.PurePosixPath):
+    """A reference to a path in a package"""
+
+    def read_text(self, encoding='utf-8'):
+        with self.locate().open(encoding=encoding) as stream:
+            return stream.read()
+
+    def read_binary(self):
+        with self.locate().open('rb') as stream:
+            return stream.read()
+
+    def locate(self):
+        """Return a path-like object for this path"""
+        return self.dist.locate_file(self)
+
+
+class FileHash:
+    def __init__(self, spec):
+        self.mode, _, self.value = spec.partition('=')
+
+    def __repr__(self):
+        return '<FileHash mode: {} value: {}>'.format(self.mode, self.value)
+
+
+class Distribution:
+    """A Python distribution package."""
+
+    @abc.abstractmethod
+    def read_text(self, filename):
+        """Attempt to load metadata file given by the name.
+
+        :param filename: The name of the file in the distribution info.
+        :return: The text if found, otherwise None.
+        """
+
+    @abc.abstractmethod
+    def locate_file(self, path):
+        """
+        Given a path to a file in this distribution, return a path
+        to it.
+        """
+
+    @classmethod
+    def from_name(cls, name):
+        """Return the Distribution for the given package name.
+
+        :param name: The name of the distribution package to search for.
+        :return: The Distribution instance (or subclass thereof) for the named
+            package, if found.
+        :raises PackageNotFoundError: When the named package's distribution
+            metadata cannot be found.
+        """
+        for resolver in cls._discover_resolvers():
+            dists = resolver(DistributionFinder.Context(name=name))
+            dist = next(iter(dists), None)
+            if dist is not None:
+                return dist
+        else:
+            raise PackageNotFoundError(name)
+
+    @classmethod
+    def discover(cls, **kwargs):
+        """Return an iterable of Distribution objects for all packages.
+
+        Pass a ``context`` or pass keyword arguments for constructing
+        a context.
+
+        :context: A ``DistributionFinder.Context`` object.
+        :return: Iterable of Distribution objects for all packages.
+        """
+        context = kwargs.pop('context', None)
+        if context and kwargs:
+            raise ValueError("cannot accept context and kwargs")
+        context = context or DistributionFinder.Context(**kwargs)
+        return itertools.chain.from_iterable(
+            resolver(context)
+            for resolver in cls._discover_resolvers()
+            )
+
+    @staticmethod
+    def at(path):
+        """Return a Distribution for the indicated metadata path
+
+        :param path: a string or path-like object
+        :return: a concrete Distribution instance for the path
+        """
+        return PathDistribution(pathlib.Path(path))
+
+    @staticmethod
+    def _discover_resolvers():
+        """Search the meta_path for resolvers."""
+        declared = (
+            getattr(finder, 'find_distributions', None)
+            for finder in sys.meta_path
+            )
+        return filter(None, declared)
+
+    @classmethod
+    def _local(cls, root='.'):
+        from pep517 import build, meta
+        system = build.compat_system(root)
+        builder = functools.partial(
+            meta.build,
+            source_dir=root,
+            system=system,
+            )
+        return PathDistribution(zipp.Path(meta.build_as_zip(builder)))
+
+    @property
+    def metadata(self):
+        """Return the parsed metadata for this Distribution.
+
+        The returned object will have keys that name the various bits of
+        metadata.  See PEP 566 for details.
+        """
+        text = (
+            self.read_text('METADATA')
+            or self.read_text('PKG-INFO')
+            # This last clause is here to support old egg-info files.  Its
+            # effect is to just end up using the PathDistribution's self._path
+            # (which points to the egg-info file) attribute unchanged.
+            or self.read_text('')
+            )
+        return email_message_from_string(text)
+
+    @property
+    def version(self):
+        """Return the 'Version' metadata for the distribution package."""
+        return self.metadata['Version']
+
+    @property
+    def entry_points(self):
+        return EntryPoint._from_text(self.read_text('entry_points.txt'))
+
+    @property
+    def files(self):
+        """Files in this distribution.
+
+        :return: List of PackagePath for this distribution or None
+
+        Result is `None` if the metadata file that enumerates files
+        (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is
+        missing.
+        Result may be empty if the metadata exists but is empty.
+        """
+        file_lines = self._read_files_distinfo() or self._read_files_egginfo()
+
+        def make_file(name, hash=None, size_str=None):
+            result = PackagePath(name)
+            result.hash = FileHash(hash) if hash else None
+            result.size = int(size_str) if size_str else None
+            result.dist = self
+            return result
+
+        return file_lines and list(starmap(make_file, csv.reader(file_lines)))
+
+    def _read_files_distinfo(self):
+        """
+        Read the lines of RECORD
+        """
+        text = self.read_text('RECORD')
+        return text and text.splitlines()
+
+    def _read_files_egginfo(self):
+        """
+        SOURCES.txt might contain literal commas, so wrap each line
+        in quotes.
+        """
+        text = self.read_text('SOURCES.txt')
+        return text and map('"{}"'.format, text.splitlines())
+
+    @property
+    def requires(self):
+        """Generated requirements specified for this Distribution"""
+        reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs()
+        return reqs and list(reqs)
+
+    def _read_dist_info_reqs(self):
+        return self.metadata.get_all('Requires-Dist')
+
+    def _read_egg_info_reqs(self):
+        source = self.read_text('requires.txt')
+        return source and self._deps_from_requires_text(source)
+
+    @classmethod
+    def _deps_from_requires_text(cls, source):
+        section_pairs = cls._read_sections(source.splitlines())
+        sections = {
+            section: list(map(operator.itemgetter('line'), results))
+            for section, results in
+            itertools.groupby(section_pairs, operator.itemgetter('section'))
+            }
+        return cls._convert_egg_info_reqs_to_simple_reqs(sections)
+
+    @staticmethod
+    def _read_sections(lines):
+        section = None
+        for line in filter(None, lines):
+            section_match = re.match(r'\[(.*)\]$', line)
+            if section_match:
+                section = section_match.group(1)
+                continue
+            yield locals()
+
+    @staticmethod
+    def _convert_egg_info_reqs_to_simple_reqs(sections):
+        """
+        Historically, setuptools would solicit and store 'extra'
+        requirements, including those with environment markers,
+        in separate sections. More modern tools expect each
+        dependency to be defined separately, with any relevant
+        extras and environment markers attached directly to that
+        requirement. This method converts the former to the
+        latter. See _test_deps_from_requires_text for an example.
+        """
+        def make_condition(name):
+            return name and 'extra == "{name}"'.format(name=name)
+
+        def parse_condition(section):
+            section = section or ''
+            extra, sep, markers = section.partition(':')
+            if extra and markers:
+                markers = '({markers})'.format(markers=markers)
+            conditions = list(filter(None, [markers, make_condition(extra)]))
+            return '; ' + ' and '.join(conditions) if conditions else ''
+
+        for section, deps in sections.items():
+            for dep in deps:
+                yield dep + parse_condition(section)
+
+
+class DistributionFinder(MetaPathFinder):
+    """
+    A MetaPathFinder capable of discovering installed distributions.
+    """
+
+    class Context:
+        """
+        Keyword arguments presented by the caller to
+        ``distributions()`` or ``Distribution.discover()``
+        to narrow the scope of a search for distributions
+        in all DistributionFinders.
+
+        Each DistributionFinder may expect any parameters
+        and should attempt to honor the canonical
+        parameters defined below when appropriate.
+        """
+
+        name = None
+        """
+        Specific name for which a distribution finder should match.
+        A name of ``None`` matches all distributions.
+        """
+
+        def __init__(self, **kwargs):
+            vars(self).update(kwargs)
+
+        @property
+        def path(self):
+            """
+            The path that a distribution finder should search.
+
+            Typically refers to Python package paths and defaults
+            to ``sys.path``.
+            """
+            return vars(self).get('path', sys.path)
+
+    @abc.abstractmethod
+    def find_distributions(self, context=Context()):
+        """
+        Find distributions.
+
+        Return an iterable of all Distribution instances capable of
+        loading the metadata for packages matching the ``context``,
+        a DistributionFinder.Context instance.
+        """
+
+
+class FastPath:
+    """
+    Micro-optimized class for searching a path for
+    children.
+    """
+
+    def __init__(self, root):
+        self.root = str(root)
+        self.base = os.path.basename(self.root).lower()
+
+    def joinpath(self, child):
+        return pathlib.Path(self.root, child)
+
+    def children(self):
+        with suppress(Exception):
+            return os.listdir(self.root or '')
+        with suppress(Exception):
+            return self.zip_children()
+        return []
+
+    def zip_children(self):
+        zip_path = zipp.Path(self.root)
+        names = zip_path.root.namelist()
+        self.joinpath = zip_path.joinpath
+
+        return unique_ordered(
+            child.split(posixpath.sep, 1)[0]
+            for child in names
+            )
+
+    def search(self, name):
+        return (
+            self.joinpath(child)
+            for child in self.children()
+            if name.matches(child, self.base)
+            )
+
+
+class Prepared:
+    """
+    A prepared search for metadata on a possibly-named package.
+    """
+    normalized = None
+    suffixes = '.dist-info', '.egg-info'
+    exact_matches = [''][:0]
+
+    def __init__(self, name):
+        self.name = name
+        if name is None:
+            return
+        self.normalized = self.normalize(name)
+        self.exact_matches = [
+            self.normalized + suffix for suffix in self.suffixes]
+
+    @staticmethod
+    def normalize(name):
+        """
+        PEP 503 normalization plus dashes as underscores.
+        """
+        return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
+
+    @staticmethod
+    def legacy_normalize(name):
+        """
+        Normalize the package name as found in the convention in
+        older packaging tools versions and specs.
+        """
+        return name.lower().replace('-', '_')
+
+    def matches(self, cand, base):
+        low = cand.lower()
+        pre, ext = os.path.splitext(low)
+        name, sep, rest = pre.partition('-')
+        return (
+            low in self.exact_matches
+            or ext in self.suffixes and (
+                not self.normalized or
+                name.replace('.', '_') == self.normalized
+                )
+            # legacy case:
+            or self.is_egg(base) and low == 'egg-info'
+            )
+
+    def is_egg(self, base):
+        normalized = self.legacy_normalize(self.name or '')
+        prefix = normalized + '-' if normalized else ''
+        versionless_egg_name = normalized + '.egg' if self.name else ''
+        return (
+            base == versionless_egg_name
+            or base.startswith(prefix)
+            and base.endswith('.egg'))
+
+
+@install
+class MetadataPathFinder(NullFinder, DistributionFinder):
+    """A degenerate finder for distribution packages on the file system.
+
+    This finder supplies only a find_distributions() method for versions
+    of Python that do not have a PathFinder find_distributions().
+    """
+
+    def find_distributions(self, context=DistributionFinder.Context()):
+        """
+        Find distributions.
+
+        Return an iterable of all Distribution instances capable of
+        loading the metadata for packages matching ``context.name``
+        (or all names if ``None`` indicated) along the paths in the list
+        of directories ``context.path``.
+        """
+        found = self._search_paths(context.name, context.path)
+        return map(PathDistribution, found)
+
+    @classmethod
+    def _search_paths(cls, name, paths):
+        """Find metadata directories in paths heuristically."""
+        return itertools.chain.from_iterable(
+            path.search(Prepared(name))
+            for path in map(FastPath, paths)
+            )
+
+
+class PathDistribution(Distribution):
+    def __init__(self, path):
+        """Construct a distribution from a path to the metadata directory.
+
+        :param path: A pathlib.Path or similar object supporting
+                     .joinpath(), __div__, .parent, and .read_text().
+        """
+        self._path = path
+
+    def read_text(self, filename):
+        with suppress(FileNotFoundError, IsADirectoryError, KeyError,
+                      NotADirectoryError, PermissionError):
+            return self._path.joinpath(filename).read_text(encoding='utf-8')
+    read_text.__doc__ = Distribution.read_text.__doc__
+
+    def locate_file(self, path):
+        return self._path.parent / path
+
+
+def distribution(distribution_name):
+    """Get the ``Distribution`` instance for the named package.
+
+    :param distribution_name: The name of the distribution package as a string.
+    :return: A ``Distribution`` instance (or subclass thereof).
+    """
+    return Distribution.from_name(distribution_name)
+
+
+def distributions(**kwargs):
+    """Get all ``Distribution`` instances in the current environment.
+
+    :return: An iterable of ``Distribution`` instances.
+    """
+    return Distribution.discover(**kwargs)
+
+
+def metadata(distribution_name):
+    """Get the metadata for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: An email.Message containing the parsed metadata.
+    """
+    return Distribution.from_name(distribution_name).metadata
+
+
+def version(distribution_name):
+    """Get the version string for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: The version string for the package as defined in the package's
+        "Version" metadata key.
+    """
+    return distribution(distribution_name).version
+
+
+def entry_points():
+    """Return EntryPoint objects for all installed packages.
+
+    :return: EntryPoint objects for all installed packages.
+    """
+    eps = itertools.chain.from_iterable(
+        dist.entry_points for dist in distributions())
+    by_group = operator.attrgetter('group')
+    ordered = sorted(eps, key=by_group)
+    grouped = itertools.groupby(ordered, by_group)
+    return {
+        group: tuple(eps)
+        for group, eps in grouped
+        }
+
+
+def files(distribution_name):
+    """Return a list of files for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: List of files composing the distribution.
+    """
+    return distribution(distribution_name).files
+
+
+def requires(distribution_name):
+    """
+    Return a list of requirements for the named package.
+
+    :return: An iterator of requirements, suitable for
+    packaging.requirement.Requirement.
+    """
+    return distribution(distribution_name).requires
rename from third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/_compat.py
copy from third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/LICENSE
copy to third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/METADATA
@@ -0,0 +1,94 @@
+Metadata-Version: 2.1
+Name: importlib-metadata
+Version: 3.1.1
+Summary: Read metadata from Python packages
+Home-page: https://github.com/python/importlib_metadata
+Author: Jason R. Coombs
+Author-email: jaraco@jaraco.com
+License: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Requires-Python: >=3.6
+Requires-Dist: zipp (>=0.5)
+Provides-Extra: docs
+Requires-Dist: sphinx ; extra == 'docs'
+Requires-Dist: jaraco.packaging (>=3.2) ; extra == 'docs'
+Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
+Provides-Extra: testing
+Requires-Dist: pytest (!=3.7.3,>=3.5) ; extra == 'testing'
+Requires-Dist: pytest-checkdocs (>=1.2.3) ; extra == 'testing'
+Requires-Dist: pytest-flake8 ; extra == 'testing'
+Requires-Dist: pytest-cov ; extra == 'testing'
+Requires-Dist: jaraco.test (>=3.2.0) ; extra == 'testing'
+Requires-Dist: packaging ; extra == 'testing'
+Requires-Dist: pep517 ; extra == 'testing'
+Requires-Dist: pyfakefs ; extra == 'testing'
+Requires-Dist: flufl.flake8 ; extra == 'testing'
+Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing'
+Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy") and extra == 'testing'
+Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing'
+
+.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg
+   :target: `PyPI link`_
+
+.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg
+   :target: `PyPI link`_
+
+.. _PyPI link: https://pypi.org/project/importlib_metadata
+
+.. image:: https://github.com/python/importlib_metadata/workflows/Automated%20Tests/badge.svg
+   :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22Automated+Tests%22
+   :alt: Automated Tests
+
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+   :target: https://github.com/psf/black
+   :alt: Code style: Black
+
+.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest
+   :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest
+
+
+``importlib_metadata`` is a library to access the metadata for a
+Python package.
+
+As of Python 3.8, this functionality has been added to the
+`Python standard library
+<https://docs.python.org/3/library/importlib.metadata.html>`_.
+This package supplies backports of that functionality including
+improvements added to subsequent Python versions.
+
+
+Usage
+=====
+
+See the `online documentation <https://importlib_metadata.readthedocs.io/>`_
+for usage details.
+
+`Finder authors
+<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can
+also add support for custom package installers.  See the above documentation
+for details.
+
+
+Caveats
+=======
+
+This project primarily supports third-party packages installed by PyPA
+tools (or other conforming packages). It does not support:
+
+- Packages in the stdlib.
+- Packages installed without metadata.
+
+Project details
+===============
+
+ * Project home: https://github.com/python/importlib_metadata
+ * Report bugs at: https://github.com/python/importlib_metadata/issues
+ * Code hosting: https://github.com/python/importlib_metadata
+ * Documentation: https://importlib_metadata.readthedocs.io/
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/RECORD
@@ -0,0 +1,7 @@
+importlib_metadata/__init__.py,sha256=QM4Oo096u6JYeokkDUwHgazI_h3o0w9tISPjHtVko_U,19266
+importlib_metadata/_compat.py,sha256=OS4joET_vaQClxhumw0NWYdS5N3FX1Ii895aZXLpQaA,2028
+importlib_metadata-3.1.1.dist-info/LICENSE,sha256=wNe6dAchmJ1VvVB8D9oTc-gHHadCuaSBAev36sYEM6U,571
+importlib_metadata-3.1.1.dist-info/METADATA,sha256=rdblRVlpAdjDcYkqWhn2yVNwrpBqpamdKvxrgA6EWE0,3442
+importlib_metadata-3.1.1.dist-info/WHEEL,sha256=gm79cMopkncyn0iSnI0vQNiDJ8t9on0H4_iz-CrpXMk,92
+importlib_metadata-3.1.1.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19
+importlib_metadata-3.1.1.dist-info/RECORD,,
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.36.0)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
copy from third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/top_level.txt
copy to third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info/top_level.txt
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/__init__.py
@@ -0,0 +1,631 @@
+import io
+import os
+import re
+import abc
+import csv
+import sys
+import zipp
+import email
+import pathlib
+import operator
+import functools
+import itertools
+import posixpath
+import collections
+
+from ._compat import (
+    NullFinder,
+    PyPy_repr,
+    install,
+)
+
+from configparser import ConfigParser
+from contextlib import suppress
+from importlib import import_module
+from importlib.abc import MetaPathFinder
+from itertools import starmap
+
+
+__all__ = [
+    'Distribution',
+    'DistributionFinder',
+    'PackageNotFoundError',
+    'distribution',
+    'distributions',
+    'entry_points',
+    'files',
+    'metadata',
+    'requires',
+    'version',
+]
+
+
+class PackageNotFoundError(ModuleNotFoundError):
+    """The package was not found."""
+
+    def __str__(self):
+        tmpl = "No package metadata was found for {self.name}"
+        return tmpl.format(**locals())
+
+    @property
+    def name(self):
+        (name,) = self.args
+        return name
+
+
+class EntryPoint(
+    PyPy_repr, collections.namedtuple('EntryPointBase', 'name value group')
+):
+    """An entry point as defined by Python packaging conventions.
+
+    See `the packaging docs on entry points
+    <https://packaging.python.org/specifications/entry-points/>`_
+    for more information.
+    """
+
+    pattern = re.compile(
+        r'(?P<module>[\w.]+)\s*'
+        r'(:\s*(?P<attr>[\w.]+))?\s*'
+        r'(?P<extras>\[.*\])?\s*$'
+    )
+    """
+    A regular expression describing the syntax for an entry point,
+    which might look like:
+
+        - module
+        - package.module
+        - package.module:attribute
+        - package.module:object.attribute
+        - package.module:attr [extra1, extra2]
+
+    Other combinations are possible as well.
+
+    The expression is lenient about whitespace around the ':',
+    following the attr, and following any extras.
+    """
+
+    def load(self):
+        """Load the entry point from its definition. If only a module
+        is indicated by the value, return that module. Otherwise,
+        return the named object.
+        """
+        match = self.pattern.match(self.value)
+        module = import_module(match.group('module'))
+        attrs = filter(None, (match.group('attr') or '').split('.'))
+        return functools.reduce(getattr, attrs, module)
+
+    @property
+    def module(self):
+        match = self.pattern.match(self.value)
+        return match.group('module')
+
+    @property
+    def attr(self):
+        match = self.pattern.match(self.value)
+        return match.group('attr')
+
+    @property
+    def extras(self):
+        match = self.pattern.match(self.value)
+        return list(re.finditer(r'\w+', match.group('extras') or ''))
+
+    @classmethod
+    def _from_config(cls, config):
+        return [
+            cls(name, value, group)
+            for group in config.sections()
+            for name, value in config.items(group)
+        ]
+
+    @classmethod
+    def _from_text(cls, text):
+        config = ConfigParser(delimiters='=')
+        # case sensitive: https://stackoverflow.com/q/1611799/812183
+        config.optionxform = str
+        try:
+            config.read_string(text)
+        except AttributeError:  # pragma: nocover
+            # Python 2 has no read_string
+            config.readfp(io.StringIO(text))
+        return EntryPoint._from_config(config)
+
+    def __iter__(self):
+        """
+        Supply iter so one may construct dicts of EntryPoints easily.
+        """
+        return iter((self.name, self))
+
+    def __reduce__(self):
+        return (
+            self.__class__,
+            (self.name, self.value, self.group),
+        )
+
+
+class PackagePath(pathlib.PurePosixPath):
+    """A reference to a path in a package"""
+
+    def read_text(self, encoding='utf-8'):
+        with self.locate().open(encoding=encoding) as stream:
+            return stream.read()
+
+    def read_binary(self):
+        with self.locate().open('rb') as stream:
+            return stream.read()
+
+    def locate(self):
+        """Return a path-like object for this path"""
+        return self.dist.locate_file(self)
+
+
+class FileHash:
+    def __init__(self, spec):
+        self.mode, _, self.value = spec.partition('=')
+
+    def __repr__(self):
+        return '<FileHash mode: {} value: {}>'.format(self.mode, self.value)
+
+
+class Distribution:
+    """A Python distribution package."""
+
+    @abc.abstractmethod
+    def read_text(self, filename):
+        """Attempt to load metadata file given by the name.
+
+        :param filename: The name of the file in the distribution info.
+        :return: The text if found, otherwise None.
+        """
+
+    @abc.abstractmethod
+    def locate_file(self, path):
+        """
+        Given a path to a file in this distribution, return a path
+        to it.
+        """
+
+    @classmethod
+    def from_name(cls, name):
+        """Return the Distribution for the given package name.
+
+        :param name: The name of the distribution package to search for.
+        :return: The Distribution instance (or subclass thereof) for the named
+            package, if found.
+        :raises PackageNotFoundError: When the named package's distribution
+            metadata cannot be found.
+        """
+        for resolver in cls._discover_resolvers():
+            dists = resolver(DistributionFinder.Context(name=name))
+            dist = next(iter(dists), None)
+            if dist is not None:
+                return dist
+        else:
+            raise PackageNotFoundError(name)
+
+    @classmethod
+    def discover(cls, **kwargs):
+        """Return an iterable of Distribution objects for all packages.
+
+        Pass a ``context`` or pass keyword arguments for constructing
+        a context.
+
+        :context: A ``DistributionFinder.Context`` object.
+        :return: Iterable of Distribution objects for all packages.
+        """
+        context = kwargs.pop('context', None)
+        if context and kwargs:
+            raise ValueError("cannot accept context and kwargs")
+        context = context or DistributionFinder.Context(**kwargs)
+        return itertools.chain.from_iterable(
+            resolver(context) for resolver in cls._discover_resolvers()
+        )
+
+    @staticmethod
+    def at(path):
+        """Return a Distribution for the indicated metadata path
+
+        :param path: a string or path-like object
+        :return: a concrete Distribution instance for the path
+        """
+        return PathDistribution(pathlib.Path(path))
+
+    @staticmethod
+    def _discover_resolvers():
+        """Search the meta_path for resolvers."""
+        declared = (
+            getattr(finder, 'find_distributions', None) for finder in sys.meta_path
+        )
+        return filter(None, declared)
+
+    @classmethod
+    def _local(cls, root='.'):
+        from pep517 import build, meta
+
+        system = build.compat_system(root)
+        builder = functools.partial(
+            meta.build,
+            source_dir=root,
+            system=system,
+        )
+        return PathDistribution(zipp.Path(meta.build_as_zip(builder)))
+
+    @property
+    def metadata(self):
+        """Return the parsed metadata for this Distribution.
+
+        The returned object will have keys that name the various bits of
+        metadata.  See PEP 566 for details.
+        """
+        text = (
+            self.read_text('METADATA')
+            or self.read_text('PKG-INFO')
+            # This last clause is here to support old egg-info files.  Its
+            # effect is to just end up using the PathDistribution's self._path
+            # (which points to the egg-info file) attribute unchanged.
+            or self.read_text('')
+        )
+        return email.message_from_string(text)
+
+    @property
+    def version(self):
+        """Return the 'Version' metadata for the distribution package."""
+        return self.metadata['Version']
+
+    @property
+    def entry_points(self):
+        return EntryPoint._from_text(self.read_text('entry_points.txt'))
+
+    @property
+    def files(self):
+        """Files in this distribution.
+
+        :return: List of PackagePath for this distribution or None
+
+        Result is `None` if the metadata file that enumerates files
+        (i.e. RECORD for dist-info or SOURCES.txt for egg-info) is
+        missing.
+        Result may be empty if the metadata exists but is empty.
+        """
+        file_lines = self._read_files_distinfo() or self._read_files_egginfo()
+
+        def make_file(name, hash=None, size_str=None):
+            result = PackagePath(name)
+            result.hash = FileHash(hash) if hash else None
+            result.size = int(size_str) if size_str else None
+            result.dist = self
+            return result
+
+        return file_lines and list(starmap(make_file, csv.reader(file_lines)))
+
+    def _read_files_distinfo(self):
+        """
+        Read the lines of RECORD
+        """
+        text = self.read_text('RECORD')
+        return text and text.splitlines()
+
+    def _read_files_egginfo(self):
+        """
+        SOURCES.txt might contain literal commas, so wrap each line
+        in quotes.
+        """
+        text = self.read_text('SOURCES.txt')
+        return text and map('"{}"'.format, text.splitlines())
+
+    @property
+    def requires(self):
+        """Generated requirements specified for this Distribution"""
+        reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs()
+        return reqs and list(reqs)
+
+    def _read_dist_info_reqs(self):
+        return self.metadata.get_all('Requires-Dist')
+
+    def _read_egg_info_reqs(self):
+        source = self.read_text('requires.txt')
+        return source and self._deps_from_requires_text(source)
+
+    @classmethod
+    def _deps_from_requires_text(cls, source):
+        section_pairs = cls._read_sections(source.splitlines())
+        sections = {
+            section: list(map(operator.itemgetter('line'), results))
+            for section, results in itertools.groupby(
+                section_pairs, operator.itemgetter('section')
+            )
+        }
+        return cls._convert_egg_info_reqs_to_simple_reqs(sections)
+
+    @staticmethod
+    def _read_sections(lines):
+        section = None
+        for line in filter(None, lines):
+            section_match = re.match(r'\[(.*)\]$', line)
+            if section_match:
+                section = section_match.group(1)
+                continue
+            yield locals()
+
+    @staticmethod
+    def _convert_egg_info_reqs_to_simple_reqs(sections):
+        """
+        Historically, setuptools would solicit and store 'extra'
+        requirements, including those with environment markers,
+        in separate sections. More modern tools expect each
+        dependency to be defined separately, with any relevant
+        extras and environment markers attached directly to that
+        requirement. This method converts the former to the
+        latter. See _test_deps_from_requires_text for an example.
+        """
+
+        def make_condition(name):
+            return name and 'extra == "{name}"'.format(name=name)
+
+        def parse_condition(section):
+            section = section or ''
+            extra, sep, markers = section.partition(':')
+            if extra and markers:
+                markers = '({markers})'.format(markers=markers)
+            conditions = list(filter(None, [markers, make_condition(extra)]))
+            return '; ' + ' and '.join(conditions) if conditions else ''
+
+        for section, deps in sections.items():
+            for dep in deps:
+                yield dep + parse_condition(section)
+
+
+class DistributionFinder(MetaPathFinder):
+    """
+    A MetaPathFinder capable of discovering installed distributions.
+    """
+
+    class Context:
+        """
+        Keyword arguments presented by the caller to
+        ``distributions()`` or ``Distribution.discover()``
+        to narrow the scope of a search for distributions
+        in all DistributionFinders.
+
+        Each DistributionFinder may expect any parameters
+        and should attempt to honor the canonical
+        parameters defined below when appropriate.
+        """
+
+        name = None
+        """
+        Specific name for which a distribution finder should match.
+        A name of ``None`` matches all distributions.
+        """
+
+        def __init__(self, **kwargs):
+            vars(self).update(kwargs)
+
+        @property
+        def path(self):
+            """
+            The path that a distribution finder should search.
+
+            Typically refers to Python package paths and defaults
+            to ``sys.path``.
+            """
+            return vars(self).get('path', sys.path)
+
+    @abc.abstractmethod
+    def find_distributions(self, context=Context()):
+        """
+        Find distributions.
+
+        Return an iterable of all Distribution instances capable of
+        loading the metadata for packages matching the ``context``,
+        a DistributionFinder.Context instance.
+        """
+
+
+class FastPath:
+    """
+    Micro-optimized class for searching a path for
+    children.
+    """
+
+    def __init__(self, root):
+        self.root = str(root)
+        self.base = os.path.basename(self.root).lower()
+
+    def joinpath(self, child):
+        return pathlib.Path(self.root, child)
+
+    def children(self):
+        with suppress(Exception):
+            return os.listdir(self.root or '')
+        with suppress(Exception):
+            return self.zip_children()
+        return []
+
+    def zip_children(self):
+        zip_path = zipp.Path(self.root)
+        names = zip_path.root.namelist()
+        self.joinpath = zip_path.joinpath
+
+        return dict.fromkeys(child.split(posixpath.sep, 1)[0] for child in names)
+
+    def search(self, name):
+        return (
+            self.joinpath(child)
+            for child in self.children()
+            if name.matches(child, self.base)
+        )
+
+
+class Prepared:
+    """
+    A prepared search for metadata on a possibly-named package.
+    """
+
+    normalized = None
+    suffixes = '.dist-info', '.egg-info'
+    exact_matches = [''][:0]
+
+    def __init__(self, name):
+        self.name = name
+        if name is None:
+            return
+        self.normalized = self.normalize(name)
+        self.exact_matches = [self.normalized + suffix for suffix in self.suffixes]
+
+    @staticmethod
+    def normalize(name):
+        """
+        PEP 503 normalization plus dashes as underscores.
+        """
+        return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
+
+    @staticmethod
+    def legacy_normalize(name):
+        """
+        Normalize the package name as found in the convention in
+        older packaging tools versions and specs.
+        """
+        return name.lower().replace('-', '_')
+
+    def matches(self, cand, base):
+        low = cand.lower()
+        pre, ext = os.path.splitext(low)
+        name, sep, rest = pre.partition('-')
+        return (
+            low in self.exact_matches
+            or ext in self.suffixes
+            and (not self.normalized or name.replace('.', '_') == self.normalized)
+            # legacy case:
+            or self.is_egg(base)
+            and low == 'egg-info'
+        )
+
+    def is_egg(self, base):
+        normalized = self.legacy_normalize(self.name or '')
+        prefix = normalized + '-' if normalized else ''
+        versionless_egg_name = normalized + '.egg' if self.name else ''
+        return (
+            base == versionless_egg_name
+            or base.startswith(prefix)
+            and base.endswith('.egg')
+        )
+
+
+@install
+class MetadataPathFinder(NullFinder, DistributionFinder):
+    """A degenerate finder for distribution packages on the file system.
+
+    This finder supplies only a find_distributions() method for versions
+    of Python that do not have a PathFinder find_distributions().
+    """
+
+    def find_distributions(self, context=DistributionFinder.Context()):
+        """
+        Find distributions.
+
+        Return an iterable of all Distribution instances capable of
+        loading the metadata for packages matching ``context.name``
+        (or all names if ``None`` indicated) along the paths in the list
+        of directories ``context.path``.
+        """
+        found = self._search_paths(context.name, context.path)
+        return map(PathDistribution, found)
+
+    @classmethod
+    def _search_paths(cls, name, paths):
+        """Find metadata directories in paths heuristically."""
+        return itertools.chain.from_iterable(
+            path.search(Prepared(name)) for path in map(FastPath, paths)
+        )
+
+
+class PathDistribution(Distribution):
+    def __init__(self, path):
+        """Construct a distribution from a path to the metadata directory.
+
+        :param path: A pathlib.Path or similar object supporting
+                     .joinpath(), __div__, .parent, and .read_text().
+        """
+        self._path = path
+
+    def read_text(self, filename):
+        with suppress(
+            FileNotFoundError,
+            IsADirectoryError,
+            KeyError,
+            NotADirectoryError,
+            PermissionError,
+        ):
+            return self._path.joinpath(filename).read_text(encoding='utf-8')
+
+    read_text.__doc__ = Distribution.read_text.__doc__
+
+    def locate_file(self, path):
+        return self._path.parent / path
+
+
+def distribution(distribution_name):
+    """Get the ``Distribution`` instance for the named package.
+
+    :param distribution_name: The name of the distribution package as a string.
+    :return: A ``Distribution`` instance (or subclass thereof).
+    """
+    return Distribution.from_name(distribution_name)
+
+
+def distributions(**kwargs):
+    """Get all ``Distribution`` instances in the current environment.
+
+    :return: An iterable of ``Distribution`` instances.
+    """
+    return Distribution.discover(**kwargs)
+
+
+def metadata(distribution_name):
+    """Get the metadata for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: An email.Message containing the parsed metadata.
+    """
+    return Distribution.from_name(distribution_name).metadata
+
+
+def version(distribution_name):
+    """Get the version string for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: The version string for the package as defined in the package's
+        "Version" metadata key.
+    """
+    return distribution(distribution_name).version
+
+
+def entry_points():
+    """Return EntryPoint objects for all installed packages.
+
+    :return: EntryPoint objects for all installed packages.
+    """
+    eps = itertools.chain.from_iterable(dist.entry_points for dist in distributions())
+    by_group = operator.attrgetter('group')
+    ordered = sorted(eps, key=by_group)
+    grouped = itertools.groupby(ordered, by_group)
+    return {group: tuple(eps) for group, eps in grouped}
+
+
+def files(distribution_name):
+    """Return a list of files for the named package.
+
+    :param distribution_name: The name of the distribution package to query.
+    :return: List of files composing the distribution.
+    """
+    return distribution(distribution_name).files
+
+
+def requires(distribution_name):
+    """
+    Return a list of requirements for the named package.
+
+    :return: An iterator of requirements, suitable for
+    packaging.requirement.Requirement.
+    """
+    return distribution(distribution_name).requires
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/_compat.py
@@ -0,0 +1,75 @@
+import sys
+
+
+__all__ = ['install', 'NullFinder', 'PyPy_repr']
+
+
+def install(cls):
+    """
+    Class decorator for installation on sys.meta_path.
+
+    Adds the backport DistributionFinder to sys.meta_path and
+    attempts to disable the finder functionality of the stdlib
+    DistributionFinder.
+    """
+    sys.meta_path.append(cls())
+    disable_stdlib_finder()
+    return cls
+
+
+def disable_stdlib_finder():
+    """
+    Give the backport primacy for discovering path-based distributions
+    by monkey-patching the stdlib O_O.
+
+    See #91 for more background for rationale on this sketchy
+    behavior.
+    """
+
+    def matches(finder):
+        return getattr(
+            finder, '__module__', None
+        ) == '_frozen_importlib_external' and hasattr(finder, 'find_distributions')
+
+    for finder in filter(matches, sys.meta_path):  # pragma: nocover
+        del finder.find_distributions
+
+
+class NullFinder:
+    """
+    A "Finder" (aka "MetaClassFinder") that never finds any modules,
+    but may find distributions.
+    """
+
+    @staticmethod
+    def find_spec(*args, **kwargs):
+        return None
+
+    # In Python 2, the import system requires finders
+    # to have a find_module() method, but this usage
+    # is deprecated in Python 3 in favor of find_spec().
+    # For the purposes of this finder (i.e. being present
+    # on sys.meta_path but having no other import
+    # system functionality), the two methods are identical.
+    find_module = find_spec
+
+
+class PyPy_repr:
+    """
+    Override repr for EntryPoint objects on PyPy to avoid __iter__ access.
+    Ref #97, #102.
+    """
+
+    affected = hasattr(sys, 'pypy_version_info')
+
+    def __compat_repr__(self):  # pragma: nocover
+        def make_param(name):
+            value = getattr(self, name)
+            return '{name}={value!r}'.format(**locals())
+
+        params = ', '.join(map(make_param, self._fields))
+        return 'EntryPoint({params})'.format(**locals())
+
+    if affected:  # pragma: nocover
+        __repr__ = __compat_repr__
+    del affected
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/METADATA
+++ /dev/null
@@ -1,53 +0,0 @@
-Metadata-Version: 2.1
-Name: importlib-resources
-Version: 3.0.0
-Summary: Read resources from Python packages
-Home-page: http://importlib-resources.readthedocs.io/
-Author: Barry Warsaw
-Author-email: barry@python.org
-License: UNKNOWN
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
-Requires-Dist: pathlib2 ; python_version < "3"
-Requires-Dist: contextlib2 ; python_version < "3"
-Requires-Dist: singledispatch ; python_version < "3.4"
-Requires-Dist: typing ; python_version < "3.5"
-Requires-Dist: zipp (>=0.4) ; python_version < "3.8"
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: rst.linker ; extra == 'docs'
-Requires-Dist: jaraco.packaging ; extra == 'docs'
-
-=========================
- ``importlib_resources``
-=========================
-
-``importlib_resources`` is a backport of Python standard library
-`importlib.resources
-<https://docs.python.org/3.9/library/importlib.html#module-importlib.resources>`_
-module for Python 2.7, and 3.4 through 3.8.  Users of Python 3.9 and beyond
-should use the standard library module, since for these versions,
-``importlib_resources`` just delegates to that module.
-
-The key goal of this module is to replace parts of `pkg_resources
-<https://setuptools.readthedocs.io/en/latest/pkg_resources.html>`_ with a
-solution in Python's stdlib that relies on well-defined APIs.  This makes
-reading resources included in packages easier, with more stable and consistent
-semantics.
-
-
-Project details
-===============
-
- * Project home: https://gitlab.com/python-devs/importlib_resources
- * Report bugs at: https://gitlab.com/python-devs/importlib_resources/issues
- * Code hosting: https://gitlab.com/python-devs/importlib_resources.git
- * Documentation: https://importlib-resources.readthedocs.io/
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/RECORD
+++ /dev/null
@@ -1,40 +0,0 @@
-importlib_resources/__init__.py,sha256=hswDmLAH0IUlLWwmdHXPN2mgus2bk5IwDP-BFzg7VKo,977
-importlib_resources/_common.py,sha256=jXVqgKZ1bt8IbZiErvjIeb69BjqsMSCSt9AwV4bHnE8,3157
-importlib_resources/_compat.py,sha256=5nvS1tAZIl_6VqrFSScNVW2wtBGaRXGxcpDXMskruoA,3233
-importlib_resources/_py2.py,sha256=G9M5mv1ILl8NARGdNX0v9_F_Hb4HUKCS-FCNK63Ajvw,4146
-importlib_resources/_py3.py,sha256=2wJYfjLG8nd9mT1HLBtX96m6zlu9-Tocte9wFl9q_bY,5474
-importlib_resources/abc.py,sha256=6PX4Nprv39YnAht3NymhHIuSso0ocAKqDJZf-A6BgIw,3894
-importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/readers.py,sha256=S0DsGQB1li6w5USiZQtiy-5HXe4UAxt-zmKo8QlAxsI,1155
-importlib_resources/trees.py,sha256=U3FlQSI5--eF4AdzOjBvW4xnjL21OFX8ivk82Quwv_M,117
-importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/test_files.py,sha256=91rf4C74_aJsKNSt-a-03slVpY9QSAuCbogFWnsaPjE,1017
-importlib_resources/tests/test_open.py,sha256=yDXmTGXQspByj6WU0prnoVwab1yWWEA3fwz_XIx7TQU,2288
-importlib_resources/tests/test_path.py,sha256=GnUOu-338o9offnC8xwbXjH9JIQJpD7JujgQkGB106Q,1548
-importlib_resources/tests/test_read.py,sha256=DpA7tzxSQlU0_YQuWibB3E5PDL9fQUdzeKoEUGnAx78,2046
-importlib_resources/tests/test_resource.py,sha256=X77DzU2BRoM6d59iEh74zDHHw3pKOBGLCg3lP3dH4BI,6467
-importlib_resources/tests/util.py,sha256=f0RZU-RkEkybJjXRd7C5HcWMsoLFRWJL4FIUF1CJ2wo,6980
-importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
-importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
-importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data01/subdirectory/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
-importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13
-importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13
-importlib_resources/tests/data03/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data03/namespace/resource1.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data03/namespace/portion1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/data03/namespace/portion2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata01/ziptestdata.zip,sha256=AYf51fj80OKCRis93v2DlZjt5rM-VQOPptSHJbFtkXw,1131
-importlib_resources/tests/zipdata02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-importlib_resources/tests/zipdata02/ziptestdata.zip,sha256=e6HXvTEObXvJcNxyX5I8tu5M8_6mSN8ALahHfqE7ADA,698
-importlib_resources-3.0.0.dist-info/LICENSE,sha256=uWRjFdYGataJX2ziXk048ItUglQmjng3GWBALaWA36U,568
-importlib_resources-3.0.0.dist-info/METADATA,sha256=BIalQpWJG-Av5ZUNQXdFsv6M8s8EdYiymu6GaoEL1Rk,2100
-importlib_resources-3.0.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
-importlib_resources-3.0.0.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20
-importlib_resources-3.0.0.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.34.2)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py
+++ /dev/null
@@ -1,127 +0,0 @@
-from __future__ import absolute_import
-import sys
-
-# flake8: noqa
-
-if sys.version_info > (3,5):
-    from pathlib import Path, PurePath
-else:
-    from pathlib2 import Path, PurePath                         # type: ignore
-
-
-if sys.version_info > (3,):
-    from contextlib import suppress
-else:
-    from contextlib2 import suppress                         # type: ignore
-
-
-try:
-    from functools import singledispatch
-except ImportError:
-    from singledispatch import singledispatch                   # type: ignore
-
-
-try:
-    from abc import ABC                                         # type: ignore
-except ImportError:
-    from abc import ABCMeta
-
-    class ABC(object):                                          # type: ignore
-        __metaclass__ = ABCMeta
-
-
-try:
-    FileNotFoundError = FileNotFoundError                       # type: ignore
-except NameError:
-    FileNotFoundError = OSError                                 # type: ignore
-
-
-try:
-    from zipfile import Path as ZipPath  # type: ignore
-except ImportError:
-    from zipp import Path as ZipPath  # type: ignore
-
-
-try:
-    from typing import runtime_checkable  # type: ignore
-except ImportError:
-    def runtime_checkable(cls):  # type: ignore
-        return cls
-
-
-try:
-    from typing import Protocol  # type: ignore
-except ImportError:
-    Protocol = ABC  # type: ignore
-
-
-__metaclass__ = type
-
-
-class PackageSpec:
-    def __init__(self, **kwargs):
-        vars(self).update(kwargs)
-
-
-class TraversableResourcesAdapter:
-    def __init__(self, spec):
-        self.spec = spec
-        self.loader = LoaderAdapter(spec)
-
-    def __getattr__(self, name):
-        return getattr(self.spec, name)
-
-
-class LoaderAdapter:
-    """
-    Adapt loaders to provide TraversableResources and other
-    compatibility.
-    """
-    def __init__(self, spec):
-        self.spec = spec
-
-    @property
-    def path(self):
-        # Python < 3
-        return self.spec.origin
-
-    def get_resource_reader(self, name):
-        # Python < 3.9
-        from . import readers
-
-        def _zip_reader(spec):
-            with suppress(AttributeError):
-                return readers.ZipReader(spec.loader, spec.name)
-
-        def _available_reader(spec):
-            with suppress(AttributeError):
-                return spec.loader.get_resource_reader(spec.name)
-
-        def _native_reader(spec):
-            reader = _available_reader(spec)
-            return reader if hasattr(reader, 'files') else None
-
-        return (
-            # native reader if it supplies 'files'
-            _native_reader(self.spec) or
-            # local ZipReader if a zip module
-            _zip_reader(self.spec) or
-            # local FileReader
-            readers.FileReader(self)
-            )
-
-
-def package_spec(package):
-    """
-    Construct a minimal package spec suitable for
-    matching the interfaces this library relies upon
-    in later Python versions.
-    """
-    spec = getattr(package, '__spec__', None) or \
-        PackageSpec(
-            origin=package.__file__,
-            loader=getattr(package, '__loader__', None),
-            name=package.__name__,
-            submodule_search_locations=getattr(package, '__path__', None),
-        )
-    return TraversableResourcesAdapter(spec)
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py
+++ /dev/null
@@ -1,150 +0,0 @@
-import os
-import sys
-
-from . import _common
-from contextlib import contextmanager, suppress
-from importlib.abc import ResourceLoader
-from io import BytesIO, TextIOWrapper
-from pathlib import Path
-from types import ModuleType
-from typing import Iterable, Iterator, Optional, Set, Union   # noqa: F401
-from typing import cast
-from typing.io import BinaryIO, TextIO
-
-if False:  # TYPE_CHECKING
-    from typing import ContextManager
-
-Package = Union[ModuleType, str]
-if sys.version_info >= (3, 6):
-    Resource = Union[str, os.PathLike]              # pragma: <=35
-else:
-    Resource = str                                  # pragma: >=36
-
-
-def open_binary(package: Package, resource: Resource) -> BinaryIO:
-    """Return a file-like object opened for binary reading of the resource."""
-    resource = _common.normalize_path(resource)
-    package = _common.get_package(package)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return reader.open_resource(resource)
-    # Using pathlib doesn't work well here due to the lack of 'strict'
-    # argument for pathlib.Path.resolve() prior to Python 3.6.
-    absolute_package_path = os.path.abspath(
-        package.__spec__.origin or 'non-existent file')
-    package_path = os.path.dirname(absolute_package_path)
-    full_path = os.path.join(package_path, resource)
-    try:
-        return open(full_path, mode='rb')
-    except OSError:
-        # Just assume the loader is a resource loader; all the relevant
-        # importlib.machinery loaders are and an AttributeError for
-        # get_data() will make it clear what is needed from the loader.
-        loader = cast(ResourceLoader, package.__spec__.loader)
-        data = None
-        if hasattr(package.__spec__.loader, 'get_data'):
-            with suppress(OSError):
-                data = loader.get_data(full_path)
-        if data is None:
-            package_name = package.__spec__.name
-            message = '{!r} resource not found in {!r}'.format(
-                resource, package_name)
-            raise FileNotFoundError(message)
-        return BytesIO(data)
-
-
-def open_text(package: Package,
-              resource: Resource,
-              encoding: str = 'utf-8',
-              errors: str = 'strict') -> TextIO:
-    """Return a file-like object opened for text reading of the resource."""
-    return TextIOWrapper(
-        open_binary(package, resource), encoding=encoding, errors=errors)
-
-
-def read_binary(package: Package, resource: Resource) -> bytes:
-    """Return the binary contents of the resource."""
-    with open_binary(package, resource) as fp:
-        return fp.read()
-
-
-def read_text(package: Package,
-              resource: Resource,
-              encoding: str = 'utf-8',
-              errors: str = 'strict') -> str:
-    """Return the decoded string of the resource.
-
-    The decoding-related arguments have the same semantics as those of
-    bytes.decode().
-    """
-    with open_text(package, resource, encoding, errors) as fp:
-        return fp.read()
-
-
-def path(
-        package: Package, resource: Resource,
-        ) -> 'ContextManager[Path]':
-    """A context manager providing a file path object to the resource.
-
-    If the resource does not already exist on its own on the file system,
-    a temporary file will be created. If the file was created, the file
-    will be deleted upon exiting the context manager (no exception is
-    raised if the file was deleted prior to the context manager
-    exiting).
-    """
-    reader = _common.get_resource_reader(_common.get_package(package))
-    return (
-        _path_from_reader(reader, resource)
-        if reader else
-        _common.as_file(
-            _common.files(package).joinpath(_common.normalize_path(resource)))
-        )
-
-
-@contextmanager
-def _path_from_reader(reader, resource):
-    norm_resource = _common.normalize_path(resource)
-    with suppress(FileNotFoundError):
-        yield Path(reader.resource_path(norm_resource))
-        return
-    opener_reader = reader.open_resource(norm_resource)
-    with _common._tempfile(opener_reader.read, suffix=norm_resource) as res:
-        yield res
-
-
-def is_resource(package: Package, name: str) -> bool:
-    """True if `name` is a resource inside `package`.
-
-    Directories are *not* resources.
-    """
-    package = _common.get_package(package)
-    _common.normalize_path(name)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return reader.is_resource(name)
-    package_contents = set(contents(package))
-    if name not in package_contents:
-        return False
-    return (_common.from_package(package) / name).is_file()
-
-
-def contents(package: Package) -> Iterable[str]:
-    """Return an iterable of entries in `package`.
-
-    Note that not all entries are resources.  Specifically, directories are
-    not considered resources.  Use `is_resource()` on each entry returned here
-    to check if it is a resource or not.
-    """
-    package = _common.get_package(package)
-    reader = _common.get_resource_reader(package)
-    if reader is not None:
-        return reader.contents()
-    # Is the package a namespace package?  By definition, namespace packages
-    # cannot have resources.
-    namespace = (
-        package.__spec__.origin is None or
-        package.__spec__.origin == 'namespace'
-        )
-    if namespace or not package.__spec__.has_location:
-        return ()
-    return list(item.name for item in _common.from_package(package).iterdir())
deleted file mode 100644
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from . import abc
-
-from ._compat import Path, ZipPath
-
-
-class FileReader(abc.TraversableResources):
-    def __init__(self, loader):
-        self.path = Path(loader.path).parent
-
-    def resource_path(self, resource):
-        """
-        Return the file system path to prevent
-        `resources.path()` from creating a temporary
-        copy.
-        """
-        return str(self.path.joinpath(resource))
-
-    def files(self):
-        return self.path
-
-
-class ZipReader(abc.TraversableResources):
-    def __init__(self, loader, module):
-        _, _, name = module.rpartition('.')
-        prefix = loader.prefix.replace('\\', '/') + name + '/'
-        self.path = ZipPath(loader.archive, prefix)
-
-    def open_resource(self, resource):
-        try:
-            return super().open_resource(resource)
-        except KeyError as exc:
-            raise FileNotFoundError(exc.args[0])
-
-    def is_resource(self, path):
-        # workaround for `zipfile.Path.is_file` returning true
-        # for non-existent paths.
-        target = self.files().joinpath(path)
-        return target.is_file() and target.exists()
-
-    def files(self):
-        return self.path
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/LICENSE
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/METADATA
@@ -0,0 +1,41 @@
+Metadata-Version: 2.1
+Name: importlib-resources
+Version: 3.2.1
+Summary: Read resources from Python packages
+Home-page: https://github.com/python/importlib_resources
+Author: Barry Warsaw
+Author-email: barry@python.org
+License: UNKNOWN
+Project-URL: Documentation, https://importlib-resources.readthedocs.io/
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
+Requires-Dist: pathlib2 ; python_version < "3"
+Requires-Dist: contextlib2 ; python_version < "3"
+Requires-Dist: singledispatch ; python_version < "3.4"
+Requires-Dist: typing ; python_version < "3.5"
+Requires-Dist: zipp (>=0.4) ; python_version < "3.8"
+Provides-Extra: docs
+Requires-Dist: sphinx ; extra == 'docs'
+Requires-Dist: rst.linker ; extra == 'docs'
+Requires-Dist: jaraco.packaging ; extra == 'docs'
+
+``importlib_resources`` is a backport of Python standard library
+`importlib.resources
+<https://docs.python.org/3.9/library/importlib.html#module-importlib.resources>`_
+module for Python 2.7, and 3.4 through 3.8.  Users of Python 3.9 and beyond
+should use the standard library module, since for these versions,
+``importlib_resources`` just delegates to that module.
+
+The key goal of this module is to replace parts of `pkg_resources
+<https://setuptools.readthedocs.io/en/latest/pkg_resources.html>`_ with a
+solution in Python's stdlib that relies on well-defined APIs.  This makes
+reading resources included in packages easier, with more stable and consistent
+semantics.
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/RECORD
@@ -0,0 +1,42 @@
+importlib_resources/__init__.py,sha256=hswDmLAH0IUlLWwmdHXPN2mgus2bk5IwDP-BFzg7VKo,977
+importlib_resources/_common.py,sha256=RN8cXOZtlygvlbyTewd-ni9wC1hwXpfbZnrl7kbx0nI,3121
+importlib_resources/_compat.py,sha256=NDCXOf1097aDJJx-_pQ0UIktzVx2G1aPIQTRFGx0FHI,3694
+importlib_resources/_py2.py,sha256=G9M5mv1ILl8NARGdNX0v9_F_Hb4HUKCS-FCNK63Ajvw,4146
+importlib_resources/_py3.py,sha256=5_FhUUHWFG1c3HcLrmDy65ZFB7EYxmHfOV3ybv4uTHM,5710
+importlib_resources/abc.py,sha256=6PX4Nprv39YnAht3NymhHIuSso0ocAKqDJZf-A6BgIw,3894
+importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/readers.py,sha256=fGuSBoMeeERUVrscN9Grhp0s-wKMy7nMVbCx92vIlGs,3674
+importlib_resources/trees.py,sha256=U3FlQSI5--eF4AdzOjBvW4xnjL21OFX8ivk82Quwv_M,117
+importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/_compat.py,sha256=geKWJe8UGXjC181JxmtxR3A_o5VrR4yxolS0xbnxMlw,801
+importlib_resources/tests/py27compat.py,sha256=9lDJkGV2swPVQJg6isOorRNFWuP6KeoWd4D2bFNmzLI,965
+importlib_resources/tests/test_files.py,sha256=91rf4C74_aJsKNSt-a-03slVpY9QSAuCbogFWnsaPjE,1017
+importlib_resources/tests/test_open.py,sha256=pIYWvuTDpQOJKX0SEuOKGotssZcEeY_xNPDqLGCvP_U,2565
+importlib_resources/tests/test_path.py,sha256=GnUOu-338o9offnC8xwbXjH9JIQJpD7JujgQkGB106Q,1548
+importlib_resources/tests/test_read.py,sha256=DpA7tzxSQlU0_YQuWibB3E5PDL9fQUdzeKoEUGnAx78,2046
+importlib_resources/tests/test_reader.py,sha256=yEO0xyrYDcGRmsBC6A1n99GXiTZpVvp-uGA313s6aao,4638
+importlib_resources/tests/test_resource.py,sha256=GbrMeHJ74N6KJG38TDodCp--nsRnFHXJc7NrAEqUPaU,8766
+importlib_resources/tests/util.py,sha256=8hBFwqIZRJFNvkboEB7aWsCqTtgUjlWI_iQ0KV158Yk,5914
+importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
+importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
+importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
+importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data01/subdirectory/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
+importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13
+importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13
+importlib_resources/tests/namespacedata01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
+importlib_resources/tests/namespacedata01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
+importlib_resources/tests/namespacedata01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
+importlib_resources/tests/zipdata01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/zipdata01/ziptestdata.zip,sha256=AYf51fj80OKCRis93v2DlZjt5rM-VQOPptSHJbFtkXw,1131
+importlib_resources/tests/zipdata02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/zipdata02/ziptestdata.zip,sha256=e6HXvTEObXvJcNxyX5I8tu5M8_6mSN8ALahHfqE7ADA,698
+importlib_resources-3.2.1.dist-info/LICENSE,sha256=uWRjFdYGataJX2ziXk048ItUglQmjng3GWBALaWA36U,568
+importlib_resources-3.2.1.dist-info/METADATA,sha256=d_tMNLHsZ_lPU-wq04MWr0yEfpwbNFKgfO_CU5GCC9g,1783
+importlib_resources-3.2.1.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
+importlib_resources-3.2.1.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20
+importlib_resources-3.2.1.dist-info/RECORD,,
copy from third_party/python/virtualenv/virtualenv-20.0.31.dist-info/WHEEL
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/WHEEL
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/top_level.txt
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info/top_level.txt
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/__init__.py
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_common.py
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_common.py
@@ -88,33 +88,32 @@ def from_package(package):
 def _tempfile(reader, suffix=''):
     # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try'
     # blocks due to the need to close the temporary file to work on Windows
     # properly.
     fd, raw_path = tempfile.mkstemp(suffix=suffix)
     try:
         os.write(fd, reader())
         os.close(fd)
+        del reader
         yield Path(raw_path)
     finally:
         try:
             os.remove(raw_path)
         except FileNotFoundError:
             pass
 
 
 @singledispatch
-@contextlib.contextmanager
 def as_file(path):
     """
     Given a Traversable object, return that object as a
     path on the local file system in a context manager.
     """
-    with _tempfile(path.read_bytes, suffix=path.name) as local:
-        yield local
+    return _tempfile(path.read_bytes, suffix=path.name)
 
 
 @as_file.register(Path)
 @contextlib.contextmanager
 def _(path):
     """
     Degenerate behavior for pathlib.Path objects.
     """
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_compat.py
@@ -0,0 +1,139 @@
+from __future__ import absolute_import
+import sys
+
+# flake8: noqa
+
+if sys.version_info > (3,5):
+    from pathlib import Path, PurePath
+else:
+    from pathlib2 import Path, PurePath                         # type: ignore
+
+
+if sys.version_info > (3,):
+    from contextlib import suppress
+else:
+    from contextlib2 import suppress                         # type: ignore
+
+
+try:
+    from functools import singledispatch
+except ImportError:
+    from singledispatch import singledispatch                   # type: ignore
+
+
+try:
+    from abc import ABC                                         # type: ignore
+except ImportError:
+    from abc import ABCMeta
+
+    class ABC(object):                                          # type: ignore
+        __metaclass__ = ABCMeta
+
+
+try:
+    FileNotFoundError = FileNotFoundError                       # type: ignore
+except NameError:
+    FileNotFoundError = OSError                                 # type: ignore
+
+
+try:
+    NotADirectoryError = NotADirectoryError                       # type: ignore
+except NameError:
+    NotADirectoryError = OSError                                 # type: ignore
+
+
+try:
+    from zipfile import Path as ZipPath  # type: ignore
+except ImportError:
+    from zipp import Path as ZipPath  # type: ignore
+
+
+try:
+    from typing import runtime_checkable  # type: ignore
+except ImportError:
+    def runtime_checkable(cls):  # type: ignore
+        return cls
+
+
+try:
+    from typing import Protocol  # type: ignore
+except ImportError:
+    Protocol = ABC  # type: ignore
+
+
+__metaclass__ = type
+
+
+class PackageSpec:
+    def __init__(self, **kwargs):
+        vars(self).update(kwargs)
+
+
+class TraversableResourcesAdapter:
+    def __init__(self, spec):
+        self.spec = spec
+        self.loader = LoaderAdapter(spec)
+
+    def __getattr__(self, name):
+        return getattr(self.spec, name)
+
+
+class LoaderAdapter:
+    """
+    Adapt loaders to provide TraversableResources and other
+    compatibility.
+    """
+    def __init__(self, spec):
+        self.spec = spec
+
+    @property
+    def path(self):
+        # Python < 3
+        return self.spec.origin
+
+    def get_resource_reader(self, name):
+        # Python < 3.9
+        from . import readers
+
+        def _zip_reader(spec):
+            with suppress(AttributeError):
+                return readers.ZipReader(spec.loader, spec.name)
+
+        def _namespace_reader(spec):
+            with suppress(AttributeError, ValueError):
+                return readers.NamespaceReader(spec.submodule_search_locations)
+
+        def _available_reader(spec):
+            with suppress(AttributeError):
+                return spec.loader.get_resource_reader(spec.name)
+
+        def _native_reader(spec):
+            reader = _available_reader(spec)
+            return reader if hasattr(reader, 'files') else None
+
+        return (
+            # native reader if it supplies 'files'
+            _native_reader(self.spec) or
+            # local ZipReader if a zip module
+            _zip_reader(self.spec) or
+            # local NamespaceReader if a namespace module
+            _namespace_reader(self.spec) or
+            # local FileReader
+            readers.FileReader(self)
+            )
+
+
+def package_spec(package):
+    """
+    Construct a minimal package spec suitable for
+    matching the interfaces this library relies upon
+    in later Python versions.
+    """
+    spec = getattr(package, '__spec__', None) or \
+        PackageSpec(
+            origin=package.__file__,
+            loader=getattr(package, '__loader__', None),
+            name=package.__name__,
+            submodule_search_locations=getattr(package, '__path__', None),
+        )
+    return TraversableResourcesAdapter(spec)
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py2.py
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py3.py
@@ -0,0 +1,164 @@
+import os
+import sys
+import io
+
+from . import _common
+from contextlib import suppress
+from importlib.abc import ResourceLoader
+from io import BytesIO, TextIOWrapper
+from pathlib import Path
+from types import ModuleType
+from typing import Iterable, Iterator, Optional, Set, Union   # noqa: F401
+from typing import cast
+from typing.io import BinaryIO, TextIO
+from collections.abc import Sequence
+from ._compat import singledispatch
+
+if False:  # TYPE_CHECKING
+    from typing import ContextManager
+
+Package = Union[ModuleType, str]
+if sys.version_info >= (3, 6):
+    Resource = Union[str, os.PathLike]              # pragma: <=35
+else:
+    Resource = str                                  # pragma: >=36
+
+
+def open_binary(package: Package, resource: Resource) -> BinaryIO:
+    """Return a file-like object opened for binary reading of the resource."""
+    resource = _common.normalize_path(resource)
+    package = _common.get_package(package)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return reader.open_resource(resource)
+    # Using pathlib doesn't work well here due to the lack of 'strict'
+    # argument for pathlib.Path.resolve() prior to Python 3.6.
+    if package.__spec__.submodule_search_locations is not None:
+        paths = package.__spec__.submodule_search_locations
+    elif package.__spec__.origin is not None:
+        paths = [os.path.dirname(os.path.abspath(package.__spec__.origin))]
+
+    for package_path in paths:
+        full_path = os.path.join(package_path, resource)
+        try:
+            return open(full_path, mode='rb')
+        except OSError:
+            # Just assume the loader is a resource loader; all the relevant
+            # importlib.machinery loaders are and an AttributeError for
+            # get_data() will make it clear what is needed from the loader.
+            loader = cast(ResourceLoader, package.__spec__.loader)
+            data = None
+            if hasattr(package.__spec__.loader, 'get_data'):
+                with suppress(OSError):
+                    data = loader.get_data(full_path)
+            if data is not None:
+                return BytesIO(data)
+
+    raise FileNotFoundError('{!r} resource not found in {!r}'.format(
+        resource, package.__spec__.name))
+
+
+def open_text(package: Package,
+              resource: Resource,
+              encoding: str = 'utf-8',
+              errors: str = 'strict') -> TextIO:
+    """Return a file-like object opened for text reading of the resource."""
+    return TextIOWrapper(
+        open_binary(package, resource), encoding=encoding, errors=errors)
+
+
+def read_binary(package: Package, resource: Resource) -> bytes:
+    """Return the binary contents of the resource."""
+    with open_binary(package, resource) as fp:
+        return fp.read()
+
+
+def read_text(package: Package,
+              resource: Resource,
+              encoding: str = 'utf-8',
+              errors: str = 'strict') -> str:
+    """Return the decoded string of the resource.
+
+    The decoding-related arguments have the same semantics as those of
+    bytes.decode().
+    """
+    with open_text(package, resource, encoding, errors) as fp:
+        return fp.read()
+
+
+def path(
+        package: Package, resource: Resource,
+        ) -> 'ContextManager[Path]':
+    """A context manager providing a file path object to the resource.
+
+    If the resource does not already exist on its own on the file system,
+    a temporary file will be created. If the file was created, the file
+    will be deleted upon exiting the context manager (no exception is
+    raised if the file was deleted prior to the context manager
+    exiting).
+    """
+    reader = _common.get_resource_reader(_common.get_package(package))
+    return (
+        _path_from_reader(reader, _common.normalize_path(resource))
+        if reader else
+        _common.as_file(
+            _common.files(package).joinpath(_common.normalize_path(resource)))
+        )
+
+
+def _path_from_reader(reader, resource):
+    return _path_from_resource_path(reader, resource) or \
+        _path_from_open_resource(reader, resource)
+
+
+def _path_from_resource_path(reader, resource):
+    with suppress(FileNotFoundError):
+        return Path(reader.resource_path(resource))
+
+
+def _path_from_open_resource(reader, resource):
+    saved = io.BytesIO(reader.open_resource(resource).read())
+    return _common._tempfile(saved.read, suffix=resource)
+
+
+def is_resource(package: Package, name: str) -> bool:
+    """True if `name` is a resource inside `package`.
+
+    Directories are *not* resources.
+    """
+    package = _common.get_package(package)
+    _common.normalize_path(name)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return reader.is_resource(name)
+    package_contents = set(contents(package))
+    if name not in package_contents:
+        return False
+    return (_common.from_package(package) / name).is_file()
+
+
+def contents(package: Package) -> Iterable[str]:
+    """Return an iterable of entries in `package`.
+
+    Note that not all entries are resources.  Specifically, directories are
+    not considered resources.  Use `is_resource()` on each entry returned here
+    to check if it is a resource or not.
+    """
+    package = _common.get_package(package)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return _ensure_sequence(reader.contents())
+    transversable = _common.from_package(package)
+    if transversable.is_dir():
+        return list(item.name for item in transversable.iterdir())
+    return []
+
+
+@singledispatch
+def _ensure_sequence(iterable):
+    return list(iterable)
+
+
+@_ensure_sequence.register(Sequence)
+def _(iterable):
+    return iterable
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/abc.py
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/readers.py
@@ -0,0 +1,123 @@
+import os.path
+
+from collections import OrderedDict
+
+from . import abc
+
+from ._compat import Path, ZipPath
+from ._compat import FileNotFoundError, NotADirectoryError
+
+
+class FileReader(abc.TraversableResources):
+    def __init__(self, loader):
+        self.path = Path(loader.path).parent
+
+    def resource_path(self, resource):
+        """
+        Return the file system path to prevent
+        `resources.path()` from creating a temporary
+        copy.
+        """
+        return str(self.path.joinpath(resource))
+
+    def files(self):
+        return self.path
+
+
+class ZipReader(abc.TraversableResources):
+    def __init__(self, loader, module):
+        _, _, name = module.rpartition('.')
+        self.prefix = loader.prefix.replace('\\', '/') + name + '/'
+        self.archive = loader.archive
+
+    def open_resource(self, resource):
+        try:
+            return super().open_resource(resource)
+        except KeyError as exc:
+            raise FileNotFoundError(exc.args[0])
+
+    def is_resource(self, path):
+        # workaround for `zipfile.Path.is_file` returning true
+        # for non-existent paths.
+        target = self.files().joinpath(path)
+        return target.is_file() and target.exists()
+
+    def files(self):
+        return ZipPath(self.archive, self.prefix)
+
+
+class MultiplexedPath(abc.Traversable):
+    """
+    Given a series of Traversable objects, implement a merged
+    version of the interface across all objects. Useful for
+    namespace packages which may be multihomed at a single
+    name.
+    """
+    def __init__(self, *paths):
+        paths = list(OrderedDict.fromkeys(paths))  # remove duplicates
+        self._paths = list(map(Path, paths))
+        if not self._paths:
+            message = 'MultiplexedPath must contain at least one path'
+            raise FileNotFoundError(message)
+        if any(not path.is_dir() for path in self._paths):
+            raise NotADirectoryError(
+                'MultiplexedPath only supports directories')
+
+    def iterdir(self):
+        visited = []
+        for path in self._paths:
+            for file in path.iterdir():
+                if file.name in visited:
+                    continue
+                visited.append(file.name)
+                yield file
+
+    def read_bytes(self):
+        raise FileNotFoundError('{} is not a file'.format(self))
+
+    def read_text(self, *args, **kwargs):
+        raise FileNotFoundError('{} is not a file'.format(self))
+
+    def is_dir(self):
+        return True
+
+    def is_file(self):
+        return False
+
+    def joinpath(self, child):
+        # first try to find child in current paths
+        for file in self.iterdir():
+            if file.name == child:
+                return file
+        # if it does not exist, construct it with the first path
+        return self._paths[0] / child
+
+    __truediv__ = joinpath
+
+    def open(self, *args, **kwargs):
+        raise FileNotFoundError('{} is not a file'.format(self))
+
+    def name(self):
+        return os.path.basename(self._paths[0])
+
+    def __repr__(self):
+        return 'MultiplexedPath({})'.format(
+            ', '.join("'{}'".format(path) for path in self._paths))
+
+
+class NamespaceReader(abc.TraversableResources):
+    def __init__(self, namespace_path):
+        if 'NamespacePath' not in str(namespace_path):
+            raise ValueError('Invalid path')
+        self.path = MultiplexedPath(*list(namespace_path))
+
+    def resource_path(self, resource):
+        """
+        Return the file system path to prevent
+        `resources.path()` from creating a temporary
+        copy.
+        """
+        return str(self.path.joinpath(resource))
+
+    def files(self):
+        return self.path
rename from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py
rename to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/trees.py
copy from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/LICENSE
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/METADATA
@@ -0,0 +1,41 @@
+Metadata-Version: 2.1
+Name: importlib-resources
+Version: 3.3.0
+Summary: Read resources from Python packages
+Home-page: https://github.com/python/importlib_resources
+Author: Barry Warsaw
+Author-email: barry@python.org
+License: UNKNOWN
+Project-URL: Documentation, https://importlib-resources.readthedocs.io/
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7
+Requires-Dist: pathlib2 ; python_version < "3"
+Requires-Dist: contextlib2 ; python_version < "3"
+Requires-Dist: singledispatch ; python_version < "3.4"
+Requires-Dist: typing ; python_version < "3.5"
+Requires-Dist: zipp (>=0.4) ; python_version < "3.8"
+Provides-Extra: docs
+Requires-Dist: sphinx ; extra == 'docs'
+Requires-Dist: rst.linker ; extra == 'docs'
+Requires-Dist: jaraco.packaging ; extra == 'docs'
+
+``importlib_resources`` is a backport of Python standard library
+`importlib.resources
+<https://docs.python.org/3.9/library/importlib.html#module-importlib.resources>`_
+module for Python 2.7, and 3.4 through 3.8.  Users of Python 3.9 and beyond
+should use the standard library module, since for these versions,
+``importlib_resources`` just delegates to that module.
+
+The key goal of this module is to replace parts of `pkg_resources
+<https://setuptools.readthedocs.io/en/latest/pkg_resources.html>`_ with a
+solution in Python's stdlib that relies on well-defined APIs.  This makes
+reading resources included in packages easier, with more stable and consistent
+semantics.
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/RECORD
@@ -0,0 +1,42 @@
+importlib_resources/__init__.py,sha256=hswDmLAH0IUlLWwmdHXPN2mgus2bk5IwDP-BFzg7VKo,977
+importlib_resources/_common.py,sha256=RN8cXOZtlygvlbyTewd-ni9wC1hwXpfbZnrl7kbx0nI,3121
+importlib_resources/_compat.py,sha256=NDCXOf1097aDJJx-_pQ0UIktzVx2G1aPIQTRFGx0FHI,3694
+importlib_resources/_py2.py,sha256=G9M5mv1ILl8NARGdNX0v9_F_Hb4HUKCS-FCNK63Ajvw,4146
+importlib_resources/_py3.py,sha256=Bc-p0UYfPVWXFJ21HLNfVvbVrPJFXBA0g80rqPInkq8,5564
+importlib_resources/abc.py,sha256=6PX4Nprv39YnAht3NymhHIuSso0ocAKqDJZf-A6BgIw,3894
+importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/readers.py,sha256=fGuSBoMeeERUVrscN9Grhp0s-wKMy7nMVbCx92vIlGs,3674
+importlib_resources/trees.py,sha256=U3FlQSI5--eF4AdzOjBvW4xnjL21OFX8ivk82Quwv_M,117
+importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/_compat.py,sha256=geKWJe8UGXjC181JxmtxR3A_o5VrR4yxolS0xbnxMlw,801
+importlib_resources/tests/py27compat.py,sha256=9lDJkGV2swPVQJg6isOorRNFWuP6KeoWd4D2bFNmzLI,965
+importlib_resources/tests/test_files.py,sha256=91rf4C74_aJsKNSt-a-03slVpY9QSAuCbogFWnsaPjE,1017
+importlib_resources/tests/test_open.py,sha256=pIYWvuTDpQOJKX0SEuOKGotssZcEeY_xNPDqLGCvP_U,2565
+importlib_resources/tests/test_path.py,sha256=GnUOu-338o9offnC8xwbXjH9JIQJpD7JujgQkGB106Q,1548
+importlib_resources/tests/test_read.py,sha256=DpA7tzxSQlU0_YQuWibB3E5PDL9fQUdzeKoEUGnAx78,2046
+importlib_resources/tests/test_reader.py,sha256=yEO0xyrYDcGRmsBC6A1n99GXiTZpVvp-uGA313s6aao,4638
+importlib_resources/tests/test_resource.py,sha256=GbrMeHJ74N6KJG38TDodCp--nsRnFHXJc7NrAEqUPaU,8766
+importlib_resources/tests/util.py,sha256=8hBFwqIZRJFNvkboEB7aWsCqTtgUjlWI_iQ0KV158Yk,5914
+importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
+importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
+importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
+importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data01/subdirectory/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
+importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13
+importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13
+importlib_resources/tests/namespacedata01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4
+importlib_resources/tests/namespacedata01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44
+importlib_resources/tests/namespacedata01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20
+importlib_resources/tests/zipdata01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/zipdata01/ziptestdata.zip,sha256=AYf51fj80OKCRis93v2DlZjt5rM-VQOPptSHJbFtkXw,1131
+importlib_resources/tests/zipdata02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+importlib_resources/tests/zipdata02/ziptestdata.zip,sha256=e6HXvTEObXvJcNxyX5I8tu5M8_6mSN8ALahHfqE7ADA,698
+importlib_resources-3.3.0.dist-info/LICENSE,sha256=uWRjFdYGataJX2ziXk048ItUglQmjng3GWBALaWA36U,568
+importlib_resources-3.3.0.dist-info/METADATA,sha256=GxPMbCwUwlCuHNCiPJvP4IC_mTKqP4b_W7UqqNidcF4,1791
+importlib_resources-3.3.0.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
+importlib_resources-3.3.0.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20
+importlib_resources-3.3.0.dist-info/RECORD,,
copy from third_party/python/virtualenv/virtualenv-20.0.31.dist-info/WHEEL
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/WHEEL
copy from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/top_level.txt
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info/top_level.txt
copy from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/__init__.py
copy from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_common.py
--- a/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_common.py
@@ -88,33 +88,32 @@ def from_package(package):
 def _tempfile(reader, suffix=''):
     # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try'
     # blocks due to the need to close the temporary file to work on Windows
     # properly.
     fd, raw_path = tempfile.mkstemp(suffix=suffix)
     try:
         os.write(fd, reader())
         os.close(fd)
+        del reader
         yield Path(raw_path)
     finally:
         try:
             os.remove(raw_path)
         except FileNotFoundError:
             pass
 
 
 @singledispatch
-@contextlib.contextmanager
 def as_file(path):
     """
     Given a Traversable object, return that object as a
     path on the local file system in a context manager.
     """
-    with _tempfile(path.read_bytes, suffix=path.name) as local:
-        yield local
+    return _tempfile(path.read_bytes, suffix=path.name)
 
 
 @as_file.register(Path)
 @contextlib.contextmanager
 def _(path):
     """
     Degenerate behavior for pathlib.Path objects.
     """
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_compat.py
@@ -0,0 +1,139 @@
+from __future__ import absolute_import
+import sys
+
+# flake8: noqa
+
+if sys.version_info > (3,5):
+    from pathlib import Path, PurePath
+else:
+    from pathlib2 import Path, PurePath                         # type: ignore
+
+
+if sys.version_info > (3,):
+    from contextlib import suppress
+else:
+    from contextlib2 import suppress                         # type: ignore
+
+
+try:
+    from functools import singledispatch
+except ImportError:
+    from singledispatch import singledispatch                   # type: ignore
+
+
+try:
+    from abc import ABC                                         # type: ignore
+except ImportError:
+    from abc import ABCMeta
+
+    class ABC(object):                                          # type: ignore
+        __metaclass__ = ABCMeta
+
+
+try:
+    FileNotFoundError = FileNotFoundError                       # type: ignore
+except NameError:
+    FileNotFoundError = OSError                                 # type: ignore
+
+
+try:
+    NotADirectoryError = NotADirectoryError                       # type: ignore
+except NameError:
+    NotADirectoryError = OSError                                 # type: ignore
+
+
+try:
+    from zipfile import Path as ZipPath  # type: ignore
+except ImportError:
+    from zipp import Path as ZipPath  # type: ignore
+
+
+try:
+    from typing import runtime_checkable  # type: ignore
+except ImportError:
+    def runtime_checkable(cls):  # type: ignore
+        return cls
+
+
+try:
+    from typing import Protocol  # type: ignore
+except ImportError:
+    Protocol = ABC  # type: ignore
+
+
+__metaclass__ = type
+
+
+class PackageSpec:
+    def __init__(self, **kwargs):
+        vars(self).update(kwargs)
+
+
+class TraversableResourcesAdapter:
+    def __init__(self, spec):
+        self.spec = spec
+        self.loader = LoaderAdapter(spec)
+
+    def __getattr__(self, name):
+        return getattr(self.spec, name)
+
+
+class LoaderAdapter:
+    """
+    Adapt loaders to provide TraversableResources and other
+    compatibility.
+    """
+    def __init__(self, spec):
+        self.spec = spec
+
+    @property
+    def path(self):
+        # Python < 3
+        return self.spec.origin
+
+    def get_resource_reader(self, name):
+        # Python < 3.9
+        from . import readers
+
+        def _zip_reader(spec):
+            with suppress(AttributeError):
+                return readers.ZipReader(spec.loader, spec.name)
+
+        def _namespace_reader(spec):
+            with suppress(AttributeError, ValueError):
+                return readers.NamespaceReader(spec.submodule_search_locations)
+
+        def _available_reader(spec):
+            with suppress(AttributeError):
+                return spec.loader.get_resource_reader(spec.name)
+
+        def _native_reader(spec):
+            reader = _available_reader(spec)
+            return reader if hasattr(reader, 'files') else None
+
+        return (
+            # native reader if it supplies 'files'
+            _native_reader(self.spec) or
+            # local ZipReader if a zip module
+            _zip_reader(self.spec) or
+            # local NamespaceReader if a namespace module
+            _namespace_reader(self.spec) or
+            # local FileReader
+            readers.FileReader(self)
+            )
+
+
+def package_spec(package):
+    """
+    Construct a minimal package spec suitable for
+    matching the interfaces this library relies upon
+    in later Python versions.
+    """
+    spec = getattr(package, '__spec__', None) or \
+        PackageSpec(
+            origin=package.__file__,
+            loader=getattr(package, '__loader__', None),
+            name=package.__name__,
+            submodule_search_locations=getattr(package, '__path__', None),
+        )
+    return TraversableResourcesAdapter(spec)
copy from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py2.py
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py3.py
@@ -0,0 +1,160 @@
+import os
+import io
+
+from . import _common
+from contextlib import suppress
+from importlib.abc import ResourceLoader
+from io import BytesIO, TextIOWrapper
+from pathlib import Path
+from types import ModuleType
+from typing import Iterable, Iterator, Optional, Set, Union   # noqa: F401
+from typing import cast
+from typing.io import BinaryIO, TextIO
+from collections.abc import Sequence
+from functools import singledispatch
+
+if False:  # TYPE_CHECKING
+    from typing import ContextManager
+
+Package = Union[ModuleType, str]
+Resource = Union[str, os.PathLike]
+
+
+def open_binary(package: Package, resource: Resource) -> BinaryIO:
+    """Return a file-like object opened for binary reading of the resource."""
+    resource = _common.normalize_path(resource)
+    package = _common.get_package(package)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return reader.open_resource(resource)
+    # Using pathlib doesn't work well here due to the lack of 'strict'
+    # argument for pathlib.Path.resolve() prior to Python 3.6.
+    if package.__spec__.submodule_search_locations is not None:
+        paths = package.__spec__.submodule_search_locations
+    elif package.__spec__.origin is not None:
+        paths = [os.path.dirname(os.path.abspath(package.__spec__.origin))]
+
+    for package_path in paths:
+        full_path = os.path.join(package_path, resource)
+        try:
+            return open(full_path, mode='rb')
+        except OSError:
+            # Just assume the loader is a resource loader; all the relevant
+            # importlib.machinery loaders are and an AttributeError for
+            # get_data() will make it clear what is needed from the loader.
+            loader = cast(ResourceLoader, package.__spec__.loader)
+            data = None
+            if hasattr(package.__spec__.loader, 'get_data'):
+                with suppress(OSError):
+                    data = loader.get_data(full_path)
+            if data is not None:
+                return BytesIO(data)
+
+    raise FileNotFoundError('{!r} resource not found in {!r}'.format(
+        resource, package.__spec__.name))
+
+
+def open_text(package: Package,
+              resource: Resource,
+              encoding: str = 'utf-8',
+              errors: str = 'strict') -> TextIO:
+    """Return a file-like object opened for text reading of the resource."""
+    return TextIOWrapper(
+        open_binary(package, resource), encoding=encoding, errors=errors)
+
+
+def read_binary(package: Package, resource: Resource) -> bytes:
+    """Return the binary contents of the resource."""
+    with open_binary(package, resource) as fp:
+        return fp.read()
+
+
+def read_text(package: Package,
+              resource: Resource,
+              encoding: str = 'utf-8',
+              errors: str = 'strict') -> str:
+    """Return the decoded string of the resource.
+
+    The decoding-related arguments have the same semantics as those of
+    bytes.decode().
+    """
+    with open_text(package, resource, encoding, errors) as fp:
+        return fp.read()
+
+
+def path(
+        package: Package, resource: Resource,
+        ) -> 'ContextManager[Path]':
+    """A context manager providing a file path object to the resource.
+
+    If the resource does not already exist on its own on the file system,
+    a temporary file will be created. If the file was created, the file
+    will be deleted upon exiting the context manager (no exception is
+    raised if the file was deleted prior to the context manager
+    exiting).
+    """
+    reader = _common.get_resource_reader(_common.get_package(package))
+    return (
+        _path_from_reader(reader, _common.normalize_path(resource))
+        if reader else
+        _common.as_file(
+            _common.files(package).joinpath(_common.normalize_path(resource)))
+        )
+
+
+def _path_from_reader(reader, resource):
+    return _path_from_resource_path(reader, resource) or \
+        _path_from_open_resource(reader, resource)
+
+
+def _path_from_resource_path(reader, resource):
+    with suppress(FileNotFoundError):
+        return Path(reader.resource_path(resource))
+
+
+def _path_from_open_resource(reader, resource):
+    saved = io.BytesIO(reader.open_resource(resource).read())
+    return _common._tempfile(saved.read, suffix=resource)
+
+
+def is_resource(package: Package, name: str) -> bool:
+    """True if `name` is a resource inside `package`.
+
+    Directories are *not* resources.
+    """
+    package = _common.get_package(package)
+    _common.normalize_path(name)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return reader.is_resource(name)
+    package_contents = set(contents(package))
+    if name not in package_contents:
+        return False
+    return (_common.from_package(package) / name).is_file()
+
+
+def contents(package: Package) -> Iterable[str]:
+    """Return an iterable of entries in `package`.
+
+    Note that not all entries are resources.  Specifically, directories are
+    not considered resources.  Use `is_resource()` on each entry returned here
+    to check if it is a resource or not.
+    """
+    package = _common.get_package(package)
+    reader = _common.get_resource_reader(package)
+    if reader is not None:
+        return _ensure_sequence(reader.contents())
+    transversable = _common.from_package(package)
+    if transversable.is_dir():
+        return list(item.name for item in transversable.iterdir())
+    return []
+
+
+@singledispatch
+def _ensure_sequence(iterable):
+    return list(iterable)
+
+
+@_ensure_sequence.register(Sequence)
+def _(iterable):
+    return iterable
copy from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/abc.py
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/readers.py
@@ -0,0 +1,123 @@
+import os.path
+
+from collections import OrderedDict
+
+from . import abc
+
+from ._compat import Path, ZipPath
+from ._compat import FileNotFoundError, NotADirectoryError
+
+
+class FileReader(abc.TraversableResources):
+    def __init__(self, loader):
+        self.path = Path(loader.path).parent
+
+    def resource_path(self, resource):
+        """
+        Return the file system path to prevent
+        `resources.path()` from creating a temporary
+        copy.
+        """
+        return str(self.path.joinpath(resource))
+
+    def files(self):
+        return self.path
+
+
+class ZipReader(abc.TraversableResources):
+    def __init__(self, loader, module):
+        _, _, name = module.rpartition('.')
+        self.prefix = loader.prefix.replace('\\', '/') + name + '/'
+        self.archive = loader.archive
+
+    def open_resource(self, resource):
+        try:
+            return super().open_resource(resource)
+        except KeyError as exc:
+            raise FileNotFoundError(exc.args[0])
+
+    def is_resource(self, path):
+        # workaround for `zipfile.Path.is_file` returning true
+        # for non-existent paths.
+        target = self.files().joinpath(path)
+        return target.is_file() and target.exists()
+
+    def files(self):
+        return ZipPath(self.archive, self.prefix)
+
+
+class MultiplexedPath(abc.Traversable):
+    """
+    Given a series of Traversable objects, implement a merged
+    version of the interface across all objects. Useful for
+    namespace packages which may be multihomed at a single
+    name.
+    """
+    def __init__(self, *paths):
+        paths = list(OrderedDict.fromkeys(paths))  # remove duplicates
+        self._paths = list(map(Path, paths))
+        if not self._paths:
+            message = 'MultiplexedPath must contain at least one path'
+            raise FileNotFoundError(message)
+        if any(not path.is_dir() for path in self._paths):
+            raise NotADirectoryError(
+                'MultiplexedPath only supports directories')
+
+    def iterdir(self):
+        visited = []
+        for path in self._paths:
+            for file in path.iterdir():
+                if file.name in visited:
+                    continue
+                visited.append(file.name)
+                yield file
+
+    def read_bytes(self):
+        raise FileNotFoundError('{} is not a file'.format(self))
+
+    def read_text(self, *args, **kwargs):
+        raise FileNotFoundError('{} is not a file'.format(self))
+
+    def is_dir(self):
+        return True
+
+    def is_file(self):
+        return False
+
+    def joinpath(self, child):
+        # first try to find child in current paths
+        for file in self.iterdir():
+            if file.name == child:
+                return file
+        # if it does not exist, construct it with the first path
+        return self._paths[0] / child
+
+    __truediv__ = joinpath
+
+    def open(self, *args, **kwargs):
+        raise FileNotFoundError('{} is not a file'.format(self))
+
+    def name(self):
+        return os.path.basename(self._paths[0])
+
+    def __repr__(self):
+        return 'MultiplexedPath({})'.format(
+            ', '.join("'{}'".format(path) for path in self._paths))
+
+
+class NamespaceReader(abc.TraversableResources):
+    def __init__(self, namespace_path):
+        if 'NamespacePath' not in str(namespace_path):
+            raise ValueError('Invalid path')
+        self.path = MultiplexedPath(*list(namespace_path))
+
+    def resource_path(self, resource):
+        """
+        Return the file system path to prevent
+        `resources.path()` from creating a temporary
+        copy.
+        """
+        return str(self.path.joinpath(resource))
+
+    def files(self):
+        return self.path
copy from third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py
copy to third_party/python/virtualenv/__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/trees.py
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD
+++ /dev/null
@@ -1,7 +0,0 @@
-_scandir.cpython-38-darwin.so,sha256=3a2UitVjb1MS0I7WSOp7jPGHsKf-ctNYTrBvDmPupOg,27780
-scandir.py,sha256=97C2AQInuKk-Phb3aXM7fJomhc-00pZMcBur23NUmrE,24827
-scandir-1.10.0.dist-info/LICENSE.txt,sha256=peL73COXREGdKUB828knk8TZwdlWwXT3y3-W-m0FjIY,1464
-scandir-1.10.0.dist-info/METADATA,sha256=cv1fZ5DeC3DJqnMByWGiprvGhLpQCkWOZiJduweakGk,9559
-scandir-1.10.0.dist-info/WHEEL,sha256=NqgkTkAaRJaCuArPZklUp2tBwn6obHN9aMIfdfLfNkU,110
-scandir-1.10.0.dist-info/top_level.txt,sha256=Ixze5mNjmis99ql7JEtAYc9-djJMbfRx-FFw3R_zZf8,17
-scandir-1.10.0.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.34.2)
-Root-Is-Purelib: false
-Tag: cp38-cp38-macosx_10_15_x86_64
-
rename from third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt
rename to third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt
rename from third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA
rename to third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD
@@ -0,0 +1,6 @@
+scandir.py,sha256=97C2AQInuKk-Phb3aXM7fJomhc-00pZMcBur23NUmrE,24827
+scandir-1.10.0.dist-info/LICENSE.txt,sha256=peL73COXREGdKUB828knk8TZwdlWwXT3y3-W-m0FjIY,1464
+scandir-1.10.0.dist-info/METADATA,sha256=cv1fZ5DeC3DJqnMByWGiprvGhLpQCkWOZiJduweakGk,9559
+scandir-1.10.0.dist-info/WHEEL,sha256=WO4o60shExe_A5pkiO6Yb-8OHLGhlAGcs2oJ7aUuE5Q,110
+scandir-1.10.0.dist-info/top_level.txt,sha256=Ixze5mNjmis99ql7JEtAYc9-djJMbfRx-FFw3R_zZf8,17
+scandir-1.10.0.dist-info/RECORD,,
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.35.1)
+Root-Is-Purelib: false
+Tag: cp39-cp39-macosx_10_15_x86_64
+
rename from third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt
rename to third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt
rename from third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py
rename to third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir.py
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/METADATA
+++ /dev/null
@@ -1,52 +0,0 @@
-Metadata-Version: 2.1
-Name: zipp
-Version: 3.1.0
-Summary: Backport of pathlib-compatible object wrapper for zip files
-Home-page: https://github.com/jaraco/zipp
-Author: Jason R. Coombs
-Author-email: jaraco@jaraco.com
-License: UNKNOWN
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Requires-Python: >=3.6
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: jaraco.packaging (>=3.2) ; extra == 'docs'
-Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: jaraco.itertools ; extra == 'testing'
-Requires-Dist: func-timeout ; extra == 'testing'
-
-.. image:: https://img.shields.io/pypi/v/zipp.svg
-   :target: `PyPI link`_
-
-.. image:: https://img.shields.io/pypi/pyversions/zipp.svg
-   :target: `PyPI link`_
-
-.. _PyPI link: https://pypi.org/project/zipp
-
-.. image:: https://dev.azure.com/jaraco/zipp/_apis/build/status/jaraco.zipp?branchName=master
-   :target: https://dev.azure.com/jaraco/zipp/_build/latest?definitionId=1&branchName=master
-
-.. image:: https://img.shields.io/travis/jaraco/zipp/master.svg
-   :target: https://travis-ci.org/jaraco/zipp
-
-.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
-   :target: https://github.com/psf/black
-   :alt: Code style: Black
-
-.. image:: https://img.shields.io/appveyor/ci/jaraco/zipp/master.svg
-   :target: https://ci.appveyor.com/project/jaraco/zipp/branch/master
-
-.. .. image:: https://readthedocs.org/projects/zipp/badge/?version=latest
-..    :target: https://zipp.readthedocs.io/en/latest/?badge=latest
-
-
-A pathlib-compatible Zipfile object wrapper. A backport of the
-`Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/RECORD
+++ /dev/null
@@ -1,6 +0,0 @@
-zipp.py,sha256=o8W25XfoR5DD_krEQLbYrNMmK-x26JvaqeKuboC91YY,7121
-zipp-3.1.0.dist-info/LICENSE,sha256=2z8CRrH5J48VhFuZ_sR4uLUG63ZIeZNyL4xuJUKF-vg,1050
-zipp-3.1.0.dist-info/METADATA,sha256=EbCdCb8ZzwzYDA7RF8R830VeruipjOKnj32zpMxPsFM,1899
-zipp-3.1.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
-zipp-3.1.0.dist-info/top_level.txt,sha256=iAbdoSHfaGqBfVb2XuR9JqSQHCoOsOtG6y9C_LSpqFw,5
-zipp-3.1.0.dist-info/RECORD,,
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.34.2)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
deleted file mode 100644
--- a/third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py
+++ /dev/null
@@ -1,285 +0,0 @@
-import io
-import posixpath
-import zipfile
-import itertools
-import contextlib
-import sys
-
-if sys.version_info < (3, 7):
-    from collections import OrderedDict
-else:
-    OrderedDict = dict
-
-
-def _parents(path):
-    """
-    Given a path with elements separated by
-    posixpath.sep, generate all parents of that path.
-
-    >>> list(_parents('b/d'))
-    ['b']
-    >>> list(_parents('/b/d/'))
-    ['/b']
-    >>> list(_parents('b/d/f/'))
-    ['b/d', 'b']
-    >>> list(_parents('b'))
-    []
-    >>> list(_parents(''))
-    []
-    """
-    return itertools.islice(_ancestry(path), 1, None)
-
-
-def _ancestry(path):
-    """
-    Given a path with elements separated by
-    posixpath.sep, generate all elements of that path
-
-    >>> list(_ancestry('b/d'))
-    ['b/d', 'b']
-    >>> list(_ancestry('/b/d/'))
-    ['/b/d', '/b']
-    >>> list(_ancestry('b/d/f/'))
-    ['b/d/f', 'b/d', 'b']
-    >>> list(_ancestry('b'))
-    ['b']
-    >>> list(_ancestry(''))
-    []
-    """
-    path = path.rstrip(posixpath.sep)
-    while path and path != posixpath.sep:
-        yield path
-        path, tail = posixpath.split(path)
-
-
-_dedupe = OrderedDict.fromkeys
-"""Deduplicate an iterable in original order"""
-
-
-def _difference(minuend, subtrahend):
-    """
-    Return items in minuend not in subtrahend, retaining order
-    with O(1) lookup.
-    """
-    return itertools.filterfalse(set(subtrahend).__contains__, minuend)
-
-
-class CompleteDirs(zipfile.ZipFile):
-    """
-    A ZipFile subclass that ensures that implied directories
-    are always included in the namelist.
-    """
-
-    @staticmethod
-    def _implied_dirs(names):
-        parents = itertools.chain.from_iterable(map(_parents, names))
-        as_dirs = (p + posixpath.sep for p in parents)
-        return _dedupe(_difference(as_dirs, names))
-
-    def namelist(self):
-        names = super(CompleteDirs, self).namelist()
-        return names + list(self._implied_dirs(names))
-
-    def _name_set(self):
-        return set(self.namelist())
-
-    def resolve_dir(self, name):
-        """
-        If the name represents a directory, return that name
-        as a directory (with the trailing slash).
-        """
-        names = self._name_set()
-        dirname = name + '/'
-        dir_match = name not in names and dirname in names
-        return dirname if dir_match else name
-
-    @classmethod
-    def make(cls, source):
-        """
-        Given a source (filename or zipfile), return an
-        appropriate CompleteDirs subclass.
-        """
-        if isinstance(source, CompleteDirs):
-            return source
-
-        if not isinstance(source, zipfile.ZipFile):
-            return cls(_pathlib_compat(source))
-
-        # Only allow for FastPath when supplied zipfile is read-only
-        if 'r' not in source.mode:
-            cls = CompleteDirs
-
-        res = cls.__new__(cls)
-        vars(res).update(vars(source))
-        return res
-
-
-class FastLookup(CompleteDirs):
-    """
-    ZipFile subclass to ensure implicit
-    dirs exist and are resolved rapidly.
-    """
-    def namelist(self):
-        with contextlib.suppress(AttributeError):
-            return self.__names
-        self.__names = super(FastLookup, self).namelist()
-        return self.__names
-
-    def _name_set(self):
-        with contextlib.suppress(AttributeError):
-            return self.__lookup
-        self.__lookup = super(FastLookup, self)._name_set()
-        return self.__lookup
-
-
-def _pathlib_compat(path):
-    """
-    For path-like objects, convert to a filename for compatibility
-    on Python 3.6.1 and earlier.
-    """
-    try:
-        return path.__fspath__()
-    except AttributeError:
-        return str(path)
-
-
-class Path:
-    """
-    A pathlib-compatible interface for zip files.
-
-    Consider a zip file with this structure::
-
-        .
-        ├── a.txt
-        └── b
-            ├── c.txt
-            └── d
-                └── e.txt
-
-    >>> data = io.BytesIO()
-    >>> zf = zipfile.ZipFile(data, 'w')
-    >>> zf.writestr('a.txt', 'content of a')
-    >>> zf.writestr('b/c.txt', 'content of c')
-    >>> zf.writestr('b/d/e.txt', 'content of e')
-    >>> zf.filename = 'abcde.zip'
-
-    Path accepts the zipfile object itself or a filename
-
-    >>> root = Path(zf)
-
-    From there, several path operations are available.
-
-    Directory iteration (including the zip file itself):
-
-    >>> a, b = root.iterdir()
-    >>> a
-    Path('abcde.zip', 'a.txt')
-    >>> b
-    Path('abcde.zip', 'b/')
-
-    name property:
-
-    >>> b.name
-    'b'
-
-    join with divide operator:
-
-    >>> c = b / 'c.txt'
-    >>> c
-    Path('abcde.zip', 'b/c.txt')
-    >>> c.name
-    'c.txt'
-
-    Read text:
-
-    >>> c.read_text()
-    'content of c'
-
-    existence:
-
-    >>> c.exists()
-    True
-    >>> (b / 'missing.txt').exists()
-    False
-
-    Coercion to string:
-
-    >>> str(c)
-    'abcde.zip/b/c.txt'
-    """
-
-    __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})"
-
-    def __init__(self, root, at=""):
-        self.root = FastLookup.make(root)
-        self.at = at
-
-    def open(self, mode='r', *args, pwd=None, **kwargs):
-        """
-        Open this entry as text or binary following the semantics
-        of ``pathlib.Path.open()`` by passing arguments through
-        to io.TextIOWrapper().
-        """
-        if self.is_dir():
-            raise IsADirectoryError(self)
-        zip_mode = mode[0]
-        if not self.exists() and zip_mode == 'r':
-            raise FileNotFoundError(self)
-        stream = self.root.open(self.at, zip_mode, pwd=pwd)
-        if 'b' in mode:
-            if args or kwargs:
-                raise ValueError("encoding args invalid for binary operation")
-            return stream
-        return io.TextIOWrapper(stream, *args, **kwargs)
-
-    @property
-    def name(self):
-        return posixpath.basename(self.at.rstrip("/"))
-
-    def read_text(self, *args, **kwargs):
-        with self.open('r', *args, **kwargs) as strm:
-            return strm.read()
-
-    def read_bytes(self):
-        with self.open('rb') as strm:
-            return strm.read()
-
-    def _is_child(self, path):
-        return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/")
-
-    def _next(self, at):
-        return Path(self.root, at)
-
-    def is_dir(self):
-        return not self.at or self.at.endswith("/")
-
-    def is_file(self):
-        return not self.is_dir()
-
-    def exists(self):
-        return self.at in self.root._name_set()
-
-    def iterdir(self):
-        if not self.is_dir():
-            raise ValueError("Can't listdir a file")
-        subs = map(self._next, self.root.namelist())
-        return filter(self._is_child, subs)
-
-    def __str__(self):
-        return posixpath.join(self.root.filename, self.at)
-
-    def __repr__(self):
-        return self.__repr.format(self=self)
-
-    def joinpath(self, add):
-        next = posixpath.join(self.at, _pathlib_compat(add))
-        return self._next(self.root.resolve_dir(next))
-
-    __truediv__ = joinpath
-
-    @property
-    def parent(self):
-        parent_at = posixpath.dirname(self.at.rstrip('/'))
-        if parent_at:
-            parent_at += '/'
-        return self._next(parent_at)
rename from third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/LICENSE
rename to third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/METADATA
@@ -0,0 +1,54 @@
+Metadata-Version: 2.1
+Name: zipp
+Version: 3.4.0
+Summary: Backport of pathlib-compatible object wrapper for zip files
+Home-page: https://github.com/jaraco/zipp
+Author: Jason R. Coombs
+Author-email: jaraco@jaraco.com
+License: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Requires-Python: >=3.6
+Provides-Extra: docs
+Requires-Dist: sphinx ; extra == 'docs'
+Requires-Dist: jaraco.packaging (>=3.2) ; extra == 'docs'
+Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
+Provides-Extra: testing
+Requires-Dist: pytest (!=3.7.3,>=3.5) ; extra == 'testing'
+Requires-Dist: pytest-checkdocs (>=1.2.3) ; extra == 'testing'
+Requires-Dist: pytest-flake8 ; extra == 'testing'
+Requires-Dist: pytest-cov ; extra == 'testing'
+Requires-Dist: jaraco.test (>=3.2.0) ; extra == 'testing'
+Requires-Dist: jaraco.itertools ; extra == 'testing'
+Requires-Dist: func-timeout ; extra == 'testing'
+Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing'
+Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy") and extra == 'testing'
+
+.. image:: https://img.shields.io/pypi/v/zipp.svg
+   :target: `PyPI link`_
+
+.. image:: https://img.shields.io/pypi/pyversions/zipp.svg
+   :target: `PyPI link`_
+
+.. _PyPI link: https://pypi.org/project/zipp
+
+.. image:: https://github.com/jaraco/zipp/workflows/Automated%20Tests/badge.svg
+   :target: https://github.com/jaraco/zipp/actions?query=workflow%3A%22Automated+Tests%22
+   :alt: Automated Tests
+
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+   :target: https://github.com/psf/black
+   :alt: Code style: Black
+
+.. .. image:: https://readthedocs.org/projects/zipp/badge/?version=latest
+..    :target: https://zipp.readthedocs.io/en/latest/?badge=latest
+
+
+A pathlib-compatible Zipfile object wrapper. A backport of the
+`Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/RECORD
@@ -0,0 +1,6 @@
+zipp.py,sha256=wMSoYxAIPgYnqJAW0JcAl5sWaIcFc5xk3dNjf6ElGgU,8089
+zipp-3.4.0.dist-info/LICENSE,sha256=2z8CRrH5J48VhFuZ_sR4uLUG63ZIeZNyL4xuJUKF-vg,1050
+zipp-3.4.0.dist-info/METADATA,sha256=noSfks-ReGCmOSTxll7TELBJy0P_yAvVLa0FCFyhMeM,2134
+zipp-3.4.0.dist-info/WHEEL,sha256=EVRjI69F5qVjm_YgqcTXPnTAv3BfSUr0WVAHuSP3Xoo,92
+zipp-3.4.0.dist-info/top_level.txt,sha256=iAbdoSHfaGqBfVb2XuR9JqSQHCoOsOtG6y9C_LSpqFw,5
+zipp-3.4.0.dist-info/RECORD,,
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.35.1)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
rename from third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/top_level.txt
rename to third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info/top_level.txt
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/__virtualenv__/zipp-3.4.0-py3-none-any/zipp.py
@@ -0,0 +1,314 @@
+import io
+import posixpath
+import zipfile
+import itertools
+import contextlib
+import sys
+import pathlib
+
+if sys.version_info < (3, 7):
+    from collections import OrderedDict
+else:
+    OrderedDict = dict
+
+
+def _parents(path):
+    """
+    Given a path with elements separated by
+    posixpath.sep, generate all parents of that path.
+
+    >>> list(_parents('b/d'))
+    ['b']
+    >>> list(_parents('/b/d/'))
+    ['/b']
+    >>> list(_parents('b/d/f/'))
+    ['b/d', 'b']
+    >>> list(_parents('b'))
+    []
+    >>> list(_parents(''))
+    []
+    """
+    return itertools.islice(_ancestry(path), 1, None)
+
+
+def _ancestry(path):
+    """
+    Given a path with elements separated by
+    posixpath.sep, generate all elements of that path
+
+    >>> list(_ancestry('b/d'))
+    ['b/d', 'b']
+    >>> list(_ancestry('/b/d/'))
+    ['/b/d', '/b']
+    >>> list(_ancestry('b/d/f/'))
+    ['b/d/f', 'b/d', 'b']
+    >>> list(_ancestry('b'))
+    ['b']
+    >>> list(_ancestry(''))
+    []
+    """
+    path = path.rstrip(posixpath.sep)
+    while path and path != posixpath.sep:
+        yield path
+        path, tail = posixpath.split(path)
+
+
+_dedupe = OrderedDict.fromkeys
+"""Deduplicate an iterable in original order"""
+
+
+def _difference(minuend, subtrahend):
+    """
+    Return items in minuend not in subtrahend, retaining order
+    with O(1) lookup.
+    """
+    return itertools.filterfalse(set(subtrahend).__contains__, minuend)
+
+
+class CompleteDirs(zipfile.ZipFile):
+    """
+    A ZipFile subclass that ensures that implied directories
+    are always included in the namelist.
+    """
+
+    @staticmethod
+    def _implied_dirs(names):
+        parents = itertools.chain.from_iterable(map(_parents, names))
+        as_dirs = (p + posixpath.sep for p in parents)
+        return _dedupe(_difference(as_dirs, names))
+
+    def namelist(self):
+        names = super(CompleteDirs, self).namelist()
+        return names + list(self._implied_dirs(names))
+
+    def _name_set(self):
+        return set(self.namelist())
+
+    def resolve_dir(self, name):
+        """
+        If the name represents a directory, return that name
+        as a directory (with the trailing slash).
+        """
+        names = self._name_set()
+        dirname = name + '/'
+        dir_match = name not in names and dirname in names
+        return dirname if dir_match else name
+
+    @classmethod
+    def make(cls, source):
+        """
+        Given a source (filename or zipfile), return an
+        appropriate CompleteDirs subclass.
+        """
+        if isinstance(source, CompleteDirs):
+            return source
+
+        if not isinstance(source, zipfile.ZipFile):
+            return cls(_pathlib_compat(source))
+
+        # Only allow for FastLookup when supplied zipfile is read-only
+        if 'r' not in source.mode:
+            cls = CompleteDirs
+
+        source.__class__ = cls
+        return source
+
+
+class FastLookup(CompleteDirs):
+    """
+    ZipFile subclass to ensure implicit
+    dirs exist and are resolved rapidly.
+    """
+
+    def namelist(self):
+        with contextlib.suppress(AttributeError):
+            return self.__names
+        self.__names = super(FastLookup, self).namelist()
+        return self.__names
+
+    def _name_set(self):
+        with contextlib.suppress(AttributeError):
+            return self.__lookup
+        self.__lookup = super(FastLookup, self)._name_set()
+        return self.__lookup
+
+
+def _pathlib_compat(path):
+    """
+    For path-like objects, convert to a filename for compatibility
+    on Python 3.6.1 and earlier.
+    """
+    try:
+        return path.__fspath__()
+    except AttributeError:
+        return str(path)
+
+
+class Path:
+    """
+    A pathlib-compatible interface for zip files.
+
+    Consider a zip file with this structure::
+
+        .
+        ├── a.txt
+        └── b
+            ├── c.txt
+            └── d
+                └── e.txt
+
+    >>> data = io.BytesIO()
+    >>> zf = zipfile.ZipFile(data, 'w')
+    >>> zf.writestr('a.txt', 'content of a')
+    >>> zf.writestr('b/c.txt', 'content of c')
+    >>> zf.writestr('b/d/e.txt', 'content of e')
+    >>> zf.filename = 'mem/abcde.zip'
+
+    Path accepts the zipfile object itself or a filename
+
+    >>> root = Path(zf)
+
+    From there, several path operations are available.
+
+    Directory iteration (including the zip file itself):
+
+    >>> a, b = root.iterdir()
+    >>> a
+    Path('mem/abcde.zip', 'a.txt')
+    >>> b
+    Path('mem/abcde.zip', 'b/')
+
+    name property:
+
+    >>> b.name
+    'b'
+
+    join with divide operator:
+
+    >>> c = b / 'c.txt'
+    >>> c
+    Path('mem/abcde.zip', 'b/c.txt')
+    >>> c.name
+    'c.txt'
+
+    Read text:
+
+    >>> c.read_text()
+    'content of c'
+
+    existence:
+
+    >>> c.exists()
+    True
+    >>> (b / 'missing.txt').exists()
+    False
+
+    Coercion to string:
+
+    >>> import os
+    >>> str(c).replace(os.sep, posixpath.sep)
+    'mem/abcde.zip/b/c.txt'
+
+    At the root, ``name``, ``filename``, and ``parent``
+    resolve to the zipfile. Note these attributes are not
+    valid and will raise a ``ValueError`` if the zipfile
+    has no filename.
+
+    >>> root.name
+    'abcde.zip'
+    >>> str(root.filename).replace(os.sep, posixpath.sep)
+    'mem/abcde.zip'
+    >>> str(root.parent)
+    'mem'
+    """
+
+    __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})"
+
+    def __init__(self, root, at=""):
+        """
+        Construct a Path from a ZipFile or filename.
+
+        Note: When the source is an existing ZipFile object,
+        its type (__class__) will be mutated to a
+        specialized type. If the caller wishes to retain the
+        original type, the caller should either create a
+        separate ZipFile object or pass a filename.
+        """
+        self.root = FastLookup.make(root)
+        self.at = at
+
+    def open(self, mode='r', *args, pwd=None, **kwargs):
+        """
+        Open this entry as text or binary following the semantics
+        of ``pathlib.Path.open()`` by passing arguments through
+        to io.TextIOWrapper().
+        """
+        if self.is_dir():
+            raise IsADirectoryError(self)
+        zip_mode = mode[0]
+        if not self.exists() and zip_mode == 'r':
+            raise FileNotFoundError(self)
+        stream = self.root.open(self.at, zip_mode, pwd=pwd)
+        if 'b' in mode:
+            if args or kwargs:
+                raise ValueError("encoding args invalid for binary operation")
+            return stream
+        return io.TextIOWrapper(stream, *args, **kwargs)
+
+    @property
+    def name(self):
+        return pathlib.Path(self.at).name or self.filename.name
+
+    @property
+    def filename(self):
+        return pathlib.Path(self.root.filename).joinpath(self.at)
+
+    def read_text(self, *args, **kwargs):
+        with self.open('r', *args, **kwargs) as strm:
+            return strm.read()
+
+    def read_bytes(self):
+        with self.open('rb') as strm:
+            return strm.read()
+
+    def _is_child(self, path):
+        return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/")
+
+    def _next(self, at):
+        return self.__class__(self.root, at)
+
+    def is_dir(self):
+        return not self.at or self.at.endswith("/")
+
+    def is_file(self):
+        return self.exists() and not self.is_dir()
+
+    def exists(self):
+        return self.at in self.root._name_set()
+
+    def iterdir(self):
+        if not self.is_dir():
+            raise ValueError("Can't listdir a file")
+        subs = map(self._next, self.root.namelist())
+        return filter(self._is_child, subs)
+
+    def __str__(self):
+        return posixpath.join(self.root.filename, self.at)
+
+    def __repr__(self):
+        return self.__repr.format(self=self)
+
+    def joinpath(self, *other):
+        next = posixpath.join(self.at, *map(_pathlib_compat, other))
+        return self._next(self.root.resolve_dir(next))
+
+    __truediv__ = joinpath
+
+    @property
+    def parent(self):
+        if not self.at:
+            return self.filename.parent
+        parent_at = posixpath.dirname(self.at.rstrip('/'))
+        if parent_at:
+            parent_at += '/'
+        return self._next(parent_at)
--- a/third_party/python/virtualenv/distributions.json
+++ b/third_party/python/virtualenv/distributions.json
@@ -16,68 +16,68 @@
     }
   },
   "3.7": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info",
-      "zipp": "__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info"
+      "importlib_metadata": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info",
+      "zipp": "__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info"
     }
   },
   "3.6": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info",
-      "zipp": "__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info",
-      "importlib_resources": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info"
+      "importlib_metadata": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata-3.1.1.dist-info",
+      "zipp": "__virtualenv__/zipp-3.4.0-py3-none-any/zipp-3.4.0.dist-info",
+      "importlib_resources": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources-3.3.0.dist-info"
     }
   },
   "3.5": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info",
+      "importlib_metadata": "__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata-2.1.1.dist-info",
       "zipp": "__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info",
-      "importlib_resources": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info"
+      "importlib_resources": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources-3.2.1.dist-info"
     }
   },
   "3.4": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
       "importlib_metadata": "__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info",
       "zipp": "__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info",
       "importlib_resources": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info",
       "typing": "__virtualenv__/typing-3.7.4.1-py3-none-any/typing-3.7.4.1.dist-info",
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info",
-      "scandir": "__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info"
+      "scandir": "__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info"
     }
   },
   "2.7": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info",
       "importlib_metadata": "__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info",
       "zipp": "__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info",
       "importlib_resources": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info",
       "typing": "__virtualenv__/typing-3.7.4.3-py2-none-any/typing-3.7.4.3.dist-info",
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info",
-      "scandir": "__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info",
+      "scandir": "__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir-1.10.0.dist-info",
       "contextlib2": "__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2-0.6.0.post1.dist-info",
       "configparser": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser-4.0.2.dist-info"
     },
     "!=win32": {
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info"
     }
   }
 }
\ No newline at end of file
--- a/third_party/python/virtualenv/modules.json
+++ b/third_party/python/virtualenv/modules.json
@@ -67,28 +67,19 @@
       "distlib.wheel": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/wheel.py",
       "distlib._backport": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/__init__.py",
       "distlib._backport.misc": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/misc.py",
       "distlib._backport.shutil": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/shutil.py",
       "distlib._backport.sysconfig": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/sysconfig.py",
       "distlib._backport.tarfile": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/tarfile.py",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock.py",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six.py",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py",
-      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py",
-      "importlib_metadata.docs": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/__init__.py",
-      "importlib_metadata.docs.conf": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/conf.py",
-      "importlib_metadata.tests": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/__init__.py",
-      "importlib_metadata.tests.fixtures": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/fixtures.py",
-      "importlib_metadata.tests.test_api": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_api.py",
-      "importlib_metadata.tests.test_integration": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_integration.py",
-      "importlib_metadata.tests.test_main": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_main.py",
-      "importlib_metadata.tests.test_zip": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_zip.py",
-      "importlib_metadata.tests.data": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/data/__init__.py",
-      "zipp": "__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py"
+      "importlib_metadata": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/__init__.py",
+      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/_compat.py",
+      "zipp": "__virtualenv__/zipp-3.4.0-py3-none-any/zipp.py"
     }
   },
   "3.6": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py",
       "distlib.compat": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py",
       "distlib.database": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py",
@@ -104,53 +95,44 @@
       "distlib.wheel": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/wheel.py",
       "distlib._backport": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/__init__.py",
       "distlib._backport.misc": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/misc.py",
       "distlib._backport.shutil": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/shutil.py",
       "distlib._backport.sysconfig": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/sysconfig.py",
       "distlib._backport.tarfile": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/tarfile.py",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock.py",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six.py",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py",
-      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py",
-      "importlib_metadata.docs": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/__init__.py",
-      "importlib_metadata.docs.conf": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/conf.py",
-      "importlib_metadata.tests": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/__init__.py",
-      "importlib_metadata.tests.fixtures": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/fixtures.py",
-      "importlib_metadata.tests.test_api": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_api.py",
-      "importlib_metadata.tests.test_integration": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_integration.py",
-      "importlib_metadata.tests.test_main": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_main.py",
-      "importlib_metadata.tests.test_zip": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_zip.py",
-      "importlib_metadata.tests.data": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/data/__init__.py",
-      "zipp": "__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py",
-      "importlib_resources": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py",
-      "importlib_resources._common": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py",
-      "importlib_resources._compat": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py",
-      "importlib_resources._py2": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py",
-      "importlib_resources._py3": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py",
-      "importlib_resources.abc": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py",
-      "importlib_resources.readers": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py",
-      "importlib_resources.trees": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py",
-      "importlib_resources.tests": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/__init__.py",
-      "importlib_resources.tests.test_files": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_files.py",
-      "importlib_resources.tests.test_open": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_open.py",
-      "importlib_resources.tests.test_path": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_path.py",
-      "importlib_resources.tests.test_read": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_read.py",
-      "importlib_resources.tests.test_resource": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_resource.py",
-      "importlib_resources.tests.util": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/util.py",
-      "importlib_resources.tests.data01": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data01/__init__.py",
-      "importlib_resources.tests.data01.subdirectory": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data01/subdirectory/__init__.py",
-      "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
-      "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
-      "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
-      "importlib_resources.tests.data03": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/__init__.py",
-      "importlib_resources.tests.data03.namespace.portion1": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/namespace/portion1/__init__.py",
-      "importlib_resources.tests.data03.namespace.portion2": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/namespace/portion2/__init__.py",
-      "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
-      "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py"
+      "importlib_metadata": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/__init__.py",
+      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-3.1.1-py3-none-any/importlib_metadata/_compat.py",
+      "zipp": "__virtualenv__/zipp-3.4.0-py3-none-any/zipp.py",
+      "importlib_resources": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/__init__.py",
+      "importlib_resources._common": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_common.py",
+      "importlib_resources._compat": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_compat.py",
+      "importlib_resources._py2": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py2.py",
+      "importlib_resources._py3": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/_py3.py",
+      "importlib_resources.abc": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/abc.py",
+      "importlib_resources.readers": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/readers.py",
+      "importlib_resources.trees": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/trees.py",
+      "importlib_resources.tests": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/__init__.py",
+      "importlib_resources.tests._compat": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/_compat.py",
+      "importlib_resources.tests.py27compat": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/py27compat.py",
+      "importlib_resources.tests.test_files": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_files.py",
+      "importlib_resources.tests.test_open": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_open.py",
+      "importlib_resources.tests.test_path": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_path.py",
+      "importlib_resources.tests.test_read": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_read.py",
+      "importlib_resources.tests.test_reader": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_reader.py",
+      "importlib_resources.tests.test_resource": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/test_resource.py",
+      "importlib_resources.tests.util": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/util.py",
+      "importlib_resources.tests.data01": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data01/__init__.py",
+      "importlib_resources.tests.data01.subdirectory": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data01/subdirectory/__init__.py",
+      "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
+      "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
+      "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
+      "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
+      "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-3.3.0-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py"
     }
   },
   "3.5": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py",
       "distlib.compat": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py",
       "distlib.database": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py",
@@ -166,53 +148,44 @@
       "distlib.wheel": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/wheel.py",
       "distlib._backport": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/__init__.py",
       "distlib._backport.misc": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/misc.py",
       "distlib._backport.shutil": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/shutil.py",
       "distlib._backport.sysconfig": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/sysconfig.py",
       "distlib._backport.tarfile": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/tarfile.py",
       "filelock": "__virtualenv__/filelock-3.0.12-py3-none-any/filelock.py",
       "six": "__virtualenv__/six-1.15.0-py2.py3-none-any/six.py",
-      "importlib_metadata": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py",
-      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py",
-      "importlib_metadata.docs": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/__init__.py",
-      "importlib_metadata.docs.conf": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/docs/conf.py",
-      "importlib_metadata.tests": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/__init__.py",
-      "importlib_metadata.tests.fixtures": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/fixtures.py",
-      "importlib_metadata.tests.test_api": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_api.py",
-      "importlib_metadata.tests.test_integration": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_integration.py",
-      "importlib_metadata.tests.test_main": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_main.py",
-      "importlib_metadata.tests.test_zip": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/test_zip.py",
-      "importlib_metadata.tests.data": "__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/tests/data/__init__.py",
+      "importlib_metadata": "__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/__init__.py",
+      "importlib_metadata._compat": "__virtualenv__/importlib_metadata-2.1.1-py2.py3-none-any/importlib_metadata/_compat.py",
       "zipp": "__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp.py",
-      "importlib_resources": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py",
-      "importlib_resources._common": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py",
-      "importlib_resources._compat": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py",
-      "importlib_resources._py2": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py",
-      "importlib_resources._py3": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py",
-      "importlib_resources.abc": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py",
-      "importlib_resources.readers": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py",
-      "importlib_resources.trees": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py",
-      "importlib_resources.tests": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/__init__.py",
-      "importlib_resources.tests.test_files": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_files.py",
-      "importlib_resources.tests.test_open": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_open.py",
-      "importlib_resources.tests.test_path": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_path.py",
-      "importlib_resources.tests.test_read": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_read.py",
-      "importlib_resources.tests.test_resource": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/test_resource.py",
-      "importlib_resources.tests.util": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/util.py",
-      "importlib_resources.tests.data01": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data01/__init__.py",
-      "importlib_resources.tests.data01.subdirectory": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data01/subdirectory/__init__.py",
-      "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
-      "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
-      "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
-      "importlib_resources.tests.data03": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/__init__.py",
-      "importlib_resources.tests.data03.namespace.portion1": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/namespace/portion1/__init__.py",
-      "importlib_resources.tests.data03.namespace.portion2": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/data03/namespace/portion2/__init__.py",
-      "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
-      "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py"
+      "importlib_resources": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/__init__.py",
+      "importlib_resources._common": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_common.py",
+      "importlib_resources._compat": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_compat.py",
+      "importlib_resources._py2": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py2.py",
+      "importlib_resources._py3": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/_py3.py",
+      "importlib_resources.abc": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/abc.py",
+      "importlib_resources.readers": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/readers.py",
+      "importlib_resources.trees": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/trees.py",
+      "importlib_resources.tests": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/__init__.py",
+      "importlib_resources.tests._compat": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/_compat.py",
+      "importlib_resources.tests.py27compat": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/py27compat.py",
+      "importlib_resources.tests.test_files": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_files.py",
+      "importlib_resources.tests.test_open": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_open.py",
+      "importlib_resources.tests.test_path": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_path.py",
+      "importlib_resources.tests.test_read": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_read.py",
+      "importlib_resources.tests.test_reader": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_reader.py",
+      "importlib_resources.tests.test_resource": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/test_resource.py",
+      "importlib_resources.tests.util": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/util.py",
+      "importlib_resources.tests.data01": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data01/__init__.py",
+      "importlib_resources.tests.data01.subdirectory": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data01/subdirectory/__init__.py",
+      "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
+      "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
+      "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
+      "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
+      "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-3.2.1-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py"
     }
   },
   "3.4": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py",
       "distlib.compat": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py",
       "distlib.database": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py",
@@ -262,17 +235,17 @@
       "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
       "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
       "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
       "importlib_resources.tests.data03": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data03/__init__.py",
       "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
       "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py",
       "typing": "__virtualenv__/typing-3.7.4.1-py3-none-any/typing.py",
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2/__init__.py",
-      "scandir": "__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py"
+      "scandir": "__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir.py"
     }
   },
   "2.7": {
     "==any": {
       "appdirs": "__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py",
       "distlib": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py",
       "distlib.compat": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py",
       "distlib.database": "__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py",
@@ -322,17 +295,17 @@
       "importlib_resources.tests.data02": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/__init__.py",
       "importlib_resources.tests.data02.one": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/one/__init__.py",
       "importlib_resources.tests.data02.two": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data02/two/__init__.py",
       "importlib_resources.tests.data03": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/data03/__init__.py",
       "importlib_resources.tests.zipdata01": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/zipdata01/__init__.py",
       "importlib_resources.tests.zipdata02": "__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/tests/zipdata02/__init__.py",
       "typing": "__virtualenv__/typing-3.7.4.3-py2-none-any/typing.py",
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2/__init__.py",
-      "scandir": "__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py",
+      "scandir": "__virtualenv__/scandir-1.10.0-cp39-cp39-macosx_10_15_x86_64/scandir.py",
       "contextlib2": "__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2.py",
       "configparser": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser.py",
       "backports": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/__init__.py",
       "backports.configparser": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/__init__.py",
       "backports.configparser.helpers": "__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/helpers.py"
     },
     "!=win32": {
       "pathlib2": "__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2/__init__.py"
deleted file mode 100644
--- a/third_party/python/virtualenv/virtualenv-20.0.31.dist-info/METADATA
+++ /dev/null
@@ -1,91 +0,0 @@
-Metadata-Version: 2.1
-Name: virtualenv
-Version: 20.0.31
-Summary: Virtual Python Environment builder
-Home-page: https://virtualenv.pypa.io/
-Author: Bernat Gabor
-Author-email: gaborjbernat@gmail.com
-Maintainer: Bernat Gabor
-Maintainer-email: gaborjbernat@gmail.com
-License: MIT
-Project-URL: Source, https://github.com/pypa/virtualenv
-Project-URL: Tracker, https://github.com/pypa/virtualenv/issues
-Keywords: virtual,environments,isolated
-Platform: any
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: POSIX
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Software Development :: Testing
-Classifier: Topic :: Utilities
-Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7
-Description-Content-Type: text/markdown
-Requires-Dist: appdirs (<2,>=1.4.3)
-Requires-Dist: distlib (<1,>=0.3.1)
-Requires-Dist: filelock (<4,>=3.0.0)
-Requires-Dist: six (<2,>=1.9.0)
-Requires-Dist: pathlib2 (<3,>=2.3.3) ; python_version < "3.4" and sys_platform != "win32"
-Requires-Dist: importlib-resources (>=1.0) ; python_version < "3.7"
-Requires-Dist: importlib-metadata (<2,>=0.12) ; python_version < "3.8"
-Provides-Extra: docs
-Requires-Dist: proselint (>=0.10.2) ; extra == 'docs'
-Requires-Dist: sphinx (>=3) ; extra == 'docs'
-Requires-Dist: sphinx-argparse (>=0.2.5) ; extra == 'docs'
-Requires-Dist: sphinx-rtd-theme (>=0.4.3) ; extra == 'docs'
-Requires-Dist: towncrier (>=19.9.0rc1) ; extra == 'docs'
-Provides-Extra: testing
-Requires-Dist: coverage (>=5) ; extra == 'testing'
-Requires-Dist: coverage-enable-subprocess (>=1) ; extra == 'testing'
-Requires-Dist: flaky (>=3) ; extra == 'testing'
-Requires-Dist: pytest (>=4) ; extra == 'testing'
-Requires-Dist: pytest-env (>=0.6.2) ; extra == 'testing'
-Requires-Dist: pytest-freezegun (>=0.4.1) ; extra == 'testing'
-Requires-Dist: pytest-mock (>=2) ; extra == 'testing'
-Requires-Dist: pytest-randomly (>=1) ; extra == 'testing'
-Requires-Dist: pytest-timeout (>=1) ; extra == 'testing'
-Requires-Dist: pytest-xdist (>=1.31.0) ; extra == 'testing'
-Requires-Dist: packaging (>=20.0) ; (python_version > "3.4") and extra == 'testing'
-Requires-Dist: xonsh (>=0.9.16) ; (python_version > "3.4" and python_version != "3.9") and extra == 'testing'
-
-# virtualenv
-
-[![PyPI](https://img.shields.io/pypi/v/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
-[![PyPI - Implementation](https://img.shields.io/pypi/implementation/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
-[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
-[![Documentation](https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square)](http://virtualenv.pypa.io)
-[![Gitter Chat](https://img.shields.io/gitter/room/pypa/virtualenv?color=FF004F&style=flat-square)](https://gitter.im/pypa/virtualenv)
-[![PyPI - Downloads](https://img.shields.io/pypi/dm/virtualenv?style=flat-square)](https://pypistats.org/packages/virtualenv)
-[![PyPI - License](https://img.shields.io/pypi/l/virtualenv?style=flat-square)](https://opensource.org/licenses/MIT)
-[![Build Status](https://github.com/pypa/virtualenv/workflows/check/badge.svg?branch=master&event=push)](https://github.com/pypa/virtualenv/actions?query=workflow%3Acheck)
-[![codecov](https://codecov.io/gh/pypa/virtualenv/branch/master/graph/badge.svg)](https://codecov.io/gh/pypa/virtualenv)
-[![Code style:
-black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/psf/black)
-
-A tool for creating isolated `virtual` python environments.
-
-- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
-- [Documentation](https://virtualenv.pypa.io)
-- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
-- [Issues](https://github.com/pypa/virtualenv/issues)
-- [PyPI](https://pypi.org/project/virtualenv)
-- [Github](https://github.com/pypa/virtualenv)
-
-## Code of Conduct
-
-Everyone interacting in the virtualenv project's codebases, issue trackers, chat rooms, and mailing lists is expected to
-follow the [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md).
-
-
deleted file mode 100644
--- a/third_party/python/virtualenv/virtualenv-20.0.31.dist-info/RECORD
+++ /dev/null
@@ -1,120 +0,0 @@
-virtualenv/__init__.py,sha256=SMvpjz4VJ3vJ_yfDDPzJAdi2GJOYd_UBXXuvImO07gk,205
-virtualenv/__main__.py,sha256=QMwDqrR4QbhEivl8yoRmAr6G1BY92gr4n1ConcDIxc4,2770
-virtualenv/info.py,sha256=-2pI_kyC9fNj5OR8AQWkKjlpOk4_96Lmbco3atYYBdY,1921
-virtualenv/report.py,sha256=M2OHHCWdOHZsn74tj1MYYKmaI3QRJF8VA1FZIdkQTMQ,1594
-virtualenv/version.py,sha256=3ieAw0XY11zpShwBdavzQZAO60AeVi5FVy0KWrcxwUY,66
-virtualenv/activation/__init__.py,sha256=jLIERxJXMnHq2fH49RdWqBoaiASres4CTKMdUJOeos0,480
-virtualenv/activation/activator.py,sha256=CXomkRvhzcAeygYlDwQdDjfPyZQG85aBab5GIVQPv2M,1341
-virtualenv/activation/via_template.py,sha256=B88RGc0qoGc46DmKJmLJuzcCJU_iXWhdD93r6KLuYHQ,2204
-virtualenv/activation/bash/__init__.py,sha256=7aC1WfvyzgFrIQs13jOuESuAbuiAnTsKkOe0iReRoaE,312
-virtualenv/activation/bash/activate.sh,sha256=xkIDykLyI5CO3K7eeAujgPiBP2eleYDTFsqhaXsOUG4,2249
-virtualenv/activation/batch/__init__.py,sha256=K0gVfwuXV7uoaMDL7moWGCq7uTDzI64giZzQQ8s2qnU,733
-virtualenv/activation/batch/activate.bat,sha256=PeQnWWsjvHT-jIWhYI7hbdzkDBZx5UOstnsCmq5PYtw,1031
-virtualenv/activation/batch/deactivate.bat,sha256=6OznnO-HC2wnWUN7YAT-bj815zeKMXEPC0keyBYwKUU,510
-virtualenv/activation/batch/pydoc.bat,sha256=pVuxn8mn9P_Rd0349fiBEiwIuMvfJQSfgJ2dljUT2fA,24
-virtualenv/activation/cshell/__init__.py,sha256=pw4s5idqQhaEccPxadETEvilBcoxW-UkVQ-RNqPyVCQ,344
-virtualenv/activation/cshell/activate.csh,sha256=jYwms8OTiVu9MJwXltuEm43HU09BJUqkrVqyj4sjpDA,1468
-virtualenv/activation/fish/__init__.py,sha256=hDkJq1P1wK2qm6BXydXWA9GMkBpj-TaejbKSceFnGZU,251
-virtualenv/activation/fish/activate.fish,sha256=V7nVwSI_nsFEMlJjSQxCayNWkjubXi1KSgSw1bEakh8,3099
-virtualenv/activation/powershell/__init__.py,sha256=EA-73s5TUMkgxAhLwucFg3gsBwW5huNh7qB4I7uEU-U,256
-virtualenv/activation/powershell/activate.ps1,sha256=qXTD2IZIPXIr3HZbNahnym8l3FFwa1o_pyB8cSmxeg0,1867
-virtualenv/activation/python/__init__.py,sha256=Uv53LqOrIT_2dO1FXcUYAnwH1eypG8CJ2InhSx1GRI4,1323
-virtualenv/activation/python/activate_this.py,sha256=Xpz7exdGSjmWk0KfwHLofIpDPUtazNSNGrxT0-5ZG_s,1208
-virtualenv/activation/xonsh/__init__.py,sha256=7NUevd5EpHRMZdSyR1KgFTe9QQBO94zZOwFH6MR6zjo,355
-virtualenv/activation/xonsh/activate.xsh,sha256=qkKgWfrUjYKrgrmhf45VuBz99EMadtiNU8GMfHZZ7AU,1172
-virtualenv/app_data/__init__.py,sha256=mOgHrNxZ320NcDvl2EU9Uhaq9XSwnJwkldKAWtrMCKo,1882
-virtualenv/app_data/base.py,sha256=wtoduyV2lc020XNdOwt5gu1lkUJd0n_LMrgT8nifAwo,2054
-virtualenv/app_data/na.py,sha256=fCISMfJt3opkAqCmJBZTW9tody6ECfVPXtSrY5ZJueY,1321
-virtualenv/app_data/via_disk_folder.py,sha256=bJxZIXTAqQekwRZuoYgAE1fvwQ6w1dBR2IJFe09OIjE,5404
-virtualenv/app_data/via_tempdir.py,sha256=vt4I1wAaNouOeFSTFX5DPbA3zPZ1ikVGzXBDsNLNHRM,771
-virtualenv/config/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/config/convert.py,sha256=msrkiG2Vq9gYQXf1C5W4n3b0ZTv6weFANV-mLUq6uMo,2091
-virtualenv/config/env_var.py,sha256=48XpOurSLLjMX-kXjvOpZuAoOUP-LvnbotTlmebhhFk,844
-virtualenv/config/ini.py,sha256=neMqXrA6IOkLF_M_MCQWQSeqNm4CT8tj_h3GdbJv1Cg,2783
-virtualenv/config/cli/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/config/cli/parser.py,sha256=y5IqHccLBqFpocpE75X611nVrP8v394VW94a9GAojvE,4524
-virtualenv/create/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/create/creator.py,sha256=D2YsK817anGhHxjh_ew7MlRCGjPPzW95lroRPlzblGk,8437
-virtualenv/create/debug.py,sha256=ETOke8w4Ib8fiufAHVeOkH3v0zrztljw3WjGvZyE0Mk,3342
-virtualenv/create/describe.py,sha256=bm0V2wpFOjdN_MkzZuJAEBSttmi5YGPVwxtwGYU5zQU,3561
-virtualenv/create/pyenv_cfg.py,sha256=VsOGfzUpaVCO3J29zrhIeip4jZ4b7llbe45iOQAIRGg,1717
-virtualenv/create/via_global_ref/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/create/via_global_ref/_virtualenv.py,sha256=aEuMB5MrpKhKwuWumv5J7wTpK6w9jUGR1FXPCdCT5fw,5662
-virtualenv/create/via_global_ref/api.py,sha256=uAQjwBRJ-u4d6A24QuxeB-khIrSGiP7-W_SQxNdE-Sk,4277
-virtualenv/create/via_global_ref/store.py,sha256=cqLBEhQ979xHnlidqmxlDjsvj2Wr-mBo7shvGQSEBxU,685
-virtualenv/create/via_global_ref/venv.py,sha256=A6XrGu3oco_ZIHv0s-TybW7lErAomgLOYDMtgpdACc0,2919
-virtualenv/create/via_global_ref/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/create/via_global_ref/builtin/builtin_way.py,sha256=hO22nT-itVoYiy8wXrXXYzHw86toCp_Uq-cURR7w6ck,546
-virtualenv/create/via_global_ref/builtin/ref.py,sha256=-r9sJSW9X9rHxThk2yyJJRA5KkmJPW_axuffYBsFDIU,5501
-virtualenv/create/via_global_ref/builtin/via_global_self_do.py,sha256=9aH07lmA6SMvtynv7ZTO6Gh2aDDFdUiDQrlbtT9xze4,4057
-virtualenv/create/via_global_ref/builtin/cpython/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/create/via_global_ref/builtin/cpython/common.py,sha256=_ycHGl1I4Pr7RfsXlUP0otJw9VQ0L744lTpPTTxPo6w,1909
-virtualenv/create/via_global_ref/builtin/cpython/cpython2.py,sha256=p41H2g6wAqhJzeUU48nH3u05-yWEbwCzhyj4pn8rnm4,3757
-virtualenv/create/via_global_ref/builtin/cpython/cpython3.py,sha256=9sY098at5Wp1Fhu1Aux1y06wH2ecbGj3bRucl4CGSQY,2473
-virtualenv/create/via_global_ref/builtin/cpython/mac_os.py,sha256=Hc9FVoQPuf8IV5j17LVj49lH7nyCep2nh_lWlZm49YI,12318
-virtualenv/create/via_global_ref/builtin/pypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/create/via_global_ref/builtin/pypy/common.py,sha256=KagqBNEuysqqO-n-VCCpuMvBK8MiZFMJQRWbWW12c6g,1696
-virtualenv/create/via_global_ref/builtin/pypy/pypy2.py,sha256=bmMY_KJZ1iD_ifq-X9ZBOlOpJ1aN7839qigBgnWRIdA,3535
-virtualenv/create/via_global_ref/builtin/pypy/pypy3.py,sha256=ti6hmOIC4HiTBnEYKytO-d9wH-eLeMoQxQ0kZRhnNrw,1751
-virtualenv/create/via_global_ref/builtin/python2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/create/via_global_ref/builtin/python2/python2.py,sha256=jkJwmkeJVTzwzo95eMIptTfdBA-qmyIqZcpt48iOitU,4276
-virtualenv/create/via_global_ref/builtin/python2/site.py,sha256=mp-Y1VLSXqhIeOojQefy8ffIylWqfq20jEfc2UwMTYU,6120
-virtualenv/discovery/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/discovery/builtin.py,sha256=1c4Py9DnkiCLrbHp7bffvQtJI9HkxfVyFedt6IFMKEs,5079
-virtualenv/discovery/cached_py_info.py,sha256=vQiAFDoBjR13zrdmc5q97z4upBxWzUG6H6IHJZjqjeU,5007
-virtualenv/discovery/discover.py,sha256=evJYn4APkwjNmdolNeIBSHiOudkvN59c5oVYI2Zsjlg,1209
-virtualenv/discovery/py_info.py,sha256=PMbQIitL6ELOJpAZF3rrMxPxM8oOmTK9aDvb4YHTDEw,21783
-virtualenv/discovery/py_spec.py,sha256=wQhLzCfXoSPsAAO9nm5-I2lNolVDux4W2vPSUfJGjlc,4790
-virtualenv/discovery/windows/__init__.py,sha256=TPbnzCtRyw47pRVHTO8ikwljNcczxmSLDdWtwasxvQU,1036
-virtualenv/discovery/windows/pep514.py,sha256=YYiaJzo-XuMtO78BMFMAudqkeJiLQkFnUTOuQZ5lJz8,5451
-virtualenv/run/__init__.py,sha256=REhXScKzirtvWjFpTZdepZCKIxcjsRHZtt3q5mDsrMQ,5771
-virtualenv/run/session.py,sha256=mzXJyVQlXXgj_kO9IJDor44Co7WKiyFGnZ0mCTIy5x0,2547
-virtualenv/run/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/run/plugin/activators.py,sha256=kmHShj36eHfbnsiAJzX0U5LYvGhe0WkRYjbuKDz6gVM,2117
-virtualenv/run/plugin/base.py,sha256=-2185C01PaxOG7gnMbWWyZlo24n_FYo5J5_naeNZw8s,1934
-virtualenv/run/plugin/creators.py,sha256=5L7G5mk2GIOIaZVvDZszd2VVBSUM3jkAR4aBO0OkOXY,3517
-virtualenv/run/plugin/discovery.py,sha256=ba9szD21er0-AkuMXrdFOjFEDsIekRWljXdXkj_-8EM,994
-virtualenv/run/plugin/seeders.py,sha256=XVKaikuOC4JUO4lirHzowEJ6d0pI1pFfywCx3heE70g,1026
-virtualenv/seed/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
-virtualenv/seed/seeder.py,sha256=DSGE_8Ycj01vj8mkppUBA9h7JG76XsVBMt-5MWlMF6k,1178
-virtualenv/seed/embed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/seed/embed/base_embed.py,sha256=j4qcALcc-ylU0bKjVxiELPqk4MJ8f0pmbe_lVYVH_5Q,4166
-virtualenv/seed/embed/pip_invoke.py,sha256=EMVwIeoW15SuorJ8z_-vBxPXwQJLS0ILA0Va9zNoOLI,2127
-virtualenv/seed/embed/via_app_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/seed/embed/via_app_data/via_app_data.py,sha256=quofMFCWc-OxvxdAJwZTWS5mOugnYB7wRqSJZxmkl-E,6053
-virtualenv/seed/embed/via_app_data/pip_install/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-virtualenv/seed/embed/via_app_data/pip_install/base.py,sha256=rnR60JzM7G04cPDo2eH-aR8-iQuFXBgHJ2lQnSf0Gfs,6355
-virtualenv/seed/embed/via_app_data/pip_install/copy.py,sha256=gG2NePFHOYh-bsCf6TpsaQ_qrYhdBy67k0RWuwHSAwo,1307
-virtualenv/seed/embed/via_app_data/pip_install/symlink.py,sha256=wHCpfKobvjjaZLUSwM3FSCblZfiBFw4IQYsxwlfEEu0,2362
-virtualenv/seed/wheels/__init__.py,sha256=1J7el7lNjAwGxM4dmricrbVhSbYxs5sPzv9PTx2A6qA,226
-virtualenv/seed/wheels/acquire.py,sha256=Iq_QPJgUPCyHfrS3t2EUUj8fieymfcKNve1JbJQ5Uyc,4420
-virtualenv/seed/wheels/bundle.py,sha256=xYbhh5nQEwec2vnqNJWNVtDL3VyjGkgDWVXSuXzXB-Y,1961
-virtualenv/seed/wheels/periodic_update.py,sha256=A9l7ZpjtWzGrq2nh39y8g5OppUryHb7_W3bCR7TAnPc,12756
-virtualenv/seed/wheels/util.py,sha256=Zdo76KEDqbNmM5u9JTuyu5uzEN_fQ4oj6qHOt0h0o1M,3960
-virtualenv/seed/wheels/embed/__init__.py,sha256=qc4QGDYH6J4ikiW1GPSkgjpapQDB7TpPd6TTr21jvbU,1995
-virtualenv/seed/wheels/embed/pip-19.1.1-py2.py3-none-any.whl,sha256=mTE08EdUcbkUUsoCnUOQ3I8pisY6cSgU8QHNG220ZnY,1360957
-virtualenv/seed/wheels/embed/pip-20.2.2-py2.py3-none-any.whl,sha256=UkTlFJT10d-7idpJLUJQywf5JGZEc20Q7WxF3rGkhQA,1503623
-virtualenv/seed/wheels/embed/setuptools-43.0.0-py2.py3-none-any.whl,sha256=pn-qUVGe8ozYJhr_DiIbbkw3D4-4utqKo-etiUUZmWM,583228
-virtualenv/seed/wheels/embed/setuptools-44.1.1-py2.py3-none-any.whl,sha256=J6cUwJJTE05gpvpoEw94xwN-VWLE8h-PMY8q6QDRUtU,583493
-virtualenv/seed/wheels/embed/setuptools-49.6.0-py3-none-any.whl,sha256=TdW7CgoM_3e0bKXdOoSFfuSMg-giOIa1VmE8ckmUBz8,803275
-virtualenv/seed/wheels/embed/wheel-0.33.6-py2.py3-none-any.whl,sha256=9NoXY9O-zy4s2SoUp8kg8PAOyjD93p6pksg2aFufryg,21556
-virtualenv/seed/wheels/embed/wheel-0.35.1-py2.py3-none-any.whl,sha256=SXrdU1JdFsFzwsHHM7j2VVEOkJ6njMDinTdCQ1RLd6I,33174
-virtualenv/util/__init__.py,sha256=om6Hs2lH5igf5lkcSmQFiU7iMZ0Wx4dmSlMc6XW_Llg,199
-virtualenv/util/error.py,sha256=SRSZlXvMYQuJwxoUfNhlAyo3VwrAnIsZemSwPOxpjns,352
-virtualenv/util/lock.py,sha256=AyYqRMsz5YnLNDLNTrutjLqS8m0lkLqNNDpxW565b44,3550
-virtualenv/util/six.py,sha256=_8KWXUWi3-AaFmz4LkdyNra-uNuf70vlxwjN7oeRo8g,1463
-virtualenv/util/zipapp.py,sha256=jtf4Vn7XBnjPs_B_ObIQv_x4pFlIlPKAWHYLFV59h6U,1054
-virtualenv/util/path/__init__.py,sha256=YaBAxtzGBdMu0uUtppe0ZeCHw5HhO-5zjeb3-fzyMoI,336
-virtualenv/util/path/_permission.py,sha256=XpO2vGAk_92_biD4MEQcAQq2Zc8_rpm3M3n_hMUA1rw,745
-virtualenv/util/path/_sync.py,sha256=7oEmxJB5fc7NIsVgPJTJ4mpVPjNaNHAdhqlgIFSDfm0,2370
-virtualenv/util/path/_pathlib/__init__.py,sha256=evaey395zOuDc3FlukUeJ8SzRqLx1xWOKmg-TEPsRd4,1446
-virtualenv/util/path/_pathlib/via_os_path.py,sha256=wlnf0MIktEP01kG9z8iKOI86levXmkX7UX1LMLK7A-E,3701
-virtualenv/util/subprocess/__init__.py,sha256=2H-ZQ74OKq60eSpxfRWD-8gVUydczkrKSexl18DzOXI,753
-virtualenv/util/subprocess/_win_subprocess.py,sha256=0-eJVcxBs1Fe76OVTQnUVLaLzB4tlJxEZ-vZECQ4xL4,5576
-virtualenv-20.0.31.dist-info/LICENSE,sha256=XBWRk3jFsqqrexnOpw2M3HX3aHnjJFTkwDmfi3HRcek,1074
-virtualenv-20.0.31.dist-info/METADATA,sha256=Pwhk7KR7q09ZjMUtWXYwzvuWD1mY4hxS1e9eqpsjRs8,4923
-virtualenv-20.0.31.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
-virtualenv-20.0.31.dist-info/entry_points.txt,sha256=1DALKzYOcffJa7Q15TQlMQu0yeFXEy5W124y0aJEfYU,1615
-virtualenv-20.0.31.dist-info/top_level.txt,sha256=JV-LVlC8YeIw1DgiYI0hEot7tgFy5IWdKVcSG7NyzaI,11
-virtualenv-20.0.31.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
-virtualenv-20.0.31.dist-info/RECORD,,
rename from third_party/python/virtualenv/virtualenv-20.0.31.dist-info/LICENSE
rename to third_party/python/virtualenv/virtualenv-20.2.2.dist-info/LICENSE
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/virtualenv-20.2.2.dist-info/METADATA
@@ -0,0 +1,92 @@
+Metadata-Version: 2.1
+Name: virtualenv
+Version: 20.2.2
+Summary: Virtual Python Environment builder
+Home-page: https://virtualenv.pypa.io/
+Author: Bernat Gabor
+Author-email: gaborjbernat@gmail.com
+Maintainer: Bernat Gabor
+Maintainer-email: gaborjbernat@gmail.com
+License: MIT
+Project-URL: Source, https://github.com/pypa/virtualenv
+Project-URL: Tracker, https://github.com/pypa/virtualenv/issues
+Keywords: virtual,environments,isolated
+Platform: any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 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
+Classifier: Topic :: Software Development :: Testing
+Classifier: Topic :: Utilities
+Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7
+Description-Content-Type: text/markdown
+Requires-Dist: appdirs (<2,>=1.4.3)
+Requires-Dist: distlib (<1,>=0.3.1)
+Requires-Dist: filelock (<4,>=3.0.0)
+Requires-Dist: six (<2,>=1.9.0)
+Requires-Dist: pathlib2 (<3,>=2.3.3) ; python_version < "3.4" and sys_platform != "win32"
+Requires-Dist: importlib-resources (>=1.0) ; python_version < "3.7"
+Requires-Dist: importlib-metadata (>=0.12) ; python_version < "3.8"
+Provides-Extra: docs
+Requires-Dist: proselint (>=0.10.2) ; extra == 'docs'
+Requires-Dist: sphinx (>=3) ; extra == 'docs'
+Requires-Dist: sphinx-argparse (>=0.2.5) ; extra == 'docs'
+Requires-Dist: sphinx-rtd-theme (>=0.4.3) ; extra == 'docs'
+Requires-Dist: towncrier (>=19.9.0rc1) ; extra == 'docs'
+Provides-Extra: testing
+Requires-Dist: coverage (>=4) ; extra == 'testing'
+Requires-Dist: coverage-enable-subprocess (>=1) ; extra == 'testing'
+Requires-Dist: flaky (>=3) ; extra == 'testing'
+Requires-Dist: pytest (>=4) ; extra == 'testing'
+Requires-Dist: pytest-env (>=0.6.2) ; extra == 'testing'
+Requires-Dist: pytest-freezegun (>=0.4.1) ; extra == 'testing'
+Requires-Dist: pytest-mock (>=2) ; extra == 'testing'
+Requires-Dist: pytest-randomly (>=1) ; extra == 'testing'
+Requires-Dist: pytest-timeout (>=1) ; extra == 'testing'
+Requires-Dist: pytest-xdist (>=1.31.0) ; extra == 'testing'
+Requires-Dist: packaging (>=20.0) ; (python_version > "3.4") and extra == 'testing'
+Requires-Dist: xonsh (>=0.9.16) ; (python_version > "3.4" and python_version != "3.9") and extra == 'testing'
+
+# virtualenv
+
+[![PyPI](https://img.shields.io/pypi/v/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
+[![PyPI - Implementation](https://img.shields.io/pypi/implementation/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
+[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
+[![Documentation](https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square)](http://virtualenv.pypa.io)
+[![Gitter Chat](https://img.shields.io/gitter/room/pypa/virtualenv?color=FF004F&style=flat-square)](https://gitter.im/pypa/virtualenv)
+[![PyPI - Downloads](https://img.shields.io/pypi/dm/virtualenv?style=flat-square)](https://pypistats.org/packages/virtualenv)
+[![PyPI - License](https://img.shields.io/pypi/l/virtualenv?style=flat-square)](https://opensource.org/licenses/MIT)
+[![Build Status](https://github.com/pypa/virtualenv/workflows/check/badge.svg?branch=main&event=push)](https://github.com/pypa/virtualenv/actions?query=workflow%3Acheck)
+[![codecov](https://codecov.io/gh/pypa/virtualenv/branch/main/graph/badge.svg)](https://codecov.io/gh/pypa/virtualenv)
+[![Code style:
+black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/psf/black)
+
+A tool for creating isolated `virtual` python environments.
+
+- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
+- [Documentation](https://virtualenv.pypa.io)
+- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
+- [Issues](https://github.com/pypa/virtualenv/issues)
+- [PyPI](https://pypi.org/project/virtualenv)
+- [Github](https://github.com/pypa/virtualenv)
+
+## Code of Conduct
+
+Everyone interacting in the virtualenv project's codebases, issue trackers, chat rooms, and mailing lists is expected to
+follow the [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md).
+
+
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/virtualenv-20.2.2.dist-info/RECORD
@@ -0,0 +1,122 @@
+virtualenv/__init__.py,sha256=SMvpjz4VJ3vJ_yfDDPzJAdi2GJOYd_UBXXuvImO07gk,205
+virtualenv/__main__.py,sha256=QMwDqrR4QbhEivl8yoRmAr6G1BY92gr4n1ConcDIxc4,2770
+virtualenv/info.py,sha256=-2pI_kyC9fNj5OR8AQWkKjlpOk4_96Lmbco3atYYBdY,1921
+virtualenv/report.py,sha256=M2OHHCWdOHZsn74tj1MYYKmaI3QRJF8VA1FZIdkQTMQ,1594
+virtualenv/version.py,sha256=T9L0FIrWWe1IEvi_PNtZQcEIf_WbHAtFeLA1_hwZ07I,65
+virtualenv/activation/__init__.py,sha256=jLIERxJXMnHq2fH49RdWqBoaiASres4CTKMdUJOeos0,480
+virtualenv/activation/activator.py,sha256=CXomkRvhzcAeygYlDwQdDjfPyZQG85aBab5GIVQPv2M,1341
+virtualenv/activation/via_template.py,sha256=U8LgH-lyTjXIQBUdbd0xOZpXNICpiKhsfpiZwzQg7tU,2372
+virtualenv/activation/bash/__init__.py,sha256=7aC1WfvyzgFrIQs13jOuESuAbuiAnTsKkOe0iReRoaE,312
+virtualenv/activation/bash/activate.sh,sha256=aHia5vyXg2JwymkvRXCp29Aswcg88Mz5UrssXbX9Jjc,2398
+virtualenv/activation/batch/__init__.py,sha256=K0gVfwuXV7uoaMDL7moWGCq7uTDzI64giZzQQ8s2qnU,733
+virtualenv/activation/batch/activate.bat,sha256=PeQnWWsjvHT-jIWhYI7hbdzkDBZx5UOstnsCmq5PYtw,1031
+virtualenv/activation/batch/deactivate.bat,sha256=6OznnO-HC2wnWUN7YAT-bj815zeKMXEPC0keyBYwKUU,510
+virtualenv/activation/batch/pydoc.bat,sha256=pVuxn8mn9P_Rd0349fiBEiwIuMvfJQSfgJ2dljUT2fA,24
+virtualenv/activation/cshell/__init__.py,sha256=pw4s5idqQhaEccPxadETEvilBcoxW-UkVQ-RNqPyVCQ,344
+virtualenv/activation/cshell/activate.csh,sha256=jYwms8OTiVu9MJwXltuEm43HU09BJUqkrVqyj4sjpDA,1468
+virtualenv/activation/fish/__init__.py,sha256=hDkJq1P1wK2qm6BXydXWA9GMkBpj-TaejbKSceFnGZU,251
+virtualenv/activation/fish/activate.fish,sha256=V7nVwSI_nsFEMlJjSQxCayNWkjubXi1KSgSw1bEakh8,3099
+virtualenv/activation/powershell/__init__.py,sha256=EA-73s5TUMkgxAhLwucFg3gsBwW5huNh7qB4I7uEU-U,256
+virtualenv/activation/powershell/activate.ps1,sha256=jVw_FwfVJzcByQ3Sku-wlnOo_a0-OSpAQ8R17kXVgIM,1807
+virtualenv/activation/python/__init__.py,sha256=Uv53LqOrIT_2dO1FXcUYAnwH1eypG8CJ2InhSx1GRI4,1323
+virtualenv/activation/python/activate_this.py,sha256=Xpz7exdGSjmWk0KfwHLofIpDPUtazNSNGrxT0-5ZG_s,1208
+virtualenv/activation/xonsh/__init__.py,sha256=7NUevd5EpHRMZdSyR1KgFTe9QQBO94zZOwFH6MR6zjo,355
+virtualenv/activation/xonsh/activate.xsh,sha256=qkKgWfrUjYKrgrmhf45VuBz99EMadtiNU8GMfHZZ7AU,1172
+virtualenv/app_data/__init__.py,sha256=nwgqY-Our_SYcDisLfRLmWrTSPytDkjck9-lzg-pOI8,1462
+virtualenv/app_data/base.py,sha256=dbS5Maob1-Cqs6EVqTmmbjAGeNYA1iw3pmdgYPWCJak,2129
+virtualenv/app_data/na.py,sha256=iMRVpCe4m5Q5WM5bC3ee1wYyfkfHvkcQ-8tgIw4druc,1306
+virtualenv/app_data/read_only.py,sha256=MD-4Bl2SZZiGw0g8qZy0YLBGZGCuFYXnAEvWboF1PSc,1006
+virtualenv/app_data/via_disk_folder.py,sha256=CdNXQkenyH178MtSs2Ve6uDUs30-oZpkOz_1guTtTz0,5597
+virtualenv/app_data/via_tempdir.py,sha256=Z_-PoU7qeZe-idzi3nqys4FX0rfsRgOQ9_7XwX3hxSA,770
+virtualenv/config/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/config/convert.py,sha256=WYGjMRKVriZkfTH3z1fI0sDQRZxCxAedqWbOGsaquyg,2693
+virtualenv/config/env_var.py,sha256=48XpOurSLLjMX-kXjvOpZuAoOUP-LvnbotTlmebhhFk,844
+virtualenv/config/ini.py,sha256=neMqXrA6IOkLF_M_MCQWQSeqNm4CT8tj_h3GdbJv1Cg,2783
+virtualenv/config/cli/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/config/cli/parser.py,sha256=y5IqHccLBqFpocpE75X611nVrP8v394VW94a9GAojvE,4524
+virtualenv/create/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/create/creator.py,sha256=4jxxEGXCWd6tInT37QNt-13_yDtcIJdPB6EkoYzDkbM,8889
+virtualenv/create/debug.py,sha256=ETOke8w4Ib8fiufAHVeOkH3v0zrztljw3WjGvZyE0Mk,3342
+virtualenv/create/describe.py,sha256=bm0V2wpFOjdN_MkzZuJAEBSttmi5YGPVwxtwGYU5zQU,3561
+virtualenv/create/pyenv_cfg.py,sha256=VsOGfzUpaVCO3J29zrhIeip4jZ4b7llbe45iOQAIRGg,1717
+virtualenv/create/via_global_ref/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/create/via_global_ref/_virtualenv.py,sha256=aEuMB5MrpKhKwuWumv5J7wTpK6w9jUGR1FXPCdCT5fw,5662
+virtualenv/create/via_global_ref/api.py,sha256=5MPq3XJBuUOBj53oIigeWWPm68M-J_E644WWbz37qOU,4357
+virtualenv/create/via_global_ref/store.py,sha256=cqLBEhQ979xHnlidqmxlDjsvj2Wr-mBo7shvGQSEBxU,685
+virtualenv/create/via_global_ref/venv.py,sha256=p5RkDcXhr1pmOwnl1dpS06UYHmfNVy2ld4sTwsYjYWU,2955
+virtualenv/create/via_global_ref/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/create/via_global_ref/builtin/builtin_way.py,sha256=hO22nT-itVoYiy8wXrXXYzHw86toCp_Uq-cURR7w6ck,546
+virtualenv/create/via_global_ref/builtin/ref.py,sha256=xCTICJhE-OiopBxl6ymo1P1NqgK3KEF8ZUOtQDtDTVA,5477
+virtualenv/create/via_global_ref/builtin/via_global_self_do.py,sha256=d569fX7fjq5vHvGGXDjo-1Xi__HhqU2xjDJOuYrmGjw,4552
+virtualenv/create/via_global_ref/builtin/cpython/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/create/via_global_ref/builtin/cpython/common.py,sha256=U7EvB9-2DlOQTGrTyPrEcItEbJ1sFBzo1EAOcAIjQ5Q,2392
+virtualenv/create/via_global_ref/builtin/cpython/cpython2.py,sha256=p41H2g6wAqhJzeUU48nH3u05-yWEbwCzhyj4pn8rnm4,3757
+virtualenv/create/via_global_ref/builtin/cpython/cpython3.py,sha256=gguQAhTQb0PH7Xg-G-mgQm5LlhyyW0V0piV3LwI-PeM,3111
+virtualenv/create/via_global_ref/builtin/cpython/mac_os.py,sha256=B0Lqgo8geZBSKSpHWUB46lDYRggW4Kg2AZUp3Z7xn9M,12382
+virtualenv/create/via_global_ref/builtin/pypy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/create/via_global_ref/builtin/pypy/common.py,sha256=-t-TZxCTJwpIh_oRsDyv5IilH19jKqJrZa27zWN_8Ws,1816
+virtualenv/create/via_global_ref/builtin/pypy/pypy2.py,sha256=bmMY_KJZ1iD_ifq-X9ZBOlOpJ1aN7839qigBgnWRIdA,3535
+virtualenv/create/via_global_ref/builtin/pypy/pypy3.py,sha256=ti6hmOIC4HiTBnEYKytO-d9wH-eLeMoQxQ0kZRhnNrw,1751
+virtualenv/create/via_global_ref/builtin/python2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/create/via_global_ref/builtin/python2/python2.py,sha256=jkJwmkeJVTzwzo95eMIptTfdBA-qmyIqZcpt48iOitU,4276
+virtualenv/create/via_global_ref/builtin/python2/site.py,sha256=4uguJDuWPmB25yBmpsMYKLOnIVXkerck0UO8CP8F2c4,6078
+virtualenv/discovery/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/discovery/builtin.py,sha256=rB6XaQwuK1HfvJsrla3BoSQUH9QkJnwKHGWBdbK4QGM,5432
+virtualenv/discovery/cached_py_info.py,sha256=l2lELE8YkwKXCNopImY2VjmpHPTawh1d3qmdsXMtkRs,5043
+virtualenv/discovery/discover.py,sha256=evJYn4APkwjNmdolNeIBSHiOudkvN59c5oVYI2Zsjlg,1209
+virtualenv/discovery/py_info.py,sha256=QtZFq0xav1tEpKI5seEJaEOkc_FXer21Gzgl_Ccqy98,21793
+virtualenv/discovery/py_spec.py,sha256=wQhLzCfXoSPsAAO9nm5-I2lNolVDux4W2vPSUfJGjlc,4790
+virtualenv/discovery/windows/__init__.py,sha256=TPbnzCtRyw47pRVHTO8ikwljNcczxmSLDdWtwasxvQU,1036
+virtualenv/discovery/windows/pep514.py,sha256=YYiaJzo-XuMtO78BMFMAudqkeJiLQkFnUTOuQZ5lJz8,5451
+virtualenv/run/__init__.py,sha256=lVIiIq_LoMHUGYkrTSx0tpFG_aYywy_u6GWUReHRcUA,5777
+virtualenv/run/session.py,sha256=S4NZiHzij1vp895mN9s9ZwYobJjjdP37QOHCb1o-Ufo,2563
+virtualenv/run/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/run/plugin/activators.py,sha256=kmHShj36eHfbnsiAJzX0U5LYvGhe0WkRYjbuKDz6gVM,2117
+virtualenv/run/plugin/base.py,sha256=-2185C01PaxOG7gnMbWWyZlo24n_FYo5J5_naeNZw8s,1934
+virtualenv/run/plugin/creators.py,sha256=PIxJ85KmrQU7lUO-r8Znxbb4lTEzwHggc9lcDqmt2tc,3494
+virtualenv/run/plugin/discovery.py,sha256=3ykxRvPA1FJMkqsbr2TV0LBRPT5UCFeJdzEHfuEjxRM,1002
+virtualenv/run/plugin/seeders.py,sha256=c1mhzu0HNzKdif6YUV35fuAOS0XHFJz3TtccLW5fWG0,1074
+virtualenv/seed/__init__.py,sha256=8ArZTco6Meo0W9i4dqnwmDO8BJYTaHX7oQx1o06vCm4,57
+virtualenv/seed/seeder.py,sha256=DSGE_8Ycj01vj8mkppUBA9h7JG76XsVBMt-5MWlMF6k,1178
+virtualenv/seed/embed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/seed/embed/base_embed.py,sha256=46mWtqWj_MjOQEqMJyosL0RWGL6HwrHAL2r1Jxc9DuI,4182
+virtualenv/seed/embed/pip_invoke.py,sha256=EMVwIeoW15SuorJ8z_-vBxPXwQJLS0ILA0Va9zNoOLI,2127
+virtualenv/seed/embed/via_app_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/seed/embed/via_app_data/via_app_data.py,sha256=NkVhEFv4iuKG0qvEg4AAmucMwmQgNaPLB-Syepzgps0,5994
+virtualenv/seed/embed/via_app_data/pip_install/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+virtualenv/seed/embed/via_app_data/pip_install/base.py,sha256=rnR60JzM7G04cPDo2eH-aR8-iQuFXBgHJ2lQnSf0Gfs,6355
+virtualenv/seed/embed/via_app_data/pip_install/copy.py,sha256=gG2NePFHOYh-bsCf6TpsaQ_qrYhdBy67k0RWuwHSAwo,1307
+virtualenv/seed/embed/via_app_data/pip_install/symlink.py,sha256=wHCpfKobvjjaZLUSwM3FSCblZfiBFw4IQYsxwlfEEu0,2362
+virtualenv/seed/wheels/__init__.py,sha256=1J7el7lNjAwGxM4dmricrbVhSbYxs5sPzv9PTx2A6qA,226
+virtualenv/seed/wheels/acquire.py,sha256=qchqlIynLi2VP2VtdAfVfZJHbUPcLY2Ui5r7Eh-aZz8,4426
+virtualenv/seed/wheels/bundle.py,sha256=W0uVjClv9IBa50jRvPKm0jMwWnrYTEfDny2Z6bw2W7c,1835
+virtualenv/seed/wheels/periodic_update.py,sha256=HNVEuU2OYdWHW7lVO0h3NkpLkC8bu-5R7igJRXBnGDc,12792
+virtualenv/seed/wheels/util.py,sha256=Zdo76KEDqbNmM5u9JTuyu5uzEN_fQ4oj6qHOt0h0o1M,3960
+virtualenv/seed/wheels/embed/__init__.py,sha256=CLMKoeveDRyiNAdZjEtD38cepgNXkg65xzFu5OSHEus,1995
+virtualenv/seed/wheels/embed/pip-19.1.1-py2.py3-none-any.whl,sha256=mTE08EdUcbkUUsoCnUOQ3I8pisY6cSgU8QHNG220ZnY,1360957
+virtualenv/seed/wheels/embed/pip-20.3.1-py2.py3-none-any.whl,sha256=Ql55sgk5q7_6djOpEVGogq7cd1ZNkxPjWE6wQWwoxVg,1518513
+virtualenv/seed/wheels/embed/setuptools-43.0.0-py2.py3-none-any.whl,sha256=pn-qUVGe8ozYJhr_DiIbbkw3D4-4utqKo-etiUUZmWM,583228
+virtualenv/seed/wheels/embed/setuptools-44.1.1-py2.py3-none-any.whl,sha256=J6cUwJJTE05gpvpoEw94xwN-VWLE8h-PMY8q6QDRUtU,583493
+virtualenv/seed/wheels/embed/setuptools-50.3.2-py3-none-any.whl,sha256=LCQqCFb7rX775WDfSnrdkyTzQM9I30NlHpYEkkRmeUo,785194
+virtualenv/seed/wheels/embed/setuptools-51.0.0-py3-none-any.whl,sha256=jBd5NiFZRcmjfvgJraD6s2UZGVL3oSNhhDK7-sNTxSk,785164
+virtualenv/seed/wheels/embed/wheel-0.33.6-py2.py3-none-any.whl,sha256=9NoXY9O-zy4s2SoUp8kg8PAOyjD93p6pksg2aFufryg,21556
+virtualenv/seed/wheels/embed/wheel-0.36.1-py2.py3-none-any.whl,sha256=kGhk-3IsCrXy-cNbLGXjrzwAlALBCKcJwKyie8LJGHs,34788
+virtualenv/util/__init__.py,sha256=om6Hs2lH5igf5lkcSmQFiU7iMZ0Wx4dmSlMc6XW_Llg,199
+virtualenv/util/error.py,sha256=SRSZlXvMYQuJwxoUfNhlAyo3VwrAnIsZemSwPOxpjns,352
+virtualenv/util/lock.py,sha256=oFa0FcbE_TVDHOol44Mgtfa4D3ZjnVy-HSQx-y7ERKQ,4727
+virtualenv/util/six.py,sha256=_8KWXUWi3-AaFmz4LkdyNra-uNuf70vlxwjN7oeRo8g,1463
+virtualenv/util/zipapp.py,sha256=jtf4Vn7XBnjPs_B_ObIQv_x4pFlIlPKAWHYLFV59h6U,1054
+virtualenv/util/path/__init__.py,sha256=YaBAxtzGBdMu0uUtppe0ZeCHw5HhO-5zjeb3-fzyMoI,336
+virtualenv/util/path/_permission.py,sha256=XpO2vGAk_92_biD4MEQcAQq2Zc8_rpm3M3n_hMUA1rw,745
+virtualenv/util/path/_sync.py,sha256=rheUrGsCqmhMwNs-uc5rDthNSUlsOrBJPoK8KZj3O1o,2393
+virtualenv/util/path/_pathlib/__init__.py,sha256=FjKCi8scB5MnHg2fLX5REoE0bOPkMXqpBEILVTeJZGQ,2130
+virtualenv/util/path/_pathlib/via_os_path.py,sha256=fYDFAX483zVvC9hAOAC9FYtrGdZethS0vtYtKsL5r-s,3772
+virtualenv/util/subprocess/__init__.py,sha256=1UmFrdBv2sVeUfZbDcO2yZpe28AE0ULOu9dRKlpJaa0,801
+virtualenv/util/subprocess/_win_subprocess.py,sha256=SChkXAKVbpehyrHod1ld76RSdTIalrgME1rtz5jUfm0,5655
+virtualenv-20.2.2.dist-info/LICENSE,sha256=XBWRk3jFsqqrexnOpw2M3HX3aHnjJFTkwDmfi3HRcek,1074
+virtualenv-20.2.2.dist-info/METADATA,sha256=OWyC_GXU3AvST-YiGhmI2iE4ntdcBm-6Q1yCaU9Bx_U,4965
+virtualenv-20.2.2.dist-info/WHEEL,sha256=oh0NKYrTcu1i1-wgrI1cnhkjYIi8WJ-8qd9Jrr5_y4E,110
+virtualenv-20.2.2.dist-info/entry_points.txt,sha256=1DALKzYOcffJa7Q15TQlMQu0yeFXEy5W124y0aJEfYU,1615
+virtualenv-20.2.2.dist-info/top_level.txt,sha256=JV-LVlC8YeIw1DgiYI0hEot7tgFy5IWdKVcSG7NyzaI,11
+virtualenv-20.2.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
+virtualenv-20.2.2.dist-info/RECORD,,
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/virtualenv-20.2.2.dist-info/WHEEL
@@ -0,0 +1,6 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.36.1)
+Root-Is-Purelib: true
+Tag: py2-none-any
+Tag: py3-none-any
+
rename from third_party/python/virtualenv/virtualenv-20.0.31.dist-info/entry_points.txt
rename to third_party/python/virtualenv/virtualenv-20.2.2.dist-info/entry_points.txt
rename from third_party/python/virtualenv/virtualenv-20.0.31.dist-info/top_level.txt
rename to third_party/python/virtualenv/virtualenv-20.2.2.dist-info/top_level.txt
rename from third_party/python/virtualenv/virtualenv-20.0.31.dist-info/zip-safe
rename to third_party/python/virtualenv/virtualenv-20.2.2.dist-info/zip-safe
--- a/third_party/python/virtualenv/virtualenv/activation/bash/activate.sh
+++ b/third_party/python/virtualenv/virtualenv/activation/bash/activate.sh
@@ -42,16 +42,19 @@ deactivate () {
         unset -f deactivate
     fi
 }
 
 # unset irrelevant variables
 deactivate nondestructive
 
 VIRTUAL_ENV='__VIRTUAL_ENV__'
+if ([ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ]) && $(command -v cygpath &> /dev/null) ; then
+    VIRTUAL_ENV=$(cygpath -u "$VIRTUAL_ENV")
+fi
 export VIRTUAL_ENV
 
 _OLD_VIRTUAL_PATH="$PATH"
 PATH="$VIRTUAL_ENV/__BIN_NAME__:$PATH"
 export PATH
 
 # unset PYTHONHOME if set
 if ! [ -z "${PYTHONHOME+_}" ] ; then
--- a/third_party/python/virtualenv/virtualenv/activation/powershell/activate.ps1
+++ b/third_party/python/virtualenv/virtualenv/activation/powershell/activate.ps1
@@ -1,60 +1,60 @@
-$script:THIS_PATH = $myinvocation.mycommand.path
-$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent
-
-function global:deactivate([switch] $NonDestructive) {
-    if (Test-Path variable:_OLD_VIRTUAL_PATH) {
-        $env:PATH = $variable:_OLD_VIRTUAL_PATH
-        Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global
-    }
-
-    if (Test-Path function:_old_virtual_prompt) {
-        $function:prompt = $function:_old_virtual_prompt
-        Remove-Item function:\_old_virtual_prompt
-    }
-
-    if ($env:VIRTUAL_ENV) {
-        Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue
-    }
-
-    if (!$NonDestructive) {
-        # Self destruct!
-        Remove-Item function:deactivate
-        Remove-Item function:pydoc
-    }
-}
-
-function global:pydoc {
-    python -m pydoc $args
-}
-
-# unset irrelevant variables
-deactivate -nondestructive
-
-$VIRTUAL_ENV = $BASE_DIR
-$env:VIRTUAL_ENV = $VIRTUAL_ENV
-
-New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH
-
-$env:PATH = "$env:VIRTUAL_ENV/__BIN_NAME____PATH_SEP__" + $env:PATH
-if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) {
-    function global:_old_virtual_prompt {
-        ""
-    }
-    $function:_old_virtual_prompt = $function:prompt
-
-    if ("__VIRTUAL_PROMPT__" -ne "") {
-        function global:prompt {
-            # Add the custom prefix to the existing prompt
-            $previous_prompt_value = & $function:_old_virtual_prompt
-            ("__VIRTUAL_PROMPT__" + $previous_prompt_value)
-        }
-    }
-    else {
-        function global:prompt {
-            # Add a prefix to the current prompt, but don't discard it.
-            $previous_prompt_value = & $function:_old_virtual_prompt
-            $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) "
-            ($new_prompt_value + $previous_prompt_value)
-        }
-    }
-}
+$script:THIS_PATH = $myinvocation.mycommand.path
+$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent
+
+function global:deactivate([switch] $NonDestructive) {
+    if (Test-Path variable:_OLD_VIRTUAL_PATH) {
+        $env:PATH = $variable:_OLD_VIRTUAL_PATH
+        Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global
+    }
+
+    if (Test-Path function:_old_virtual_prompt) {
+        $function:prompt = $function:_old_virtual_prompt
+        Remove-Item function:\_old_virtual_prompt
+    }
+
+    if ($env:VIRTUAL_ENV) {
+        Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue
+    }
+
+    if (!$NonDestructive) {
+        # Self destruct!
+        Remove-Item function:deactivate
+        Remove-Item function:pydoc
+    }
+}
+
+function global:pydoc {
+    python -m pydoc $args
+}
+
+# unset irrelevant variables
+deactivate -nondestructive
+
+$VIRTUAL_ENV = $BASE_DIR
+$env:VIRTUAL_ENV = $VIRTUAL_ENV
+
+New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH
+
+$env:PATH = "$env:VIRTUAL_ENV/__BIN_NAME____PATH_SEP__" + $env:PATH
+if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) {
+    function global:_old_virtual_prompt {
+        ""
+    }
+    $function:_old_virtual_prompt = $function:prompt
+
+    if ("__VIRTUAL_PROMPT__" -ne "") {
+        function global:prompt {
+            # Add the custom prefix to the existing prompt
+            $previous_prompt_value = & $function:_old_virtual_prompt
+            ("__VIRTUAL_PROMPT__" + $previous_prompt_value)
+        }
+    }
+    else {
+        function global:prompt {
+            # Add a prefix to the current prompt, but don't discard it.
+            $previous_prompt_value = & $function:_old_virtual_prompt
+            $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) "
+            ($new_prompt_value + $previous_prompt_value)
+        }
+    }
+}
--- a/third_party/python/virtualenv/virtualenv/activation/via_template.py
+++ b/third_party/python/virtualenv/virtualenv/activation/via_template.py
@@ -6,19 +6,19 @@ from abc import ABCMeta, abstractmethod
 
 from six import add_metaclass
 
 from virtualenv.util.six import ensure_text
 
 from .activator import Activator
 
 if sys.version_info >= (3, 7):
-    from importlib.resources import read_text
+    from importlib.resources import read_binary
 else:
-    from importlib_resources import read_text
+    from importlib_resources import read_binary
 
 
 @add_metaclass(ABCMeta)
 class ViaTemplateActivator(Activator):
     @abstractmethod
     def templates(self):
         raise NotImplementedError
 
@@ -39,26 +39,28 @@ class ViaTemplateActivator(Activator):
             "__PATH_SEP__": ensure_text(os.pathsep),
         }
 
     def _generate(self, replacements, templates, to_folder, creator):
         generated = []
         for template in templates:
             text = self.instantiate_template(replacements, template, creator)
             dest = to_folder / self.as_name(template)
-            dest.write_text(text, encoding="utf-8")
+            # use write_bytes to avoid platform specific line normalization (\n -> \r\n)
+            dest.write_bytes(text.encode("utf-8"))
             generated.append(dest)
         return generated
 
     def as_name(self, template):
         return template.name
 
     def instantiate_template(self, replacements, template, creator):
-        # read text and do replacements
-        text = read_text(self.__module__, str(template), encoding="utf-8", errors="strict")
+        # read content as binary to avoid platform specific line normalization (\n -> \r\n)
+        binary = read_binary(self.__module__, str(template))
+        text = binary.decode("utf-8", errors="strict")
         for key, value in replacements.items():
             value = self._repr_unicode(creator, value)
             text = text.replace(key, value)
         return text
 
     @staticmethod
     def _repr_unicode(creator, value):
         # by default we just let it be unicode
--- a/third_party/python/virtualenv/virtualenv/app_data/__init__.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/__init__.py
@@ -1,62 +1,57 @@
 """
 Application data stored by virtualenv.
 """
 from __future__ import absolute_import, unicode_literals
 
 import logging
 import os
-from argparse import Action, ArgumentError
 
 from appdirs import user_data_dir
 
 from .na import AppDataDisabled
+from .read_only import ReadOnlyAppData
 from .via_disk_folder import AppDataDiskFolder
 from .via_tempdir import TempAppData
 
 
-class AppDataAction(Action):
-    def __call__(self, parser, namespace, values, option_string=None):
-        folder = self._check_folder(values)
-        if folder is None:
-            raise ArgumentError("app data path {} is not valid".format(values))
-        setattr(namespace, self.dest, AppDataDiskFolder(folder))
+def _default_app_data_dir():  # type: () -> str
+    key = str("VIRTUALENV_OVERRIDE_APP_DATA")
+    if key in os.environ:
+        return os.environ[key]
+    else:
+        return user_data_dir(appname="virtualenv", appauthor="pypa")
+
+
+def make_app_data(folder, **kwargs):
+    read_only = kwargs.pop("read_only")
+    if kwargs:  # py3+ kwonly
+        raise TypeError("unexpected keywords: {}")
 
-    @staticmethod
-    def _check_folder(folder):
-        folder = os.path.abspath(folder)
-        if not os.path.exists(folder):
-            try:
-                os.makedirs(folder)
-                logging.debug("created app data folder %s", folder)
-            except OSError as exception:
-                logging.info("could not create app data folder %s due to %r", folder, exception)
-                return None
-        write_enabled = os.access(folder, os.W_OK)
-        if write_enabled:
-            return folder
-        logging.debug("app data folder %s has no write access", folder)
-        return None
+    if folder is None:
+        folder = _default_app_data_dir()
+    folder = os.path.abspath(folder)
+
+    if read_only:
+        return ReadOnlyAppData(folder)
 
-    @staticmethod
-    def default():
-        for folder in AppDataAction._app_data_candidates():
-            folder = AppDataAction._check_folder(folder)
-            if folder is not None:
-                return AppDataDiskFolder(folder)
-        return AppDataDisabled()
+    if not os.path.isdir(folder):
+        try:
+            os.makedirs(folder)
+            logging.debug("created app data folder %s", folder)
+        except OSError as exception:
+            logging.info("could not create app data folder %s due to %r", folder, exception)
 
-    @staticmethod
-    def _app_data_candidates():
-        key = str("VIRTUALENV_OVERRIDE_APP_DATA")
-        if key in os.environ:
-            yield os.environ[key]
-        else:
-            yield user_data_dir(appname="virtualenv", appauthor="pypa")
+    if os.access(folder, os.W_OK):
+        return AppDataDiskFolder(folder)
+    else:
+        logging.debug("app data folder %s has no write access", folder)
+        return TempAppData()
 
 
 __all__ = (
+    "AppDataDisabled",
     "AppDataDiskFolder",
+    "ReadOnlyAppData",
     "TempAppData",
-    "AppDataAction",
-    "AppDataDisabled",
+    "make_app_data",
 )
--- a/third_party/python/virtualenv/virtualenv/app_data/base.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/base.py
@@ -26,16 +26,20 @@ class AppData(object):
     @abstractmethod
     def py_info(self, path):
         raise NotImplementedError
 
     @abstractmethod
     def py_info_clear(self):
         raise NotImplementedError
 
+    @property
+    def can_update(self):
+        raise NotImplementedError
+
     @abstractmethod
     def embed_update_log(self, distribution, for_py_version):
         raise NotImplementedError
 
     @property
     def house(self):
         raise NotImplementedError
 
--- a/third_party/python/virtualenv/virtualenv/app_data/na.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/na.py
@@ -3,16 +3,19 @@ from __future__ import absolute_import, 
 from contextlib import contextmanager
 
 from .base import AppData, ContentStore
 
 
 class AppDataDisabled(AppData):
     """No application cache available (most likely as we don't have write permissions)"""
 
+    transient = True
+    can_update = False
+
     def __init__(self):
         pass
 
     error = RuntimeError("no app data folder available, probably no write access to the folder")
 
     def close(self):
         """do nothing"""
 
@@ -35,20 +38,16 @@ class AppDataDisabled(AppData):
 
     @property
     def house(self):
         raise self.error
 
     def wheel_image(self, for_py_version, name):
         raise self.error
 
-    @property
-    def transient(self):
-        return True
-
     def py_info_clear(self):
         """"""
 
 
 class ContentStoreNA(ContentStore):
     def exists(self):
         return False
 
new file mode 100644
--- /dev/null
+++ b/third_party/python/virtualenv/virtualenv/app_data/read_only.py
@@ -0,0 +1,34 @@
+import os.path
+
+from virtualenv.util.lock import NoOpFileLock
+
+from .via_disk_folder import AppDataDiskFolder, PyInfoStoreDisk
+
+
+class ReadOnlyAppData(AppDataDiskFolder):
+    can_update = False
+
+    def __init__(self, folder):  # type: (str) -> None
+        if not os.path.isdir(folder):
+            raise RuntimeError("read-only app data directory {} does not exist".format(folder))
+        self.lock = NoOpFileLock(folder)
+
+    def reset(self):  # type: () -> None
+        raise RuntimeError("read-only app data does not support reset")
+
+    def py_info_clear(self):  # type: () -> None
+        raise NotImplementedError
+
+    def py_info(self, path):
+        return _PyInfoStoreDiskReadOnly(self.py_info_at, path)
+
+    def embed_update_log(self, distribution, for_py_version):
+        raise NotImplementedError
+
+
+class _PyInfoStoreDiskReadOnly(PyInfoStoreDisk):
+    def write(self, content):
+        raise RuntimeError("read-only app data python info cannot be updated")
+
+
+__all__ = ("ReadOnlyAppData",)
--- a/third_party/python/virtualenv/virtualenv/app_data/via_disk_folder.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/via_disk_folder.py
@@ -41,25 +41,27 @@ from virtualenv.version import __version
 from .base import AppData, ContentStore
 
 
 class AppDataDiskFolder(AppData):
     """
     Store the application data on the disk within a folder layout.
     """
 
+    transient = False
+    can_update = True
+
     def __init__(self, folder):
         self.lock = ReentrantFileLock(folder)
 
     def __repr__(self):
-        return "{}".format(self.lock.path)
+        return "{}({})".format(type(self).__name__, self.lock.path)
 
-    @property
-    def transient(self):
-        return False
+    def __str__(self):
+        return str(self.lock.path)
 
     def reset(self):
         logging.debug("reset app data folder %s", self.lock.path)
         safe_delete(self.lock.path)
 
     def close(self):
         """do nothing"""
 
@@ -132,41 +134,44 @@ class JSONStoreDisk(ContentStore):
             data = json.loads(self.file.read_text())
             logging.debug("got {} from %s".format(self.msg), *self.msg_args)
             return data
         except ValueError:
             bad_format = True
         except Exception:  # noqa
             pass
         if bad_format:
-            self.remove()
+            try:
+                self.remove()
+            except OSError:  # reading and writing on the same file may cause race on multiple processes
+                pass
         return None
 
     def remove(self):
         self.file.unlink()
         logging.debug("removed {} at %s".format(self.msg), *self.msg_args)
 
     @contextmanager
     def locked(self):
         with self.in_folder.lock_for_key(self.key):
             yield
 
     def write(self, content):
         folder = self.file.parent
-        try:
-            folder.mkdir(parents=True, exist_ok=True)
-        except OSError:
-            pass
+        folder.mkdir(parents=True, exist_ok=True)
         self.file.write_text(ensure_text(json.dumps(content, sort_keys=True, indent=2)))
         logging.debug("wrote {} at %s".format(self.msg), *self.msg_args)
 
 
 class PyInfoStoreDisk(JSONStoreDisk):
     def __init__(self, in_folder, path):
         key = sha256(str(path).encode("utf-8") if six.PY3 else str(path)).hexdigest()
         super(PyInfoStoreDisk, self).__init__(in_folder, key, "python info of %s", (path,))
 
 
 class EmbedDistributionUpdateStoreDisk(JSONStoreDisk):
     def __init__(self, in_folder, distribution):
         super(EmbedDistributionUpdateStoreDisk, self).__init__(
-            in_folder, distribution, "embed update of distribution %s", (distribution,),
+            in_folder,
+            distribution,
+            "embed update of distribution %s",
+            (distribution,),
         )
--- a/third_party/python/virtualenv/virtualenv/app_data/via_tempdir.py
+++ b/third_party/python/virtualenv/virtualenv/app_data/via_tempdir.py
@@ -4,25 +4,24 @@ import logging
 from tempfile import mkdtemp
 
 from virtualenv.util.path import safe_delete
 
 from .via_disk_folder import AppDataDiskFolder
 
 
 class TempAppData(AppDataDiskFolder):
+    transient = True
+    can_update = False
+
     def __init__(self):
         super(TempAppData, self).__init__(folder=mkdtemp())
         logging.debug("created temporary app data folder %s", self.lock.path)
 
     def reset(self):
         """this is a temporary folder, is already empty to start with"""
 
     def close(self):
         logging.debug("remove temporary app data folder %s", self.lock.path)
         safe_delete(self.lock.path)
 
     def embed_update_log(self, distribution, for_py_version):
-        return None
-
-    @property
-    def transient(self):
-        return True
+        raise NotImplementedError
--- a/third_party/python/virtualenv/virtualenv/config/convert.py
+++ b/third_party/python/virtualenv/virtualenv/config/convert.py
@@ -41,26 +41,43 @@ class NoneType(TypeData):
         return str(value)
 
 
 class ListType(TypeData):
     def _validate(self):
         """"""
 
     def convert(self, value, flatten=True):
-        if isinstance(value, (str, bytes)):
-            value = filter(None, [x.strip() for x in value.splitlines()])
-        values = list(value)
+        values = self.split_values(value)
         result = []
         for value in values:
             sub_values = value.split(os.pathsep)
             result.extend(sub_values)
         converted = [self.as_type(i) for i in result]
         return converted
 
+    def split_values(self, value):
+        """Split the provided value into a list.
+
+        First this is done by newlines. If there were no newlines in the text,
+        then we next try to split by comma.
+        """
+        if isinstance(value, (str, bytes)):
+            # Use `splitlines` rather than a custom check for whether there is
+            # more than one line. This ensures that the full `splitlines()`
+            # logic is supported here.
+            values = value.splitlines()
+            if len(values) <= 1:
+                values = value.split(",")
+            values = filter(None, [x.strip() for x in values])
+        else:
+            values = list(value)
+
+        return values
+
 
 def convert(value, as_type, source):
     """Convert the value as a given type where the value comes from the given source"""
     try:
         return as_type.convert(value)
     except Exception as exception:
         logging.warning("%s failed to convert %r as %r because %r", source, value, as_type, exception)
         raise
--- a/third_party/python/virtualenv/virtualenv/create/creator.py
+++ b/third_party/python/virtualenv/virtualenv/create/creator.py
@@ -39,29 +39,31 @@ class Creator(object):
 
         :param options: the CLI option as parsed from :meth:`add_parser_arguments`
         :param interpreter: the interpreter to create virtual environment from
         """
         self.interpreter = interpreter
         self._debug = None
         self.dest = Path(options.dest)
         self.clear = options.clear
+        self.no_vcs_ignore = options.no_vcs_ignore
         self.pyenv_cfg = PyEnvCfg.from_folder(self.dest)
         self.app_data = options.app_data
 
     def __repr__(self):
         return ensure_str(self.__unicode__())
 
     def __unicode__(self):
         return "{}({})".format(self.__class__.__name__, ", ".join("{}={}".format(k, v) for k, v in self._args()))
 
     def _args(self):
         return [
             ("dest", ensure_text(str(self.dest))),
             ("clear", self.clear),
+            ("no_vcs_ignore", self.no_vcs_ignore),
         ]
 
     @classmethod
     def can_create(cls, interpreter):
         """Determine if we can create a virtual environment.
 
         :param interpreter: the interpreter in question
         :return: ``None`` if we can't create, any other object otherwise that will be forwarded to \
@@ -74,25 +76,34 @@ class Creator(object):
         """Add CLI arguments for the creator.
 
         :param parser: the CLI parser
         :param app_data: the application data folder
         :param interpreter: the interpreter we're asked to create virtual environment for
         :param meta: value as returned by :meth:`can_create`
         """
         parser.add_argument(
-            "dest", help="directory to create virtualenv at", type=cls.validate_dest,
+            "dest",
+            help="directory to create virtualenv at",
+            type=cls.validate_dest,
         )
         parser.add_argument(
             "--clear",
             dest="clear",
             action="store_true",
             help="remove the destination directory if exist before starting (will overwrite files otherwise)",
             default=False,
         )
+        parser.add_argument(
+            "--no-vcs-ignore",
+            dest="no_vcs_ignore",
+            action="store_true",
+            help="don't create VCS ignore directive in the destination directory",
+            default=False,
+        )
 
     @abstractmethod
     def create(self):
         """Perform the virtual environment creation."""
         raise NotImplementedError
 
     @classmethod
     def validate_dest(cls, raw_value):
@@ -115,17 +126,19 @@ class Creator(object):
                 if trip == char:
                     continue
                 raise ValueError(trip)
             except ValueError:
                 refused[char] = None
         if refused:
             raise ArgumentTypeError(
                 "the file system codec ({}) cannot handle characters {!r} within {!r}".format(
-                    encoding, "".join(refused.keys()), raw_value,
+                    encoding,
+                    "".join(refused.keys()),
+                    raw_value,
                 ),
             )
         if os.pathsep in raw_value:
             raise ArgumentTypeError(
                 "destination {!r} must not contain the path separator ({}) as this would break "
                 "the activation scripts".format(raw_value, os.pathsep),
             )
 
@@ -151,17 +164,18 @@ class Creator(object):
         return str(value)
 
     def run(self):
         if self.dest.exists() and self.clear:
             logging.debug("delete %s", self.dest)
             safe_delete(self.dest)
         self.create()
         self.set_pyenv_cfg()
-        self.setup_ignore_vcs()
+        if not self.no_vcs_ignore:
+            self.setup_ignore_vcs()
 
     def set_pyenv_cfg(self):
         self.pyenv_cfg.content = OrderedDict()
         self.pyenv_cfg["home"] = self.interpreter.system_exec_prefix
         self.pyenv_cfg["implementation"] = self.interpreter.implementation
         self.pyenv_cfg["version_info"] = ".".join(str(i) for i in self.interpreter.version_info)
         self.pyenv_cfg["virtualenv"] = __version__
 
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/api.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/api.py
@@ -3,16 +3,17 @@ from __future__ import absolute_import, 
 import logging
 import os
 from abc import ABCMeta
 
 from six import add_metaclass
 
 from virtualenv.info import fs_supports_symlink
 from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_text
 
 from ..creator import Creator, CreatorMeta
 
 
 class ViaGlobalRefMeta(CreatorMeta):
     def __init__(self):
         super(ViaGlobalRefMeta, self).__init__()
         self.copy_error = None
@@ -86,20 +87,20 @@ class ViaGlobalRefApi(Creator):
 
     def create(self):
         self.install_patch()
 
     def install_patch(self):
         text = self.env_patch_text()
         if text:
             pth = self.purelib / "_virtualenv.pth"
-            logging.debug("create virtualenv import hook file %s", pth)
+            logging.debug("create virtualenv import hook file %s", ensure_text(str(pth)))
             pth.write_text("import _virtualenv")
             dest_path = self.purelib / "_virtualenv.py"
-            logging.debug("create %s", dest_path)
+            logging.debug("create %s", ensure_text(str(dest_path)))
             dest_path.write_text(text)
 
     def env_patch_text(self):
         """Patch the distutils package to not be derailed by its configuration files"""
         with self.app_data.ensure_extracted(Path(__file__).parent / "_virtualenv.py") as resolved_path:
             text = resolved_path.read_text()
             return text.replace('"__SCRIPT_DIR__"', repr(os.path.relpath(str(self.script_dir), str(self.purelib))))
 
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/common.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/common.py
@@ -1,16 +1,17 @@
 from __future__ import absolute_import, unicode_literals
 
 from abc import ABCMeta
 from collections import OrderedDict
 
 from six import add_metaclass
 
 from virtualenv.create.describe import PosixSupports, WindowsSupports
+from virtualenv.create.via_global_ref.builtin.ref import RefMust, RefWhen
 from virtualenv.util.path import Path
 
 from ..via_global_self_do import ViaGlobalRefVirtualenvBuiltin
 
 
 @add_metaclass(ABCMeta)
 class CPython(ViaGlobalRefVirtualenvBuiltin):
     @classmethod
@@ -28,29 +29,37 @@ class CPythonPosix(CPython, PosixSupport
 
     @classmethod
     def _executables(cls, interpreter):
         host_exe = Path(interpreter.system_executable)
         major, minor = interpreter.version_info.major, interpreter.version_info.minor
         targets = OrderedDict(
             (i, None) for i in ["python", "python{}".format(major), "python{}.{}".format(major, minor), host_exe.name]
         )
-        yield host_exe, list(targets.keys())
+        must = RefMust.COPY if interpreter.version_info.major == 2 else RefMust.NA
+        yield host_exe, list(targets.keys()), must, RefWhen.ANY
 
 
 @add_metaclass(ABCMeta)
 class CPythonWindows(CPython, WindowsSupports):
     @classmethod
     def _executables(cls, interpreter):
-        host = Path(interpreter.system_executable)
+        # symlink of the python executables does not work reliably, copy always instead
+        # - https://bugs.python.org/issue42013
+        # - venv
+        host = cls.host_python(interpreter)
         for path in (host.parent / n for n in {"python.exe", host.name}):
-            yield host, [path.name]
+            yield host, [path.name], RefMust.COPY, RefWhen.ANY
         # for more info on pythonw.exe see https://stackoverflow.com/a/30313091
         python_w = host.parent / "pythonw.exe"
-        yield python_w, [python_w.name]
+        yield python_w, [python_w.name], RefMust.COPY, RefWhen.ANY
+
+    @classmethod
+    def host_python(cls, interpreter):
+        return Path(interpreter.system_executable)
 
 
 def is_mac_os_framework(interpreter):
     if interpreter.platform == "darwin":
         framework_var = interpreter.sysconfig_vars.get("PYTHONFRAMEWORK")
         value = "Python3" if interpreter.version_info.major == 3 else "Python"
         return framework_var == value
     return False
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
@@ -50,18 +50,31 @@ class CPython3Windows(CPythonWindows, CP
         if is_store_python(interpreter):  # store python is not supported here
             return None
         return super(CPython3Windows, cls).setup_meta(interpreter)
 
     @classmethod
     def sources(cls, interpreter):
         for src in super(CPython3Windows, cls).sources(interpreter):
             yield src
-        for src in cls.include_dll_and_pyd(interpreter):
-            yield src
+        if not cls.venv_37p(interpreter):
+            for src in cls.include_dll_and_pyd(interpreter):
+                yield src
+
+    @staticmethod
+    def venv_37p(interpreter):
+        return interpreter.version_info.minor >= 7
+
+    @classmethod
+    def host_python(cls, interpreter):
+        if cls.venv_37p(interpreter):
+            # starting with CPython 3.7 Windows ships with a venvlauncher.exe that avoids the need for dll/pyd copies
+            # it also means the wrapper must be copied to avoid bugs such as https://bugs.python.org/issue42013
+            return Path(interpreter.system_stdlib) / "venv" / "scripts" / "nt" / "python.exe"
+        return super(CPython3Windows, cls).host_python(interpreter)
 
     @classmethod
     def include_dll_and_pyd(cls, interpreter):
         dll_folder = Path(interpreter.system_prefix) / "DLLs"
         host_exe_folder = Path(interpreter.system_executable).parent
         for folder in [host_exe_folder, dll_folder]:
             for file in folder.iterdir():
                 if file.suffix in (".pyd", ".dll"):
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/mac_os.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/mac_os.py
@@ -4,17 +4,17 @@ import logging
 import os
 import struct
 import subprocess
 from abc import ABCMeta, abstractmethod
 from textwrap import dedent
 
 from six import add_metaclass
 
-from virtualenv.create.via_global_ref.builtin.ref import ExePathRefToDest, PathRefToDest
+from virtualenv.create.via_global_ref.builtin.ref import ExePathRefToDest, PathRefToDest, RefMust
 from virtualenv.util.path import Path
 from virtualenv.util.six import ensure_text
 
 from .common import CPython, CPythonPosix, is_mac_os_framework
 from .cpython2 import CPython2PosixBase
 from .cpython3 import CPython3
 
 
@@ -24,42 +24,43 @@ class CPythonmacOsFramework(CPython):
     def can_describe(cls, interpreter):
         return is_mac_os_framework(interpreter) and super(CPythonmacOsFramework, cls).can_describe(interpreter)
 
     @classmethod
     def sources(cls, interpreter):
         for src in super(CPythonmacOsFramework, cls).sources(interpreter):
             yield src
         # add a symlink to the host python image
-        ref = PathRefToDest(cls.image_ref(interpreter), dest=lambda self, _: self.dest / ".Python", must_symlink=True)
+        exe = cls.image_ref(interpreter)
+        ref = PathRefToDest(exe, dest=lambda self, _: self.dest / ".Python", must=RefMust.SYMLINK)
         yield ref
 
     def create(self):
         super(CPythonmacOsFramework, self).create()
 
         # change the install_name of the copied python executables
         target = "@executable_path/../.Python"
         current = self.current_mach_o_image_path()
         for src in self._sources:
             if isinstance(src, ExePathRefToDest):
-                if src.must_copy or not self.symlinks:
+                if src.must == RefMust.COPY or not self.symlinks:
                     exes = [self.bin_dir / src.base]
                     if not self.symlinks:
                         exes.extend(self.bin_dir / a for a in src.aliases)
                     for exe in exes:
                         fix_mach_o(str(exe), current, target, self.interpreter.max_size)
 
     @classmethod
     def _executables(cls, interpreter):
-        for _, targets in super(CPythonmacOsFramework, cls)._executables(interpreter):
+        for _, targets, must, when in super(CPythonmacOsFramework, cls)._executables(interpreter):
             # Make sure we use the embedded interpreter inside the framework, even if sys.executable points to the
             # stub executable in ${sys.prefix}/bin.
             # See http://groups.google.com/group/python-virtualenv/browse_thread/thread/17cab2f85da75951
             fixed_host_exe = Path(interpreter.prefix) / "Resources" / "Python.app" / "Contents" / "MacOS" / "Python"
-            yield fixed_host_exe, targets
+            yield fixed_host_exe, targets, must, when
 
     @abstractmethod
     def current_mach_o_image_path(self):
         raise NotImplementedError
 
     @classmethod
     def image_ref(cls, interpreter):
         raise NotImplementedError
@@ -236,17 +237,17 @@ def _builtin_change_mach_o(maxint):
         """Read a given number of 32-bits unsigned integers from the given file with the given endianness."""
         res = struct.unpack(endian + "L" * num, file.read(num * 4))
         if len(res) == 1:
             return res[0]
         return res
 
     def mach_o_change(at_path, what, value):
         """Replace a given name (what) in any LC_LOAD_DYLIB command found in the given binary with a new name (value),
-         provided it's shorter."""
+        provided it's shorter."""
 
         def do_macho(file, bits, endian):
             # Read Mach-O header (the magic number is assumed read by the caller)
             cpu_type, cpu_sub_type, file_type, n_commands, size_of_commands, flags = read_data(file, endian, 6)
             # 64-bits header has one more field.
             if bits == 64:
                 read_data(file, endian)
             # The header is followed by n commands
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/common.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/common.py
@@ -1,31 +1,32 @@
 from __future__ import absolute_import, unicode_literals
 
 import abc
 
 from six import add_metaclass
 
-from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest
+from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest, RefMust, RefWhen
 from virtualenv.util.path import Path
 
 from ..via_global_self_do import ViaGlobalRefVirtualenvBuiltin
 
 
 @add_metaclass(abc.ABCMeta)
 class PyPy(ViaGlobalRefVirtualenvBuiltin):
     @classmethod
     def can_describe(cls, interpreter):
         return interpreter.implementation == "PyPy" and super(PyPy, cls).can_describe(interpreter)
 
     @classmethod
     def _executables(cls, interpreter):
         host = Path(interpreter.system_executable)
         targets = sorted("{}{}".format(name, PyPy.suffix) for name in cls.exe_names(interpreter))
-        yield host, targets
+        must = RefMust.COPY if interpreter.version_info.major == 2 else RefMust.NA
+        yield host, targets, must, RefWhen.ANY
 
     @classmethod
     def exe_names(cls, interpreter):
         return {
             cls.exe_stem(),
             "python",
             "python{}".format(interpreter.version_info.major),
             "python{}.{}".format(*interpreter.version_info),
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/site.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/site.py
@@ -47,18 +47,17 @@ def load_host_site():
     site_packages = r"""
     ___EXPECTED_SITE_PACKAGES___
     """
     import json
 
     add_site_dir = sys.modules["site"].addsitedir
     for path in json.loads(site_packages):
         full_path = os.path.abspath(os.path.join(here, path.encode("utf-8")))
-        if full_path not in sys.path:
-            add_site_dir(full_path)
+        add_site_dir(full_path)
 
 
 sep = "\\" if sys.platform == "win32" else "/"  # no os module here yet - poor mans version
 
 
 def read_pyvenv():
     """read pyvenv.cfg"""
     config_file = "{}{}pyvenv.cfg".format(sys.prefix, sep)
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/ref.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/ref.py
@@ -12,36 +12,46 @@ from stat import S_IXGRP, S_IXOTH, S_IXU
 
 from six import add_metaclass
 
 from virtualenv.info import fs_is_case_sensitive, fs_supports_symlink
 from virtualenv.util.path import copy, make_exe, symlink
 from virtualenv.util.six import ensure_text
 
 
+class RefMust(object):
+    NA = "NA"
+    COPY = "copy"
+    SYMLINK = "symlink"
+
+
+class RefWhen(object):
+    ANY = "ANY"
+    COPY = "copy"
+    SYMLINK = "symlink"
+
+
 @add_metaclass(ABCMeta)
 class PathRef(object):
     """Base class that checks if a file reference can be symlink/copied"""
 
     FS_SUPPORTS_SYMLINK = fs_supports_symlink()
     FS_CASE_SENSITIVE = fs_is_case_sensitive()
 
-    def __init__(self, src, must_symlink, must_copy):
-        self.must_symlink = must_symlink
-        self.must_copy = must_copy
+    def __init__(self, src, must=RefMust.NA, when=RefWhen.ANY):
+        self.must = must
+        self.when = when
         self.src = src
         try:
             self.exists = src.exists()
         except OSError:
             self.exists = False
         self._can_read = None if self.exists else False
         self._can_copy = None if self.exists else False
         self._can_symlink = None if self.exists else False
-        if self.must_copy is True and self.must_symlink is True:
-            raise ValueError("can copy and symlink at the same time")
 
     def __repr__(self):
         return "{}(src={})".format(self.__class__.__name__, self.src)
 
     @property
     def can_read(self):
         if self._can_read is None:
             if self.src.is_file():
@@ -52,49 +62,49 @@ class PathRef(object):
                     self._can_read = False
             else:
                 self._can_read = os.access(ensure_text(str(self.src)), os.R_OK)
         return self._can_read
 
     @property
     def can_copy(self):
         if self._can_copy is None:
-            if self.must_symlink:
+            if self.must == RefMust.SYMLINK:
                 self._can_copy = self.can_symlink
             else:
                 self._can_copy = self.can_read
         return self._can_copy
 
     @property
     def can_symlink(self):
         if self._can_symlink is None:
-            if self.must_copy:
+            if self.must == RefMust.COPY:
                 self._can_symlink = self.can_copy
             else:
                 self._can_symlink = self.FS_SUPPORTS_SYMLINK and self.can_read
         return self._can_symlink
 
     @abstractmethod
     def run(self, creator, symlinks):
         raise NotImplementedError
 
     def method(self, symlinks):
-        if self.must_symlink:
+        if self.must == RefMust.SYMLINK:
             return symlink
-        if self.must_copy:
+        if self.must == RefMust.COPY:
             return copy
         return symlink if symlinks else copy
 
 
 @add_metaclass(ABCMeta)
 class ExePathRef(PathRef):
     """Base class that checks if a executable can be references via symlink/copy"""
 
-    def __init__(self, src, must_symlink, must_copy):
-        super(ExePathRef, self).__init__(src, must_symlink, must_copy)
+    def __init__(self, src, must=RefMust.NA, when=RefWhen.ANY):
+        super(ExePathRef, self).__init__(src, must, when)
         self._can_run = None
 
     @property
     def can_symlink(self):
         if self.FS_SUPPORTS_SYMLINK:
             return self.can_run
         return False
 
@@ -109,42 +119,41 @@ class ExePathRef(PathRef):
             else:
                 self._can_run = False
         return self._can_run
 
 
 class PathRefToDest(PathRef):
     """Link a path on the file system"""
 
-    def __init__(self, src, dest, must_symlink=False, must_copy=False):
-        super(PathRefToDest, self).__init__(src, must_symlink, must_copy)
+    def __init__(self, src, dest, must=RefMust.NA, when=RefWhen.ANY):
+        super(PathRefToDest, self).__init__(src, must, when)
         self.dest = dest
 
     def run(self, creator, symlinks):
         dest = self.dest(creator, self.src)
         method = self.method(symlinks)
         dest_iterable = dest if isinstance(dest, list) else (dest,)
         if not dest.parent.exists():
             dest.parent.mkdir(parents=True, exist_ok=True)
         for dst in dest_iterable:
             method(self.src, dst)
 
 
 class ExePathRefToDest(PathRefToDest, ExePathRef):
     """Link a exe path on the file system"""
 
-    def __init__(self, src, targets, dest, must_symlink=False, must_copy=False):
-        ExePathRef.__init__(self, src, must_symlink, must_copy)
-        PathRefToDest.__init__(self, src, dest, must_symlink, must_copy)
+    def __init__(self, src, targets, dest, must=RefMust.NA, when=RefWhen.ANY):
+        ExePathRef.__init__(self, src, must, when)
+        PathRefToDest.__init__(self, src, dest, must, when)
         if not self.FS_CASE_SENSITIVE:
             targets = list(OrderedDict((i.lower(), None) for i in targets).keys())
         self.base = targets[0]
         self.aliases = targets[1:]
         self.dest = dest
-        self.must_copy = must_copy
 
     def run(self, creator, symlinks):
         bin_dir = self.dest(creator, self.src).parent
         dest = bin_dir / self.base
         method = self.method(symlinks)
         method(self.src, dest)
         if not symlinks:
             make_exe(dest)
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/via_global_self_do.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/via_global_self_do.py
@@ -1,15 +1,15 @@
 from __future__ import absolute_import, unicode_literals
 
 from abc import ABCMeta
 
 from six import add_metaclass
 
-from virtualenv.create.via_global_ref.builtin.ref import ExePathRefToDest
+from virtualenv.create.via_global_ref.builtin.ref import ExePathRefToDest, RefMust, RefWhen
 from virtualenv.util.path import ensure_dir
 
 from ..api import ViaGlobalRefApi, ViaGlobalRefMeta
 from .builtin_way import VirtualenvBuiltin
 
 
 class BuiltinViaGlobalRefMeta(ViaGlobalRefMeta):
     def __init__(self):
@@ -22,46 +22,56 @@ class ViaGlobalRefVirtualenvBuiltin(ViaG
     def __init__(self, options, interpreter):
         super(ViaGlobalRefVirtualenvBuiltin, self).__init__(options, interpreter)
         self._sources = getattr(options.meta, "sources", None)  # if we're created as a describer this might be missing
 
     @classmethod
     def can_create(cls, interpreter):
         """By default all built-in methods assume that if we can describe it we can create it"""
         # first we must be able to describe it
-        if cls.can_describe(interpreter):
-            meta = cls.setup_meta(interpreter)
-            if meta is not None and meta:
-                for src in cls.sources(interpreter):
-                    if src.exists:
-                        if meta.can_copy and not src.can_copy:
-                            meta.copy_error = "cannot copy {}".format(src)
-                        if meta.can_symlink and not src.can_symlink:
-                            meta.symlink_error = "cannot symlink {}".format(src)
-                        if not meta.can_copy and not meta.can_symlink:
-                            meta.error = "neither copy or symlink supported, copy: {} symlink: {}".format(
-                                meta.copy_error, meta.symlink_error,
-                            )
-                    else:
-                        meta.error = "missing required file {}".format(src)
-                    if meta.error:
-                        break
-                    meta.sources.append(src)
-            return meta
-        return None
+        if not cls.can_describe(interpreter):
+            return None
+        meta = cls.setup_meta(interpreter)
+        if meta is not None and meta:
+            cls._sources_can_be_applied(interpreter, meta)
+        return meta
+
+    @classmethod
+    def _sources_can_be_applied(cls, interpreter, meta):
+        for src in cls.sources(interpreter):
+            if src.exists:
+                if meta.can_copy and not src.can_copy:
+                    meta.copy_error = "cannot copy {}".format(src)
+                if meta.can_symlink and not src.can_symlink:
+                    meta.symlink_error = "cannot symlink {}".format(src)
+            else:
+                msg = "missing required file {}".format(src)
+                if src.when == RefMust.NA:
+                    meta.error = msg
+                elif src.when == RefMust.COPY:
+                    meta.copy_error = msg
+                elif src.when == RefMust.SYMLINK:
+                    meta.symlink_error = msg
+            if not meta.can_copy and not meta.can_symlink:
+                meta.error = "neither copy or symlink supported, copy: {} symlink: {}".format(
+                    meta.copy_error,
+                    meta.symlink_error,
+                )
+            if meta.error:
+                break
+            meta.sources.append(src)
 
     @classmethod
     def setup_meta(cls, interpreter):
         return BuiltinViaGlobalRefMeta()
 
     @classmethod
     def sources(cls, interpreter):
-        is_py2 = interpreter.version_info.major == 2
-        for host_exe, targets in cls._executables(interpreter):
-            yield ExePathRefToDest(host_exe, dest=cls.to_bin, targets=targets, must_copy=is_py2)
+        for host_exe, targets, must, when in cls._executables(interpreter):
+            yield ExePathRefToDest(host_exe, dest=cls.to_bin, targets=targets, must=must, when=when)
 
     def to_bin(self, src):
         return self.bin_dir / src.name
 
     @classmethod
     def _executables(cls, interpreter):
         raise NotImplementedError
 
@@ -74,26 +84,31 @@ class ViaGlobalRefVirtualenvBuiltin(ViaG
             ensure_dir(directory)
 
         self.set_pyenv_cfg()
         self.pyenv_cfg.write()
         true_system_site = self.enable_system_site_package
         try:
             self.enable_system_site_package = False
             for src in self._sources:
-                src.run(self, self.symlinks)
+                if (
+                    src.when == RefWhen.ANY
+                    or (src.when == RefWhen.SYMLINK and self.symlinks is True)
+                    or (src.when == RefWhen.COPY and self.symlinks is False)
+                ):
+                    src.run(self, self.symlinks)
         finally:
             if true_system_site != self.enable_system_site_package:
                 self.enable_system_site_package = true_system_site
         super(ViaGlobalRefVirtualenvBuiltin, self).create()
 
     def ensure_directories(self):
         return {self.dest, self.bin_dir, self.script_dir, self.stdlib} | set(self.libs)
 
     def set_pyenv_cfg(self):
         """
         We directly inject the base prefix and base exec prefix to avoid site.py needing to discover these
         from home (which usually is done within the interpreter itself)
-         """
+        """
         super(ViaGlobalRefVirtualenvBuiltin, self).set_pyenv_cfg()
         self.pyenv_cfg["base-prefix"] = self.interpreter.system_prefix
         self.pyenv_cfg["base-exec-prefix"] = self.interpreter.system_exec_prefix
         self.pyenv_cfg["base-executable"] = self.interpreter.system_executable
--- a/third_party/python/virtualenv/virtualenv/create/via_global_ref/venv.py
+++ b/third_party/python/virtualenv/virtualenv/create/via_global_ref/venv.py
@@ -41,17 +41,20 @@ class Venv(ViaGlobalRefApi):
         for lib in self.libs:
             ensure_dir(lib)
         super(Venv, self).create()
 
     def create_inline(self):
         from venv import EnvBuilder
 
         builder = EnvBuilder(
-            system_site_packages=self.enable_system_site_package, clear=False, symlinks=self.symlinks, with_pip=False,
+            system_site_packages=self.enable_system_site_package,
+            clear=False,
+            symlinks=self.symlinks,
+            with_pip=False,
         )
         builder.create(str(self.dest))
 
     def create_via_sub_process(self):
         cmd = self.get_host_create_cmd()
         logging.info("using host built-in venv to create via %s", " ".join(cmd))
         code, out, err = run_cmd(cmd)
         if code != 0:
--- a/third_party/python/virtualenv/virtualenv/discovery/builtin.py
+++ b/third_party/python/virtualenv/virtualenv/discovery/builtin.py
@@ -10,38 +10,46 @@ from virtualenv.util.six import ensure_s
 from .discover import Discover
 from .py_info import PythonInfo
 from .py_spec import PythonSpec
 
 
 class Builtin(Discover):
     def __init__(self, options):
         super(Builtin, self).__init__(options)
-        self.python_spec = options.python
+        self.python_spec = options.python if options.python else [sys.executable]
         self.app_data = options.app_data
 
     @classmethod
     def add_parser_arguments(cls, parser):
         parser.add_argument(
             "-p",
             "--python",
             dest="python",
             metavar="py",
-            help="target interpreter for which to create a virtual (either absolute path or identifier string)",
-            default=sys.executable,
+            type=str,
+            action="append",
+            default=[],
+            help="interpreter based on what to create environment (path/identifier) "
+            "- by default use the interpreter where the tool is installed - first found wins",
         )
 
     def run(self):
-        return get_interpreter(self.python_spec, self.app_data)
+        for python_spec in self.python_spec:
+            result = get_interpreter(python_spec, self.app_data)
+            if result is not None:
+                return result
+        return None
 
     def __repr__(self):
         return ensure_str(self.__unicode__())
 
     def __unicode__(self):
-        return "{} discover of python_spec={!r}".format(self.__class__.__name__, self.python_spec)
+        spec = self.python_spec[0] if len(self.python_spec) == 1 else self.python_spec
+        return "{} discover of python_spec={!r}".format(self.__class__.__name__, spec)
 
 
 def get_interpreter(key, app_data=None):
     spec = PythonSpec.from_string_spec(key)
     logging.info("find interpreter for spec %r", spec)
     proposed_paths = set()
     for interpreter, impl_must_match in propose_interpreters(spec, app_data):
         key = interpreter.system_executable, impl_must_match
--- a/third_party/python/virtualenv/virtualenv/discovery/cached_py_info.py
+++ b/third_party/python/virtualenv/virtualenv/discovery/cached_py_info.py
@@ -99,17 +99,20 @@ def _run_subprocess(cls, exe, app_data):
         except OSError as os_error:
             out, err, code = "", os_error.strerror, os_error.errno
     result, failure = None, None
     if code == 0:
         result = cls._from_json(out)
         result.executable = exe  # keep original executable as this may contain initialization code
     else:
         msg = "failed to query {} with code {}{}{}".format(
-            exe, code, " out: {!r}".format(out) if out else "", " err: {!r}".format(err) if err else "",
+            exe,
+            code,
+            " out: {!r}".format(out) if out else "",
+            " err: {!r}".format(err) if err else "",
         )
         failure = RuntimeError(msg)
     return failure, result
 
 
 class LogCmd(object):
     def __init__(self, cmd, env=None):
         self.cmd = cmd
--- a/third_party/python/virtualenv/virtualenv/discovery/py_info.py
+++ b/third_party/python/virtualenv/virtualenv/discovery/py_info.py
@@ -115,17 +115,17 @@ class PythonInfo(object):
                         return base_executable
             return None  # in this case we just can't tell easily without poking around FS and calling them, bail
         # if we're not in a virtual environment, this is already a system python, so return the original executable
         # note we must choose the original and not the pure executable as shim scripts might throw us off
         return self.original_executable
 
     @staticmethod
     def _distutils_install():
-        # follow https://github.com/pypa/pip/blob/master/src/pip/_internal/locations.py#L95
+        # follow https://github.com/pypa/pip/blob/main/src/pip/_internal/locations.py#L95
         # note here we don't import Distribution directly to allow setuptools to patch it
         d = dist.Distribution({"script_args": "--no-user-cfg"})  # conf files not parsed so they do not hijack paths
         if hasattr(sys, "_framework"):
             sys._framework = None  # disable macOS static paths for framework
         i = d.get_command_obj("install", create=True)
         i.prefix = os.sep  # paths generated are relative to prefix that contains the path sep, this makes it relative
         i.finalize_options()
         result = {key: (getattr(i, "install_{}".format(key))[1:]).lstrip(os.sep) for key in SCHEME_KEYS}
@@ -193,17 +193,18 @@ class PythonInfo(object):
     def __unicode__(self):
         content = repr(self)
         if sys.version_info == 2:
             content = content.decode("utf-8")
         return content
 
     def __repr__(self):
         return "{}({!r})".format(
-            self.__class__.__name__, {k: v for k, v in self.__dict__.items() if not k.startswith("_")},
+            self.__class__.__name__,
+            {k: v for k, v in self.__dict__.items() if not k.startswith("_")},
         )
 
     def __str__(self):
         content = "{}({})".format(
             self.__class__.__name__,
             ", ".join(
                 "{}={}".format(k, v)
                 for k, v in (
--- a/third_party/python/virtualenv/virtualenv/run/__init__.py
+++ b/third_party/python/virtualenv/virtualenv/run/__init__.py
@@ -1,13 +1,14 @@
 from __future__ import absolute_import, unicode_literals
 
 import logging
+from functools import partial
 
-from ..app_data import AppDataAction, AppDataDisabled, TempAppData
+from ..app_data import make_app_data
 from ..config.cli.parser import VirtualEnvConfigParser
 from ..report import LEVELS, setup_report
 from ..run.session import Session
 from ..seed.wheels.periodic_update import manual_upgrade
 from ..version import __version__
 from .plugin.activators import ActivationSelector
 from .plugin.creators import CreatorSelector
 from .plugin.discovery import get_discover
@@ -83,42 +84,41 @@ def build_parser_only(args=None):
 
 def handle_extra_commands(options):
     if options.upgrade_embed_wheels:
         result = manual_upgrade(options.app_data)
         raise SystemExit(result)
 
 
 def load_app_data(args, parser, options):
+    parser.add_argument(
+        "--read-only-app-data",
+        action="store_true",
+        help="use app data folder in read-only mode (write operations will fail with error)",
+    )
+    options, _ = parser.parse_known_args(args, namespace=options)
+
     # here we need a write-able application data (e.g. the zipapp might need this for discovery cache)
-    default_app_data = AppDataAction.default()
     parser.add_argument(
         "--app-data",
-        dest="app_data",
-        action=AppDataAction,
-        default="<temp folder>" if isinstance(default_app_data, AppDataDisabled) else default_app_data,
         help="a data folder used as cache by the virtualenv",
+        type=partial(make_app_data, read_only=options.read_only_app_data),
+        default=make_app_data(None, read_only=options.read_only_app_data),
     )
     parser.add_argument(
         "--reset-app-data",
-        dest="reset_app_data",
         action="store_true",
         help="start with empty app data folder",
-        default=False,
     )
     parser.add_argument(
         "--upgrade-embed-wheels",
-        dest="upgrade_embed_wheels",
         action="store_true",
         help="trigger a manual update of the embedded wheels",
-        default=False,
     )
     options, _ = parser.parse_known_args(args, namespace=options)
-    if options.app_data == "<temp folder>":
-        options.app_data = TempAppData()
     if options.reset_app_data:
         options.app_data.reset()
     return options
 
 
 def add_version_flag(parser):
     import virtualenv
 
@@ -129,17 +129,18 @@ def add_version_flag(parser):
         help="display the version of the virtualenv package and its location, then exit",
     )
 
 
 def _do_report_setup(parser, args, setup_logging):
     level_map = ", ".join("{}={}".format(logging.getLevelName(l), c) for c, l in sorted(list(LEVELS.items())))
     msg = "verbosity = verbose - quiet, default {}, mapping => {}"
     verbosity_group = parser.add_argument_group(
-        title="verbosity", description=msg.format(logging.getLevelName(LEVELS[3]), level_map),
+        title="verbosity",
+        description=msg.format(logging.getLevelName(LEVELS[3]), level_map),
     )
     verbosity = verbosity_group.add_mutually_exclusive_group()
     verbosity.add_argument("-v", "--verbose", action="count", dest="verbose", help="increase verbosity", default=2)
     verbosity.add_argument("-q", "--quiet", action="count", dest="quiet", help="decrease verbosity", default=0)
     option, _ = parser.parse_known_args(args)
     if setup_logging:
         setup_report(option.verbosity)
 
--- a/third_party/python/virtualenv/virtualenv/run/plugin/creators.py
+++ b/third_party/python/virtualenv/virtualenv/run/plugin/creators.py
@@ -13,44 +13,44 @@ CreatorInfo = namedtuple("CreatorInfo", 
 class CreatorSelector(ComponentBuilder):
     def __init__(self, interpreter, parser):
         creators, self.key_to_meta, self.describe, self.builtin_key = self.for_interpreter(interpreter)
         super(CreatorSelector, self).__init__(interpreter, parser, "creator", creators)
 
     @classmethod
     def for_interpreter(cls, interpreter):
         key_to_class, key_to_meta, builtin_key, describe = OrderedDict(), {}, None, None
-        errored = defaultdict(list)
+        errors = defaultdict(list)
         for key, creator_class in cls.options("virtualenv.create").items():
             if key == "builtin":
                 raise RuntimeError("builtin creator is a reserved name")
             meta = creator_class.can_create(interpreter)
             if meta:
                 if meta.error:
-                    errored[meta.error].append(creator_class)
+                    errors[meta.error].append(creator_class)
                 else:
                     if "builtin" not in key_to_class and issubclass(creator_class, VirtualenvBuiltin):
                         builtin_key = key
                         key_to_class["builtin"] = creator_class
                         key_to_meta["builtin"] = meta
                     key_to_class[key] = creator_class
                     key_to_meta[key] = meta
             if describe is None and issubclass(creator_class, Describe) and creator_class.can_describe(interpreter):
                 describe = creator_class
         if not key_to_meta:
-            if errored:
-                raise RuntimeError(
-                    "\n".join(
-                        "{} for creators {}".format(k, ", ".join(i.__name__ for i in v)) for k, v in errored.items()
-                    ),
-                )
+            if errors:
+                rows = ["{} for creators {}".format(k, ", ".join(i.__name__ for i in v)) for k, v in errors.items()]
+                raise RuntimeError("\n".join(rows))
             else:
                 raise RuntimeError("No virtualenv implementation for {}".format(interpreter))
         return CreatorInfo(
-            key_to_class=key_to_class, key_to_meta=key_to_meta, describe=describe, builtin_key=builtin_key,
+            key_to_class=key_to_class,
+            key_to_meta=key_to_meta,
+            describe=describe,
+            builtin_key=builtin_key,
         )
 
     def add_selector_arg_parse(self, name, choices):
         # prefer the built-in venv if present, otherwise fallback to first defined type
         choices = sorted(choices, key=lambda a: 0 if a == "builtin" else 1)
         default_value = self._get_default(choices)
         self.parser.add_argument(
             "--{}".format(name),
--- a/third_party/python/virtualenv/virtualenv/run/plugin/discovery.py
+++ b/third_party/python/virtualenv/virtualenv/run/plugin/discovery.py
@@ -5,17 +5,18 @@ from .base import PluginLoader
 
 class Discovery(PluginLoader):
     """"""
 
 
 def get_discover(parser, args):
     discover_types = Discovery.entry_points_for("virtualenv.discovery")
     discovery_parser = parser.add_argument_group(
-        title="discovery", description="discover and provide a target interpreter",
+        title="discovery",
+        description="discover and provide a target interpreter",
     )
     discovery_parser.add_argument(
         "--discovery",
         choices=_get_default_discovery(discover_types),
         default=next(i for i in discover_types.keys()),
         required=False,
         help="interpreter discovery method",
     )
--- a/third_party/python/virtualenv/virtualenv/run/plugin/seeders.py
+++ b/third_party/python/virtualenv/virtualenv/run/plugin/seeders.py
@@ -12,17 +12,21 @@ class SeederSelector(ComponentBuilder):
         self.parser.add_argument(
             "--{}".format(name),
             choices=choices,
             default=self._get_default(),
             required=False,
             help="seed packages install method",
         )
         self.parser.add_argument(
-            "--no-seed", "--without-pip", help="do not install seed packages", action="store_true", dest="no_seed",
+            "--no-seed",
+            "--without-pip",
+            help="do not install seed packages",
+            action="store_true",
+            dest="no_seed",
         )
 
     @staticmethod
     def _get_default():
         return "app-data"
 
     def handle_selected_arg_parse(self, options):
         return super(SeederSelector, self).handle_selected_arg_parse(options)
--- a/third_party/python/virtualenv/virtualenv/run/session.py
+++ b/third_party/python/virtualenv/virtualenv/run/session.py
@@ -57,17 +57,18 @@ class Session(object):
     def _seed(self):
         if self.seeder is not None and self.seeder.enabled:
             logging.info("add seed packages via %s", self.seeder)
             self.seeder.run(self.creator)
 
     def _activate(self):
         if self.activators:
             logging.info(
-                "add activators for %s", ", ".join(type(i).__name__.replace("Activator", "") for i in self.activators),
+                "add activators for %s",
+                ", ".join(type(i).__name__.replace("Activator", "") for i in self.activators),
             )
             for activator in self.activators:
                 activator.generate(self.creator)
 
     def __enter__(self):
         return self
 
     def __exit__(self, exc_type, exc_val, exc_tb):
--- a/third_party/python/virtualenv/virtualenv/seed/embed/base_embed.py
+++ b/third_party/python/virtualenv/virtualenv/seed/embed/base_embed.py
@@ -104,14 +104,15 @@ class BaseEmbed(Seeder):
         result += "("
         if self.extra_search_dir:
             result += "extra_search_dir={},".format(", ".join(ensure_text(str(i)) for i in self.extra_search_dir))
         result += "download={},".format(self.download)
         for distribution in self.distributions():
             if getattr(self, "no_{}".format(distribution)):
                 continue
             result += " {}{},".format(
-                distribution, "={}".format(getattr(self, "{}_version".format(distribution), None) or "latest"),
+                distribution,
+                "={}".format(getattr(self, "{}_version".format(distribution), None) or "latest"),
             )
         return result[:-1] + ")"
 
     def __repr__(self):
         return ensure_str(self.__unicode__())
--- a/third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/via_app_data.py
+++ b/third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/via_app_data.py
@@ -3,24 +3,20 @@ from __future__ import absolute_import, 
 
 import logging
 import sys
 import traceback
 from contextlib import contextmanager
 from subprocess import CalledProcessError
 from threading import Lock, Thread
 
-import six
-
 from virtualenv.info import fs_supports_symlink
 from virtualenv.seed.embed.base_embed import BaseEmbed
 from virtualenv.seed.wheels import get_wheel
-from virtualenv.util.lock import _CountedFileLock
 from virtualenv.util.path import Path
-from virtualenv.util.six import ensure_text
 
 from .pip_install.copy import CopyPipInstall
 from .pip_install.symlink import SymlinkPipInstall
 
 
 class FromAppData(BaseEmbed):
     def __init__(self, options):
         super(FromAppData, self).__init__(options)
@@ -49,17 +45,18 @@ class FromAppData(BaseEmbed):
             exceptions = {}
 
             def _install(name, wheel):
                 try:
                     logging.debug("install %s from wheel %s via %s", name, wheel, installer_class.__name__)
                     key = Path(installer_class.__name__) / wheel.path.stem
                     wheel_img = self.app_data.wheel_image(creator.interpreter.version_release_str, key)
                     installer = installer_class(wheel.path, creator, wheel_img)
-                    with _CountedFileLock(ensure_text(str(wheel_img.parent / "{}.lock".format(wheel_img.name)))):
+                    parent = self.app_data.lock / wheel_img.parent
+                    with parent.non_reentrant_lock_for_key(wheel_img.name):
                         if not installer.has_image():
                             installer.build_image()
                     installer.install(creator.interpreter.version_info)
                 except Exception:  # noqa
                     exceptions[name] = sys.exc_info()
 
             threads = list(Thread(target=_install, args=(n, w)) for n, w in name_to_whl.items())
             for thread in threads:
@@ -99,17 +96,17 @@ class FromAppData(BaseEmbed):
                     logging.exception("fail")
                     failure = exception
             if failure:
                 if isinstance(failure, CalledProcessError):
                     msg = "failed to download {}".format(distribution)
                     if version is not None:
                         msg += " version {}".format(version)
                     msg += ", pip download exit code {}".format(failure.returncode)
-                    output = failure.output if six.PY2 else (failure.output + failure.stderr)
+                    output = failure.output if sys.version_info < (3, 5) else (failure.output + failure.stderr)
                     if output:
                         msg += "\n"
                         msg += output
                 else:
                     msg = repr(failure)
                 logging.error(msg)
                 with lock:
                     fail[distribution] = version
--- a/third_party/python/virtualenv/virtualenv/seed/wheels/acquire.py
+++ b/third_party/python/virtualenv/virtualenv/seed/wheels/acquire.py
@@ -1,18 +1,16 @@
 """Bootstrap"""
 from __future__ import absolute_import, unicode_literals
 
 import logging
 import os
 import sys
 from operator import eq, lt
 
-import six
-
 from virtualenv.util.path import Path
 from virtualenv.util.six import ensure_str
 from virtualenv.util.subprocess import Popen, subprocess
 
 from .bundle import from_bundle
 from .util import Version, Wheel, discover_wheels
 
 
@@ -57,17 +55,17 @@ def download_wheel(distribution, version
         to_download,
     ]
     # pip has no interface in python - must be a new sub-process
     env = pip_wheel_env_run(search_dirs, app_data)
     process = Popen(cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
     out, err = process.communicate()
     if process.returncode != 0:
         kwargs = {"output": out}
-        if six.PY2:
+        if sys.version_info < (3, 5):
             kwargs["output"] += err
         else:
             kwargs["stderr"] = err
         raise subprocess.CalledProcessError(process.returncode, cmd, **kwargs)
     result = _find_downloaded_wheel(distribution, version_spec, for_py_version, to_folder, out)
     logging.debug("downloaded wheel %s", result.name)
     return result
 
--- a/third_party/python/virtualenv/virtualenv/seed/wheels/bundle.py
+++ b/third_party/python/virtualenv/virtualenv/seed/wheels/bundle.py
@@ -1,27 +1,25 @@
 from __future__ import absolute_import, unicode_literals
 
-from virtualenv.app_data import AppDataDiskFolder, TempAppData
-
 from ..wheels.embed import get_embed_wheel
 from .periodic_update import periodic_update
 from .util import Version, Wheel, discover_wheels
 
 
 def from_bundle(distribution, version, for_py_version, search_dirs, app_data, do_periodic_update):
     """
     Load the bundled wheel to a cache directory.
     """
     of_version = Version.of_version(version)
     wheel = load_embed_wheel(app_data, distribution, for_py_version, of_version)
 
     if version != Version.embed:
         # 2. check if we have upgraded embed
-        if isinstance(app_data, AppDataDiskFolder) and not isinstance(app_data, TempAppData):
+        if app_data.can_update:
             wheel = periodic_update(distribution, for_py_version, wheel, search_dirs, app_data, do_periodic_update)
 
         # 3. acquire from extra search dir
         found_wheel = from_dir(distribution, of_version, for_py_version, search_dirs)
         if found_wheel is not None:
             if wheel is None:
                 wheel = found_wheel
             elif found_wheel.version_tuple > wheel.version_tuple:
--- a/third_party/python/virtualenv/virtualenv/seed/wheels/embed/__init__.py
+++ b/third_party/python/virtualenv/virtualenv/seed/wheels/embed/__init__.py
@@ -1,54 +1,54 @@
 from __future__ import absolute_import, unicode_literals
 
 from virtualenv.seed.wheels.util import Wheel
 from virtualenv.util.path import Path
 
 BUNDLE_FOLDER = Path(__file__).absolute().parent
 BUNDLE_SUPPORT = {
     "3.10": {
-        "pip": "pip-20.2.2-py2.py3-none-any.whl",
-        "setuptools": "setuptools-49.6.0-py3-none-any.whl",
-        "wheel": "wheel-0.35.1-py2.py3-none-any.whl",
+        "pip": "pip-20.3.1-py2.py3-none-any.whl",
+        "setuptools": "setuptools-51.0.0-py3-none-any.whl",
+        "wheel": "wheel-0.36.1-py2.py3-none-any.whl",
     },
     "3.9": {
-        "pip": "pip-20.2.2-py2.py3-none-any.whl",
-        "setuptools": "setuptools-49.6.0-py3-none-any.whl",
-        "wheel": "wheel-0.35.1-py2.py3-none-any.whl",
+        "pip": "pip-20.3.1-py2.py3-none-any.whl",
+        "setuptools": "setuptools-51.0.0-py3-none-any.whl",
+        "wheel": "wheel-0.36.1-py2.py3-none-any.whl",
     },
     "3.8": {
-        "pip": "pip-20.2.2-py2.py3-none-any.whl",
-        "setuptools": "setuptools-49.6.0-py3-none-any.whl",
-        "wheel": "wheel-0.35.1-py2.py3-none-any.whl",
+        "pip": "pip-20.3.1-py2.py3-none-any.whl",
+        "setuptools": "setuptools-51.0.0-py3-none-any.whl",
+        "wheel": "wheel-0.36.1-py2.py3-none-any.whl",
     },
     "3.7": {
-        "pip": "pip-20.2.2-py2.py3-none-any.whl",
-        "setuptools": "setuptools-49.6.0-py3-none-any.whl",
-        "wheel": "wheel-0.35.1-py2.py3-none-any.whl",
+        "pip": "pip-20.3.1-py2.py3-none-any.whl",
+        "setuptools": "setuptools-51.0.0-py3-none-any.whl",
+        "wheel": "wheel-0.36.1-py2.py3-none-any.whl",
     },
     "3.6": {
-        "pip": "pip-20.2.2-py2.py3-none-any.whl",
-        "setuptools": "setuptools-49.6.0-py3-none-any.whl",
-        "wheel": "wheel-0.35.1-py2.py3-none-any.whl",
+        "pip": "pip-20.3.1-py2.py3-none-any.whl",
+        "setuptools": "setuptools-51.0.0-py3-none-any.whl",
+        "wheel": "wheel-0.36.1-py2.py3-none-any.whl",
     },
     "3.5": {
-        "pip": "pip-20.2.2-py2.py3-none-any.whl",
-        "setuptools": "setuptools-49.6.0-py3-none-any.whl",
-        "wheel": "wheel-0.35.1-py2.py3-none-any.whl",
+        "pip": "pip-20.3.1-py2.py3-none-any.whl",
+        "setuptools": "setuptools-50.3.2-py3-none-any.whl",
+        "wheel": "wheel-0.36.1-py2.py3-none-any.whl",
     },
     "3.4": {
         "pip": "pip-19.1.1-py2.py3-none-any.whl",
         "setuptools": "setuptools-43.0.0-py2.py3-none-any.whl",
         "wheel": "wheel-0.33.6-py2.py3-none-any.whl",
     },
     "2.7": {
-        "pip": "pip-20.2.2-py2.py3-none-any.whl",
+        "pip": "pip-20.3.1-py2.py3-none-any.whl",
         "setuptools": "setuptools-44.1.1-py2.py3-none-any.whl",
-        "wheel": "wheel-0.35.1-py2.py3-none-any.whl",
+        "wheel": "wheel-0.36.1-py2.py3-none-any.whl",
     },
 }
 MAX = "3.10"
 
 
 def get_embed_wheel(distribution, for_py_version):
     path = BUNDLE_FOLDER / (BUNDLE_SUPPORT.get(for_py_version, {}) or BUNDLE_SUPPORT[MAX]).get(distribution)
     return Wheel.from_path(path)
deleted file mode 100644
index 78bad7a0e097ec2e037d18cfe602859e7faab22a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
index 0000000000000000000000000000000000000000..fbac5d3c90f33aadec124001a0e29ef091a923ab
GIT binary patch
literal 1518513
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