From 888fdc511555b53503285f459c22b5764a6e2b31 Mon Sep 17 00:00:00 2001
From: "Robin.Mueller" <robin.mueller.m@gmail.com>
Date: Wed, 19 Aug 2020 20:38:16 +0200
Subject: [PATCH] reinstalled venv

---
 requirements.txt                              |    3 +
 setup.py                                      |    0
 .../site-packages/_distutils_hack/__init__.py |   99 ++
 .../site-packages/_distutils_hack/override.py |    1 +
 .../site-packages/distutils-precedence.pth    |    1 +
 .../site-packages/easy_install.py             |    0
 .../pip-20.2.2.dist-info}/INSTALLER           |    0
 .../pip-20.2.2.dist-info}/LICENSE.txt         |    0
 .../pip-20.2.2.dist-info}/METADATA            |    7 +-
 .../pip-20.2.2.dist-info}/RECORD              |  328 ++--
 .../site-packages/pip-20.2.2.dist-info}/WHEEL |    0
 .../pip-20.2.2.dist-info}/entry_points.txt    |    0
 .../pip-20.2.2.dist-info}/top_level.txt       |    0
 .../site-packages/pip/__init__.py             |    2 +-
 .../site-packages/pip/__main__.py             |    0
 .../site-packages/pip/_internal/__init__.py   |    0
 .../site-packages/pip/_internal/build_env.py  |   40 +-
 .../site-packages/pip/_internal/cache.py      |   15 +-
 .../pip/_internal/cli/__init__.py             |    0
 .../pip/_internal/cli/autocompletion.py       |    0
 .../pip/_internal/cli/base_command.py         |   45 +-
 .../pip/_internal/cli/cmdoptions.py           |   51 +-
 .../pip/_internal/cli/command_context.py      |    0
 .../site-packages/pip/_internal/cli/main.py   |    0
 .../pip/_internal/cli/main_parser.py          |    0
 .../site-packages/pip/_internal/cli/parser.py |    0
 .../pip/_internal/cli/progress_bars.py        |   21 +-
 .../pip/_internal/cli/req_command.py          |   36 +-
 .../pip/_internal/cli/spinners.py             |    0
 .../pip/_internal/cli/status_codes.py         |    0
 .../pip/_internal/commands/__init__.py        |    0
 .../pip/_internal/commands/cache.py           |   17 +-
 .../pip/_internal/commands/check.py           |    0
 .../pip/_internal/commands/completion.py      |   27 +-
 .../pip/_internal/commands/configuration.py   |   91 +-
 .../pip/_internal/commands/debug.py           |   48 +-
 .../pip/_internal/commands/download.py        |   65 +-
 .../pip/_internal/commands/freeze.py          |   16 +-
 .../pip/_internal/commands/hash.py            |   17 +-
 .../pip/_internal/commands/help.py            |    9 +-
 .../pip/_internal/commands/install.py         |  361 +++--
 .../pip/_internal/commands/list.py            |   79 +-
 .../pip/_internal/commands/search.py          |   34 +-
 .../pip/_internal/commands/show.py            |   20 +-
 .../pip/_internal/commands/uninstall.py       |   16 +-
 .../pip/_internal/commands/wheel.py           |   58 +-
 .../pip/_internal/configuration.py            |   56 +-
 .../pip/_internal/distributions/__init__.py   |    0
 .../pip/_internal/distributions/base.py       |    0
 .../pip/_internal/distributions/installed.py  |    0
 .../pip/_internal/distributions/sdist.py      |    0
 .../pip/_internal/distributions/wheel.py      |    0
 .../site-packages/pip/_internal/exceptions.py |   87 +-
 .../pip/_internal/index/__init__.py           |    0
 .../pip/_internal/index/collector.py          |   55 +-
 .../pip/_internal/index/package_finder.py     |   36 +-
 .../site-packages/pip/_internal/locations.py  |    2 +-
 .../site-packages/pip/_internal/main.py       |    0
 .../pip/_internal/models/__init__.py          |    0
 .../pip/_internal/models/candidate.py         |    2 +
 .../pip/_internal/models/direct_url.py        |    0
 .../pip/_internal/models/format_control.py    |   18 +-
 .../pip/_internal/models/index.py             |    3 +
 .../pip/_internal/models/link.py              |    9 +
 .../pip/_internal/models/scheme.py            |    6 +
 .../pip/_internal/models/search_scope.py      |    6 +-
 .../pip/_internal/models/selection_prefs.py   |    4 +-
 .../pip/_internal/models/target_python.py     |   10 +
 .../pip/_internal/models/wheel.py             |    0
 .../pip/_internal/network/__init__.py         |    0
 .../pip/_internal/network/auth.py             |   28 +-
 .../pip/_internal/network/cache.py            |    6 +-
 .../pip/_internal/network/download.py         |   38 +-
 .../pip/_internal/network/lazy_wheel.py       |  235 +++
 .../pip/_internal/network/session.py          |    0
 .../pip/_internal/network/utils.py            |   97 ++
 .../pip/_internal/network/xmlrpc.py           |   20 +-
 .../pip/_internal/operations/__init__.py      |    0
 .../_internal/operations/build/__init__.py    |    0
 .../_internal/operations/build/metadata.py    |    3 -
 .../operations/build/metadata_legacy.py       |    0
 .../pip/_internal/operations/build/wheel.py   |    2 +-
 .../operations/build/wheel_legacy.py          |    0
 .../pip/_internal/operations/check.py         |   13 +-
 .../pip/_internal/operations/freeze.py        |   24 +-
 .../_internal/operations/install/__init__.py  |    0
 .../operations/install/editable_legacy.py     |    0
 .../_internal/operations/install/legacy.py    |   26 +-
 .../pip/_internal/operations/install/wheel.py |  861 +++++++++++
 .../pip/_internal/operations/prepare.py       |  247 +--
 .../site-packages/pip/_internal/pyproject.py  |    0
 .../pip/_internal/req/__init__.py             |   59 +-
 .../pip/_internal/req/constructors.py         |   48 +-
 .../pip/_internal/req/req_file.py             |   34 +-
 .../pip/_internal/req/req_install.py          |  104 +-
 .../pip/_internal/req/req_set.py              |   15 +-
 .../pip/_internal/req/req_tracker.py          |    5 +-
 .../pip/_internal/req/req_uninstall.py        |    3 +-
 .../pip/_internal/resolution/__init__.py      |    0
 .../pip/_internal/resolution/base.py          |    0
 .../_internal/resolution/legacy/__init__.py   |    0
 .../_internal/resolution/legacy/resolver.py   |   38 +-
 .../resolution/resolvelib/__init__.py         |    0
 .../_internal/resolution/resolvelib/base.py   |   48 +-
 .../resolution/resolvelib/candidates.py       |  356 +++--
 .../resolution/resolvelib/factory.py          |  459 ++++++
 .../resolution/resolvelib/provider.py         |  153 ++
 .../resolution/resolvelib/requirements.py     |   60 +-
 .../resolution/resolvelib/resolver.py         |  259 ++++
 .../pip/_internal/self_outdated_check.py      |   49 +-
 .../pip/_internal/utils/__init__.py           |    0
 .../pip/_internal/utils/appdirs.py            |    0
 .../pip/_internal/utils/compat.py             |    9 +-
 .../pip/_internal/utils/compatibility_tags.py |    3 -
 .../pip/_internal/utils/datetime.py           |   14 +
 .../pip/_internal/utils/deprecation.py        |    0
 .../pip/_internal/utils/direct_url_helpers.py |    0
 .../pip/_internal/utils/distutils_args.py     |    0
 .../pip/_internal/utils/encoding.py           |    7 +-
 .../pip/_internal/utils/entrypoints.py        |    0
 .../pip/_internal/utils/filesystem.py         |   38 +-
 .../pip/_internal/utils/filetypes.py          |    0
 .../pip/_internal/utils/glibc.py              |    0
 .../pip/_internal/utils/hashes.py             |   12 +
 .../_internal/utils/inject_securetransport.py |    0
 .../pip/_internal/utils/logging.py            |    0
 .../site-packages/pip/_internal/utils/misc.py |  108 +-
 .../pip/_internal/utils/models.py             |    2 +
 .../pip/_internal/utils/packaging.py          |    0
 .../pip/_internal/utils/parallel.py           |  107 ++
 .../pip/_internal/utils/pkg_resources.py      |    0
 .../pip/_internal/utils/setuptools_build.py   |    0
 .../pip/_internal/utils/subprocess.py         |   13 +-
 .../pip/_internal/utils/temp_dir.py           |    9 +-
 .../pip/_internal/utils/typing.py             |    0
 .../pip/_internal/utils/unpacking.py          |   37 +-
 .../site-packages/pip/_internal/utils/urls.py |    0
 .../pip/_internal/utils/virtualenv.py         |    5 +-
 .../pip/_internal/utils/wheel.py              |    2 +-
 .../pip/_internal/vcs/__init__.py             |    0
 .../site-packages/pip/_internal/vcs/bazaar.py |    7 +-
 .../site-packages/pip/_internal/vcs/git.py    |   27 +-
 .../pip/_internal/vcs/mercurial.py            |   17 +-
 .../pip/_internal/vcs/subversion.py           |   16 +-
 .../pip/_internal/vcs/versioncontrol.py       |  122 +-
 .../pip/_internal/wheel_builder.py            |   45 +-
 .../site-packages/pip/_vendor/__init__.py     |   14 +-
 .../site-packages/pip/_vendor/appdirs.py      |    4 +-
 .../pip/_vendor/cachecontrol/__init__.py      |    0
 .../pip/_vendor/cachecontrol/_cmd.py          |    0
 .../pip/_vendor/cachecontrol/adapter.py       |    0
 .../pip/_vendor/cachecontrol/cache.py         |    0
 .../_vendor/cachecontrol/caches/__init__.py   |    0
 .../_vendor/cachecontrol/caches/file_cache.py |    0
 .../cachecontrol/caches/redis_cache.py        |    0
 .../pip/_vendor/cachecontrol/compat.py        |    0
 .../pip/_vendor/cachecontrol/controller.py    |    0
 .../pip/_vendor/cachecontrol/filewrapper.py   |    0
 .../pip/_vendor/cachecontrol/heuristics.py    |    0
 .../pip/_vendor/cachecontrol/serialize.py     |    0
 .../pip/_vendor/cachecontrol/wrapper.py       |    0
 .../pip/_vendor/certifi/__init__.py           |    2 +-
 .../pip/_vendor/certifi/__main__.py           |    0
 .../pip/_vendor/certifi/cacert.pem            |  273 ++--
 .../site-packages/pip/_vendor/certifi/core.py |   60 +
 .../pip/_vendor/chardet/__init__.py           |    0
 .../pip/_vendor/chardet/big5freq.py           |    0
 .../pip/_vendor/chardet/big5prober.py         |    0
 .../pip/_vendor/chardet/chardistribution.py   |    0
 .../pip/_vendor/chardet/charsetgroupprober.py |    0
 .../pip/_vendor/chardet/charsetprober.py      |    0
 .../pip/_vendor/chardet/cli/__init__.py       |    0
 .../pip/_vendor/chardet/cli/chardetect.py     |    0
 .../pip/_vendor/chardet/codingstatemachine.py |    0
 .../pip/_vendor/chardet/compat.py             |    0
 .../pip/_vendor/chardet/cp949prober.py        |    0
 .../pip/_vendor/chardet/enums.py              |    0
 .../pip/_vendor/chardet/escprober.py          |    0
 .../pip/_vendor/chardet/escsm.py              |    0
 .../pip/_vendor/chardet/eucjpprober.py        |    0
 .../pip/_vendor/chardet/euckrfreq.py          |    0
 .../pip/_vendor/chardet/euckrprober.py        |    0
 .../pip/_vendor/chardet/euctwfreq.py          |    0
 .../pip/_vendor/chardet/euctwprober.py        |    0
 .../pip/_vendor/chardet/gb2312freq.py         |    0
 .../pip/_vendor/chardet/gb2312prober.py       |    0
 .../pip/_vendor/chardet/hebrewprober.py       |    0
 .../pip/_vendor/chardet/jisfreq.py            |    0
 .../pip/_vendor/chardet/jpcntx.py             |    0
 .../pip/_vendor/chardet/langbulgarianmodel.py |    0
 .../pip/_vendor/chardet/langcyrillicmodel.py  |    0
 .../pip/_vendor/chardet/langgreekmodel.py     |    0
 .../pip/_vendor/chardet/langhebrewmodel.py    |    0
 .../pip/_vendor/chardet/langhungarianmodel.py |    0
 .../pip/_vendor/chardet/langthaimodel.py      |    0
 .../pip/_vendor/chardet/langturkishmodel.py   |    0
 .../pip/_vendor/chardet/latin1prober.py       |    0
 .../pip/_vendor/chardet/mbcharsetprober.py    |    0
 .../pip/_vendor/chardet/mbcsgroupprober.py    |    0
 .../pip/_vendor/chardet/mbcssm.py             |    0
 .../pip/_vendor/chardet/sbcharsetprober.py    |    0
 .../pip/_vendor/chardet/sbcsgroupprober.py    |    0
 .../pip/_vendor/chardet/sjisprober.py         |    0
 .../pip/_vendor/chardet/universaldetector.py  |    0
 .../pip/_vendor/chardet/utf8prober.py         |    0
 .../pip/_vendor/chardet/version.py            |    0
 .../pip/_vendor/colorama/__init__.py          |    0
 .../pip/_vendor/colorama/ansi.py              |    0
 .../pip/_vendor/colorama/ansitowin32.py       |    0
 .../pip/_vendor/colorama/initialise.py        |    0
 .../pip/_vendor/colorama/win32.py             |    0
 .../pip/_vendor/colorama/winterm.py           |    0
 .../site-packages/pip/_vendor/contextlib2.py  |    0
 .../pip/_vendor/distlib/__init__.py           |    2 +-
 .../pip/_vendor/distlib/_backport/__init__.py |    0
 .../pip/_vendor/distlib/_backport/misc.py     |    0
 .../pip/_vendor/distlib/_backport/shutil.py   |    9 +-
 .../_vendor/distlib/_backport/sysconfig.cfg   |    0
 .../_vendor/distlib/_backport/sysconfig.py    |    0
 .../pip/_vendor/distlib/_backport/tarfile.py  |    0
 .../pip/_vendor/distlib/compat.py             |    2 +-
 .../pip/_vendor/distlib/database.py           |    2 +-
 .../pip/_vendor/distlib/index.py              |    0
 .../pip/_vendor/distlib/locators.py           |    0
 .../pip/_vendor/distlib/manifest.py           |    0
 .../pip/_vendor/distlib/markers.py            |    0
 .../pip/_vendor/distlib/metadata.py           |  122 +-
 .../pip/_vendor/distlib/resources.py          |    0
 .../pip/_vendor/distlib/scripts.py            |   13 +-
 .../site-packages/pip/_vendor/distlib/t32.exe |  Bin
 .../site-packages/pip/_vendor/distlib/t64.exe |  Bin
 .../site-packages/pip/_vendor/distlib/util.py |    0
 .../pip/_vendor/distlib/version.py            |    0
 .../site-packages/pip/_vendor/distlib/w32.exe |  Bin
 .../site-packages/pip/_vendor/distlib/w64.exe |  Bin
 .../pip/_vendor/distlib/wheel.py              |   38 +-
 .../site-packages/pip/_vendor/distro.py       |    0
 .../pip/_vendor/html5lib/__init__.py          |    2 +-
 .../pip/_vendor/html5lib/_ihatexml.py         |    5 +-
 .../pip/_vendor/html5lib/_inputstream.py      |   55 +-
 .../pip/_vendor/html5lib/_tokenizer.py        |   16 +-
 .../pip/_vendor/html5lib/_trie/__init__.py    |    5 +
 .../pip/_vendor/html5lib/_trie/_base.py       |    0
 .../pip/_vendor/html5lib/_trie/py.py          |    0
 .../pip/_vendor/html5lib/_utils.py            |   49 +-
 .../pip/_vendor/html5lib/constants.py         |    9 +-
 .../pip/_vendor/html5lib/filters/__init__.py  |    0
 .../filters/alphabeticalattributes.py         |    0
 .../pip/_vendor/html5lib/filters/base.py      |    0
 .../html5lib/filters/inject_meta_charset.py   |    0
 .../pip/_vendor/html5lib/filters/lint.py      |    0
 .../_vendor/html5lib/filters/optionaltags.py  |    0
 .../pip/_vendor/html5lib/filters/sanitizer.py |   20 +
 .../_vendor/html5lib/filters/whitespace.py    |    0
 .../pip/_vendor/html5lib/html5parser.py       |  734 ++++-----
 .../pip/_vendor/html5lib/serializer.py        |    2 +-
 .../_vendor/html5lib/treeadapters/__init__.py |    0
 .../_vendor/html5lib/treeadapters/genshi.py   |    0
 .../pip/_vendor/html5lib/treeadapters/sax.py  |    0
 .../_vendor/html5lib/treebuilders/__init__.py |    0
 .../pip/_vendor/html5lib/treebuilders/base.py |    8 +-
 .../pip/_vendor/html5lib/treebuilders/dom.py  |    0
 .../_vendor/html5lib/treebuilders/etree.py    |   27 +-
 .../html5lib/treebuilders/etree_lxml.py       |   64 +-
 .../_vendor/html5lib/treewalkers/__init__.py  |    6 +-
 .../pip/_vendor/html5lib/treewalkers/base.py  |    0
 .../pip/_vendor/html5lib/treewalkers/dom.py   |    0
 .../pip/_vendor/html5lib/treewalkers/etree.py |    1 +
 .../html5lib/treewalkers/etree_lxml.py        |    4 +-
 .../_vendor/html5lib/treewalkers/genshi.py    |    0
 .../pip/_vendor/idna/__init__.py              |    0
 .../site-packages/pip/_vendor/idna/codec.py   |    0
 .../site-packages/pip/_vendor/idna/compat.py  |    0
 .../site-packages/pip/_vendor/idna/core.py    |    2 +
 .../pip/_vendor/idna/idnadata.py              |  107 +-
 .../pip/_vendor/idna/intranges.py             |    0
 .../pip/_vendor/idna/package_data.py          |    2 +
 .../pip/_vendor/idna/uts46data.py             |  492 +++---
 .../site-packages/pip/_vendor/ipaddress.py    |    0
 .../pip/_vendor/msgpack/__init__.py           |    0
 .../pip/_vendor/msgpack/_version.py           |    0
 .../pip/_vendor/msgpack/exceptions.py         |    0
 .../site-packages/pip/_vendor/msgpack/ext.py  |    0
 .../pip/_vendor/msgpack/fallback.py           |    0
 .../pip}/_vendor/packaging/__about__.py       |    4 +-
 .../pip/_vendor/packaging/__init__.py         |    0
 .../pip/_vendor/packaging/_compat.py          |    4 +-
 .../pip/_vendor/packaging/_structures.py      |    0
 .../pip/_vendor/packaging/_typing.py          |   48 +
 .../pip/_vendor/packaging/markers.py          |    4 +-
 .../pip/_vendor/packaging/requirements.py     |    4 +-
 .../pip/_vendor/packaging/specifiers.py       |   26 +-
 .../pip/_vendor/packaging/tags.py             |   18 +-
 .../pip/_vendor/packaging/utils.py            |   13 +-
 .../pip/_vendor/packaging/version.py          |    4 +-
 .../pip/_vendor/pep517/__init__.py            |    0
 .../pip/_vendor/pep517/_in_process.py         |    0
 .../site-packages/pip/_vendor/pep517/build.py |    0
 .../site-packages/pip/_vendor/pep517/check.py |    0
 .../pip/_vendor/pep517/colorlog.py            |    0
 .../pip/_vendor/pep517/compat.py              |    0
 .../pip/_vendor/pep517/dirtools.py            |    0
 .../pip/_vendor/pep517/envbuild.py            |    0
 .../site-packages/pip/_vendor/pep517/meta.py  |    0
 .../pip/_vendor/pep517/wrappers.py            |    0
 .../pip/_vendor/pkg_resources/__init__.py     |    0
 .../pip/_vendor/pkg_resources/py31compat.py   |    0
 .../pip/_vendor/progress/__init__.py          |    0
 .../site-packages/pip/_vendor/progress/bar.py |    0
 .../pip/_vendor/progress/counter.py           |    0
 .../pip/_vendor/progress/spinner.py           |    0
 .../site-packages/pip/_vendor/pyparsing.py    |    0
 .../pip/_vendor/requests/__init__.py          |   21 +-
 .../pip/_vendor/requests/__version__.py       |    4 +-
 .../pip/_vendor/requests/_internal_utils.py   |    0
 .../pip/_vendor/requests/adapters.py          |    0
 .../site-packages/pip/_vendor/requests/api.py |    0
 .../pip/_vendor/requests/auth.py              |    0
 .../pip/_vendor/requests/certs.py             |    0
 .../pip/_vendor/requests/compat.py            |    0
 .../pip/_vendor/requests/cookies.py           |    0
 .../pip/_vendor/requests/exceptions.py        |    9 +-
 .../pip/_vendor/requests/help.py              |    0
 .../pip/_vendor/requests/hooks.py             |    0
 .../pip/_vendor/requests/models.py            |   12 +-
 .../pip/_vendor/requests/packages.py          |    0
 .../pip/_vendor/requests/sessions.py          |   10 +-
 .../pip/_vendor/requests/status_codes.py      |    0
 .../pip/_vendor/requests/structures.py        |    0
 .../pip/_vendor/requests/utils.py             |    0
 .../pip/_vendor/resolvelib/__init__.py        |    2 +-
 .../_vendor/resolvelib/compat}/__init__.py    |    0
 .../resolvelib/compat/collections_abc.py      |    6 +
 .../pip/_vendor/resolvelib/providers.py       |   52 +-
 .../pip/_vendor/resolvelib/reporters.py       |   12 +-
 .../pip/_vendor/resolvelib/resolvers.py       |   64 +-
 .../pip/_vendor/resolvelib/structs.py         |    0
 .../site-packages/pip/_vendor/retrying.py     |    0
 .../site-packages/pip/_vendor/six.py          |   20 +-
 .../pip/_vendor/toml/__init__.py              |    6 +-
 .../site-packages/pip/_vendor/toml/common.py  |    6 +
 .../site-packages/pip/_vendor/toml/decoder.py |  159 +-
 .../site-packages/pip/_vendor/toml/encoder.py |   72 +-
 .../site-packages/pip/_vendor/toml/ordered.py |    0
 .../site-packages/pip/_vendor/toml/tz.py      |    0
 .../pip/_vendor/urllib3/__init__.py           |    2 +-
 .../pip/_vendor/urllib3/_collections.py       |    0
 .../pip/_vendor/urllib3/connection.py         |   47 +-
 .../pip/_vendor/urllib3/connectionpool.py     |   36 +-
 .../pip/_vendor/urllib3/contrib}/__init__.py  |    0
 .../urllib3/contrib/_appengine_environ.py     |    0
 .../contrib/_securetransport}/__init__.py     |    0
 .../contrib/_securetransport/bindings.py      |    0
 .../contrib/_securetransport/low_level.py     |    0
 .../pip/_vendor/urllib3/contrib/appengine.py  |    0
 .../pip/_vendor/urllib3/contrib/ntlmpool.py   |    0
 .../pip/_vendor/urllib3/contrib/pyopenssl.py  |    9 +-
 .../urllib3/contrib/securetransport.py        |    5 +
 .../pip/_vendor/urllib3/contrib/socks.py      |    0
 .../pip/_vendor/urllib3/exceptions.py         |   19 +-
 .../pip/_vendor/urllib3/fields.py             |    0
 .../pip/_vendor/urllib3/filepost.py           |    0
 .../pip/_vendor/urllib3/packages/__init__.py  |    0
 .../urllib3/packages/backports}/__init__.py   |    0
 .../urllib3/packages/backports/makefile.py    |    0
 .../pip/_vendor/urllib3/packages/six.py       |    0
 .../packages/ssl_match_hostname/__init__.py   |    0
 .../ssl_match_hostname/_implementation.py     |    0
 .../pip/_vendor/urllib3/poolmanager.py        |   24 +-
 .../pip/_vendor/urllib3/request.py            |    0
 .../pip/_vendor/urllib3/response.py           |   12 +
 .../pip/_vendor/urllib3/util/__init__.py      |    0
 .../pip/_vendor/urllib3/util/connection.py    |    0
 .../pip/_vendor/urllib3/util/queue.py         |    0
 .../pip/_vendor/urllib3/util/request.py       |    0
 .../pip/_vendor/urllib3/util/response.py      |    0
 .../pip/_vendor/urllib3/util/retry.py         |    3 +
 .../pip/_vendor/urllib3/util/ssl_.py          |   13 +-
 .../pip/_vendor/urllib3/util/timeout.py       |    5 +-
 .../pip/_vendor/urllib3/util/url.py           |    2 +-
 .../pip/_vendor/urllib3/util/wait.py          |    0
 .../site-packages/pip/_vendor/vendor.txt      |   22 +-
 .../pip/_vendor/webencodings/__init__.py      |    0
 .../pip/_vendor/webencodings/labels.py        |    0
 .../pip/_vendor/webencodings/mklabels.py      |    0
 .../pip/_vendor/webencodings/tests.py         |    0
 .../_vendor/webencodings/x_user_defined.py    |    0
 .../site-packages/pkg_resources/__init__.py   |  137 +-
 .../pkg_resources/_vendor}/__init__.py        |    0
 .../pkg_resources/_vendor/appdirs.py          |    0
 .../_vendor/packaging/__about__.py            |    4 +-
 .../_vendor/packaging/__init__.py             |    0
 .../_vendor/packaging/_compat.py              |    9 +-
 .../_vendor/packaging/_structures.py          |   26 +-
 .../_vendor/packaging/_typing.py              |   29 +-
 .../_vendor/packaging/markers.py              |  139 +-
 .../_vendor/packaging/requirements.py         |   50 +-
 .../_vendor/packaging/specifiers.py           |  190 ++-
 .../pkg_resources/_vendor/packaging/tags.py   |  751 +++++++++
 .../pkg_resources}/_vendor/packaging/utils.py |   18 +-
 .../_vendor/packaging/version.py              |  151 +-
 .../pkg_resources/_vendor/pyparsing.py        |    0
 .../pkg_resources/_vendor/six.py              |    0
 .../pkg_resources/extern/__init__.py          |    0
 .../setuptools-49.6.0.dist-info}/INSTALLER    |    0
 .../setuptools-49.6.0.dist-info}/LICENSE      |    0
 .../setuptools-49.6.0.dist-info}/METADATA     |    8 +-
 .../setuptools-49.6.0.dist-info/RECORD        |  303 ++++
 .../setuptools-49.6.0.dist-info}/WHEEL        |    2 +-
 .../dependency_links.txt                      |    0
 .../entry_points.txt                          |    0
 .../top_level.txt                             |    1 +
 .../setuptools-49.6.0.dist-info}/zip-safe     |    0
 .../site-packages/setuptools/__init__.py      |   35 +-
 .../setuptools/_deprecation_warning.py        |    0
 .../setuptools/_distutils/__init__.py         |   15 +
 .../setuptools/_distutils/_msvccompiler.py    |  537 +++++++
 .../setuptools/_distutils/archive_util.py     |  256 ++++
 .../setuptools/_distutils/bcppcompiler.py     |  393 +++++
 .../setuptools/_distutils/ccompiler.py        | 1116 ++++++++++++++
 .../setuptools/_distutils/cmd.py              |  403 +++++
 .../setuptools/_distutils/command/__init__.py |   31 +
 .../setuptools/_distutils/command/bdist.py    |  143 ++
 .../_distutils/command/bdist_dumb.py          |  123 ++
 .../_distutils/command/bdist_msi.py           |  749 +++++++++
 .../_distutils/command/bdist_rpm.py           |  579 +++++++
 .../_distutils/command/bdist_wininst.py       |  377 +++++
 .../setuptools/_distutils/command/build.py    |  157 ++
 .../_distutils/command/build_clib.py          |  209 +++
 .../_distutils/command/build_ext.py           |  754 +++++++++
 .../setuptools/_distutils/command/build_py.py |  416 +++++
 .../_distutils/command/build_scripts.py       |  160 ++
 .../setuptools/_distutils/command/check.py    |  148 ++
 .../setuptools/_distutils/command/clean.py    |   76 +
 .../setuptools/_distutils/command/config.py   |  344 +++++
 .../setuptools/_distutils/command/install.py  |  677 +++++++++
 .../_distutils/command/install_data.py        |   79 +
 .../_distutils/command/install_egg_info.py    |   77 +
 .../_distutils/command/install_headers.py     |   47 +
 .../_distutils/command/install_lib.py         |  217 +++
 .../_distutils/command/install_scripts.py     |   60 +
 .../setuptools/_distutils/command/register.py |  304 ++++
 .../setuptools/_distutils/command/sdist.py    |  494 ++++++
 .../setuptools/_distutils/command/upload.py   |  214 +++
 .../setuptools/_distutils/config.py           |  130 ++
 .../setuptools/_distutils/core.py             |  234 +++
 .../setuptools/_distutils/cygwinccompiler.py  |  403 +++++
 .../setuptools/_distutils/debug.py            |    5 +
 .../setuptools/_distutils/dep_util.py         |   92 ++
 .../setuptools/_distutils/dir_util.py         |  210 +++
 .../setuptools/_distutils/dist.py             | 1257 +++++++++++++++
 .../setuptools/_distutils/errors.py           |   97 ++
 .../setuptools/_distutils/extension.py        |  240 +++
 .../setuptools/_distutils/fancy_getopt.py     |  457 ++++++
 .../setuptools/_distutils/file_util.py        |  238 +++
 .../setuptools/_distutils/filelist.py         |  327 ++++
 .../setuptools/_distutils/log.py              |   77 +
 .../setuptools/_distutils/msvc9compiler.py    |  788 ++++++++++
 .../setuptools/_distutils/msvccompiler.py     |  643 ++++++++
 .../setuptools/_distutils/spawn.py            |  125 ++
 .../setuptools/_distutils/sysconfig.py        |  573 +++++++
 .../setuptools/_distutils/text_file.py        |  286 ++++
 .../setuptools/_distutils/unixccompiler.py    |  328 ++++
 .../setuptools/_distutils/util.py             |  559 +++++++
 .../setuptools/_distutils/version.py          |  347 +++++
 .../setuptools/_distutils/versionpredicate.py |  166 ++
 .../site-packages/setuptools/_imp.py          |    0
 .../setuptools/_vendor}/__init__.py           |    0
 .../setuptools/_vendor/ordered_set.py         |    0
 .../_vendor/packaging/__about__.py            |   16 +-
 .../setuptools}/_vendor/packaging/__init__.py |   20 +-
 .../setuptools}/_vendor/packaging/_compat.py  |   16 +-
 .../_vendor/packaging/_structures.py          |   28 +-
 .../setuptools/_vendor/packaging/_typing.py   |   48 +
 .../setuptools/_vendor/packaging/markers.py   |   54 +-
 .../_vendor/packaging/requirements.py         |    9 +-
 .../_vendor/packaging/specifiers.py           |  251 ++-
 .../setuptools/_vendor/packaging/tags.py      |  751 +++++++++
 .../setuptools/_vendor/packaging/utils.py     |   65 +
 .../setuptools}/_vendor/packaging/version.py  |  290 +++-
 .../setuptools/_vendor/pyparsing.py           |    0
 .../site-packages/setuptools/_vendor/six.py   |    0
 .../site-packages/setuptools/archive_util.py  |    4 +-
 .../site-packages/setuptools/build_meta.py    |   25 +-
 .../site-packages/setuptools/cli-32.exe       |  Bin
 .../site-packages/setuptools/cli-64.exe       |  Bin
 .../site-packages/setuptools/cli.exe          |  Bin
 .../setuptools/command/__init__.py            |    0
 .../site-packages/setuptools/command/alias.py |    0
 .../setuptools/command/bdist_egg.py           |    6 +-
 .../setuptools/command/bdist_rpm.py           |    0
 .../setuptools/command/bdist_wininst.py       |    9 +
 .../setuptools/command/build_clib.py          |    0
 .../setuptools/command/build_ext.py           |    8 +-
 .../setuptools/command/build_py.py            |    0
 .../setuptools/command/develop.py             |    1 -
 .../setuptools/command/dist_info.py           |    0
 .../setuptools/command/easy_install.py        |   96 +-
 .../setuptools/command/egg_info.py            |    4 +-
 .../setuptools/command/install.py             |    0
 .../setuptools/command/install_egg_info.py    |    0
 .../setuptools/command/install_lib.py         |    0
 .../setuptools/command/install_scripts.py     |    0
 .../setuptools/command/launcher manifest.xml  |    0
 .../setuptools/command/py36compat.py          |    0
 .../setuptools/command/register.py            |    0
 .../setuptools/command/rotate.py              |    4 +-
 .../setuptools/command/saveopts.py            |    0
 .../site-packages/setuptools/command/sdist.py |    0
 .../setuptools/command/setopt.py              |    0
 .../site-packages/setuptools/command/test.py  |    0
 .../setuptools/command/upload.py              |    0
 .../setuptools/command/upload_docs.py         |    0
 .../site-packages/setuptools/config.py        |   58 +-
 .../site-packages/setuptools/dep_util.py      |    0
 .../site-packages/setuptools/depends.py       |    0
 .../site-packages/setuptools/dist.py          |   38 +-
 .../site-packages/setuptools/errors.py        |    0
 .../site-packages/setuptools/extension.py     |    0
 .../setuptools/extern/__init__.py             |    0
 .../site-packages/setuptools/glob.py          |    0
 .../site-packages/setuptools/gui-32.exe       |  Bin
 .../site-packages/setuptools/gui-64.exe       |  Bin
 .../site-packages/setuptools/gui.exe          |  Bin
 .../site-packages/setuptools/installer.py     |    2 +-
 .../site-packages/setuptools/launch.py        |    3 +-
 .../site-packages/setuptools/lib2to3_ex.py    |    9 +
 .../site-packages/setuptools/monkey.py        |    2 +-
 .../site-packages/setuptools/msvc.py          |   38 +-
 .../site-packages/setuptools/namespaces.py    |    0
 .../site-packages/setuptools/package_index.py |   14 +-
 .../site-packages/setuptools/py27compat.py    |    0
 .../site-packages/setuptools/py31compat.py    |    0
 .../site-packages/setuptools/py33compat.py    |    0
 .../site-packages/setuptools/py34compat.py    |    0
 .../site-packages/setuptools/sandbox.py       |   23 +-
 .../setuptools/script (dev).tmpl              |    0
 .../site-packages/setuptools/script.tmpl      |    0
 .../site-packages/setuptools/ssl_support.py   |    0
 .../site-packages/setuptools/unicode_utils.py |    0
 .../site-packages/setuptools/version.py       |    0
 .../site-packages/setuptools/wheel.py         |    8 +-
 .../setuptools/windows_support.py             |    0
 venv/Scripts/Activate.ps1                     |  374 +++++
 venv/{bin => Scripts}/activate                |  152 +-
 venv/Scripts/activate.bat                     |   33 +
 venv/Scripts/deactivate.bat                   |   21 +
 venv/Scripts/easy_install-3.8.exe             |  Bin 0 -> 106390 bytes
 venv/Scripts/easy_install.exe                 |  Bin 0 -> 106390 bytes
 venv/Scripts/pip.exe                          |  Bin 0 -> 106381 bytes
 venv/Scripts/pip3.8.exe                       |  Bin 0 -> 106381 bytes
 venv/Scripts/pip3.exe                         |  Bin 0 -> 106381 bytes
 venv/Scripts/python.exe                       |  Bin 0 -> 524872 bytes
 venv/Scripts/pythonw.exe                      |  Bin 0 -> 523848 bytes
 venv/bin/Activate.ps1                         |  230 ---
 venv/bin/activate.csh                         |   37 -
 venv/bin/activate.fish                        |   75 -
 venv/bin/easy_install                         |   10 -
 venv/bin/easy_install-3.8                     |   10 -
 venv/bin/miniterm.py                          |  976 ------------
 venv/bin/miniterm.pyc                         |  Bin 28907 -> 0 bytes
 venv/bin/pip                                  |   10 -
 venv/bin/pip3                                 |   10 -
 venv/bin/pip3.8                               |   10 -
 venv/bin/python                               |    1 -
 venv/bin/python3                              |    1 -
 venv/bin/python3.8                            |    1 -
 .../crcmod-1.7-py3.8.egg-info/PKG-INFO        |  157 --
 .../crcmod-1.7-py3.8.egg-info/SOURCES.txt     |   54 -
 .../dependency_links.txt                      |    1 -
 .../installed-files.txt                       |   15 -
 .../crcmod-1.7-py3.8.egg-info/top_level.txt   |    1 -
 .../site-packages/crcmod/__init__.py          |    8 -
 .../_crcfunext.cpython-38-x86_64-linux-gnu.so |  Bin 50768 -> 0 bytes
 .../site-packages/crcmod/_crcfunpy.py         |  107 --
 .../python3.8/site-packages/crcmod/crcmod.py  |  457 ------
 .../site-packages/crcmod/predefined.py        |  162 --
 .../python3.8/site-packages/crcmod/test.py    |  540 -------
 .../pip/_internal/network/utils.py            |   48 -
 .../pip/_internal/operations/install/wheel.py |  631 --------
 .../resolution/resolvelib/factory.py          |  201 ---
 .../resolution/resolvelib/provider.py         |   54 -
 .../resolution/resolvelib/resolver.py         |  174 ---
 .../site-packages/pip/_vendor/certifi/core.py |   30 -
 .../pip/_vendor/html5lib/_trie/__init__.py    |   14 -
 .../pip/_vendor/html5lib/_trie/datrie.py      |   44 -
 .../pip/_vendor/idna/package_data.py          |    2 -
 .../site-packages/pip/_vendor/toml.py         | 1039 -------------
 .../pkg_resources/_vendor/packaging/utils.py  |   14 -
 .../site-packages/pkg_resources/py2_warn.py   |   21 -
 .../site-packages/pkg_resources/py31compat.py |   23 -
 .../pyserial-3.4.dist-info/DESCRIPTION.rst    |   13 -
 .../pyserial-3.4.dist-info/METADATA           |   44 -
 .../pyserial-3.4.dist-info/RECORD             |   91 --
 .../pyserial-3.4.dist-info/WHEEL              |    6 -
 .../pyserial-3.4.dist-info/metadata.json      |    1 -
 .../pyserial-3.4.dist-info/top_level.txt      |    1 -
 .../site-packages/serial/__init__.py          |   89 --
 .../site-packages/serial/__init__.pyc         |  Bin 2322 -> 0 bytes
 .../lib/python3.8/site-packages/serial/aio.py |  115 --
 .../python3.8/site-packages/serial/aio.pyc    |  Bin 4496 -> 0 bytes
 .../python3.8/site-packages/serial/rfc2217.py | 1346 -----------------
 .../site-packages/serial/rfc2217.pyc          |  Bin 37632 -> 0 bytes
 .../python3.8/site-packages/serial/rs485.py   |   92 --
 .../python3.8/site-packages/serial/rs485.pyc  |  Bin 3266 -> 0 bytes
 .../site-packages/serial/serialcli.py         |  251 ---
 .../site-packages/serial/serialcli.pyc        |  Bin 8308 -> 0 bytes
 .../site-packages/serial/serialjava.py        |  249 ---
 .../site-packages/serial/serialjava.pyc       |  Bin 9577 -> 0 bytes
 .../site-packages/serial/serialposix.py       |  811 ----------
 .../site-packages/serial/serialposix.pyc      |  Bin 24286 -> 0 bytes
 .../site-packages/serial/serialutil.py        |  693 ---------
 .../site-packages/serial/serialutil.pyc       |  Bin 20027 -> 0 bytes
 .../site-packages/serial/serialwin32.py       |  475 ------
 .../site-packages/serial/serialwin32.pyc      |  Bin 14471 -> 0 bytes
 .../site-packages/serial/threaded/__init__.py |  295 ----
 .../site-packages/serial/tools/__init__.pyc   |  Bin 140 -> 0 bytes
 .../serial/tools/hexlify_codec.py             |  124 --
 .../serial/tools/hexlify_codec.pyc            |  Bin 4872 -> 0 bytes
 .../site-packages/serial/tools/list_ports.py  |  108 --
 .../site-packages/serial/tools/list_ports.pyc |  Bin 2815 -> 0 bytes
 .../serial/tools/list_ports_common.py         |  108 --
 .../serial/tools/list_ports_common.pyc        |  Bin 3315 -> 0 bytes
 .../serial/tools/list_ports_linux.py          |  107 --
 .../serial/tools/list_ports_linux.pyc         |  Bin 3038 -> 0 bytes
 .../serial/tools/list_ports_osx.py            |  260 ----
 .../serial/tools/list_ports_osx.pyc           |  Bin 7164 -> 0 bytes
 .../serial/tools/list_ports_posix.py          |  117 --
 .../serial/tools/list_ports_posix.pyc         |  Bin 3966 -> 0 bytes
 .../serial/tools/list_ports_windows.py        |  305 ----
 .../serial/tools/list_ports_windows.pyc       |  Bin 6912 -> 0 bytes
 .../site-packages/serial/tools/miniterm.py    |  976 ------------
 .../site-packages/serial/tools/miniterm.pyc   |  Bin 30469 -> 0 bytes
 .../serial/urlhandler/__init__.pyc            |  Bin 145 -> 0 bytes
 .../serial/urlhandler/protocol_alt.py         |   55 -
 .../serial/urlhandler/protocol_hwgrep.py      |   89 --
 .../serial/urlhandler/protocol_hwgrep.pyc     |  Bin 1627 -> 0 bytes
 .../serial/urlhandler/protocol_loop.py        |  295 ----
 .../serial/urlhandler/protocol_loop.pyc       |  Bin 9394 -> 0 bytes
 .../serial/urlhandler/protocol_rfc2217.py     |   10 -
 .../serial/urlhandler/protocol_rfc2217.pyc    |  Bin 214 -> 0 bytes
 .../urlhandler/protocol_serve-rfc2217.py      |   10 -
 .../serial/urlhandler/protocol_socket.py      |  356 -----
 .../serial/urlhandler/protocol_socket.pyc     |  Bin 9803 -> 0 bytes
 .../serial/urlhandler/protocol_spy.py         |  286 ----
 .../serial/urlhandler/protocol_spy.pyc        |  Bin 10984 -> 0 bytes
 .../python3.8/site-packages/serial/win32.py   |  354 -----
 .../python3.8/site-packages/serial/win32.pyc  |  Bin 7725 -> 0 bytes
 .../setuptools-46.1.3.dist-info/INSTALLER     |    1 -
 .../setuptools-46.1.3.dist-info/RECORD        |  196 ---
 .../setuptools/_vendor/__init__.py            |    0
 .../setuptools/_vendor/packaging/tags.py      |  404 -----
 .../site-packages/setuptools/site-patch.py    |   76 -
 venv/lib64                                    |    1 -
 venv/pyvenv.cfg                               |    6 +-
 655 files changed, 26621 insertions(+), 17054 deletions(-)
 create mode 100644 requirements.txt
 delete mode 100644 setup.py
 create mode 100644 venv/Lib/site-packages/_distutils_hack/__init__.py
 create mode 100644 venv/Lib/site-packages/_distutils_hack/override.py
 create mode 100644 venv/Lib/site-packages/distutils-precedence.pth
 rename venv/{lib/python3.8 => Lib}/site-packages/easy_install.py (100%)
 rename venv/{lib/python3.8/site-packages/pip-20.1.dist-info => Lib/site-packages/pip-20.2.2.dist-info}/INSTALLER (100%)
 rename venv/{lib/python3.8/site-packages/pip-20.1.dist-info => Lib/site-packages/pip-20.2.2.dist-info}/LICENSE.txt (100%)
 rename venv/{lib/python3.8/site-packages/pip-20.1.dist-info => Lib/site-packages/pip-20.2.2.dist-info}/METADATA (94%)
 rename venv/{lib/python3.8/site-packages/pip-20.1.dist-info => Lib/site-packages/pip-20.2.2.dist-info}/RECORD (73%)
 rename venv/{lib/python3.8/site-packages/pip-20.1.dist-info => Lib/site-packages/pip-20.2.2.dist-info}/WHEEL (100%)
 rename venv/{lib/python3.8/site-packages/pip-20.1.dist-info => Lib/site-packages/pip-20.2.2.dist-info}/entry_points.txt (100%)
 rename venv/{lib/python3.8/site-packages/pip-20.1.dist-info => Lib/site-packages/pip-20.2.2.dist-info}/top_level.txt (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/__init__.py (94%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/__main__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/build_env.py (87%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cache.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/autocompletion.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/base_command.py (86%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/cmdoptions.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/command_context.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/main.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/main_parser.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/parser.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/progress_bars.py (93%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/req_command.py (93%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/spinners.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/cli/status_codes.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/cache.py (92%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/check.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/completion.py (83%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/configuration.py (69%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/debug.py (86%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/download.py (68%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/freeze.py (90%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/hash.py (81%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/help.py (85%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/install.py (66%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/list.py (81%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/search.py (82%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/show.py (93%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/uninstall.py (90%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/commands/wheel.py (79%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/configuration.py (91%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/distributions/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/distributions/base.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/distributions/installed.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/distributions/sdist.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/distributions/wheel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/exceptions.py (79%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/index/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/index/collector.py (92%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/index/package_finder.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/locations.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/main.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/candidate.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/direct_url.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/format_control.py (86%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/index.py (91%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/link.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/scheme.py (87%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/search_scope.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/selection_prefs.py (93%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/target_python.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/models/wheel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/network/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/network/auth.py (93%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/network/cache.py (94%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/network/download.py (76%)
 create mode 100644 venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/network/session.py (100%)
 create mode 100644 venv/Lib/site-packages/pip/_internal/network/utils.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/network/xmlrpc.py (73%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/build/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/build/metadata.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/build/metadata_legacy.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/build/wheel.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/build/wheel_legacy.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/check.py (93%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/freeze.py (94%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/install/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/install/editable_legacy.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/install/legacy.py (84%)
 create mode 100644 venv/Lib/site-packages/pip/_internal/operations/install/wheel.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/operations/prepare.py (67%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/pyproject.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/req/__init__.py (54%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/req/constructors.py (90%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/req/req_file.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/req/req_install.py (91%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/req/req_set.py (94%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/req/req_tracker.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/req/req_uninstall.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/resolution/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/resolution/base.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/resolution/legacy/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/resolution/legacy/resolver.py (92%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/resolution/resolvelib/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/resolution/resolvelib/base.py (54%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/resolution/resolvelib/candidates.py (54%)
 create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py
 create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/resolution/resolvelib/requirements.py (68%)
 create mode 100644 venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/self_outdated_check.py (82%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/appdirs.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/compat.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/compatibility_tags.py (99%)
 create mode 100644 venv/Lib/site-packages/pip/_internal/utils/datetime.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/deprecation.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/direct_url_helpers.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/distutils_args.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/encoding.py (86%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/entrypoints.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/filesystem.py (84%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/filetypes.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/glibc.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/hashes.py (91%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/inject_securetransport.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/logging.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/misc.py (89%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/models.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/packaging.py (100%)
 create mode 100644 venv/Lib/site-packages/pip/_internal/utils/parallel.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/pkg_resources.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/setuptools_build.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/subprocess.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/temp_dir.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/typing.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/unpacking.py (91%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/urls.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/virtualenv.py (94%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/utils/wheel.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/vcs/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/vcs/bazaar.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/vcs/git.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/vcs/mercurial.py (90%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/vcs/subversion.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/vcs/versioncontrol.py (87%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_internal/wheel_builder.py (92%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/__init__.py (88%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/appdirs.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/_cmd.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/adapter.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/cache.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/caches/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/controller.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/filewrapper.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/heuristics.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/serialize.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/cachecontrol/wrapper.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/certifi/__init__.py (54%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/certifi/__main__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/certifi/cacert.pem (96%)
 create mode 100644 venv/Lib/site-packages/pip/_vendor/certifi/core.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/big5freq.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/big5prober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/chardistribution.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/charsetgroupprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/charsetprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/cli/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/cli/chardetect.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/codingstatemachine.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/cp949prober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/enums.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/escprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/escsm.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/eucjpprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/euckrfreq.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/euckrprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/euctwfreq.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/euctwprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/gb2312freq.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/gb2312prober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/hebrewprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/jisfreq.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/jpcntx.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/langbulgarianmodel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/langcyrillicmodel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/langgreekmodel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/langhebrewmodel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/langhungarianmodel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/langthaimodel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/langturkishmodel.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/latin1prober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/mbcharsetprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/mbcsgroupprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/mbcssm.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/sbcharsetprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/sbcsgroupprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/sjisprober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/universaldetector.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/utf8prober.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/chardet/version.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/colorama/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/colorama/ansi.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/colorama/ansitowin32.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/colorama/initialise.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/colorama/win32.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/colorama/winterm.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/contextlib2.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/__init__.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/_backport/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/_backport/misc.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/_backport/shutil.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/_backport/sysconfig.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/_backport/tarfile.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/compat.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/database.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/index.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/locators.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/manifest.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/markers.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/metadata.py (92%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/resources.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/scripts.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/t32.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/t64.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/util.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/version.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/w32.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/w64.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distlib/wheel.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/distro.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/__init__.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/_ihatexml.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/_inputstream.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/_tokenizer.py (99%)
 create mode 100644 venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/_trie/_base.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/_trie/py.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/_utils.py (75%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/constants.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/filters/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/filters/base.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/filters/lint.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/filters/optionaltags.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/filters/sanitizer.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/filters/whitespace.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/html5parser.py (85%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/serializer.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treeadapters/sax.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treebuilders/base.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treebuilders/dom.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treebuilders/etree.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py (89%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treewalkers/base.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treewalkers/dom.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treewalkers/etree.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/idna/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/idna/codec.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/idna/compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/idna/core.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/idna/idnadata.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/idna/intranges.py (100%)
 create mode 100644 venv/Lib/site-packages/pip/_vendor/idna/package_data.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/idna/uts46data.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/ipaddress.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/msgpack/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/msgpack/_version.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/msgpack/exceptions.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/msgpack/ext.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/msgpack/fallback.py (100%)
 rename venv/{lib/python3.8/site-packages/setuptools => Lib/site-packages/pip}/_vendor/packaging/__about__.py (90%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/_compat.py (92%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/_structures.py (100%)
 create mode 100644 venv/Lib/site-packages/pip/_vendor/packaging/_typing.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/markers.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/requirements.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/specifiers.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/tags.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/utils.py (83%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/packaging/version.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/_in_process.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/build.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/check.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/colorlog.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/dirtools.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/envbuild.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/meta.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pep517/wrappers.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pkg_resources/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pkg_resources/py31compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/progress/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/progress/bar.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/progress/counter.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/progress/spinner.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/pyparsing.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/__init__.py (88%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/__version__.py (90%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/_internal_utils.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/adapters.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/api.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/auth.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/certs.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/cookies.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/exceptions.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/help.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/hooks.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/models.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/packages.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/sessions.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/status_codes.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/structures.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/requests/utils.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/resolvelib/__init__.py (95%)
 rename venv/{lib/python3.8/site-packages/pip/_vendor/urllib3/contrib => Lib/site-packages/pip/_vendor/resolvelib/compat}/__init__.py (100%)
 create mode 100644 venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/resolvelib/providers.py (70%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/resolvelib/reporters.py (62%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/resolvelib/resolvers.py (90%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/resolvelib/structs.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/retrying.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/six.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/toml/__init__.py (67%)
 create mode 100644 venv/Lib/site-packages/pip/_vendor/toml/common.py
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/toml/decoder.py (87%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/toml/encoder.py (78%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/toml/ordered.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/toml/tz.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/__init__.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/_collections.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/connection.py (94%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/connectionpool.py (96%)
 rename venv/{lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport => Lib/site-packages/pip/_vendor/urllib3/contrib}/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py (100%)
 rename venv/{lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports => Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport}/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/contrib/appengine.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/contrib/securetransport.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/contrib/socks.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/exceptions.py (92%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/fields.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/filepost.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/packages/__init__.py (100%)
 rename venv/{lib/python3.8/site-packages/pkg_resources/_vendor => Lib/site-packages/pip/_vendor/urllib3/packages/backports}/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/packages/six.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/poolmanager.py (95%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/request.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/response.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/connection.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/queue.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/request.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/response.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/retry.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/ssl_.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/timeout.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/url.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/urllib3/util/wait.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/vendor.txt (58%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/webencodings/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/webencodings/labels.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/webencodings/mklabels.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/webencodings/tests.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pip/_vendor/webencodings/x_user_defined.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pkg_resources/__init__.py (97%)
 rename venv/{lib/python3.8/site-packages/serial/tools => Lib/site-packages/pkg_resources/_vendor}/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pkg_resources/_vendor/appdirs.py (100%)
 rename venv/{lib/python3.8/site-packages/pip => Lib/site-packages/pkg_resources}/_vendor/packaging/__about__.py (90%)
 rename venv/{lib/python3.8/site-packages/setuptools => Lib/site-packages/pkg_resources}/_vendor/packaging/__init__.py (100%)
 rename venv/{lib/python3.8/site-packages/setuptools => Lib/site-packages/pkg_resources}/_vendor/packaging/_compat.py (74%)
 rename venv/{lib/python3.8/site-packages/setuptools => Lib/site-packages/pkg_resources}/_vendor/packaging/_structures.py (64%)
 rename venv/{lib/python3.8/site-packages/pip => Lib/site-packages/pkg_resources}/_vendor/packaging/_typing.py (57%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pkg_resources/_vendor/packaging/markers.py (68%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pkg_resources/_vendor/packaging/requirements.py (71%)
 rename venv/{lib/python3.8/site-packages/setuptools => Lib/site-packages/pkg_resources}/_vendor/packaging/specifiers.py (81%)
 create mode 100644 venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py
 rename venv/{lib/python3.8/site-packages/setuptools => Lib/site-packages/pkg_resources}/_vendor/packaging/utils.py (75%)
 rename venv/{lib/python3.8/site-packages/setuptools => Lib/site-packages/pkg_resources}/_vendor/packaging/version.py (73%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pkg_resources/_vendor/pyparsing.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pkg_resources/_vendor/six.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/pkg_resources/extern/__init__.py (100%)
 rename venv/{lib/python3.8/site-packages/pyserial-3.4.dist-info => Lib/site-packages/setuptools-49.6.0.dist-info}/INSTALLER (100%)
 rename venv/{lib/python3.8/site-packages/setuptools-46.1.3.dist-info => Lib/site-packages/setuptools-49.6.0.dist-info}/LICENSE (100%)
 rename venv/{lib/python3.8/site-packages/setuptools-46.1.3.dist-info => Lib/site-packages/setuptools-49.6.0.dist-info}/METADATA (94%)
 create mode 100644 venv/Lib/site-packages/setuptools-49.6.0.dist-info/RECORD
 rename venv/{lib/python3.8/site-packages/setuptools-46.1.3.dist-info => Lib/site-packages/setuptools-49.6.0.dist-info}/WHEEL (65%)
 rename venv/{lib/python3.8/site-packages/setuptools-46.1.3.dist-info => Lib/site-packages/setuptools-49.6.0.dist-info}/dependency_links.txt (100%)
 rename venv/{lib/python3.8/site-packages/setuptools-46.1.3.dist-info => Lib/site-packages/setuptools-49.6.0.dist-info}/entry_points.txt (100%)
 rename venv/{lib/python3.8/site-packages/setuptools-46.1.3.dist-info => Lib/site-packages/setuptools-49.6.0.dist-info}/top_level.txt (70%)
 rename venv/{lib/python3.8/site-packages/setuptools-46.1.3.dist-info => Lib/site-packages/setuptools-49.6.0.dist-info}/zip-safe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/__init__.py (91%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/_deprecation_warning.py (100%)
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/__init__.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/archive_util.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/ccompiler.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/cmd.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/__init__.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_py.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/check.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/clean.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/config.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_data.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/register.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/sdist.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/command/upload.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/config.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/core.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/debug.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/dep_util.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/dir_util.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/dist.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/errors.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/extension.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/file_util.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/filelist.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/log.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/spawn.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/sysconfig.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/text_file.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/util.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/version.py
 create mode 100644 venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/_imp.py (100%)
 rename venv/{lib/python3.8/site-packages/serial/urlhandler => Lib/site-packages/setuptools/_vendor}/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/_vendor/ordered_set.py (100%)
 rename venv/{lib/python3.8/site-packages/pkg_resources => Lib/site-packages/setuptools}/_vendor/packaging/__about__.py (64%)
 rename venv/{lib/python3.8/site-packages/pkg_resources => Lib/site-packages/setuptools}/_vendor/packaging/__init__.py (51%)
 rename venv/{lib/python3.8/site-packages/pkg_resources => Lib/site-packages/setuptools}/_vendor/packaging/_compat.py (63%)
 rename venv/{lib/python3.8/site-packages/pkg_resources => Lib/site-packages/setuptools}/_vendor/packaging/_structures.py (64%)
 create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/_typing.py
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/_vendor/packaging/markers.py (82%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/_vendor/packaging/requirements.py (95%)
 rename venv/{lib/python3.8/site-packages/pkg_resources => Lib/site-packages/setuptools}/_vendor/packaging/specifiers.py (78%)
 create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py
 create mode 100644 venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py
 rename venv/{lib/python3.8/site-packages/pkg_resources => Lib/site-packages/setuptools}/_vendor/packaging/version.py (57%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/_vendor/pyparsing.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/_vendor/six.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/archive_util.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/build_meta.py (93%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/cli-32.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/cli-64.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/cli.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/alias.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/bdist_egg.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/bdist_rpm.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/bdist_wininst.py (69%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/build_clib.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/build_ext.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/build_py.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/develop.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/dist_info.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/easy_install.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/egg_info.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/install.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/install_egg_info.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/install_lib.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/install_scripts.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/launcher manifest.xml (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/py36compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/register.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/rotate.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/saveopts.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/sdist.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/setopt.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/test.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/upload.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/command/upload_docs.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/config.py (93%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/dep_util.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/depends.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/dist.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/errors.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/extension.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/extern/__init__.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/glob.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/gui-32.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/gui-64.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/gui.exe (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/installer.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/launch.py (92%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/lib2to3_ex.py (84%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/monkey.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/msvc.py (98%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/namespaces.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/package_index.py (99%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/py27compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/py31compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/py33compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/py34compat.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/sandbox.py (96%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/script (dev).tmpl (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/script.tmpl (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/ssl_support.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/unicode_utils.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/version.py (100%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/wheel.py (97%)
 rename venv/{lib/python3.8 => Lib}/site-packages/setuptools/windows_support.py (100%)
 create mode 100644 venv/Scripts/Activate.ps1
 rename venv/{bin => Scripts}/activate (92%)
 create mode 100644 venv/Scripts/activate.bat
 create mode 100644 venv/Scripts/deactivate.bat
 create mode 100644 venv/Scripts/easy_install-3.8.exe
 create mode 100644 venv/Scripts/easy_install.exe
 create mode 100644 venv/Scripts/pip.exe
 create mode 100644 venv/Scripts/pip3.8.exe
 create mode 100644 venv/Scripts/pip3.exe
 create mode 100644 venv/Scripts/python.exe
 create mode 100644 venv/Scripts/pythonw.exe
 delete mode 100644 venv/bin/Activate.ps1
 delete mode 100644 venv/bin/activate.csh
 delete mode 100644 venv/bin/activate.fish
 delete mode 100755 venv/bin/easy_install
 delete mode 100755 venv/bin/easy_install-3.8
 delete mode 100755 venv/bin/miniterm.py
 delete mode 100755 venv/bin/miniterm.pyc
 delete mode 100755 venv/bin/pip
 delete mode 100755 venv/bin/pip3
 delete mode 100755 venv/bin/pip3.8
 delete mode 120000 venv/bin/python
 delete mode 120000 venv/bin/python3
 delete mode 120000 venv/bin/python3.8
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/PKG-INFO
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/SOURCES.txt
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/dependency_links.txt
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/installed-files.txt
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/top_level.txt
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod/__init__.py
 delete mode 100755 venv/lib/python3.8/site-packages/crcmod/_crcfunext.cpython-38-x86_64-linux-gnu.so
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod/_crcfunpy.py
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod/crcmod.py
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod/predefined.py
 delete mode 100644 venv/lib/python3.8/site-packages/crcmod/test.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/network/utils.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/factory.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/provider.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/resolver.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_vendor/certifi/core.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__init__.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/datrie.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_vendor/idna/package_data.py
 delete mode 100644 venv/lib/python3.8/site-packages/pip/_vendor/toml.py
 delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py
 delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/py2_warn.py
 delete mode 100644 venv/lib/python3.8/site-packages/pkg_resources/py31compat.py
 delete mode 100644 venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/DESCRIPTION.rst
 delete mode 100644 venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/METADATA
 delete mode 100644 venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/RECORD
 delete mode 100644 venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/WHEEL
 delete mode 100644 venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/metadata.json
 delete mode 100644 venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/top_level.txt
 delete mode 100644 venv/lib/python3.8/site-packages/serial/__init__.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/__init__.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/aio.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/aio.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/rfc2217.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/rfc2217.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/rs485.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/rs485.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialcli.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialcli.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialjava.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialjava.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialposix.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialposix.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialutil.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialutil.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialwin32.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/serialwin32.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/threaded/__init__.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/__init__.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/hexlify_codec.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/hexlify_codec.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_common.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_common.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_linux.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_linux.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_osx.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_osx.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_posix.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_posix.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_windows.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/list_ports_windows.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/miniterm.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/tools/miniterm.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/__init__.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_alt.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_hwgrep.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_hwgrep.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_loop.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_loop.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_rfc2217.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_rfc2217.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_serve-rfc2217.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_socket.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_socket.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_spy.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/urlhandler/protocol_spy.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/serial/win32.py
 delete mode 100644 venv/lib/python3.8/site-packages/serial/win32.pyc
 delete mode 100644 venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/INSTALLER
 delete mode 100644 venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/RECORD
 delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/__init__.py
 delete mode 100644 venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py
 delete mode 100644 venv/lib/python3.8/site-packages/setuptools/site-patch.py
 delete mode 120000 venv/lib64

diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..fc5619a
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+crcmod>=1.7
+pyserial>=3.4
+PyQt5>=5.15.0
\ No newline at end of file
diff --git a/setup.py b/setup.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/_distutils_hack/__init__.py b/venv/Lib/site-packages/_distutils_hack/__init__.py
new file mode 100644
index 0000000..1e7b294
--- /dev/null
+++ b/venv/Lib/site-packages/_distutils_hack/__init__.py
@@ -0,0 +1,99 @@
+import sys
+import os
+import re
+import importlib
+import warnings
+
+
+is_pypy = '__pypy__' in sys.builtin_module_names
+
+
+def warn_distutils_present():
+    if 'distutils' not in sys.modules:
+        return
+    if is_pypy and sys.version_info < (3, 7):
+        # PyPy for 3.6 unconditionally imports distutils, so bypass the warning
+        # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
+        return
+    warnings.warn(
+        "Distutils was imported before Setuptools, but importing Setuptools "
+        "also replaces the `distutils` module in `sys.modules`. This may lead "
+        "to undesirable behaviors or errors. To avoid these issues, avoid "
+        "using distutils directly, ensure that setuptools is installed in the "
+        "traditional way (e.g. not an editable install), and/or make sure that "
+        "setuptools is always imported before distutils.")
+
+
+def clear_distutils():
+    if 'distutils' not in sys.modules:
+        return
+    warnings.warn("Setuptools is replacing distutils.")
+    mods = [name for name in sys.modules if re.match(r'distutils\b', name)]
+    for name in mods:
+        del sys.modules[name]
+
+
+def enabled():
+    """
+    Allow selection of distutils by environment variable.
+    """
+    which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib')
+    return which == 'local'
+
+
+def ensure_local_distutils():
+    clear_distutils()
+    distutils = importlib.import_module('setuptools._distutils')
+    distutils.__name__ = 'distutils'
+    sys.modules['distutils'] = distutils
+
+    # sanity check that submodules load as expected
+    core = importlib.import_module('distutils.core')
+    assert '_distutils' in core.__file__, core.__file__
+
+
+def do_override():
+    """
+    Ensure that the local copy of distutils is preferred over stdlib.
+
+    See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
+    for more motivation.
+    """
+    if enabled():
+        warn_distutils_present()
+        ensure_local_distutils()
+
+
+class DistutilsMetaFinder:
+    def find_spec(self, fullname, path, target=None):
+        if path is not None or fullname != "distutils":
+            return None
+
+        return self.get_distutils_spec()
+
+    def get_distutils_spec(self):
+        import importlib.util
+
+        class DistutilsLoader(importlib.util.abc.Loader):
+
+            def create_module(self, spec):
+                return importlib.import_module('._distutils', 'setuptools')
+
+            def exec_module(self, module):
+                pass
+
+        return importlib.util.spec_from_loader('distutils', DistutilsLoader())
+
+
+DISTUTILS_FINDER = DistutilsMetaFinder()
+
+
+def add_shim():
+    sys.meta_path.insert(0, DISTUTILS_FINDER)
+
+
+def remove_shim():
+    try:
+        sys.meta_path.remove(DISTUTILS_FINDER)
+    except ValueError:
+        pass
diff --git a/venv/Lib/site-packages/_distutils_hack/override.py b/venv/Lib/site-packages/_distutils_hack/override.py
new file mode 100644
index 0000000..2cc433a
--- /dev/null
+++ b/venv/Lib/site-packages/_distutils_hack/override.py
@@ -0,0 +1 @@
+__import__('_distutils_hack').do_override()
diff --git a/venv/Lib/site-packages/distutils-precedence.pth b/venv/Lib/site-packages/distutils-precedence.pth
new file mode 100644
index 0000000..0ef77a4
--- /dev/null
+++ b/venv/Lib/site-packages/distutils-precedence.pth
@@ -0,0 +1 @@
+import os; enabled = os.environ.get('SETUPTOOLS_USE_DISTUTILS') == 'local'; enabled and __import__('_distutils_hack').add_shim(); 
diff --git a/venv/lib/python3.8/site-packages/easy_install.py b/venv/Lib/site-packages/easy_install.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/easy_install.py
rename to venv/Lib/site-packages/easy_install.py
diff --git a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/INSTALLER b/venv/Lib/site-packages/pip-20.2.2.dist-info/INSTALLER
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip-20.1.dist-info/INSTALLER
rename to venv/Lib/site-packages/pip-20.2.2.dist-info/INSTALLER
diff --git a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/LICENSE.txt b/venv/Lib/site-packages/pip-20.2.2.dist-info/LICENSE.txt
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip-20.1.dist-info/LICENSE.txt
rename to venv/Lib/site-packages/pip-20.2.2.dist-info/LICENSE.txt
diff --git a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/METADATA b/venv/Lib/site-packages/pip-20.2.2.dist-info/METADATA
similarity index 94%
rename from venv/lib/python3.8/site-packages/pip-20.1.dist-info/METADATA
rename to venv/Lib/site-packages/pip-20.2.2.dist-info/METADATA
index 70f3e7b..959afb6 100644
--- a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/METADATA
+++ b/venv/Lib/site-packages/pip-20.2.2.dist-info/METADATA
@@ -1,13 +1,14 @@
 Metadata-Version: 2.1
 Name: pip
-Version: 20.1
+Version: 20.2.2
 Summary: The PyPA recommended tool for installing Python packages.
 Home-page: https://pip.pypa.io/
 Author: The pip developers
-Author-email: pypa-dev@groups.google.com
+Author-email: distutils-sig@python.org
 License: MIT
 Project-URL: Documentation, https://pip.pypa.io
 Project-URL: Source, https://github.com/pypa/pip
+Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
 Keywords: distutils easy_install egg setuptools wheel virtualenv
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
@@ -79,7 +80,7 @@ rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.
 .. _learn more and take our survey: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
 .. _Issue tracking: https://github.com/pypa/pip/issues
 .. _Discourse channel: https://discuss.python.org/c/packaging
-.. _Development mailing list: https://groups.google.com/forum/#!forum/pypa-dev
+.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
 .. _User IRC: https://webchat.freenode.net/?channels=%23pypa
 .. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
 .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
diff --git a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/RECORD b/venv/Lib/site-packages/pip-20.2.2.dist-info/RECORD
similarity index 73%
rename from venv/lib/python3.8/site-packages/pip-20.1.dist-info/RECORD
rename to venv/Lib/site-packages/pip-20.2.2.dist-info/RECORD
index 594970c..f9d4d4d 100644
--- a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/RECORD
+++ b/venv/Lib/site-packages/pip-20.2.2.dist-info/RECORD
@@ -1,14 +1,14 @@
-../../../bin/pip,sha256=nvpG7UjjKgW9F1iP1camR7XCan8t36ZP22ftacbaijA,269
-../../../bin/pip3,sha256=nvpG7UjjKgW9F1iP1camR7XCan8t36ZP22ftacbaijA,269
-../../../bin/pip3.8,sha256=nvpG7UjjKgW9F1iP1camR7XCan8t36ZP22ftacbaijA,269
-pip-20.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pip-20.1.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090
-pip-20.1.dist-info/METADATA,sha256=MHetfxZEN-9nAomwHGG2qZqmg0r3siOYh-HWiN3g5UQ,3632
-pip-20.1.dist-info/RECORD,,
-pip-20.1.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
-pip-20.1.dist-info/entry_points.txt,sha256=HtfDOwpUlr9s73jqLQ6wF9V0_0qvUXJwCBz7Vwx0Ue0,125
-pip-20.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pip/__init__.py,sha256=8yOe6Pjl-IQGcJKDu84FV_9r3OiNCvcM8kzKINsOfv8,453
+../../Scripts/pip.exe,sha256=JRDdBJ6EvUNuOm_vTxJLlqPhBMoqURI27-_rf-xmXXY,106381
+../../Scripts/pip3.8.exe,sha256=JRDdBJ6EvUNuOm_vTxJLlqPhBMoqURI27-_rf-xmXXY,106381
+../../Scripts/pip3.exe,sha256=JRDdBJ6EvUNuOm_vTxJLlqPhBMoqURI27-_rf-xmXXY,106381
+pip-20.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pip-20.2.2.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090
+pip-20.2.2.dist-info/METADATA,sha256=ZMrQjU30hfRVRViE4qoVrwZzDSRyGCT8OdkDkkTMBv8,3708
+pip-20.2.2.dist-info/RECORD,,
+pip-20.2.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
+pip-20.2.2.dist-info/entry_points.txt,sha256=HtfDOwpUlr9s73jqLQ6wF9V0_0qvUXJwCBz7Vwx0Ue0,125
+pip-20.2.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pip/__init__.py,sha256=fZ401OZGdv55YGsuCEhsvdNa4YCZLmK457SN3qrstJk,455
 pip/__main__.py,sha256=bqCAM1cj1HwHCDx3WJa-LJxOBXimGxE8OjBqAvnhVg0,911
 pip/__pycache__/__init__.cpython-38.pyc,,
 pip/__pycache__/__main__.cpython-38.pyc,,
@@ -23,8 +23,8 @@ pip/_internal/__pycache__/main.cpython-38.pyc,,
 pip/_internal/__pycache__/pyproject.cpython-38.pyc,,
 pip/_internal/__pycache__/self_outdated_check.cpython-38.pyc,,
 pip/_internal/__pycache__/wheel_builder.cpython-38.pyc,,
-pip/_internal/build_env.py,sha256=2P0xaKpDhEfrA5P7cXnbx9QpL52Hc1Uturp8EIcjGRg,7506
-pip/_internal/cache.py,sha256=aXPdcihRKQVH26jl1cxSKTmTnV0_hNMs7cGADMUFi1Y,12334
+pip/_internal/build_env.py,sha256=9_UaQ2fpsBvpKAji27f7bPAi2v3mb0cBvDYcejwFKNM,8088
+pip/_internal/cache.py,sha256=pT17VVxgzZK32aqY5FRS8GyAI73LKzNMF8ZelQ7Ojm0,12249
 pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
 pip/_internal/cli/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc,,
@@ -39,14 +39,14 @@ pip/_internal/cli/__pycache__/req_command.cpython-38.pyc,,
 pip/_internal/cli/__pycache__/spinners.cpython-38.pyc,,
 pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc,,
 pip/_internal/cli/autocompletion.py,sha256=ekGNtcDI0p7rFVc-7s4T9Tbss4Jgb7vsB649XJIblRg,6547
-pip/_internal/cli/base_command.py,sha256=O5fT5HHfc_UYNvhqK0rjfh_13K3fIVQzcKUF4xKbFts,8024
-pip/_internal/cli/cmdoptions.py,sha256=SjHNqaQ49FO0VKshjoazPVFb7iDx71FKW_N4KgcS3qQ,28403
+pip/_internal/cli/base_command.py,sha256=BWTztM4b6h8hodDHDKjgJ82jaSeru2AILAJxi1d_IP8,8810
+pip/_internal/cli/cmdoptions.py,sha256=M_BtuqeyRpZAUUYytts3pguBCF2RaGukVpDPE0niroI,28782
 pip/_internal/cli/command_context.py,sha256=ygMVoTy2jpNilKT-6416gFSQpaBtrKRBbVbi2fy__EU,975
 pip/_internal/cli/main.py,sha256=Hxc9dZyW3xiDsYZX-_J2cGXT5DWNLNn_Y7o9oUme-Ec,2616
 pip/_internal/cli/main_parser.py,sha256=voAtjo4WVPIYeu7Fqabva9SXaB3BjG0gH93GBfe6jHQ,2843
 pip/_internal/cli/parser.py,sha256=4FfwW8xB84CrkLs35ud90ZkhCcWyVkx17XD6j3XCW7c,9480
-pip/_internal/cli/progress_bars.py,sha256=WtKOHkePvHwnlhDUotAmKpjBH6hBdVTOnxSiiuCC2l8,9031
-pip/_internal/cli/req_command.py,sha256=NajtG3IfB3YkiM7LANLttyJTfPtgB-3CTErY0YR0k50,15309
+pip/_internal/cli/progress_bars.py,sha256=J1zykt2LI4gbBeXorfYRmYV5FgXhcW4x3r6xE_a7Z7c,9121
+pip/_internal/cli/req_command.py,sha256=Eiz8TVzeqzG-40t7qLC1vO-vzjCRvX9C-qXMyfw9D1I,15132
 pip/_internal/cli/spinners.py,sha256=PS9s53LB5aDPelIn8FhKerK3bOdgeefFH5wSWJ2PCzI,5509
 pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156
 pip/_internal/commands/__init__.py,sha256=yoLAnmEXjoQgYfDuwsuWG3RzzD19oeHobGEhmpIYsB4,4100
@@ -66,22 +66,22 @@ pip/_internal/commands/__pycache__/search.cpython-38.pyc,,
 pip/_internal/commands/__pycache__/show.cpython-38.pyc,,
 pip/_internal/commands/__pycache__/uninstall.cpython-38.pyc,,
 pip/_internal/commands/__pycache__/wheel.cpython-38.pyc,,
-pip/_internal/commands/cache.py,sha256=LZCLVEYCr5Ugh81Zt07Hz5v6SIt0QQzr2-npj3M44aE,5676
+pip/_internal/commands/cache.py,sha256=U3rLjls0AMMO8PxnhXVwIp7Biyvns8-gBThKTH3tX7Y,5676
 pip/_internal/commands/check.py,sha256=fqRrz2uKPC8Qsx2rgLygAD2Rbr-qxp1Q55zUoyZzB9Q,1677
-pip/_internal/commands/completion.py,sha256=BoEW3RZQZhsZe5to1aOe245dcBLkf-PTCJL7_u9A-Es,2957
-pip/_internal/commands/configuration.py,sha256=y74Vl2p41dBOE2NwUzW4YqnbGbl9r0lsCyBlHguDAWA,7206
-pip/_internal/commands/debug.py,sha256=3YkY_M-h1tfpEzat4agulzAk17MU93Qt7ehy_Gi2l6Q,7275
-pip/_internal/commands/download.py,sha256=thDfHi0qY6DQ_1GkYPTutwta3tA0RaHJhKycepC4FgA,4740
-pip/_internal/commands/freeze.py,sha256=LveCd11SlrZ7s3RovnWpaK0tXB2Jci4DPcP6A9cj0e4,3342
-pip/_internal/commands/hash.py,sha256=KckEd5FeomfsRgZmRzhJRPYSsz-HXbFZGNdrzp12ftQ,1742
-pip/_internal/commands/help.py,sha256=s8bDMJbRVxs9ehLKuD4mXTsv1bTRapy1jDwaTCE90qw,1193
-pip/_internal/commands/install.py,sha256=1oXXadnvHM-55XWIdeqdaR75BjLPGC2-wXEkkhMyMtQ,25430
-pip/_internal/commands/list.py,sha256=IFAuSxf6TYhRW9WuKY5uai1P7ERt6gFpDmAVHAzmaUE,10511
-pip/_internal/commands/search.py,sha256=KjAz-s9mwkiLfDd-cpQO3pL6KFoOyl1RKlvxnJj3zz8,5191
-pip/_internal/commands/show.py,sha256=RqSX_KvzcZWz1gxIOZEnnk4-VeSkNvr0yWz5jF6JrcY,6791
-pip/_internal/commands/uninstall.py,sha256=D2Otze7J-RJvjfozRq2Yon9NKJrg4cbBGFuXyEwBMR0,3202
-pip/_internal/commands/wheel.py,sha256=oxyo51V1m_Hu4U-HCS53vBx5-82Q6GOhn1doOgAr3KE,6431
-pip/_internal/configuration.py,sha256=k3Y3HMMMm_fzNqX75QoNuHvjX8tplmNBuIJJpDHmf9M,14349
+pip/_internal/commands/completion.py,sha256=ObssM77quf61qvbuSE6XLwUBdm_WcWIvXFI-Hy1RBsI,3081
+pip/_internal/commands/configuration.py,sha256=IN2QBF653sRiRU7-pHTpnZ6_gyiXNKUQkLiLaNRLKNw,9344
+pip/_internal/commands/debug.py,sha256=otBZnpnostX2kmYyOl6g6CeCLmk6H00Tsj2CDsCtFXw,7314
+pip/_internal/commands/download.py,sha256=EKFlj_ceGUEJj6yCDw7P6w7yUoB16IcNHhT2qnCFDNQ,4918
+pip/_internal/commands/freeze.py,sha256=vLBBP1d8wgEXrmlh06hbz_x_Q1mWHUdiWDa9NP2eKLE,3452
+pip/_internal/commands/hash.py,sha256=v2nYCiEsEI9nEam1p6GwdG8xyj5gFv-4WrqvNexKmeY,1843
+pip/_internal/commands/help.py,sha256=ryuMDt2tc7ic3NJYMjjoNRH5r6LrB2yQVZvehAm8bLs,1270
+pip/_internal/commands/install.py,sha256=h2L8vS6t2DbGAdttkdZmMucK2eJG2CYvcwhDa7AdKrQ,28683
+pip/_internal/commands/list.py,sha256=2o3rYw37ECrhe4-Bu5s_2C0bwhYgghh4833MxcWAEug,11312
+pip/_internal/commands/search.py,sha256=1HPAFU-tmgKrHhr4xNuk3xMoPeSzD_oDvDDiUFZZ15E,5756
+pip/_internal/commands/show.py,sha256=r69-G8HIepDKm4SeyeHj0Ez1P9xoihrpVUyXm6NmXYY,6996
+pip/_internal/commands/uninstall.py,sha256=Ys8hwFsg0kvvGtLGYG3ibL5BKvURhlSlCX50ZQ-hsHk,3311
+pip/_internal/commands/wheel.py,sha256=-HSISE5AV29I752Aqw4DdmulrGd8rB_ZTOdpbJ6T8iM,6419
+pip/_internal/configuration.py,sha256=-Gxz2J-KuvxiqWIJ9F-XnYVZ5lKhNk7VO6ondEbH4EM,14115
 pip/_internal/distributions/__init__.py,sha256=ECBUW5Gtu9TjJwyFLvim-i6kUMYVuikNh9I5asL6tbA,959
 pip/_internal/distributions/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/distributions/__pycache__/base.cpython-38.pyc,,
@@ -92,14 +92,14 @@ pip/_internal/distributions/base.py,sha256=ruprpM_L2T2HNi3KLUHlbHimZ1sWVw-3Q0Lb8
 pip/_internal/distributions/installed.py,sha256=YqlkBKr6TVP1MAYS6SG8ojud21wVOYLMZ8jMLJe9MSU,760
 pip/_internal/distributions/sdist.py,sha256=D4XTMlCwgPlK69l62GLYkNSVTVe99fR5iAcVt2EbGok,4086
 pip/_internal/distributions/wheel.py,sha256=95uD-TfaYoq3KiKBdzk9YMN4RRqJ28LNoSTS2K46gek,1294
-pip/_internal/exceptions.py,sha256=B3tSkzheqSfGoGt5OcAOhLhfnWWMzfJ60URvZWwkwHw,10308
+pip/_internal/exceptions.py,sha256=ZVpArxQrSlm4qAMtHaY3nHvG_t5eSi3WCnMowdm_m8I,12637
 pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
 pip/_internal/index/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/index/__pycache__/collector.cpython-38.pyc,,
 pip/_internal/index/__pycache__/package_finder.cpython-38.pyc,,
-pip/_internal/index/collector.py,sha256=tFpQdkBlbNzdwlep7a5_o9unymgWuEmo2WtARsagiao,21547
-pip/_internal/index/package_finder.py,sha256=2Uq4RPSRboyRPj1Zp3-SB8ZFNLAEMrZv6G2yH-wVjIA,37676
-pip/_internal/locations.py,sha256=VifFEqhc7FWFV8QGoEM3CpECRY8Doq7kTytytxsEgx0,6734
+pip/_internal/index/collector.py,sha256=rMdGdAABOrvIl0DYlCMWXr7mIoqrU2VGeQpCuWiPu1Q,22838
+pip/_internal/index/package_finder.py,sha256=ISieDd20dOSndMNybafCu3pO2JR3BKOfHv92Bes0j0Q,37364
+pip/_internal/locations.py,sha256=7YjzJy2CroQD8GBMemnHWRl9448BSIt0lfH98B-Dkd8,6732
 pip/_internal/main.py,sha256=IVBnUQ-FG7DK6617uEXRB5_QJqspAsBFmTmTesYkbdQ,437
 pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
 pip/_internal/models/__pycache__/__init__.cpython-38.pyc,,
@@ -113,30 +113,32 @@ pip/_internal/models/__pycache__/search_scope.cpython-38.pyc,,
 pip/_internal/models/__pycache__/selection_prefs.cpython-38.pyc,,
 pip/_internal/models/__pycache__/target_python.cpython-38.pyc,,
 pip/_internal/models/__pycache__/wheel.cpython-38.pyc,,
-pip/_internal/models/candidate.py,sha256=Y58Bcm6oXUj0iS-yhmerlGo5CQJI2p0Ww9h6hR9zQDw,1150
+pip/_internal/models/candidate.py,sha256=gACeCSHTIaWuB6RAeLmGJnbFFbKfp_47UERDoC_ldOU,1195
 pip/_internal/models/direct_url.py,sha256=MnBLPci1hE9Ndh6d3m0LAqB7hX3ci80CCJTE5eerFaQ,6900
-pip/_internal/models/format_control.py,sha256=ICzVjjGwfZYdX-eLLKHjMHLutEJlAGpfj09OG_eMqac,2673
-pip/_internal/models/index.py,sha256=K59A8-hVhBM20Xkahr4dTwP7OjkJyEqXH11UwHFVgqM,1060
-pip/_internal/models/link.py,sha256=KobEaGViwOzyPBD7kgzpGqyrQfh5zjlonOStCGAhl2U,7302
-pip/_internal/models/scheme.py,sha256=vvhBrrno7eVDXcdKHiZWwxhPHf4VG5uSCEkC0QDR2RU,679
-pip/_internal/models/search_scope.py,sha256=AYbFyfEen5cx0kRZTMgUWUxzcMr5nDk32MO4S67Ror4,4712
-pip/_internal/models/selection_prefs.py,sha256=rPeif2KKjhTPXeMoQYffjqh10oWpXhdkxRDaPT1HO8k,1908
-pip/_internal/models/target_python.py,sha256=bbOSwPmojPMtCW6i2XMNjVJzt_2GQYfx3FcGQY8pL44,3842
+pip/_internal/models/format_control.py,sha256=RdnnmXxVJppCZWzWEmFTr-zD_m3G0izPLqJi6Iop75M,2823
+pip/_internal/models/index.py,sha256=carvxxaT7mJyoEkptaECHUZiNaA6R5NrsGF55zawNn8,1161
+pip/_internal/models/link.py,sha256=FMlxvqKmLoj7xTQSgKqfO2ehE1WcgD4C5DmEBuC_Qos,7470
+pip/_internal/models/scheme.py,sha256=EhPkT_6G0Md84JTLSVopYsp5H_K6BREYmFvU8H6wMK8,778
+pip/_internal/models/search_scope.py,sha256=Lum0mY4_pdR9DDBy6HV5xHGIMPp_kU8vMsqYKFHZip4,4751
+pip/_internal/models/selection_prefs.py,sha256=pgNjTfgePPiX1R5S2S8Yc6odOfU9NzG7YP_m_gnS0kw,2044
+pip/_internal/models/target_python.py,sha256=R7tAXI15B_cgw7Fgnq5cI9F-44goUZncH9JMtE8pXRw,4034
 pip/_internal/models/wheel.py,sha256=FTfzVb4WIbfIehxhdlAVvCil_MQ0-W44oyN56cE6NHc,2772
 pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
 pip/_internal/network/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/network/__pycache__/auth.cpython-38.pyc,,
 pip/_internal/network/__pycache__/cache.cpython-38.pyc,,
 pip/_internal/network/__pycache__/download.cpython-38.pyc,,
+pip/_internal/network/__pycache__/lazy_wheel.cpython-38.pyc,,
 pip/_internal/network/__pycache__/session.cpython-38.pyc,,
 pip/_internal/network/__pycache__/utils.cpython-38.pyc,,
 pip/_internal/network/__pycache__/xmlrpc.cpython-38.pyc,,
-pip/_internal/network/auth.py,sha256=HJg5peC3gL44H7pmZhCPnu2MrwpAalOSF7d1jmNDqt8,11125
-pip/_internal/network/cache.py,sha256=51CExcRkXWrgMZ7WsrZ6cmijKfViD5tVgKbBvJHO1IE,2394
-pip/_internal/network/download.py,sha256=MIisedL1oFOSrYAN119HDlIuFfw6eL6CNY7oJhHIzUc,6269
+pip/_internal/network/auth.py,sha256=dt3NvTRJ8182S3VpdYFEZMPT0JhOKHyFtR-O-JMlJII,11652
+pip/_internal/network/cache.py,sha256=6cCD7XNrqh1d1lOSY5U-0ZXOG1YwEgMYs-VhRZVyzMA,2329
+pip/_internal/network/download.py,sha256=VTGDO01_nX-5MCdatd4Icv0F88_M8N3WnW6BevA6a0o,5151
+pip/_internal/network/lazy_wheel.py,sha256=RXcQILT5v5UO6kxgv76CSncLTqRL29o-OXbaW2aK7t4,8138
 pip/_internal/network/session.py,sha256=Zs0uiyPxTpfpgSv-ZI9hK9TjasmTplBuBivOTcUiJME,15208
-pip/_internal/network/utils.py,sha256=iiixo1OeaQ3niUWiBjg59PN6f1w7vvTww1vFriTD_IU,1959
-pip/_internal/network/xmlrpc.py,sha256=AL115M3vFJ8xiHVJneb8Hi0ZFeRvdPhblC89w25OG5s,1597
+pip/_internal/network/utils.py,sha256=ZPHg7u6DEcg2EvILIdPECnvPLp21OPHxNVmeXfMy-n0,4172
+pip/_internal/network/xmlrpc.py,sha256=PFCiX_nnwYxC8SFIf7J3trP40ECGjA6fl2-IVNhbkPM,1882
 pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_internal/operations/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/operations/__pycache__/check.cpython-38.pyc,,
@@ -148,23 +150,23 @@ pip/_internal/operations/build/__pycache__/metadata.cpython-38.pyc,,
 pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-38.pyc,,
 pip/_internal/operations/build/__pycache__/wheel.cpython-38.pyc,,
 pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-38.pyc,,
-pip/_internal/operations/build/metadata.py,sha256=yHMi5gHYXcXyHcvUPWHdO-UyOo3McFWljn_nHfM1O9c,1307
+pip/_internal/operations/build/metadata.py,sha256=2aILgWCQTF1aIhWuCH8TTSjv_kYmA3x1262fT2FQ6pQ,1254
 pip/_internal/operations/build/metadata_legacy.py,sha256=VgzBTk8naIO8-8N_ifEYF7ZAxWUDhphWVIaVlZ2FqYM,2011
-pip/_internal/operations/build/wheel.py,sha256=ntltdNP6D2Tpr4V0agssu6rE0F9LaBpJkYT6zSdhEbw,1469
+pip/_internal/operations/build/wheel.py,sha256=33vdkxTO-gNqrtWH1eNL_uZo4Irax85moDx2o9zae3M,1465
 pip/_internal/operations/build/wheel_legacy.py,sha256=N1aqNZyGURBX0Bj6wPmB0t4866oMbxoHUpC9pz6FyT0,3356
-pip/_internal/operations/check.py,sha256=a6uHG0daoWpmSPCdL7iYJaGQYZ-CRvPvTnCv2PnIIs0,5353
-pip/_internal/operations/freeze.py,sha256=mGT2OFjMOb0FlVjgedAzJ9GbNOgNwYiL0130xx60pHA,10587
+pip/_internal/operations/check.py,sha256=JYDsVLvpFyJuJq0ttStgg8TRKbc0myYFAMnfnnQOREM,5215
+pip/_internal/operations/freeze.py,sha256=_vJSZwHBNzBV0GpRUSXhUJz3BrGFdcT2aTcWxH1L4P0,10373
 pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
 pip/_internal/operations/install/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/operations/install/__pycache__/editable_legacy.cpython-38.pyc,,
 pip/_internal/operations/install/__pycache__/legacy.cpython-38.pyc,,
 pip/_internal/operations/install/__pycache__/wheel.cpython-38.pyc,,
 pip/_internal/operations/install/editable_legacy.py,sha256=rJ_xs2qtDUjpY2-n6eYlVyZiNoKbOtZXZrYrcnIELt4,1488
-pip/_internal/operations/install/legacy.py,sha256=YkKdL_tyNwDP2huOGxmopySh5Pz2v_wRVeSTEa6ZUco,4686
-pip/_internal/operations/install/wheel.py,sha256=XZ574AfGou1Kv_X0BPU4i3huX2MUmsGIkkj3qF94fxA,23884
-pip/_internal/operations/prepare.py,sha256=mmPpSeBjnxgoj4q7_k0FqSljy1AF6Z5ajcLSAAF-YS4,17957
+pip/_internal/operations/install/legacy.py,sha256=zu3Gw54dgHtluyW5n8j5qKcAScidQXJvqB8fb0oLB-4,4281
+pip/_internal/operations/install/wheel.py,sha256=nJmOSOYY3keksXd_3GFuhAWeeoKvGOyoSGbjXABjZ40,31310
+pip/_internal/operations/prepare.py,sha256=Rt7Yh7w10_Q-vI3b7R1wkt2R6XPX8YVUdODk-TaGI9c,19903
 pip/_internal/pyproject.py,sha256=VJKsrXORGiGoDPVKCQhuu4tWlQSTOhoiRlVLRNu4rx4,7400
-pip/_internal/req/__init__.py,sha256=UVaYPlHZVGRBQQPjvGC_6jJDQtewXm0ws-8Lxhg_TiY,2671
+pip/_internal/req/__init__.py,sha256=s-E5Vxxqqpcs7xfY5gY69oHogsWJ4sLbnUiDoWmkHOU,3133
 pip/_internal/req/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/req/__pycache__/constructors.cpython-38.pyc,,
 pip/_internal/req/__pycache__/req_file.cpython-38.pyc,,
@@ -172,12 +174,12 @@ pip/_internal/req/__pycache__/req_install.cpython-38.pyc,,
 pip/_internal/req/__pycache__/req_set.cpython-38.pyc,,
 pip/_internal/req/__pycache__/req_tracker.cpython-38.pyc,,
 pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc,,
-pip/_internal/req/constructors.py,sha256=i_dU2sYtSk5GMsad68gBx26tfneRmhPF2sYGe4uPnu8,15441
-pip/_internal/req/req_file.py,sha256=5QlZr36kkw1Jsbr8vFO-fGUEAef9h-AoRRqjx8EYSuQ,19075
-pip/_internal/req/req_install.py,sha256=9yn_fBFTyzHPMjYG5WXBB2WiGQvk3BT6gYl9Khw8ZoE,31713
-pip/_internal/req/req_set.py,sha256=EBHZ9zWSR8arxjcadyU2OotZIECemM8oOFQ0nK-Bb7E,7792
-pip/_internal/req/req_tracker.py,sha256=cAKhSw-QbhGxqPF1Wc0zD6jo932jpdYF3ROfRSH8hes,4744
-pip/_internal/req/req_uninstall.py,sha256=NdErRQBpNScsdwJAo3O_zo2KPPfQyVMJ_Q2mxPWYyOA,23734
+pip/_internal/req/constructors.py,sha256=LrSHbRHu52-h6HM1qJKG68o1Jw5q8MvJGfr4As6j2uU,16387
+pip/_internal/req/req_file.py,sha256=p7n3Y0q275Eisqfxd0vtfnxYvlT6TCCY0tj75p-yiOY,19448
+pip/_internal/req/req_install.py,sha256=hqQMm6s7f1a2RAGasyAhy47eZGom3OBKeiRM60xxdPg,33080
+pip/_internal/req/req_set.py,sha256=dxcfbieWYfYkTJNE07U8xaO40zLxl8BhWOcIHVFTmoo,7886
+pip/_internal/req/req_tracker.py,sha256=qWaiejNK6o6cqeyTOIGKIU1CoyrXCcqgMHYi3cqelOA,4690
+pip/_internal/req/req_uninstall.py,sha256=opMGDGb7ZaFippRbaarJaljtzl2CNZmBGEUSnTubE-A,23706
 pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_internal/resolution/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/resolution/__pycache__/base.cpython-38.pyc,,
@@ -185,7 +187,7 @@ pip/_internal/resolution/base.py,sha256=xi72YmIS-lEjyK13PN_3qkGGthA4yGoK0C6qWyny
 pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_internal/resolution/legacy/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/resolution/legacy/__pycache__/resolver.cpython-38.pyc,,
-pip/_internal/resolution/legacy/resolver.py,sha256=56GuGHWcseV24cvTCOuRHMAF_Er1UeDxn5m18XMkHBs,17587
+pip/_internal/resolution/legacy/resolver.py,sha256=d-qW6UUxbZqKyXmX2bqnW5C8UtnO0ZcsQuKw_QXualc,18755
 pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/resolution/resolvelib/__pycache__/base.cpython-38.pyc,,
@@ -194,18 +196,19 @@ pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-38.pyc,,
 pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-38.pyc,,
 pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-38.pyc,,
 pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-38.pyc,,
-pip/_internal/resolution/resolvelib/base.py,sha256=l2Z3-1Qg243lWzwFbaN17qixA4U8LYr-qMhZTdaHROc,1502
-pip/_internal/resolution/resolvelib/candidates.py,sha256=wzi9t3aX1Twi3xTNEkpG6eWOd0dEg5uKul-QkK3arvw,15173
-pip/_internal/resolution/resolvelib/factory.py,sha256=mDs3p8D9N9zfYvn_iIx0saDLHF1SF7KHBQlA1gWSWVQ,7574
-pip/_internal/resolution/resolvelib/provider.py,sha256=0fKuPuEoD5T7w-YwKgQZc1AmgSnAkrxGnLBOf-_6Kiw,1703
-pip/_internal/resolution/resolvelib/requirements.py,sha256=bu9Y4YINHjvBm-NBKvnxw9IYHW4t6rRlm4-QKVqLDsM,3872
-pip/_internal/resolution/resolvelib/resolver.py,sha256=3LXhhCz6CtIpih8tK2nHeRvVEjVJmXrqxNCM1FQM1U0,6673
-pip/_internal/self_outdated_check.py,sha256=3KO1pTJUuYaiV9X0t87I9PimkGL82HbhLWbocqKZpBU,8009
+pip/_internal/resolution/resolvelib/base.py,sha256=n8Rilea9jCzhlbtFiJKwCwIQSPW0ATjEKsCc0Vpm894,2342
+pip/_internal/resolution/resolvelib/candidates.py,sha256=RHo9r9g25FWzufKv93Ti9nS4hvAPUrhAjSDL7GCZFNQ,20339
+pip/_internal/resolution/resolvelib/factory.py,sha256=--ahYsr-r9zIhdyJJ1ZuETgaQrWiPIqwILWiMDn1IIU,17169
+pip/_internal/resolution/resolvelib/provider.py,sha256=BP8nh07Z1FlcT-Iaw4FblRM-DjUeUkiItKdKARYeM6M,6134
+pip/_internal/resolution/resolvelib/requirements.py,sha256=lGvoHRhkusRfaz4cFxYBoQNqxS6TeuO3K68qlui6g-0,4511
+pip/_internal/resolution/resolvelib/resolver.py,sha256=kI8g0NVlYIsDMRmDplWQdox6WO-0H7CI2wN-1ixnaew,10149
+pip/_internal/self_outdated_check.py,sha256=q6_nqUHPpt-DScwD97h7FCSqd4nI1s-xkpOI4I5Za3Y,6779
 pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_internal/utils/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/compat.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/compatibility_tags.cpython-38.pyc,,
+pip/_internal/utils/__pycache__/datetime.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/direct_url_helpers.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/distutils_args.cpython-38.pyc,,
@@ -220,6 +223,7 @@ pip/_internal/utils/__pycache__/logging.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/misc.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/models.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/packaging.cpython-38.pyc,,
+pip/_internal/utils/__pycache__/parallel.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/pkg_resources.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/subprocess.cpython-38.pyc,,
@@ -230,31 +234,33 @@ pip/_internal/utils/__pycache__/urls.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/virtualenv.cpython-38.pyc,,
 pip/_internal/utils/__pycache__/wheel.cpython-38.pyc,,
 pip/_internal/utils/appdirs.py,sha256=RZzUG-Bkh2b-miX0DSZ3v703_-bgK-v0PfWCCjwVE9g,1349
-pip/_internal/utils/compat.py,sha256=ZRJsXMjq373p0US54CUkKRkpLH-ioOM3H3yAhmbUPcs,8898
-pip/_internal/utils/compatibility_tags.py,sha256=b2NWEbxfsrB2pBLwJkNVSYUrIAsumQ2IWDoNabbwLPs,5492
+pip/_internal/utils/compat.py,sha256=GoCSUMoUmTGeg5irQGLDZ7v12As87yHrMzBXEke-njg,8865
+pip/_internal/utils/compatibility_tags.py,sha256=EtBJj-pstj_U0STUZ8FjlG7YDTjuRZUy6GY1cM86yv8,5439
+pip/_internal/utils/datetime.py,sha256=KL-vIdGU9JIpGB5NYkmwXWkH-G_2mvvABlmRtoSZsao,295
 pip/_internal/utils/deprecation.py,sha256=pBnNogoA4UGTxa_JDnPXBRRYpKMbExAhXpBwAwklOBs,3318
 pip/_internal/utils/direct_url_helpers.py,sha256=bZCBNwPQVyZpYGjX_VcomvVvRHvKw-9JzEV-Ft09LQc,4359
 pip/_internal/utils/distutils_args.py,sha256=a56mblNxk9BGifbpEETG61mmBrqhjtjRkJ4HYn-oOEE,1350
-pip/_internal/utils/encoding.py,sha256=hxZz0t3Whw3d4MHQEiofxalTlfKwxFdLc8fpeGfhKo8,1320
+pip/_internal/utils/encoding.py,sha256=wHDJ25yCT_T4ySscCL3P978OpLrfDCpitg8D64IEXMY,1284
 pip/_internal/utils/entrypoints.py,sha256=vHcNpnksCv6mllihU6hfifdsKPEjwcaJ1aLIXEaynaU,1152
-pip/_internal/utils/filesystem.py,sha256=me1ZZUSutr77-SInNrhRvHYMugzm2cffA2nMHy1lOzM,5948
+pip/_internal/utils/filesystem.py,sha256=-fU3XteCAIJwf_9FvCZU7vhywvt3nuf_cqkCdwgy1Y8,6943
 pip/_internal/utils/filetypes.py,sha256=R2FwzoeX7b-rZALOXx5cuO8VPPMhUQ4ne7wm3n3IcWA,571
 pip/_internal/utils/glibc.py,sha256=LOeNGgawCKS-4ke9fii78fwXD73dtNav3uxz1Bf-Ab8,3297
-pip/_internal/utils/hashes.py,sha256=LQVOt2LTWAdBJH6WPim1YGdF0J-0AfBBLghIDlY1-80,3986
+pip/_internal/utils/hashes.py,sha256=xHmrqNwC1eBN0oY0R_RXLJLXGvFdo5gwmbz_pas94k8,4358
 pip/_internal/utils/inject_securetransport.py,sha256=M17ZlFVY66ApgeASVjKKLKNz0LAfk-SyU0HZ4ZB6MmI,810
 pip/_internal/utils/logging.py,sha256=YIfuDUEkmdn9cIRQ_Ec8rgXs1m5nOwDECtZqM4CBH5U,13093
-pip/_internal/utils/misc.py,sha256=cK17YkNfEccS9AuH6Xc9kYQxE0DPNgb-ULh8QgKPr8c,26195
-pip/_internal/utils/models.py,sha256=IA0hw_T4awQzui0kqfIEASm5yLtgZAB08ag59Nip5G8,1148
+pip/_internal/utils/misc.py,sha256=QQZWMJkKKADPSWQYmrwlasc8b03eCcghn0yDNprYgrI,28001
+pip/_internal/utils/models.py,sha256=HqiBVtTbW_b_Umvj2fjhDWOHo2RKhPwSz4iAYkQZ688,1201
 pip/_internal/utils/packaging.py,sha256=VtiwcAAL7LBi7tGL2je7LeW4bE11KMHGCsJ1NZY5XtM,3035
+pip/_internal/utils/parallel.py,sha256=7az3aaTMCkqpaLFbpYYOvk0rj7Hu5YH1NPXXomqjgf4,3404
 pip/_internal/utils/pkg_resources.py,sha256=ZX-k7V5q_aNWyDse92nN7orN1aCpRLsaxzpkBZ1XKzU,1254
 pip/_internal/utils/setuptools_build.py,sha256=E1KswI7wfNnCDE5R6G8c9ZbByENpu7NqocjY26PCQDw,5058
-pip/_internal/utils/subprocess.py,sha256=vI2QWpNDqM-dkn-z8i1Yrfxnn5sYniPeWn6FhTxX4dY,9902
-pip/_internal/utils/temp_dir.py,sha256=H8yUBrRWqTM83cuUu7jVvw_xKL9eZtg_IIbXQtjMLlA,8185
+pip/_internal/utils/subprocess.py,sha256=UkPe89gcjxBMx73uutoeJXgD3kwdlL6YO16BkjDdVSI,9924
+pip/_internal/utils/temp_dir.py,sha256=blmG0jEvEgdxbYUt_V15bgcTIJIrxZwAw8QZlCTJYDE,8378
 pip/_internal/utils/typing.py,sha256=xkYwOeHlf4zsHXBDC4310HtEqwhQcYXFPq2h35Tcrl0,1401
-pip/_internal/utils/unpacking.py,sha256=M944JTSiapBOSKLWu7lbawpVHSE7flfzZTEr3TAG7v8,9438
+pip/_internal/utils/unpacking.py,sha256=YFAckhqqvmehA8Kan5vd3b1kN_9TafqmOk4b-yz4fho,9488
 pip/_internal/utils/urls.py,sha256=q2rw1kMiiig_XZcoyJSsWMJQqYw-2wUmrMoST4mCW_I,1527
-pip/_internal/utils/virtualenv.py,sha256=iVJ8ZlbNtGon6I4uZFsY2SidrUf1vt3YHrgS5CuU98w,3553
-pip/_internal/utils/wheel.py,sha256=ofsZEN35YhSxRYC4gfzpTtqa_UQ8GF1tl4jtyUdd0gU,7306
+pip/_internal/utils/virtualenv.py,sha256=fNGrRp-8QmNL5OzXajBd-z7PbwOsx1XY6G-AVMAhfso,3706
+pip/_internal/utils/wheel.py,sha256=wFzn3h8GqYvgsyWPZtUyn0Rb3MJzmtyP3owMOhKnmL0,7303
 pip/_internal/vcs/__init__.py,sha256=viJxJRqRE_mVScum85bgQIXAd6o0ozFt18VpC-qIJrM,617
 pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc,,
 pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc,,
@@ -262,13 +268,13 @@ pip/_internal/vcs/__pycache__/git.cpython-38.pyc,,
 pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc,,
 pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc,,
 pip/_internal/vcs/__pycache__/versioncontrol.cpython-38.pyc,,
-pip/_internal/vcs/bazaar.py,sha256=84q1-kj1_nJ9AMzMu8RmMp-riRZu81M7K9kowcYgi3U,3957
-pip/_internal/vcs/git.py,sha256=wlvvVT-hPRwCvkihEoOCZmkCzMzosmV43_DTPvEVA_M,14165
-pip/_internal/vcs/mercurial.py,sha256=wVdmoFH-RYoaxjtuAqw40b0daMPX-Fr_26W1ME_9HZU,5347
-pip/_internal/vcs/subversion.py,sha256=6shByxeASetbM7WCj6WNoPcuLfBK65DoOEqbkSiWPAI,12331
-pip/_internal/vcs/versioncontrol.py,sha256=RtSrHr96CynqXYBQIC61cVY_9C0e7hk8dXUV-BpHmpI,23591
-pip/_internal/wheel_builder.py,sha256=sBxp_hbH1WVsX8n_eBVDSzblpKqQjBf86acoJ0fEH8Q,9583
-pip/_vendor/__init__.py,sha256=Tfcbsek_rpFZWMnYp6vzGpWHsmiwBGYOmInUX1NGJp4,4788
+pip/_internal/vcs/bazaar.py,sha256=5rRR02uDZTLaxQT-R5Obd8FZDOMlShqYds-pwVSJJs8,3887
+pip/_internal/vcs/git.py,sha256=kvB729wrKY0OWMSgOS1pUly4LosZp8utrd3kOQsWalA,13985
+pip/_internal/vcs/mercurial.py,sha256=FzCGmYzVZvB-vyM73fKcQk2B4jMNXGnXlQ2bJ7nmglM,5162
+pip/_internal/vcs/subversion.py,sha256=rldcn9ZDt5twjNPzFn_FKRn4qdfkjlxHMJEsR2MFfoA,12399
+pip/_internal/vcs/versioncontrol.py,sha256=WpxeTRC0NoGB2uXJdmfq4pPxY-p7sk1rV_WkxMxgzQA,25966
+pip/_internal/wheel_builder.py,sha256=6w1VPXrpUvCCPlV0cI1wNaCqNz4laF6B6whvaxl9cns,9522
+pip/_vendor/__init__.py,sha256=CsxnpYPbi_2agrDI79iQrCmQeZRcwwIF0C6cm_1RynU,4588
 pip/_vendor/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/__pycache__/appdirs.cpython-38.pyc,,
 pip/_vendor/__pycache__/contextlib2.cpython-38.pyc,,
@@ -277,8 +283,7 @@ pip/_vendor/__pycache__/ipaddress.cpython-38.pyc,,
 pip/_vendor/__pycache__/pyparsing.cpython-38.pyc,,
 pip/_vendor/__pycache__/retrying.cpython-38.pyc,,
 pip/_vendor/__pycache__/six.cpython-38.pyc,,
-pip/_vendor/__pycache__/toml.cpython-38.pyc,,
-pip/_vendor/appdirs.py,sha256=pYg72GhKgkVzkPxZNFUSIzMF3tAPWBgIPoQE8jgVftg,25888
+pip/_vendor/appdirs.py,sha256=M6IYRJtdZgmSPCXCSMBRB0VT3P8MdFbWCDbSLrB2Ebg,25907
 pip/_vendor/cachecontrol/__init__.py,sha256=pJtAaUxOsMPnytI1A3juAJkXYDr8krdSnsg4Yg3OBEg,302
 pip/_vendor/cachecontrol/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-38.pyc,,
@@ -305,13 +310,13 @@ pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3
 pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070
 pip/_vendor/cachecontrol/serialize.py,sha256=vIa4jvq4x_KSOLdEIedoknX2aXYHQujLDFV4-F21Dno,7091
 pip/_vendor/cachecontrol/wrapper.py,sha256=5LX0uJwkNQUtYSEw3aGmGu9WY8wGipd81mJ8lG0d0M4,690
-pip/_vendor/certifi/__init__.py,sha256=AOqspvggP_F62Q_4UmJAhx5rZkoRHoRYBE3SCnSJzAk,64
+pip/_vendor/certifi/__init__.py,sha256=u1E_DrSGj_nnEkK5VglvEqP8D80KpghLVWL0A_pq41A,62
 pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
 pip/_vendor/certifi/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/certifi/__pycache__/__main__.cpython-38.pyc,,
 pip/_vendor/certifi/__pycache__/core.cpython-38.pyc,,
-pip/_vendor/certifi/cacert.pem,sha256=hwBo73gFnF0BKiP3FQKfG32xkGDhxl4SwCQiH2rDKr0,284099
-pip/_vendor/certifi/core.py,sha256=c8hoNcYWz6rQo2VAM5d0mcEWiewCvQuOUbCwJz49vhQ,792
+pip/_vendor/certifi/cacert.pem,sha256=GhT24f0R7_9y4YY_hkXwkO7BthZhRGDCEMO348E9S14,282394
+pip/_vendor/certifi/core.py,sha256=jBrwKEWpG0IKcuozK0BQ2HHGp8adXAOyBPC7ddgR6vM,2315
 pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559
 pip/_vendor/chardet/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/chardet/__pycache__/big5freq.cpython-38.pyc,,
@@ -407,7 +412,7 @@ pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiEr
 pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404
 pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438
 pip/_vendor/contextlib2.py,sha256=5HjGflUzwWAUfcILhSmC2GqvoYdZZzFzVfIDztHigUs,16915
-pip/_vendor/distlib/__init__.py,sha256=gzl1hjUXmDGrqRyU7ZLjBwJGAcMimQbrZ22XPVaKaRE,581
+pip/_vendor/distlib/__init__.py,sha256=3veAk2rPznOB2gsK6tjbbh0TQMmGE5P82eE9wXq6NIk,581
 pip/_vendor/distlib/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/distlib/__pycache__/compat.cpython-38.pyc,,
 pip/_vendor/distlib/__pycache__/database.cpython-38.pyc,,
@@ -428,28 +433,28 @@ pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-38.pyc,,
 pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-38.pyc,,
 pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-38.pyc,,
 pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971
-pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647
+pip/_vendor/distlib/_backport/shutil.py,sha256=IX_G2NPqwecJibkIDje04bqu0xpHkfSQ2GaGdEVqM5Y,25707
 pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617
 pip/_vendor/distlib/_backport/sysconfig.py,sha256=BQHFlb6pubCl_dvT1NjtzIthylofjKisox239stDg0U,26854
 pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628
-pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404
-pip/_vendor/distlib/database.py,sha256=fhNzEDtb4HXrpxKyQvhVzDXcOiJlzrOM--UYnvCeZrI,51045
+pip/_vendor/distlib/compat.py,sha256=ADA56xiAxar3mU6qemlBhNbsrFPosXRhO44RzsbJPqk,41408
+pip/_vendor/distlib/database.py,sha256=Kl0YvPQKc4OcpVi7k5cFziydM1xOK8iqdxLGXgbZHV4,51059
 pip/_vendor/distlib/index.py,sha256=SXKzpQCERctxYDMp_OLee2f0J0e19ZhGdCIoMlUfUQM,21066
 pip/_vendor/distlib/locators.py,sha256=c9E4cDEacJ_uKbuE5BqAVocoWp6rsuBGTkiNDQq3zV4,52100
 pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811
 pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387
-pip/_vendor/distlib/metadata.py,sha256=OhbCKmf5lswE8unWBopI1hj7tRpHp4ZbFvU4d6aAEMM,40234
+pip/_vendor/distlib/metadata.py,sha256=z2KPy3h3tcDnb9Xs7nAqQ5Oz0bqjWAUFmKWcFKRoodg,38962
 pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766
-pip/_vendor/distlib/scripts.py,sha256=OAkEwxRvIzX-VSfhEttQEKJFVLA47gbW0OgQXJRs7OQ,16998
+pip/_vendor/distlib/scripts.py,sha256=_MAj3sMuv56kuM8FsiIWXqbT0gmumPGaOR_atOzn4a4,17180
 pip/_vendor/distlib/t32.exe,sha256=NS3xBCVAld35JVFNmb-1QRyVtThukMrwZVeXn4LhaEQ,96768
 pip/_vendor/distlib/t64.exe,sha256=oAqHes78rUWVM0OtVqIhUvequl_PKhAhXYQWnUf7zR0,105984
 pip/_vendor/distlib/util.py,sha256=f2jZCPrcLCt6LcnC0gUy-Fur60tXD8reA7k4rDpHMDw,59845
 pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391
 pip/_vendor/distlib/w32.exe,sha256=lJtnZdeUxTZWya_EW5DZos_K5rswRECGspIl8ZJCIXs,90112
 pip/_vendor/distlib/w64.exe,sha256=0aRzoN2BO9NWW4ENy4_4vHkHR4qZTFZNVSAJJYlODTI,99840
-pip/_vendor/distlib/wheel.py,sha256=bRtR5bNR_u_DwkwktN1bgZuwLVOJT1p_vNIUPyN8kJc,40452
+pip/_vendor/distlib/wheel.py,sha256=v6DnwTqhNHwrEVFr8_YeiTW6G4ftP_evsywNgrmdb2o,41144
 pip/_vendor/distro.py,sha256=xxMIh2a3KmippeWEHzynTdHT3_jZM0o-pos0dAWJROM,43628
-pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162
+pip/_vendor/html5lib/__init__.py,sha256=BYzcKCqeEii52xDrqBFruhnmtmkiuHXFyFh-cglQ8mk,1160
 pip/_vendor/html5lib/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-38.pyc,,
 pip/_vendor/html5lib/__pycache__/_inputstream.cpython-38.pyc,,
@@ -458,19 +463,17 @@ pip/_vendor/html5lib/__pycache__/_utils.cpython-38.pyc,,
 pip/_vendor/html5lib/__pycache__/constants.cpython-38.pyc,,
 pip/_vendor/html5lib/__pycache__/html5parser.cpython-38.pyc,,
 pip/_vendor/html5lib/__pycache__/serializer.cpython-38.pyc,,
-pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705
-pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552
-pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580
-pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289
+pip/_vendor/html5lib/_ihatexml.py,sha256=ifOwF7pXqmyThIXc3boWc96s4MDezqRrRVp7FwDYUFs,16728
+pip/_vendor/html5lib/_inputstream.py,sha256=jErNASMlkgs7MpOM9Ve_VdLDJyFFweAjLuhVutZz33U,32353
+pip/_vendor/html5lib/_tokenizer.py,sha256=04mgA2sNTniutl2fxFv-ei5bns4iRaPxVXXHh_HrV_4,77040
+pip/_vendor/html5lib/_trie/__init__.py,sha256=nqfgO910329BEVJ5T4psVwQtjd2iJyEXQ2-X8c1YxwU,109
 pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-38.pyc,,
-pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-38.pyc,,
 pip/_vendor/html5lib/_trie/__pycache__/py.cpython-38.pyc,,
 pip/_vendor/html5lib/_trie/_base.py,sha256=CaybYyMro8uERQYjby2tTeSUatnWDfWroUN9N7ety5w,1013
-pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178
 pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775
-pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015
-pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518
+pip/_vendor/html5lib/_utils.py,sha256=Dx9AKntksRjFT1veBj7I362pf5OgIaT0zglwq43RnfU,4931
+pip/_vendor/html5lib/constants.py,sha256=Ll-yzLU_jcjyAI_h57zkqZ7aQWE5t5xA4y_jQgoUUhw,83464
 pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-38.pyc,,
@@ -485,10 +488,10 @@ pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVr
 pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945
 pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643
 pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588
-pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248
+pip/_vendor/html5lib/filters/sanitizer.py,sha256=m6oGmkBhkGAnn2nV6D4hE78SCZ6WEnK9rKdZB3uXBIc,26897
 pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214
-pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963
-pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758
+pip/_vendor/html5lib/html5parser.py,sha256=anr-aXre_ImfrkQ35c_rftKXxC80vJCREKe06Tq15HA,117186
+pip/_vendor/html5lib/serializer.py,sha256=_PpvcZF07cwE7xr9uKkZqh5f4UEaI8ltCU2xPJzaTpk,15759
 pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679
 pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-38.pyc,,
@@ -501,11 +504,11 @@ pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-38.pyc,,
 pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-38.pyc,,
 pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc,,
 pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-38.pyc,,
-pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579
+pip/_vendor/html5lib/treebuilders/base.py,sha256=z-o51vt9r_l2IDG5IioTOKGzZne4Fy3_Fc-7ztrOh4I,14565
 pip/_vendor/html5lib/treebuilders/dom.py,sha256=22whb0C71zXIsai5mamg6qzBEiigcBIvaDy4Asw3at0,8925
-pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764
-pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122
-pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714
+pip/_vendor/html5lib/treebuilders/etree.py,sha256=w5ZFpKk6bAxnrwD2_BrF5EVC7vzz0L3LMi9Sxrbc_8w,12836
+pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9gqDjs-IxsPhBYa5cpvv2FZ1KZlG83Giusy2lFmvIkE,14766
+pip/_vendor/html5lib/treewalkers/__init__.py,sha256=OBPtc1TU5mGyy18QDMxKEyYEz0wxFUUNj5v0-XgmYhY,5719
 pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-38.pyc,,
 pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-38.pyc,,
@@ -514,8 +517,8 @@ pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-38.pyc,,
 pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-38.pyc,,
 pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476
 pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413
-pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550
-pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309
+pip/_vendor/html5lib/treewalkers/etree.py,sha256=xo1L5m9VtkfpFJK0pFmkLVajhqYYVisVZn3k9kYpPkI,4551
+pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=_b0LAVWLcVu9WaU_-w3D8f0IRSpCbjf667V-3NRdhTw,6357
 pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309
 pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58
 pip/_vendor/idna/__pycache__/__init__.cpython-38.pyc,,
@@ -528,11 +531,11 @@ pip/_vendor/idna/__pycache__/package_data.cpython-38.pyc,,
 pip/_vendor/idna/__pycache__/uts46data.cpython-38.pyc,,
 pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299
 pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232
-pip/_vendor/idna/core.py,sha256=Hy1RkJrrIQWW8kicqZ8vQT_GreYlAhkfopjESSzL3wk,11844
-pip/_vendor/idna/idnadata.py,sha256=p1_KeD9BqT-sDGqMcGxhBWAOrYNrPxj5YvHya0ImFbU,41201
+pip/_vendor/idna/core.py,sha256=jCoaLb3bA2tS_DDx9PpGuNTEZZN2jAzB369aP-IHYRE,11951
+pip/_vendor/idna/idnadata.py,sha256=gmzFwZWjdms3kKZ_M_vwz7-LP_SCgYfSeE03B21Qpsk,42350
 pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749
-pip/_vendor/idna/package_data.py,sha256=IjspS_rQQ_0HCGc0CaNhn3NXl3ohvRg7-_P0gAaSc-o,21
-pip/_vendor/idna/uts46data.py,sha256=w9d1B5OESLSgr2tMx0svwoPBi0Qj0_7HRyL1Vq5axwg,201192
+pip/_vendor/idna/package_data.py,sha256=bxBjpLnE06_1jSYKEy5svOMu1zM3OMztXVUb1tPlcp0,22
+pip/_vendor/idna/uts46data.py,sha256=lMdw2zdjkH1JUWXPPEfFUSYT3Fyj60bBmfLvvy5m7ko,202084
 pip/_vendor/ipaddress.py,sha256=-0RmurI31XgAaN20WCi0zrcuoat90nNA70_6yGlx2PU,79875
 pip/_vendor/msgpack/__init__.py,sha256=2gJwcsTIaAtCM0GMi2rU-_Y6kILeeQuqRkrQ22jSANc,1118
 pip/_vendor/msgpack/__pycache__/__init__.cpython-38.pyc,,
@@ -544,7 +547,7 @@ pip/_vendor/msgpack/_version.py,sha256=hu7lzmZ_ClOaOOmRsWb4xomhzQ4UIsLsvv8KY6Uys
 pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
 pip/_vendor/msgpack/ext.py,sha256=nV19BzE9Be8SJHrxxYJHFbvEHJaXcP3avRkHVp5wovM,6034
 pip/_vendor/msgpack/fallback.py,sha256=Z8V3iYUUPqKVy4WWTk64Vq3G0PylQIOmlWvgnMhmkdU,37133
-pip/_vendor/packaging/__about__.py,sha256=y-K51xPSysxvOfTjAb074yqOZfDeX5qSID0ZEbEb9cE,744
+pip/_vendor/packaging/__about__.py,sha256=PNMsaZn4UcCHyubgROH1bl6CluduPjI5kFrSp_Zgklo,736
 pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562
 pip/_vendor/packaging/__pycache__/__about__.cpython-38.pyc,,
 pip/_vendor/packaging/__pycache__/__init__.cpython-38.pyc,,
@@ -557,15 +560,15 @@ pip/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc,,
 pip/_vendor/packaging/__pycache__/tags.cpython-38.pyc,,
 pip/_vendor/packaging/__pycache__/utils.cpython-38.pyc,,
 pip/_vendor/packaging/__pycache__/version.cpython-38.pyc,,
-pip/_vendor/packaging/_compat.py,sha256=Z-PwchK0cREbaRGF5MZP8LEv8JkC-qydn2FRrtjeixk,1138
+pip/_vendor/packaging/_compat.py,sha256=MXdsGpSE_W-ZrHoC87andI4LV2FAwU7HLL-eHe_CjhU,1128
 pip/_vendor/packaging/_structures.py,sha256=ozkCX8Q8f2qE1Eic3YiQ4buDVfgz2iYevY9e7R2y3iY,2022
-pip/_vendor/packaging/_typing.py,sha256=-cq_iNeveAWCVoseVvqmknWLbvZ_i9g7BeZBo0ShtHg,1449
-pip/_vendor/packaging/markers.py,sha256=yap5bk3c8QyPuGtiVbQSYhN70bxWj1nLDv2ZuaCLq7g,9501
-pip/_vendor/packaging/requirements.py,sha256=G43p2ylM_REg87RLG9JybjbdwfaPyzaKYRtllRfNdrM,4913
-pip/_vendor/packaging/specifiers.py,sha256=Nz8bnFp53cQInmRGZy50QXlIi2tkDXMfRuGyGps2IRE,31314
-pip/_vendor/packaging/tags.py,sha256=SCrw-jC3h0ymam6QXDX5ZqgvRcMNq_cQD55gFnT56Xg,23704
-pip/_vendor/packaging/utils.py,sha256=v5Wk8B7gUL13Rzed6NNhCZlutPQT7jNV-7hr-WOtacU,1700
-pip/_vendor/packaging/version.py,sha256=qRdNN0_XuPFOJ3fut8ehzxJrNYtBzqF8ZtagEvgNUUM,15480
+pip/_vendor/packaging/_typing.py,sha256=VgA0AAvsc97KB5nF89zoudOyCMEsV7FlaXzZbYqEkzA,1824
+pip/_vendor/packaging/markers.py,sha256=V_RdoQqOUbSfy7y9o2vRk7BkzAh3yneC82cuWpKrqOg,9491
+pip/_vendor/packaging/requirements.py,sha256=F93hkn7i8NKRZP-FtdTIlhz1PUsRjhe6eRbsBXX0Uh4,4903
+pip/_vendor/packaging/specifiers.py,sha256=uYp9l13F0LcknS6d4N60ytiBgFmIhKideOq9AnsxTco,31944
+pip/_vendor/packaging/tags.py,sha256=NKMS37Zo_nWrZxgsD6zbXsXgc9edn9m160cBiLmHJdE,24067
+pip/_vendor/packaging/utils.py,sha256=RShlvnjO2CtYSD8uri32frMMFMTmB-3ihsq1-ghzLEw,1811
+pip/_vendor/packaging/version.py,sha256=Cnbm-OO9D_qd8ZTFxzFcjSavexSYFZmyeaoPvMsjgPc,15470
 pip/_vendor/pep517/__init__.py,sha256=r5uA106NGJa3slspaD2m32aFpFUiZX-mZ9vIlzAEOp4,84
 pip/_vendor/pep517/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/pep517/__pycache__/_in_process.cpython-38.pyc,,
@@ -599,7 +602,7 @@ pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2
 pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372
 pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380
 pip/_vendor/pyparsing.py,sha256=J1b4z3S_KwyJW7hKGnoN-hXW9pgMIzIP6QThyY5yJq4,273394
-pip/_vendor/requests/__init__.py,sha256=DoS7sn6SOs-Vmi3IHdJFfM1RmlONZHmEKO3DGvyWsnY,4080
+pip/_vendor/requests/__init__.py,sha256=orzv4-1uejMDc2v3LnTVneINGXiwqXSfrASoFBsYblE,4465
 pip/_vendor/requests/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/requests/__pycache__/__version__.cpython-38.pyc,,
 pip/_vendor/requests/__pycache__/_internal_utils.cpython-38.pyc,,
@@ -618,7 +621,7 @@ pip/_vendor/requests/__pycache__/sessions.cpython-38.pyc,,
 pip/_vendor/requests/__pycache__/status_codes.cpython-38.pyc,,
 pip/_vendor/requests/__pycache__/structures.cpython-38.pyc,,
 pip/_vendor/requests/__pycache__/utils.cpython-38.pyc,,
-pip/_vendor/requests/__version__.py,sha256=dpcXABdGo9y3UFFKFU_Wu_YHSa7TBXxCghOju7S8IYs,441
+pip/_vendor/requests/__version__.py,sha256=Xwky1FMlMkJJGidBM50JC7FKcosWzkjIW-WhQGrBdFM,441
 pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096
 pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548
 pip/_vendor/requests/api.py,sha256=PlHM-HT3PQ5lyufoeGmV-nJxRi7UnUyGVh7OV7B9XV4,6496
@@ -626,39 +629,44 @@ pip/_vendor/requests/auth.py,sha256=OMoJIVKyRLy9THr91y8rxysZuclwPB-K1Xg1zBomUhQ,
 pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465
 pip/_vendor/requests/compat.py,sha256=LQWuCR4qXk6w7-qQopXyz0WNHUdAD40k0mKnaAEf1-g,2045
 pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430
-pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197
+pip/_vendor/requests/exceptions.py,sha256=d9fJJw8YFBB9VzG9qhvxLuOx6be3c_Dwbck-dVUEAcs,3173
 pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578
 pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757
-pip/_vendor/requests/models.py,sha256=P7sUBpjV7iIzjpf9rYVzHaOXlxlzJk5ikFP_Nsg6zAU,34278
+pip/_vendor/requests/models.py,sha256=_tKIbrscbGvaTdX1UHCwRaiYmPF9VBIuBeydr4Qx1Tg,34287
 pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695
-pip/_vendor/requests/sessions.py,sha256=Ju8VnlWZPU_Xr-cMjKXNbs_l2cyanr3Dm9c7fLxprQI,29265
+pip/_vendor/requests/sessions.py,sha256=OBtwQs1vjkB1xamFdi_p5y8BVeX16BJoQcwSwx_Y3fI,29316
 pip/_vendor/requests/status_codes.py,sha256=gT79Pbs_cQjBgp-fvrUgg1dn2DQO32bDj4TInjnMPSc,4188
 pip/_vendor/requests/structures.py,sha256=msAtr9mq1JxHd-JRyiILfdFlpbJwvvFuP3rfUQT_QxE,3005
 pip/_vendor/requests/utils.py,sha256=VBs99cvV8Z29WGXeWZqHzZ80_nu1AwwjYzJfe0wQIvs,30176
-pip/_vendor/resolvelib/__init__.py,sha256=aBndiGQ3I68Ezdv0fMPQ9ek6ScvwpuQRimxn6wp7pJ4,537
+pip/_vendor/resolvelib/__init__.py,sha256=sqMOy4CbVJQiaG9bCPj0oAntGAVy-RWdPfVaC9XDIEQ,537
 pip/_vendor/resolvelib/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/resolvelib/__pycache__/providers.cpython-38.pyc,,
 pip/_vendor/resolvelib/__pycache__/reporters.cpython-38.pyc,,
 pip/_vendor/resolvelib/__pycache__/resolvers.cpython-38.pyc,,
 pip/_vendor/resolvelib/__pycache__/structs.cpython-38.pyc,,
-pip/_vendor/resolvelib/providers.py,sha256=1JCBbBV0E_Q1o0XOAeAdr2YaKU_zHxO7i_BBLqCLhUc,4913
-pip/_vendor/resolvelib/reporters.py,sha256=5gXUn3hRjA4UomD3HHZGreBp23aSjMHgBrC3OgYSpTY,1094
-pip/_vendor/resolvelib/resolvers.py,sha256=nTTfBBIMsoxGhqUAyh8GbmR-si_TijpY67wD7aUS264,14481
+pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-38.pyc,,
+pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-38.pyc,,
+pip/_vendor/resolvelib/compat/collections_abc.py,sha256=mtTkpr3Gf3OGvU1PD8YuvrJRhVbioxV82T-niFPoX3o,127
+pip/_vendor/resolvelib/providers.py,sha256=TZDCmL-Ic-R5JRIZY8G4FLG5xB2343B0DfuK7aw2Yqw,4547
+pip/_vendor/resolvelib/reporters.py,sha256=ZPSJnVfK8WvXTbX8jE0Nren0-_Hg9ym4epCUPtU8Y0U,1405
+pip/_vendor/resolvelib/resolvers.py,sha256=lQTGcc-2fgHbmdiLzeNDUxVmGc5ZFjkAL6JrVqnqJIw,15018
 pip/_vendor/resolvelib/structs.py,sha256=yrdhd-n7DercimPGclXe20rgqhlxw8PnxC0wmcXO19Y,2016
 pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972
-pip/_vendor/six.py,sha256=Q6WvEXZ1DGEASAo3CGNCJkKv2tPy8xkSmK-VHE9PYIA,34074
-pip/_vendor/toml.py,sha256=D8pTQbgSGge2nDdpsAk8_C7UGJeva0qFq2tGGNaE70Q,35675
-pip/_vendor/toml/__init__.py,sha256=CwtvzaEThoIbqNwJJB8BhHoA5clb2_x8V42UF6JAysA,527
+pip/_vendor/six.py,sha256=U4Z_yv534W5CNyjY9i8V1OXY2SjAny8y2L5vDLhhThM,34159
+pip/_vendor/toml/__init__.py,sha256=rJ1pu933HgUtyeeNiusoPd5jJOPNhaKHhSSld3o8AQo,747
 pip/_vendor/toml/__pycache__/__init__.cpython-38.pyc,,
+pip/_vendor/toml/__pycache__/common.cpython-38.pyc,,
 pip/_vendor/toml/__pycache__/decoder.cpython-38.pyc,,
 pip/_vendor/toml/__pycache__/encoder.cpython-38.pyc,,
 pip/_vendor/toml/__pycache__/ordered.cpython-38.pyc,,
 pip/_vendor/toml/__pycache__/tz.cpython-38.pyc,,
-pip/_vendor/toml/decoder.py,sha256=8uIcWLLyMFwBGT3fiph98KDx8uF_V2Pf84Qi43pqNf0,35067
-pip/_vendor/toml/encoder.py,sha256=Nw1wrNgcUgod1XbOXwxFSDGqO5blgOi07Lp_6kStTgc,8128
+pip/_vendor/toml/common.py,sha256=ViBccAduP6eZNJAb1POhRhjOAi56TDsNgWJ1TjgXAug,242
+pip/_vendor/toml/decoder.py,sha256=atpXmyFCzNGiqhkcYLySBuJQkPeSHDzBz47sEaX1amw,38696
+pip/_vendor/toml/encoder.py,sha256=fPqLyFdPAam17X9SELz2TMp9affkfHCmgWZxRKcmzhY,9955
 pip/_vendor/toml/ordered.py,sha256=UWt5Eka90IWVBYdvLgY5PXnkBcVYpHjnw9T67rM85T8,378
 pip/_vendor/toml/tz.py,sha256=DrAgI3wZxZiGcLuV_l8ueA_nPrYoxQ3hZA9tJSjWRsQ,618
-pip/_vendor/urllib3/__init__.py,sha256=oVOeFuNyEg33ShIefD4qSeGvbb-aJ3otjcdX2iswkLM,2683
+pip/_vendor/urllib3/__init__.py,sha256=rdFZCO1L7e8861ZTvo8AiSKwxCe9SnWQUQwJ599YV9c,2683
 pip/_vendor/urllib3/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/urllib3/__pycache__/_collections.cpython-38.pyc,,
 pip/_vendor/urllib3/__pycache__/connection.cpython-38.pyc,,
@@ -670,8 +678,8 @@ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-38.pyc,,
 pip/_vendor/urllib3/__pycache__/request.cpython-38.pyc,,
 pip/_vendor/urllib3/__pycache__/response.cpython-38.pyc,,
 pip/_vendor/urllib3/_collections.py,sha256=GouVsNzwg6jADZTmimMI6oqmwKSswnMo9dh5tGNVWO4,10792
-pip/_vendor/urllib3/connection.py,sha256=wHpV1S60bvXWnqEDtdzmHiY9NwIiKeFwQI5VvX7AtqM,14026
-pip/_vendor/urllib3/connectionpool.py,sha256=jg_yTHo2B3Zyo4urYVecyg-34v3hxUrH9B401-c4A9w,36513
+pip/_vendor/urllib3/connection.py,sha256=Fln8a_bkegdNMkFoSOwyI0PJvL1OqzVUO6ifihKOTpc,14461
+pip/_vendor/urllib3/connectionpool.py,sha256=egdaX-Db_LVXifDxv3JY0dHIpQqDv0wC0_9Eeh8FkPM,35725
 pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc,,
@@ -689,10 +697,10 @@ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=mullWYFaghBdRWla
 pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=V7GnujxnWZh2N2sMsV5N4d9Imymokkm3zBwgt77_bSE,11956
 pip/_vendor/urllib3/contrib/appengine.py,sha256=gfdK4T7CRin7v9HRhHDbDh-Hbk66hHDWeoz7nV3PJo8,11034
 pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=a402AwGN_Ll3N-4ur_AS6UrU-ycUtlnYqoBF76lORg8,4160
-pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=w35mWy_1POZUsbOhurVb_zhf0C1Jkd79AFlucLs6KuQ,16440
-pip/_vendor/urllib3/contrib/securetransport.py,sha256=iKzVUAxKnChsADR5YMwc05oEixXDzAk0xPU0g-rc2z8,32275
+pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=9gm5kpC0ScbDCWobeCrh5LDqS8HgU8FNhmk5v8qQ5Bs,16582
+pip/_vendor/urllib3/contrib/securetransport.py,sha256=vBDFjSnH2gWa-ztMKVaiwW46K1mlDZKqvo_VAonfdcY,32401
 pip/_vendor/urllib3/contrib/socks.py,sha256=nzDMgDIFJWVubKHqvIn2-SKCO91hhJInP92WgHChGzA,7036
-pip/_vendor/urllib3/exceptions.py,sha256=P3e-p9_LScyIxX7FoR3wU0A6hZmDqFAVCz2wgI3D0lM,6607
+pip/_vendor/urllib3/exceptions.py,sha256=D2Jvab7M7m_n0rnmBmq481paoVT32VvVeB6VeQM0y-w,7172
 pip/_vendor/urllib3/fields.py,sha256=kroD76QK-GdHHW7f_AUN4XxDC3OQPI2FFrS9eSL4BCs,8553
 pip/_vendor/urllib3/filepost.py,sha256=vj0qbrpT1AFzvvW4SuC8M5kJiw7wftHcSr-7b8UpPpw,2440
 pip/_vendor/urllib3/packages/__init__.py,sha256=h4BLhD4tLaBx1adaDtKXfupsgqY0wWLXb_f1_yVlV6A,108
@@ -707,9 +715,9 @@ pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=ywgKMtfHi1-Dr
 pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc,,
 pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=rvQDQviqQLtPJB6MfEgABnBFj3nXft7ZJ3Dx-BC0AQY,5696
-pip/_vendor/urllib3/poolmanager.py,sha256=JYUyBUN3IiEknUdjZ7VJrpCQr6SP7vi0WwSndrn8XpE,17053
+pip/_vendor/urllib3/poolmanager.py,sha256=iWEAIGrVNGoOmQyfiFwCqG-IyYy6GIQ-jJ9QCsX9li4,17861
 pip/_vendor/urllib3/request.py,sha256=hhoHvEEatyd9Tn5EbGjQ0emn-ENMCyY591yNWTneINA,6018
-pip/_vendor/urllib3/response.py,sha256=5OVDLR6ss88mak30ZhDaSqHxXbbAQ7CIUrktI7B5aPA,27833
+pip/_vendor/urllib3/response.py,sha256=eo1Sfkn2x44FtjgP3qwwDsG9ak84spQAxEGy7Ovd4Pc,28221
 pip/_vendor/urllib3/util/__init__.py,sha256=bWNaav_OT-1L7-sxm59cGb59rDORlbhb_4noduM5m0U,1038
 pip/_vendor/urllib3/util/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/urllib3/util/__pycache__/connection.cpython-38.pyc,,
@@ -725,12 +733,12 @@ pip/_vendor/urllib3/util/connection.py,sha256=NsxUAKQ98GKywta--zg57CdVpeTCI6N-GE
 pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497
 pip/_vendor/urllib3/util/request.py,sha256=C-6-AWffxZG03AdRGoY59uqsn4CVItKU6gjxz7Hc3Mc,3815
 pip/_vendor/urllib3/util/response.py,sha256=_WbTQr8xRQuJuY2rTIZxVdJD6mnEOtQupjaK_bF_Vj8,2573
-pip/_vendor/urllib3/util/retry.py,sha256=Ui74h44gLIIWkAxT9SK3A2mEvu55-odWgJMw3LiUNGk,15450
-pip/_vendor/urllib3/util/ssl_.py,sha256=W52OyrqLO1IQ5kUgzM8fLAO-EgJxuftd5nhcTOD54ew,14167
-pip/_vendor/urllib3/util/timeout.py,sha256=bCtaS_xVKaTDJ5VMlroXBfCnPUDNVGZqik7-z83issg,9871
-pip/_vendor/urllib3/util/url.py,sha256=6cDyd46labP8STbF0vieWygu2xVhKkgcF1h3tc6HYno,13979
+pip/_vendor/urllib3/util/retry.py,sha256=3wbv7SdzYNOxPcBiFkPCubTbK1_6vWSepznOXirhUfA,15543
+pip/_vendor/urllib3/util/ssl_.py,sha256=N7gqt2iqzKBsWGmc61YeKNSPri6Ns2iZ_MD5hV2y8tU,14523
+pip/_vendor/urllib3/util/timeout.py,sha256=3qawUo-TZq4q7tyeRToMIOdNGEOBjOOQVq7nHnLryP4,9947
+pip/_vendor/urllib3/util/url.py,sha256=S4YyAwWKJPjFFECC7l9Vp9EKqRH1XAb-uQFANn1Tak0,13981
 pip/_vendor/urllib3/util/wait.py,sha256=k46KzqIYu3Vnzla5YW3EvtInNlU_QycFqQAghIOxoAg,5406
-pip/_vendor/vendor.txt,sha256=ZewT4rljE_Ct9eJsAk0HhDlKSHaguTqeBSGlF1zIgss,440
+pip/_vendor/vendor.txt,sha256=bWUiaRjMJhuUsqFZHEJkBH_6lJ_Avl9cOyszcI74IHs,437
 pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
 pip/_vendor/webencodings/__pycache__/__init__.cpython-38.pyc,,
 pip/_vendor/webencodings/__pycache__/labels.cpython-38.pyc,,
diff --git a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/WHEEL b/venv/Lib/site-packages/pip-20.2.2.dist-info/WHEEL
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip-20.1.dist-info/WHEEL
rename to venv/Lib/site-packages/pip-20.2.2.dist-info/WHEEL
diff --git a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/entry_points.txt b/venv/Lib/site-packages/pip-20.2.2.dist-info/entry_points.txt
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip-20.1.dist-info/entry_points.txt
rename to venv/Lib/site-packages/pip-20.2.2.dist-info/entry_points.txt
diff --git a/venv/lib/python3.8/site-packages/pip-20.1.dist-info/top_level.txt b/venv/Lib/site-packages/pip-20.2.2.dist-info/top_level.txt
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip-20.1.dist-info/top_level.txt
rename to venv/Lib/site-packages/pip-20.2.2.dist-info/top_level.txt
diff --git a/venv/lib/python3.8/site-packages/pip/__init__.py b/venv/Lib/site-packages/pip/__init__.py
similarity index 94%
rename from venv/lib/python3.8/site-packages/pip/__init__.py
rename to venv/Lib/site-packages/pip/__init__.py
index 3d249ce..611753f 100644
--- a/venv/lib/python3.8/site-packages/pip/__init__.py
+++ b/venv/Lib/site-packages/pip/__init__.py
@@ -4,7 +4,7 @@ if MYPY_CHECK_RUNNING:
     from typing import List, Optional
 
 
-__version__ = "20.1"
+__version__ = "20.2.2"
 
 
 def main(args=None):
diff --git a/venv/lib/python3.8/site-packages/pip/__main__.py b/venv/Lib/site-packages/pip/__main__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/__main__.py
rename to venv/Lib/site-packages/pip/__main__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/__init__.py b/venv/Lib/site-packages/pip/_internal/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/__init__.py
rename to venv/Lib/site-packages/pip/_internal/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/build_env.py b/venv/Lib/site-packages/pip/_internal/build_env.py
similarity index 87%
rename from venv/lib/python3.8/site-packages/pip/_internal/build_env.py
rename to venv/Lib/site-packages/pip/_internal/build_env.py
index b8f005f..28d1ad6 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/build_env.py
+++ b/venv/Lib/site-packages/pip/_internal/build_env.py
@@ -1,10 +1,6 @@
 """Build Environment used for isolation during sdist building
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-# mypy: disallow-untyped-defs=False
-
 import logging
 import os
 import sys
@@ -22,7 +18,8 @@ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 if MYPY_CHECK_RUNNING:
-    from typing import Tuple, Set, Iterable, Optional, List
+    from types import TracebackType
+    from typing import Tuple, Set, Iterable, Optional, List, Type
     from pip._internal.index.package_finder import PackageFinder
 
 logger = logging.getLogger(__name__)
@@ -110,6 +107,7 @@ class BuildEnvironment(object):
             ).format(system_sites=system_sites, lib_dirs=self._lib_dirs))
 
     def __enter__(self):
+        # type: () -> None
         self._save_env = {
             name: os.environ.get(name, None)
             for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH')
@@ -128,7 +126,13 @@ class BuildEnvironment(object):
             'PYTHONPATH': os.pathsep.join(pythonpath),
         })
 
-    def __exit__(self, exc_type, exc_val, exc_tb):
+    def __exit__(
+        self,
+        exc_type,  # type: Optional[Type[BaseException]]
+        exc_val,  # type: Optional[BaseException]
+        exc_tb  # type: Optional[TracebackType]
+    ):
+        # type: (...) -> None
         for varname, old_value in self._save_env.items():
             if old_value is None:
                 os.environ.pop(varname, None)
@@ -159,7 +163,7 @@ class BuildEnvironment(object):
         finder,  # type: PackageFinder
         requirements,  # type: Iterable[str]
         prefix_as_string,  # type: str
-        message  # type: Optional[str]
+        message  # type: str
     ):
         # type: (...) -> None
         prefix = self._prefixes[prefix_as_string]
@@ -193,6 +197,8 @@ class BuildEnvironment(object):
             args.extend(['--trusted-host', host])
         if finder.allow_all_prereleases:
             args.append('--pre')
+        if finder.prefer_binary:
+            args.append('--prefer-binary')
         args.append('--')
         args.extend(requirements)
         with open_spinner(message) as spinner:
@@ -204,16 +210,32 @@ class NoOpBuildEnvironment(BuildEnvironment):
     """
 
     def __init__(self):
+        # type: () -> None
         pass
 
     def __enter__(self):
+        # type: () -> None
         pass
 
-    def __exit__(self, exc_type, exc_val, exc_tb):
+    def __exit__(
+        self,
+        exc_type,  # type: Optional[Type[BaseException]]
+        exc_val,  # type: Optional[BaseException]
+        exc_tb  # type: Optional[TracebackType]
+    ):
+        # type: (...) -> None
         pass
 
     def cleanup(self):
+        # type: () -> None
         pass
 
-    def install_requirements(self, finder, requirements, prefix, message):
+    def install_requirements(
+        self,
+        finder,  # type: PackageFinder
+        requirements,  # type: Iterable[str]
+        prefix_as_string,  # type: str
+        message  # type: str
+    ):
+        # type: (...) -> None
         raise NotImplementedError()
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cache.py b/venv/Lib/site-packages/pip/_internal/cache.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_internal/cache.py
rename to venv/Lib/site-packages/pip/_internal/cache.py
index b534f0c..07db948 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/cache.py
+++ b/venv/Lib/site-packages/pip/_internal/cache.py
@@ -1,9 +1,6 @@
 """Cache Management
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 import hashlib
 import json
 import logging
@@ -122,7 +119,7 @@ class Cache(object):
         return parts
 
     def _get_candidates(self, link, canonical_package_name):
-        # type: (Link, Optional[str]) -> List[Any]
+        # type: (Link, str) -> List[Any]
         can_not_cache = (
             not self.cache_dir or
             not canonical_package_name or
@@ -185,6 +182,7 @@ class SimpleWheelCache(Cache):
     def get_path_for_link_legacy(self, link):
         # type: (Link) -> str
         parts = self._get_cache_path_parts_legacy(link)
+        assert self.cache_dir
         return os.path.join(self.cache_dir, "wheels", *parts)
 
     def get_path_for_link(self, link):
@@ -204,7 +202,7 @@ class SimpleWheelCache(Cache):
         :param link: The link of the sdist for which this will cache wheels.
         """
         parts = self._get_cache_path_parts(link)
-
+        assert self.cache_dir
         # Store wheels within the root cache_dir
         return os.path.join(self.cache_dir, "wheels", *parts)
 
@@ -230,10 +228,9 @@ class SimpleWheelCache(Cache):
                 continue
             if canonicalize_name(wheel.name) != canonical_package_name:
                 logger.debug(
-                    "Ignoring cached wheel {} for {} as it "
-                    "does not match the expected distribution name {}.".format(
-                        wheel_name, link, package_name
-                    )
+                    "Ignoring cached wheel %s for %s as it "
+                    "does not match the expected distribution name %s.",
+                    wheel_name, link, package_name,
                 )
                 continue
             if not wheel.supported(supported_tags):
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/__init__.py b/venv/Lib/site-packages/pip/_internal/cli/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/__init__.py
rename to venv/Lib/site-packages/pip/_internal/cli/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py b/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py
rename to venv/Lib/site-packages/pip/_internal/cli/autocompletion.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/base_command.py b/venv/Lib/site-packages/pip/_internal/cli/base_command.py
similarity index 86%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/base_command.py
rename to venv/Lib/site-packages/pip/_internal/cli/base_command.py
index 1fa5ba0..c3b6a85 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/cli/base_command.py
+++ b/venv/Lib/site-packages/pip/_internal/cli/base_command.py
@@ -19,7 +19,6 @@ from pip._internal.cli.parser import (
 from pip._internal.cli.status_codes import (
     ERROR,
     PREVIOUS_BUILD_DIR_ERROR,
-    SUCCESS,
     UNKNOWN_ERROR,
     VIRTUALENV_NOT_FOUND,
 )
@@ -27,7 +26,9 @@ from pip._internal.exceptions import (
     BadCommand,
     CommandError,
     InstallationError,
+    NetworkConnectionError,
     PreviousBuildDirError,
+    SubProcessError,
     UninstallationError,
 )
 from pip._internal.utils.deprecation import deprecated
@@ -88,6 +89,12 @@ class Command(CommandContextMixIn):
         )
         self.parser.add_option_group(gen_opts)
 
+        self.add_options()
+
+    def add_options(self):
+        # type: () -> None
+        pass
+
     def handle_pip_version_check(self, options):
         # type: (Values) -> None
         """
@@ -99,7 +106,7 @@ class Command(CommandContextMixIn):
         assert not hasattr(options, 'no_index')
 
     def run(self, options, args):
-        # type: (Values, List[Any]) -> Any
+        # type: (Values, List[Any]) -> int
         raise NotImplementedError
 
     def parse_args(self, args):
@@ -142,7 +149,7 @@ class Command(CommandContextMixIn):
         ):
             message = (
                 "pip 21.0 will drop support for Python 2.7 in January 2021. "
-                "More details about Python 2 support in pip, can be found at "
+                "More details about Python 2 support in pip can be found at "
                 "https://pip.pypa.io/en/latest/development/release-process/#python-2-support"  # noqa
             )
             if platform.python_implementation() == "CPython":
@@ -184,18 +191,38 @@ class Command(CommandContextMixIn):
                 )
                 options.cache_dir = None
 
+        if getattr(options, "build_dir", None):
+            deprecated(
+                reason=(
+                    "The -b/--build/--build-dir/--build-directory "
+                    "option is deprecated."
+                ),
+                replacement=(
+                    "use the TMPDIR/TEMP/TMP environment variable, "
+                    "possibly combined with --no-clean"
+                ),
+                gone_in="20.3",
+                issue=8333,
+            )
+
+        if 'resolver' in options.unstable_features:
+            logger.critical(
+                "--unstable-feature=resolver is no longer supported, and "
+                "has been replaced with --use-feature=2020-resolver instead."
+            )
+            sys.exit(ERROR)
+
         try:
             status = self.run(options, args)
-            # FIXME: all commands should return an exit status
-            # and when it is done, isinstance is not needed anymore
-            if isinstance(status, int):
-                return status
+            assert isinstance(status, int)
+            return status
         except PreviousBuildDirError as exc:
             logger.critical(str(exc))
             logger.debug('Exception information:', exc_info=True)
 
             return PREVIOUS_BUILD_DIR_ERROR
-        except (InstallationError, UninstallationError, BadCommand) as exc:
+        except (InstallationError, UninstallationError, BadCommand,
+                SubProcessError, NetworkConnectionError) as exc:
             logger.critical(str(exc))
             logger.debug('Exception information:', exc_info=True)
 
@@ -224,5 +251,3 @@ class Command(CommandContextMixIn):
             return UNKNOWN_ERROR
         finally:
             self.handle_pip_version_check(options)
-
-        return SUCCESS
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py b/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py
rename to venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py
index 5b5647d..ed42c5f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py
+++ b/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py
@@ -12,7 +12,6 @@ pass on state. To be consistent, all options will follow this design.
 
 from __future__ import absolute_import
 
-import logging
 import os
 import textwrap
 import warnings
@@ -35,8 +34,6 @@ if MYPY_CHECK_RUNNING:
     from optparse import OptionParser, Values
     from pip._internal.cli.parser import ConfigOptionParser
 
-logger = logging.getLogger(__name__)
-
 
 def raise_option_error(parser, option, msg):
     # type: (OptionParser, Option, str) -> None
@@ -243,7 +240,7 @@ no_input = partial(
     dest='no_input',
     action='store_true',
     default=False,
-    help=SUPPRESS_HELP
+    help="Disable prompting for input."
 )  # type: Callable[..., Option]
 
 proxy = partial(
@@ -702,7 +699,8 @@ build_dir = partial(
     metavar='dir',
     action='callback',
     callback=_handle_build_dir,
-    help='Directory to unpack packages into and build in. Note that '
+    help='(DEPRECATED) '
+         'Directory to unpack packages into and build in. Note that '
          'an initial build still takes place in a temporary directory. '
          'The location of temporary directories can be controlled by setting '
          'the TMPDIR environment variable (TEMP on Windows) appropriately. '
@@ -824,16 +822,6 @@ disable_pip_version_check = partial(
 )  # type: Callable[..., Option]
 
 
-# Deprecated, Remove later
-always_unzip = partial(
-    Option,
-    '-Z', '--always-unzip',
-    dest='always_unzip',
-    action='store_true',
-    help=SUPPRESS_HELP,
-)  # type: Callable[..., Option]
-
-
 def _handle_merge_hash(option, opt_str, value, parser):
     # type: (Option, str, str, OptionParser) -> None
     """Given a value spelled "algo:digest", append the digest to a list
@@ -843,11 +831,11 @@ def _handle_merge_hash(option, opt_str, value, parser):
     try:
         algo, digest = value.split(':', 1)
     except ValueError:
-        parser.error('Arguments to {} must be a hash name '
+        parser.error('Arguments to {} must be a hash name '  # noqa
                      'followed by a value, like --hash=sha256:'
                      'abcde...'.format(opt_str))
     if algo not in STRONG_HASHES:
-        parser.error('Allowed hash algorithms for {} are {}.'.format(
+        parser.error('Allowed hash algorithms for {} are {}.'.format(  # noqa
                      opt_str, ', '.join(STRONG_HASHES)))
     parser.values.hashes.setdefault(algo, []).append(digest)
 
@@ -915,8 +903,31 @@ unstable_feature = partial(
     action='append',
     default=[],
     choices=['resolver'],
-    help=SUPPRESS_HELP,  # TODO: Enable this when the resolver actually works.
-    # help='Enable unstable feature(s) that may be backward incompatible.',
+    help=SUPPRESS_HELP,  # TODO: drop this in pip 20.3
+)  # type: Callable[..., Option]
+
+use_new_feature = partial(
+    Option,
+    '--use-feature',
+    dest='features_enabled',
+    metavar='feature',
+    action='append',
+    default=[],
+    choices=['2020-resolver', 'fast-deps'],
+    help='Enable new functionality, that may be backward incompatible.',
+)  # type: Callable[..., Option]
+
+use_deprecated_feature = partial(
+    Option,
+    '--use-deprecated',
+    dest='deprecated_features_enabled',
+    metavar='feature',
+    action='append',
+    default=[],
+    choices=[],
+    help=(
+        'Enable deprecated functionality, that will be removed in the future.'
+    ),
 )  # type: Callable[..., Option]
 
 
@@ -948,6 +959,8 @@ general_group = {
         no_color,
         no_python_version_warning,
         unstable_feature,
+        use_new_feature,
+        use_deprecated_feature,
     ]
 }  # type: Dict[str, Any]
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/command_context.py b/venv/Lib/site-packages/pip/_internal/cli/command_context.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/command_context.py
rename to venv/Lib/site-packages/pip/_internal/cli/command_context.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/main.py b/venv/Lib/site-packages/pip/_internal/cli/main.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/main.py
rename to venv/Lib/site-packages/pip/_internal/cli/main.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py b/venv/Lib/site-packages/pip/_internal/cli/main_parser.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py
rename to venv/Lib/site-packages/pip/_internal/cli/main_parser.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/parser.py b/venv/Lib/site-packages/pip/_internal/cli/parser.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/parser.py
rename to venv/Lib/site-packages/pip/_internal/cli/parser.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/progress_bars.py b/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py
similarity index 93%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/progress_bars.py
rename to venv/Lib/site-packages/pip/_internal/cli/progress_bars.py
index 7ed2247..6933855 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/cli/progress_bars.py
+++ b/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py
@@ -78,6 +78,7 @@ class InterruptibleMixin(object):
         """
         Save the original SIGINT handler for later.
         """
+        # https://github.com/python/mypy/issues/5887
         super(InterruptibleMixin, self).__init__(  # type: ignore
             *args,
             **kwargs
@@ -134,6 +135,7 @@ class DownloadProgressMixin(object):
 
     def __init__(self, *args, **kwargs):
         # type: (List[Any], Dict[Any, Any]) -> None
+        # https://github.com/python/mypy/issues/5887
         super(DownloadProgressMixin, self).__init__(  # type: ignore
             *args,
             **kwargs
@@ -165,7 +167,9 @@ class DownloadProgressMixin(object):
     def iter(self, it):  # type: ignore
         for x in it:
             yield x
-            self.next(len(x))
+            # B305 is incorrectly raised here
+            # https://github.com/PyCQA/flake8-bugbear/issues/59
+            self.next(len(x))  # noqa: B305
         self.finish()
 
 
@@ -183,6 +187,7 @@ class WindowsMixin(object):
         if WINDOWS and self.hide_cursor:  # type: ignore
             self.hide_cursor = False
 
+        # https://github.com/python/mypy/issues/5887
         super(WindowsMixin, self).__init__(*args, **kwargs)  # type: ignore
 
         # Check if we are running on Windows and we have the colorama module,
@@ -206,30 +211,27 @@ class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin,
     message = "%(percent)d%%"
     suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s"
 
-# NOTE: The "type: ignore" comments on the following classes are there to
-#       work around https://github.com/python/typing/issues/241
-
 
 class DefaultDownloadProgressBar(BaseDownloadProgressBar,
                                  _BaseBar):
     pass
 
 
-class DownloadSilentBar(BaseDownloadProgressBar, SilentBar):  # type: ignore
+class DownloadSilentBar(BaseDownloadProgressBar, SilentBar):
     pass
 
 
-class DownloadBar(BaseDownloadProgressBar,  # type: ignore
+class DownloadBar(BaseDownloadProgressBar,
                   Bar):
     pass
 
 
-class DownloadFillingCirclesBar(BaseDownloadProgressBar,  # type: ignore
+class DownloadFillingCirclesBar(BaseDownloadProgressBar,
                                 FillingCirclesBar):
     pass
 
 
-class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar,  # type: ignore
+class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar,
                                    BlueEmojiBar):
     pass
 
@@ -240,7 +242,8 @@ class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin,
     file = sys.stdout
     suffix = "%(downloaded)s %(download_speed)s"
 
-    def next_phase(self):  # type: ignore
+    def next_phase(self):
+        # type: () -> str
         if not hasattr(self, "_phaser"):
             self._phaser = itertools.cycle(self.phases)
         return next(self._phaser)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/req_command.py b/venv/Lib/site-packages/pip/_internal/cli/req_command.py
similarity index 93%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/req_command.py
rename to venv/Lib/site-packages/pip/_internal/cli/req_command.py
index 104b033..78b5ce6 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/cli/req_command.py
+++ b/venv/Lib/site-packages/pip/_internal/cli/req_command.py
@@ -13,6 +13,7 @@ from pip._internal.cli import cmdoptions
 from pip._internal.cli.base_command import Command
 from pip._internal.cli.command_context import CommandContextMixIn
 from pip._internal.exceptions import CommandError, PreviousBuildDirError
+from pip._internal.index.collector import LinkCollector
 from pip._internal.index.package_finder import PackageFinder
 from pip._internal.models.selection_prefs import SelectionPreferences
 from pip._internal.network.download import Downloader
@@ -25,11 +26,7 @@ from pip._internal.req.constructors import (
     install_req_from_req_string,
 )
 from pip._internal.req.req_file import parse_requirements
-from pip._internal.req.req_set import RequirementSet
-from pip._internal.self_outdated_check import (
-    make_link_collector,
-    pip_self_version_check,
-)
+from pip._internal.self_outdated_check import pip_self_version_check
 from pip._internal.utils.temp_dir import tempdir_kinds
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
@@ -260,7 +257,7 @@ class RequirementCommand(IndexGroupCommand):
         # The long import name and duplicated invocation is needed to convince
         # Mypy into correctly typechecking. Otherwise it would complain the
         # "Resolver" class being redefined.
-        if 'resolver' in options.unstable_features:
+        if '2020-resolver' in options.features_enabled:
             import pip._internal.resolution.resolvelib.resolver
             return pip._internal.resolution.resolvelib.resolver.Resolver(
                 preparer=preparer,
@@ -274,6 +271,7 @@ class RequirementCommand(IndexGroupCommand):
                 force_reinstall=force_reinstall,
                 upgrade_strategy=upgrade_strategy,
                 py_version_info=py_version_info,
+                lazy_wheel='fast-deps' in options.features_enabled,
             )
         import pip._internal.resolution.legacy.resolver
         return pip._internal.resolution.legacy.resolver.Resolver(
@@ -296,15 +294,12 @@ class RequirementCommand(IndexGroupCommand):
         options,          # type: Values
         finder,           # type: PackageFinder
         session,          # type: PipSession
-        check_supported_wheels=True,  # type: bool
     ):
         # type: (...) -> List[InstallRequirement]
         """
         Parse command-line arguments into the corresponding requirements.
         """
-        requirement_set = RequirementSet(
-            check_supported_wheels=check_supported_wheels
-        )
+        requirements = []  # type: List[InstallRequirement]
         for filename in options.constraints:
             for parsed_req in parse_requirements(
                     filename,
@@ -313,26 +308,26 @@ class RequirementCommand(IndexGroupCommand):
                 req_to_add = install_req_from_parsed_requirement(
                     parsed_req,
                     isolated=options.isolated_mode,
+                    user_supplied=False,
                 )
-                req_to_add.is_direct = True
-                requirement_set.add_requirement(req_to_add)
+                requirements.append(req_to_add)
 
         for req in args:
             req_to_add = install_req_from_line(
                 req, None, isolated=options.isolated_mode,
                 use_pep517=options.use_pep517,
+                user_supplied=True,
             )
-            req_to_add.is_direct = True
-            requirement_set.add_requirement(req_to_add)
+            requirements.append(req_to_add)
 
         for req in options.editables:
             req_to_add = install_req_from_editable(
                 req,
+                user_supplied=True,
                 isolated=options.isolated_mode,
                 use_pep517=options.use_pep517,
             )
-            req_to_add.is_direct = True
-            requirement_set.add_requirement(req_to_add)
+            requirements.append(req_to_add)
 
         # NOTE: options.require_hashes may be set if --require-hashes is True
         for filename in options.requirements:
@@ -342,13 +337,12 @@ class RequirementCommand(IndexGroupCommand):
                 req_to_add = install_req_from_parsed_requirement(
                     parsed_req,
                     isolated=options.isolated_mode,
-                    use_pep517=options.use_pep517
+                    use_pep517=options.use_pep517,
+                    user_supplied=True,
                 )
-                req_to_add.is_direct = True
-                requirement_set.add_requirement(req_to_add)
+                requirements.append(req_to_add)
 
         # If any requirement has hash options, enable hash checking.
-        requirements = requirement_set.all_requirements
         if any(req.has_hash_options for req in requirements):
             options.require_hashes = True
 
@@ -392,7 +386,7 @@ class RequirementCommand(IndexGroupCommand):
         :param ignore_requires_python: Whether to ignore incompatible
             "Requires-Python" values in links. Defaults to False.
         """
-        link_collector = make_link_collector(session, options=options)
+        link_collector = LinkCollector.create(session, options=options)
         selection_prefs = SelectionPreferences(
             allow_yanked=True,
             format_control=options.format_control,
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/spinners.py b/venv/Lib/site-packages/pip/_internal/cli/spinners.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/spinners.py
rename to venv/Lib/site-packages/pip/_internal/cli/spinners.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/cli/status_codes.py b/venv/Lib/site-packages/pip/_internal/cli/status_codes.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/cli/status_codes.py
rename to venv/Lib/site-packages/pip/_internal/cli/status_codes.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/__init__.py b/venv/Lib/site-packages/pip/_internal/commands/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/__init__.py
rename to venv/Lib/site-packages/pip/_internal/commands/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/cache.py b/venv/Lib/site-packages/pip/_internal/commands/cache.py
similarity index 92%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/cache.py
rename to venv/Lib/site-packages/pip/_internal/commands/cache.py
index ca6d437..747277f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/cache.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/cache.py
@@ -24,13 +24,13 @@ class CacheCommand(Command):
 
     Subcommands:
 
-        dir: Show the cache directory.
-        info: Show information about the cache.
-        list: List filenames of packages stored in the cache.
-        remove: Remove one or more package from the cache.
-        purge: Remove all items from the cache.
+    - dir: Show the cache directory.
+    - info: Show information about the cache.
+    - list: List filenames of packages stored in the cache.
+    - remove: Remove one or more package from the cache.
+    - purge: Remove all items from the cache.
 
-        <pattern> can be a glob expression or a package name.
+    ``<pattern>`` can be a glob expression or a package name.
     """
 
     ignore_require_venv = True
@@ -59,8 +59,9 @@ class CacheCommand(Command):
 
         # Determine action
         if not args or args[0] not in handlers:
-            logger.error("Need an action ({}) to perform.".format(
-                ", ".join(sorted(handlers)))
+            logger.error(
+                "Need an action (%s) to perform.",
+                ", ".join(sorted(handlers)),
             )
             return ERROR
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/check.py b/venv/Lib/site-packages/pip/_internal/commands/check.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/check.py
rename to venv/Lib/site-packages/pip/_internal/commands/check.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/completion.py b/venv/Lib/site-packages/pip/_internal/commands/completion.py
similarity index 83%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/completion.py
rename to venv/Lib/site-packages/pip/_internal/commands/completion.py
index 910fcbf..9b99f51 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/completion.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/completion.py
@@ -1,13 +1,16 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import sys
 import textwrap
 
 from pip._internal.cli.base_command import Command
+from pip._internal.cli.status_codes import SUCCESS
 from pip._internal.utils.misc import get_prog
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import List
+    from optparse import Values
 
 BASE_COMPLETION = """
 # pip {shell} completion start{script}# pip {shell} completion end
@@ -53,33 +56,31 @@ class CompletionCommand(Command):
 
     ignore_require_venv = True
 
-    def __init__(self, *args, **kw):
-        super(CompletionCommand, self).__init__(*args, **kw)
-
-        cmd_opts = self.cmd_opts
-
-        cmd_opts.add_option(
+    def add_options(self):
+        # type: () -> None
+        self.cmd_opts.add_option(
             '--bash', '-b',
             action='store_const',
             const='bash',
             dest='shell',
             help='Emit completion code for bash')
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--zsh', '-z',
             action='store_const',
             const='zsh',
             dest='shell',
             help='Emit completion code for zsh')
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--fish', '-f',
             action='store_const',
             const='fish',
             dest='shell',
             help='Emit completion code for fish')
 
-        self.parser.insert_option_group(0, cmd_opts)
+        self.parser.insert_option_group(0, self.cmd_opts)
 
     def run(self, options, args):
+        #  type: (Values, List[str]) -> int
         """Prints the completion code of the given shell"""
         shells = COMPLETION_SCRIPTS.keys()
         shell_options = ['--' + shell for shell in sorted(shells)]
@@ -89,7 +90,9 @@ class CompletionCommand(Command):
                     prog=get_prog())
             )
             print(BASE_COMPLETION.format(script=script, shell=options.shell))
+            return SUCCESS
         else:
             sys.stderr.write(
                 'ERROR: You must pass {}\n' .format(' or '.join(shell_options))
             )
+            return SUCCESS
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/configuration.py b/venv/Lib/site-packages/pip/_internal/commands/configuration.py
similarity index 69%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/configuration.py
rename to venv/Lib/site-packages/pip/_internal/commands/configuration.py
index b801be6..f9b3ab7 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/configuration.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/configuration.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 import logging
 import os
 import subprocess
@@ -13,21 +10,31 @@ from pip._internal.configuration import (
     kinds,
 )
 from pip._internal.exceptions import PipError
+from pip._internal.utils.logging import indent_log
 from pip._internal.utils.misc import get_prog, write_output
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import List, Any, Optional
+    from optparse import Values
+
+    from pip._internal.configuration import Kind
 
 logger = logging.getLogger(__name__)
 
 
 class ConfigurationCommand(Command):
-    """Manage local and global configuration.
+    """
+    Manage local and global configuration.
 
     Subcommands:
 
-        list: List the active configuration (or from the file specified)
-        edit: Edit the configuration file in an editor
-        get: Get the value associated with name
-        set: Set the name=value
-        unset: Unset the value associated with name
+    - list: List the active configuration (or from the file specified)
+    - edit: Edit the configuration file in an editor
+    - get: Get the value associated with name
+    - set: Set the name=value
+    - unset: Unset the value associated with name
+    - debug: List the configuration files and values defined under them
 
     If none of --user, --global and --site are passed, a virtual
     environment configuration file is used if one is active and the file
@@ -43,13 +50,11 @@ class ConfigurationCommand(Command):
         %prog [<file-option>] get name
         %prog [<file-option>] set name value
         %prog [<file-option>] unset name
+        %prog [<file-option>] debug
     """
 
-    def __init__(self, *args, **kwargs):
-        super(ConfigurationCommand, self).__init__(*args, **kwargs)
-
-        self.configuration = None
-
+    def add_options(self):
+        # type: () -> None
         self.cmd_opts.add_option(
             '--editor',
             dest='editor',
@@ -88,18 +93,21 @@ class ConfigurationCommand(Command):
         self.parser.insert_option_group(0, self.cmd_opts)
 
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
         handlers = {
             "list": self.list_values,
             "edit": self.open_in_editor,
             "get": self.get_name,
             "set": self.set_name_value,
-            "unset": self.unset_name
+            "unset": self.unset_name,
+            "debug": self.list_config_values,
         }
 
         # Determine action
         if not args or args[0] not in handlers:
-            logger.error("Need an action ({}) to perform.".format(
-                ", ".join(sorted(handlers)))
+            logger.error(
+                "Need an action (%s) to perform.",
+                ", ".join(sorted(handlers)),
             )
             return ERROR
 
@@ -131,6 +139,7 @@ class ConfigurationCommand(Command):
         return SUCCESS
 
     def _determine_file(self, options, need_value):
+        # type: (Values, bool) -> Optional[Kind]
         file_options = [key for key, value in (
             (kinds.USER, options.user_file),
             (kinds.GLOBAL, options.global_file),
@@ -157,30 +166,70 @@ class ConfigurationCommand(Command):
         )
 
     def list_values(self, options, args):
+        # type: (Values, List[str]) -> None
         self._get_n_args(args, "list", n=0)
 
         for key, value in sorted(self.configuration.items()):
             write_output("%s=%r", key, value)
 
     def get_name(self, options, args):
+        # type: (Values, List[str]) -> None
         key = self._get_n_args(args, "get [name]", n=1)
         value = self.configuration.get_value(key)
 
         write_output("%s", value)
 
     def set_name_value(self, options, args):
+        # type: (Values, List[str]) -> None
         key, value = self._get_n_args(args, "set [name] [value]", n=2)
         self.configuration.set_value(key, value)
 
         self._save_configuration()
 
     def unset_name(self, options, args):
+        # type: (Values, List[str]) -> None
         key = self._get_n_args(args, "unset [name]", n=1)
         self.configuration.unset_value(key)
 
         self._save_configuration()
 
+    def list_config_values(self, options, args):
+        # type: (Values, List[str]) -> None
+        """List config key-value pairs across different config files"""
+        self._get_n_args(args, "debug", n=0)
+
+        self.print_env_var_values()
+        # Iterate over config files and print if they exist, and the
+        # key-value pairs present in them if they do
+        for variant, files in sorted(self.configuration.iter_config_files()):
+            write_output("%s:", variant)
+            for fname in files:
+                with indent_log():
+                    file_exists = os.path.exists(fname)
+                    write_output("%s, exists: %r",
+                                 fname, file_exists)
+                    if file_exists:
+                        self.print_config_file_values(variant)
+
+    def print_config_file_values(self, variant):
+        # type: (Kind) -> None
+        """Get key-value pairs from the file of a variant"""
+        for name, value in self.configuration.\
+                get_values_in_config(variant).items():
+            with indent_log():
+                write_output("%s: %s", name, value)
+
+    def print_env_var_values(self):
+        # type: () -> None
+        """Get key-values pairs present as environment variables"""
+        write_output("%s:", 'env_var')
+        with indent_log():
+            for key, value in sorted(self.configuration.get_environ_vars()):
+                env_var = 'PIP_{}'.format(key.upper())
+                write_output("%s=%r", env_var, value)
+
     def open_in_editor(self, options, args):
+        # type: (Values, List[str]) -> None
         editor = self._determine_editor(options)
 
         fname = self.configuration.get_file_to_edit()
@@ -196,6 +245,7 @@ class ConfigurationCommand(Command):
             )
 
     def _get_n_args(self, args, example, n):
+        # type: (List[str], str, int) -> Any
         """Helper to make sure the command got the right number of arguments
         """
         if len(args) != n:
@@ -211,18 +261,19 @@ class ConfigurationCommand(Command):
             return args
 
     def _save_configuration(self):
+        # type: () -> None
         # We successfully ran a modifying command. Need to save the
         # configuration.
         try:
             self.configuration.save()
         except Exception:
-            logger.error(
-                "Unable to save configuration. Please report this as a bug.",
-                exc_info=1
+            logger.exception(
+                "Unable to save configuration. Please report this as a bug."
             )
             raise PipError("Internal Error.")
 
     def _determine_editor(self, options):
+        # type: (Values) -> str
         if options.editor is not None:
             return options.editor
         elif "VISUAL" in os.environ:
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/debug.py b/venv/Lib/site-packages/pip/_internal/commands/debug.py
similarity index 86%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/debug.py
rename to venv/Lib/site-packages/pip/_internal/commands/debug.py
index b7c92fa..ff369d7 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/debug.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/debug.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import locale
@@ -23,15 +20,16 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 if MYPY_CHECK_RUNNING:
     from types import ModuleType
-    from typing import Any, List, Optional, Dict
+    from typing import List, Optional, Dict
     from optparse import Values
+    from pip._internal.configuration import Configuration
 
 logger = logging.getLogger(__name__)
 
 
 def show_value(name, value):
     # type: (str, Optional[str]) -> None
-    logger.info('{}: {}'.format(name, value))
+    logger.info('%s: %s', name, value)
 
 
 def show_sys_implementation():
@@ -67,7 +65,6 @@ def create_vendor_txt_map():
 
 def get_module_from_module_name(module_name):
     # type: (str) -> ModuleType
-
     # Module name can be uppercase in vendor.txt for some reason...
     module_name = module_name.lower()
     # PATCH: setuptools is actually only pkg_resources.
@@ -84,15 +81,18 @@ def get_module_from_module_name(module_name):
 
 
 def get_vendor_version_from_module(module_name):
-    # type: (str) -> str
-
+    # type: (str) -> Optional[str]
     module = get_module_from_module_name(module_name)
     version = getattr(module, '__version__', None)
 
     if not version:
         # Try to find version in debundled module info
+        # The type for module.__file__ is Optional[str] in
+        # Python 2, and str in Python 3. The type: ignore is
+        # added to account for Python 2, instead of a cast
+        # and should be removed once we drop Python 2 support
         pkg_set = pkg_resources.WorkingSet(
-            [os.path.dirname(getattr(module, '__file__'))]
+            [os.path.dirname(module.__file__)]  # type: ignore
         )
         package = pkg_set.find(pkg_resources.Requirement.parse(module_name))
         version = getattr(package, 'version', None)
@@ -102,9 +102,9 @@ def get_vendor_version_from_module(module_name):
 
 def show_actual_vendor_versions(vendor_txt_versions):
     # type: (Dict[str, str]) -> None
-    # Logs the actual version and print extra info
-    # if there is a conflict or if the actual version could not be imported.
-
+    """Log the actual version and print extra info if there is
+    a conflict or if the actual version could not be imported.
+    """
     for module_name, expected_version in vendor_txt_versions.items():
         extra_message = ''
         actual_version = get_vendor_version_from_module(module_name)
@@ -115,14 +115,7 @@ def show_actual_vendor_versions(vendor_txt_versions):
         elif actual_version != expected_version:
             extra_message = ' (CONFLICT: vendor.txt suggests version should'\
                             ' be {})'.format(expected_version)
-
-        logger.info(
-            '{name}=={actual}{extra}'.format(
-                name=module_name,
-                actual=actual_version,
-                extra=extra_message
-            )
-        )
+        logger.info('%s==%s%s', module_name, actual_version, extra_message)
 
 
 def show_vendor_versions():
@@ -169,8 +162,9 @@ def show_tags(options):
 
 
 def ca_bundle_info(config):
+    # type: (Configuration) -> str
     levels = set()
-    for key, value in config.items():
+    for key, _ in config.items():
         levels.add(key.split('.')[0])
 
     if not levels:
@@ -197,16 +191,14 @@ class DebugCommand(Command):
       %prog <options>"""
     ignore_require_venv = True
 
-    def __init__(self, *args, **kw):
-        super(DebugCommand, self).__init__(*args, **kw)
-
-        cmd_opts = self.cmd_opts
-        cmdoptions.add_target_python_options(cmd_opts)
-        self.parser.insert_option_group(0, cmd_opts)
+    def add_options(self):
+        # type: () -> None
+        cmdoptions.add_target_python_options(self.cmd_opts)
+        self.parser.insert_option_group(0, self.cmd_opts)
         self.parser.config.load()
 
     def run(self, options, args):
-        # type: (Values, List[Any]) -> int
+        # type: (Values, List[str]) -> int
         logger.warning(
             "This command is only meant for debugging. "
             "Do not use this with automation for parsing and getting these "
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/download.py b/venv/Lib/site-packages/pip/_internal/commands/download.py
similarity index 68%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/download.py
rename to venv/Lib/site-packages/pip/_internal/commands/download.py
index c829550..46e8371 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/download.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/download.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import logging
@@ -9,9 +6,15 @@ import os
 from pip._internal.cli import cmdoptions
 from pip._internal.cli.cmdoptions import make_target_python
 from pip._internal.cli.req_command import RequirementCommand, with_cleanup
+from pip._internal.cli.status_codes import SUCCESS
 from pip._internal.req.req_tracker import get_requirement_tracker
 from pip._internal.utils.misc import ensure_dir, normalize_path, write_output
 from pip._internal.utils.temp_dir import TempDirectory
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from optparse import Values
+    from typing import List
 
 logger = logging.getLogger(__name__)
 
@@ -36,28 +39,25 @@ class DownloadCommand(RequirementCommand):
       %prog [options] <local project path> ...
       %prog [options] <archive url/path> ..."""
 
-    def __init__(self, *args, **kw):
-        super(DownloadCommand, self).__init__(*args, **kw)
-
-        cmd_opts = self.cmd_opts
-
-        cmd_opts.add_option(cmdoptions.constraints())
-        cmd_opts.add_option(cmdoptions.requirements())
-        cmd_opts.add_option(cmdoptions.build_dir())
-        cmd_opts.add_option(cmdoptions.no_deps())
-        cmd_opts.add_option(cmdoptions.global_options())
-        cmd_opts.add_option(cmdoptions.no_binary())
-        cmd_opts.add_option(cmdoptions.only_binary())
-        cmd_opts.add_option(cmdoptions.prefer_binary())
-        cmd_opts.add_option(cmdoptions.src())
-        cmd_opts.add_option(cmdoptions.pre())
-        cmd_opts.add_option(cmdoptions.require_hashes())
-        cmd_opts.add_option(cmdoptions.progress_bar())
-        cmd_opts.add_option(cmdoptions.no_build_isolation())
-        cmd_opts.add_option(cmdoptions.use_pep517())
-        cmd_opts.add_option(cmdoptions.no_use_pep517())
-
-        cmd_opts.add_option(
+    def add_options(self):
+        # type: () -> None
+        self.cmd_opts.add_option(cmdoptions.constraints())
+        self.cmd_opts.add_option(cmdoptions.requirements())
+        self.cmd_opts.add_option(cmdoptions.build_dir())
+        self.cmd_opts.add_option(cmdoptions.no_deps())
+        self.cmd_opts.add_option(cmdoptions.global_options())
+        self.cmd_opts.add_option(cmdoptions.no_binary())
+        self.cmd_opts.add_option(cmdoptions.only_binary())
+        self.cmd_opts.add_option(cmdoptions.prefer_binary())
+        self.cmd_opts.add_option(cmdoptions.src())
+        self.cmd_opts.add_option(cmdoptions.pre())
+        self.cmd_opts.add_option(cmdoptions.require_hashes())
+        self.cmd_opts.add_option(cmdoptions.progress_bar())
+        self.cmd_opts.add_option(cmdoptions.no_build_isolation())
+        self.cmd_opts.add_option(cmdoptions.use_pep517())
+        self.cmd_opts.add_option(cmdoptions.no_use_pep517())
+
+        self.cmd_opts.add_option(
             '-d', '--dest', '--destination-dir', '--destination-directory',
             dest='download_dir',
             metavar='dir',
@@ -65,7 +65,7 @@ class DownloadCommand(RequirementCommand):
             help=("Download packages into <dir>."),
         )
 
-        cmdoptions.add_target_python_options(cmd_opts)
+        cmdoptions.add_target_python_options(self.cmd_opts)
 
         index_opts = cmdoptions.make_option_group(
             cmdoptions.index_group,
@@ -73,10 +73,12 @@ class DownloadCommand(RequirementCommand):
         )
 
         self.parser.insert_option_group(0, index_opts)
-        self.parser.insert_option_group(0, cmd_opts)
+        self.parser.insert_option_group(0, self.cmd_opts)
 
     @with_cleanup
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
+
         options.ignore_installed = True
         # editable doesn't really make sense for `pip download`, but the bowels
         # of the RequirementSet code require that property.
@@ -132,11 +134,10 @@ class DownloadCommand(RequirementCommand):
             reqs, check_supported_wheels=True
         )
 
-        downloaded = ' '.join([
-            req.name for req in requirement_set.requirements.values()
-            if req.successfully_downloaded
-        ])
+        downloaded = ' '.join([req.name  # type: ignore
+                               for req in requirement_set.requirements.values()
+                               if req.successfully_downloaded])
         if downloaded:
             write_output('Successfully downloaded %s', downloaded)
 
-        return requirement_set
+        return SUCCESS
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/freeze.py b/venv/Lib/site-packages/pip/_internal/commands/freeze.py
similarity index 90%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/freeze.py
rename to venv/Lib/site-packages/pip/_internal/commands/freeze.py
index 1317177..2071fba 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/freeze.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/freeze.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import sys
@@ -8,12 +5,18 @@ import sys
 from pip._internal.cache import WheelCache
 from pip._internal.cli import cmdoptions
 from pip._internal.cli.base_command import Command
+from pip._internal.cli.status_codes import SUCCESS
 from pip._internal.models.format_control import FormatControl
 from pip._internal.operations.freeze import freeze
 from pip._internal.utils.compat import stdlib_pkgs
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'}
 
+if MYPY_CHECK_RUNNING:
+    from optparse import Values
+    from typing import List
+
 
 class FreezeCommand(Command):
     """
@@ -26,9 +29,8 @@ class FreezeCommand(Command):
       %prog [options]"""
     log_streams = ("ext://sys.stderr", "ext://sys.stderr")
 
-    def __init__(self, *args, **kw):
-        super(FreezeCommand, self).__init__(*args, **kw)
-
+    def add_options(self):
+        # type: () -> None
         self.cmd_opts.add_option(
             '-r', '--requirement',
             dest='requirements',
@@ -75,6 +77,7 @@ class FreezeCommand(Command):
         self.parser.insert_option_group(0, self.cmd_opts)
 
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
         format_control = FormatControl(set(), set())
         wheel_cache = WheelCache(options.cache_dir, format_control)
         skip = set(stdlib_pkgs)
@@ -97,3 +100,4 @@ class FreezeCommand(Command):
 
         for line in freeze(**freeze_kwargs):
             sys.stdout.write(line + '\n')
+        return SUCCESS
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/hash.py b/venv/Lib/site-packages/pip/_internal/commands/hash.py
similarity index 81%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/hash.py
rename to venv/Lib/site-packages/pip/_internal/commands/hash.py
index f266861..37831c3 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/hash.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/hash.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import hashlib
@@ -8,9 +5,14 @@ import logging
 import sys
 
 from pip._internal.cli.base_command import Command
-from pip._internal.cli.status_codes import ERROR
+from pip._internal.cli.status_codes import ERROR, SUCCESS
 from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES
 from pip._internal.utils.misc import read_chunks, write_output
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from optparse import Values
+    from typing import List
 
 logger = logging.getLogger(__name__)
 
@@ -26,8 +28,8 @@ class HashCommand(Command):
     usage = '%prog [options] <file> ...'
     ignore_require_venv = True
 
-    def __init__(self, *args, **kw):
-        super(HashCommand, self).__init__(*args, **kw)
+    def add_options(self):
+        # type: () -> None
         self.cmd_opts.add_option(
             '-a', '--algorithm',
             dest='algorithm',
@@ -39,6 +41,7 @@ class HashCommand(Command):
         self.parser.insert_option_group(0, self.cmd_opts)
 
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
         if not args:
             self.parser.print_usage(sys.stderr)
             return ERROR
@@ -47,9 +50,11 @@ class HashCommand(Command):
         for path in args:
             write_output('%s:\n--hash=%s:%s',
                          path, algorithm, _hash_of_file(path, algorithm))
+        return SUCCESS
 
 
 def _hash_of_file(path, algorithm):
+    # type: (str, str) -> str
     """Return the hash digest of a file."""
     with open(path, 'rb') as archive:
         hash = hashlib.new(algorithm)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/help.py b/venv/Lib/site-packages/pip/_internal/commands/help.py
similarity index 85%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/help.py
rename to venv/Lib/site-packages/pip/_internal/commands/help.py
index c17d7a4..a2edc29 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/help.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/help.py
@@ -1,11 +1,13 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 from pip._internal.cli.base_command import Command
 from pip._internal.cli.status_codes import SUCCESS
 from pip._internal.exceptions import CommandError
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import List
+    from optparse import Values
 
 
 class HelpCommand(Command):
@@ -16,6 +18,7 @@ class HelpCommand(Command):
     ignore_require_venv = True
 
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
         from pip._internal.commands import (
             commands_dict, create_command, get_similar_commands,
         )
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/install.py b/venv/Lib/site-packages/pip/_internal/commands/install.py
similarity index 66%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/install.py
rename to venv/Lib/site-packages/pip/_internal/commands/install.py
index 70bda2e..8c2c32f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/install.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/install.py
@@ -1,10 +1,3 @@
-# The following comment should be removed at some point in the future.
-# It's included for now because without it InstallCommand.run() has a
-# couple errors where we have to know req.name is str rather than
-# Optional[str] for the InstallRequirement req.
-# mypy: strict-optional=False
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import errno
@@ -28,12 +21,14 @@ from pip._internal.locations import distutils_scheme
 from pip._internal.operations.check import check_install_conflicts
 from pip._internal.req import install_given_reqs
 from pip._internal.req.req_tracker import get_requirement_tracker
+from pip._internal.utils.datetime import today_is_later_than
 from pip._internal.utils.deprecation import deprecated
 from pip._internal.utils.distutils_args import parse_distutils_args
 from pip._internal.utils.filesystem import test_writable_dir
 from pip._internal.utils.misc import (
     ensure_dir,
     get_installed_version,
+    get_pip_version,
     protect_pip_from_modification_on_windows,
     write_output,
 )
@@ -44,9 +39,10 @@ from pip._internal.wheel_builder import build, should_build_for_install_command
 
 if MYPY_CHECK_RUNNING:
     from optparse import Values
-    from typing import Any, Iterable, List, Optional
+    from typing import Iterable, List, Optional
 
     from pip._internal.models.format_control import FormatControl
+    from pip._internal.operations.check import ConflictDetails
     from pip._internal.req.req_install import InstallRequirement
     from pip._internal.wheel_builder import BinaryAllowedPredicate
 
@@ -87,18 +83,15 @@ class InstallCommand(RequirementCommand):
       %prog [options] [-e] <local project path> ...
       %prog [options] <archive url/path> ..."""
 
-    def __init__(self, *args, **kw):
-        super(InstallCommand, self).__init__(*args, **kw)
-
-        cmd_opts = self.cmd_opts
-
-        cmd_opts.add_option(cmdoptions.requirements())
-        cmd_opts.add_option(cmdoptions.constraints())
-        cmd_opts.add_option(cmdoptions.no_deps())
-        cmd_opts.add_option(cmdoptions.pre())
+    def add_options(self):
+        # type: () -> None
+        self.cmd_opts.add_option(cmdoptions.requirements())
+        self.cmd_opts.add_option(cmdoptions.constraints())
+        self.cmd_opts.add_option(cmdoptions.no_deps())
+        self.cmd_opts.add_option(cmdoptions.pre())
 
-        cmd_opts.add_option(cmdoptions.editable())
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(cmdoptions.editable())
+        self.cmd_opts.add_option(
             '-t', '--target',
             dest='target_dir',
             metavar='dir',
@@ -108,9 +101,9 @@ class InstallCommand(RequirementCommand):
                  '<dir>. Use --upgrade to replace existing packages in <dir> '
                  'with new versions.'
         )
-        cmdoptions.add_target_python_options(cmd_opts)
+        cmdoptions.add_target_python_options(self.cmd_opts)
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--user',
             dest='use_user_site',
             action='store_true',
@@ -118,19 +111,19 @@ class InstallCommand(RequirementCommand):
                  "platform. Typically ~/.local/, or %APPDATA%\\Python on "
                  "Windows. (See the Python documentation for site.USER_BASE "
                  "for full details.)")
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--no-user',
             dest='use_user_site',
             action='store_false',
             help=SUPPRESS_HELP)
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--root',
             dest='root_path',
             metavar='dir',
             default=None,
             help="Install everything relative to this alternate root "
                  "directory.")
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--prefix',
             dest='prefix_path',
             metavar='dir',
@@ -138,11 +131,11 @@ class InstallCommand(RequirementCommand):
             help="Installation prefix where lib, bin and other top-level "
                  "folders are placed")
 
-        cmd_opts.add_option(cmdoptions.build_dir())
+        self.cmd_opts.add_option(cmdoptions.build_dir())
 
-        cmd_opts.add_option(cmdoptions.src())
+        self.cmd_opts.add_option(cmdoptions.src())
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '-U', '--upgrade',
             dest='upgrade',
             action='store_true',
@@ -151,7 +144,7 @@ class InstallCommand(RequirementCommand):
                  'upgrade-strategy used.'
         )
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--upgrade-strategy',
             dest='upgrade_strategy',
             default='only-if-needed',
@@ -165,14 +158,14 @@ class InstallCommand(RequirementCommand):
                  'satisfy the requirements of the upgraded package(s).'
         )
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--force-reinstall',
             dest='force_reinstall',
             action='store_true',
             help='Reinstall all packages even if they are already '
                  'up-to-date.')
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '-I', '--ignore-installed',
             dest='ignore_installed',
             action='store_true',
@@ -182,15 +175,15 @@ class InstallCommand(RequirementCommand):
                  'with a different package manager!'
         )
 
-        cmd_opts.add_option(cmdoptions.ignore_requires_python())
-        cmd_opts.add_option(cmdoptions.no_build_isolation())
-        cmd_opts.add_option(cmdoptions.use_pep517())
-        cmd_opts.add_option(cmdoptions.no_use_pep517())
+        self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
+        self.cmd_opts.add_option(cmdoptions.no_build_isolation())
+        self.cmd_opts.add_option(cmdoptions.use_pep517())
+        self.cmd_opts.add_option(cmdoptions.no_use_pep517())
 
-        cmd_opts.add_option(cmdoptions.install_options())
-        cmd_opts.add_option(cmdoptions.global_options())
+        self.cmd_opts.add_option(cmdoptions.install_options())
+        self.cmd_opts.add_option(cmdoptions.global_options())
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             "--compile",
             action="store_true",
             dest="compile",
@@ -198,21 +191,21 @@ class InstallCommand(RequirementCommand):
             help="Compile Python source files to bytecode",
         )
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             "--no-compile",
             action="store_false",
             dest="compile",
             help="Do not compile Python source files to bytecode",
         )
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             "--no-warn-script-location",
             action="store_false",
             dest="warn_script_location",
             default=True,
             help="Do not warn when installing scripts outside PATH",
         )
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             "--no-warn-conflicts",
             action="store_false",
             dest="warn_about_conflicts",
@@ -220,11 +213,11 @@ class InstallCommand(RequirementCommand):
             help="Do not warn about broken dependencies",
         )
 
-        cmd_opts.add_option(cmdoptions.no_binary())
-        cmd_opts.add_option(cmdoptions.only_binary())
-        cmd_opts.add_option(cmdoptions.prefer_binary())
-        cmd_opts.add_option(cmdoptions.require_hashes())
-        cmd_opts.add_option(cmdoptions.progress_bar())
+        self.cmd_opts.add_option(cmdoptions.no_binary())
+        self.cmd_opts.add_option(cmdoptions.only_binary())
+        self.cmd_opts.add_option(cmdoptions.prefer_binary())
+        self.cmd_opts.add_option(cmdoptions.require_hashes())
+        self.cmd_opts.add_option(cmdoptions.progress_bar())
 
         index_opts = cmdoptions.make_option_group(
             cmdoptions.index_group,
@@ -232,11 +225,11 @@ class InstallCommand(RequirementCommand):
         )
 
         self.parser.insert_option_group(0, index_opts)
-        self.parser.insert_option_group(0, cmd_opts)
+        self.parser.insert_option_group(0, self.cmd_opts)
 
     @with_cleanup
     def run(self, options, args):
-        # type: (Values, List[Any]) -> int
+        # type: (Values, List[str]) -> int
         if options.use_user_site and options.target_dir is not None:
             raise CommandError("Can not combine '--user' and '--target'")
 
@@ -249,6 +242,7 @@ class InstallCommand(RequirementCommand):
 
         install_options = options.install_options or []
 
+        logger.debug("Using %s", get_pip_version())
         options.use_user_site = decide_user_install(
             options.use_user_site,
             prefix_path=options.prefix_path,
@@ -272,6 +266,7 @@ class InstallCommand(RequirementCommand):
             # Create a target directory for using with the target option
             target_temp_dir = TempDirectory(kind="target")
             target_temp_dir_path = target_temp_dir.path
+            self.enter_context(target_temp_dir)
 
         global_options = options.global_options or []
 
@@ -297,12 +292,9 @@ class InstallCommand(RequirementCommand):
         )
 
         try:
-            reqs = self.get_requirements(
-                args, options, finder, session,
-                check_supported_wheels=not options.target_dir,
-            )
+            reqs = self.get_requirements(args, options, finder, session)
 
-            warn_deprecated_install_options(
+            reject_location_related_install_options(
                 reqs, options.install_options
             )
 
@@ -336,7 +328,7 @@ class InstallCommand(RequirementCommand):
             try:
                 pip_req = requirement_set.get_requirement("pip")
             except KeyError:
-                modifying_pip = None
+                modifying_pip = False
             else:
                 # If we're not replacing an already installed pip,
                 # we're not modifying it.
@@ -365,29 +357,51 @@ class InstallCommand(RequirementCommand):
 
             # If we're using PEP 517, we cannot do a direct install
             # so we fail here.
-            # We don't care about failures building legacy
-            # requirements, as we'll fall through to a direct
-            # install for those.
-            pep517_build_failures = [
-                r for r in build_failures if r.use_pep517
-            ]
-            if pep517_build_failures:
+            pep517_build_failure_names = [
+                r.name   # type: ignore
+                for r in build_failures if r.use_pep517
+            ]  # type: List[str]
+            if pep517_build_failure_names:
                 raise InstallationError(
                     "Could not build wheels for {} which use"
                     " PEP 517 and cannot be installed directly".format(
-                        ", ".join(r.name for r in pep517_build_failures)))
+                        ", ".join(pep517_build_failure_names)
+                    )
+                )
+
+            # For now, we just warn about failures building legacy
+            # requirements, as we'll fall through to a direct
+            # install for those.
+            legacy_build_failure_names = [
+                r.name  # type: ignore
+                for r in build_failures if not r.use_pep517
+            ]  # type: List[str]
+            if legacy_build_failure_names:
+                deprecated(
+                    reason=(
+                        "Could not build wheels for {} which do not use "
+                        "PEP 517. pip will fall back to legacy 'setup.py "
+                        "install' for these.".format(
+                            ", ".join(legacy_build_failure_names)
+                        )
+                    ),
+                    replacement="to fix the wheel build issue reported above",
+                    gone_in="21.0",
+                    issue=8368,
+                )
 
             to_install = resolver.get_installation_order(
                 requirement_set
             )
 
-            # Consistency Checking of the package set we're installing.
+            # Check for conflicts in the package set we're installing.
+            conflicts = None  # type: Optional[ConflictDetails]
             should_warn_about_conflicts = (
                 not options.ignore_dependencies and
                 options.warn_about_conflicts
             )
             if should_warn_about_conflicts:
-                self._warn_about_conflicts(to_install)
+                conflicts = self._determine_conflicts(to_install)
 
             # Don't warn about script install locations if
             # --target has been specified
@@ -402,9 +416,9 @@ class InstallCommand(RequirementCommand):
                 root=options.root_path,
                 home=target_temp_dir_path,
                 prefix=options.prefix_path,
-                pycompile=options.compile,
                 warn_script_location=warn_script_location,
                 use_user_site=options.use_user_site,
+                pycompile=options.compile,
             )
 
             lib_locations = get_lib_location_guesses(
@@ -429,6 +443,13 @@ class InstallCommand(RequirementCommand):
                 except Exception:
                     pass
                 items.append(item)
+
+            if conflicts is not None:
+                self._warn_about_conflicts(
+                    conflicts,
+                    new_resolver='2020-resolver' in options.features_enabled,
+                )
+
             installed_desc = ' '.join(items)
             if installed_desc:
                 write_output(
@@ -440,11 +461,12 @@ class InstallCommand(RequirementCommand):
             message = create_env_error_message(
                 error, show_traceback, options.use_user_site,
             )
-            logger.error(message, exc_info=show_traceback)
+            logger.error(message, exc_info=show_traceback)  # noqa
 
             return ERROR
 
         if options.target_dir:
+            assert target_temp_dir
             self._handle_target_dir(
                 options.target_dir, target_temp_dir, options.upgrade
             )
@@ -452,96 +474,154 @@ class InstallCommand(RequirementCommand):
         return SUCCESS
 
     def _handle_target_dir(self, target_dir, target_temp_dir, upgrade):
+        # type: (str, TempDirectory, bool) -> None
         ensure_dir(target_dir)
 
         # Checking both purelib and platlib directories for installed
         # packages to be moved to target directory
         lib_dir_list = []
 
-        with target_temp_dir:
-            # Checking both purelib and platlib directories for installed
-            # packages to be moved to target directory
-            scheme = distutils_scheme('', home=target_temp_dir.path)
-            purelib_dir = scheme['purelib']
-            platlib_dir = scheme['platlib']
-            data_dir = scheme['data']
-
-            if os.path.exists(purelib_dir):
-                lib_dir_list.append(purelib_dir)
-            if os.path.exists(platlib_dir) and platlib_dir != purelib_dir:
-                lib_dir_list.append(platlib_dir)
-            if os.path.exists(data_dir):
-                lib_dir_list.append(data_dir)
-
-            for lib_dir in lib_dir_list:
-                for item in os.listdir(lib_dir):
-                    if lib_dir == data_dir:
-                        ddir = os.path.join(data_dir, item)
-                        if any(s.startswith(ddir) for s in lib_dir_list[:-1]):
-                            continue
-                    target_item_dir = os.path.join(target_dir, item)
-                    if os.path.exists(target_item_dir):
-                        if not upgrade:
-                            logger.warning(
-                                'Target directory %s already exists. Specify '
-                                '--upgrade to force replacement.',
-                                target_item_dir
-                            )
-                            continue
-                        if os.path.islink(target_item_dir):
-                            logger.warning(
-                                'Target directory %s already exists and is '
-                                'a link. pip will not automatically replace '
-                                'links, please remove if replacement is '
-                                'desired.',
-                                target_item_dir
-                            )
-                            continue
-                        if os.path.isdir(target_item_dir):
-                            shutil.rmtree(target_item_dir)
-                        else:
-                            os.remove(target_item_dir)
-
-                    shutil.move(
-                        os.path.join(lib_dir, item),
-                        target_item_dir
-                    )
+        # Checking both purelib and platlib directories for installed
+        # packages to be moved to target directory
+        scheme = distutils_scheme('', home=target_temp_dir.path)
+        purelib_dir = scheme['purelib']
+        platlib_dir = scheme['platlib']
+        data_dir = scheme['data']
+
+        if os.path.exists(purelib_dir):
+            lib_dir_list.append(purelib_dir)
+        if os.path.exists(platlib_dir) and platlib_dir != purelib_dir:
+            lib_dir_list.append(platlib_dir)
+        if os.path.exists(data_dir):
+            lib_dir_list.append(data_dir)
+
+        for lib_dir in lib_dir_list:
+            for item in os.listdir(lib_dir):
+                if lib_dir == data_dir:
+                    ddir = os.path.join(data_dir, item)
+                    if any(s.startswith(ddir) for s in lib_dir_list[:-1]):
+                        continue
+                target_item_dir = os.path.join(target_dir, item)
+                if os.path.exists(target_item_dir):
+                    if not upgrade:
+                        logger.warning(
+                            'Target directory %s already exists. Specify '
+                            '--upgrade to force replacement.',
+                            target_item_dir
+                        )
+                        continue
+                    if os.path.islink(target_item_dir):
+                        logger.warning(
+                            'Target directory %s already exists and is '
+                            'a link. pip will not automatically replace '
+                            'links, please remove if replacement is '
+                            'desired.',
+                            target_item_dir
+                        )
+                        continue
+                    if os.path.isdir(target_item_dir):
+                        shutil.rmtree(target_item_dir)
+                    else:
+                        os.remove(target_item_dir)
+
+                shutil.move(
+                    os.path.join(lib_dir, item),
+                    target_item_dir
+                )
 
-    def _warn_about_conflicts(self, to_install):
+    def _determine_conflicts(self, to_install):
+        # type: (List[InstallRequirement]) -> Optional[ConflictDetails]
         try:
-            package_set, _dep_info = check_install_conflicts(to_install)
+            return check_install_conflicts(to_install)
         except Exception:
-            logger.error("Error checking for conflicts.", exc_info=True)
+            logger.exception(
+                "Error while checking for conflicts. Please file an issue on "
+                "pip's issue tracker: https://github.com/pypa/pip/issues/new"
+            )
+            return None
+
+    def _warn_about_conflicts(self, conflict_details, new_resolver):
+        # type: (ConflictDetails, bool) -> None
+        package_set, (missing, conflicting) = conflict_details
+        if not missing and not conflicting:
             return
-        missing, conflicting = _dep_info
 
-        # NOTE: There is some duplication here from pip check
+        parts = []  # type: List[str]
+        if not new_resolver:
+            parts.append(
+                "After October 2020 you may experience errors when installing "
+                "or updating packages. This is because pip will change the "
+                "way that it resolves dependency conflicts.\n"
+            )
+            parts.append(
+                "We recommend you use --use-feature=2020-resolver to test "
+                "your packages with the new resolver before it becomes the "
+                "default.\n"
+            )
+        elif not today_is_later_than(year=2020, month=7, day=31):
+            # NOTE: trailing newlines here are intentional
+            parts.append(
+                "Pip will install or upgrade your package(s) and its "
+                "dependencies without taking into account other packages you "
+                "already have installed. This may cause an uncaught "
+                "dependency conflict.\n"
+            )
+            form_link = "https://forms.gle/cWKMoDs8sUVE29hz9"
+            parts.append(
+                "If you would like pip to take your other packages into "
+                "account, please tell us here: {}\n".format(form_link)
+            )
+
+        # NOTE: There is some duplication here, with commands/check.py
         for project_name in missing:
             version = package_set[project_name][0]
             for dependency in missing[project_name]:
-                logger.critical(
-                    "%s %s requires %s, which is not installed.",
-                    project_name, version, dependency[1],
+                message = (
+                    "{name} {version} requires {requirement}, "
+                    "which is not installed."
+                ).format(
+                    name=project_name,
+                    version=version,
+                    requirement=dependency[1],
                 )
+                parts.append(message)
 
         for project_name in conflicting:
             version = package_set[project_name][0]
             for dep_name, dep_version, req in conflicting[project_name]:
-                logger.critical(
-                    "%s %s has requirement %s, but you'll have %s %s which is "
-                    "incompatible.",
-                    project_name, version, req, dep_name, dep_version,
+                message = (
+                    "{name} {version} requires {requirement}, but you'll have "
+                    "{dep_name} {dep_version} which is incompatible."
+                ).format(
+                    name=project_name,
+                    version=version,
+                    requirement=req,
+                    dep_name=dep_name,
+                    dep_version=dep_version,
                 )
+                parts.append(message)
 
+        logger.critical("\n".join(parts))
 
-def get_lib_location_guesses(*args, **kwargs):
-    scheme = distutils_scheme('', *args, **kwargs)
+
+def get_lib_location_guesses(
+        user=False,  # type: bool
+        home=None,  # type: Optional[str]
+        root=None,  # type: Optional[str]
+        isolated=False,  # type: bool
+        prefix=None  # type: Optional[str]
+):
+    # type:(...) -> List[str]
+    scheme = distutils_scheme('', user=user, home=home, root=root,
+                              isolated=isolated, prefix=prefix)
     return [scheme['purelib'], scheme['platlib']]
 
 
-def site_packages_writable(**kwargs):
+def site_packages_writable(root, isolated):
+    # type: (Optional[str], bool) -> bool
     return all(
-        test_writable_dir(d) for d in set(get_lib_location_guesses(**kwargs))
+        test_writable_dir(d) for d in set(
+            get_lib_location_guesses(root=root, isolated=isolated))
     )
 
 
@@ -605,7 +685,7 @@ def decide_user_install(
     return True
 
 
-def warn_deprecated_install_options(requirements, options):
+def reject_location_related_install_options(requirements, options):
     # type: (List[InstallRequirement], Optional[List[str]]) -> None
     """If any location-changing --install-option arguments were passed for
     requirements or on the command-line, then show a deprecation warning.
@@ -638,24 +718,17 @@ def warn_deprecated_install_options(requirements, options):
     if not offenders:
         return
 
-    deprecated(
-        reason=(
-            "Location-changing options found in --install-option: {}. "
-            "This configuration may cause unexpected behavior and is "
-            "unsupported.".format(
-                "; ".join(offenders)
-            )
-        ),
-        replacement=(
-            "using pip-level options like --user, --prefix, --root, and "
-            "--target"
-        ),
-        gone_in="20.2",
-        issue=7309,
+    raise CommandError(
+        "Location-changing options found in --install-option: {}."
+        " This is unsupported, use pip-level options like --user,"
+        " --prefix, --root, and --target instead.".format(
+            "; ".join(offenders)
+        )
     )
 
 
 def create_env_error_message(error, show_traceback, using_user_site):
+    # type: (EnvironmentError, bool, bool) -> str
     """Format an error message for an EnvironmentError
 
     It may occur anytime during the execution of the install command.
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/list.py b/venv/Lib/site-packages/pip/_internal/commands/list.py
similarity index 81%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/list.py
rename to venv/Lib/site-packages/pip/_internal/commands/list.py
index cf3be7e..20e9bff 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/list.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/list.py
@@ -1,21 +1,17 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import json
 import logging
-from multiprocessing.dummy import Pool
 
 from pip._vendor import six
-from pip._vendor.requests.adapters import DEFAULT_POOLSIZE
 
 from pip._internal.cli import cmdoptions
 from pip._internal.cli.req_command import IndexGroupCommand
+from pip._internal.cli.status_codes import SUCCESS
 from pip._internal.exceptions import CommandError
+from pip._internal.index.collector import LinkCollector
 from pip._internal.index.package_finder import PackageFinder
 from pip._internal.models.selection_prefs import SelectionPreferences
-from pip._internal.self_outdated_check import make_link_collector
 from pip._internal.utils.misc import (
     dist_is_editable,
     get_installed_distributions,
@@ -23,6 +19,15 @@ from pip._internal.utils.misc import (
     write_output,
 )
 from pip._internal.utils.packaging import get_installer
+from pip._internal.utils.parallel import map_multithread
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from optparse import Values
+    from typing import List, Set, Tuple, Iterator
+
+    from pip._internal.network.session import PipSession
+    from pip._vendor.pkg_resources import Distribution
 
 logger = logging.getLogger(__name__)
 
@@ -34,30 +39,28 @@ class ListCommand(IndexGroupCommand):
     Packages are listed in a case-insensitive sorted order.
     """
 
+    ignore_require_venv = True
     usage = """
       %prog [options]"""
 
-    def __init__(self, *args, **kw):
-        super(ListCommand, self).__init__(*args, **kw)
-
-        cmd_opts = self.cmd_opts
-
-        cmd_opts.add_option(
+    def add_options(self):
+        # type: () -> None
+        self.cmd_opts.add_option(
             '-o', '--outdated',
             action='store_true',
             default=False,
             help='List outdated packages')
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '-u', '--uptodate',
             action='store_true',
             default=False,
             help='List uptodate packages')
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '-e', '--editable',
             action='store_true',
             default=False,
             help='List editable projects.')
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '-l', '--local',
             action='store_true',
             default=False,
@@ -70,8 +73,8 @@ class ListCommand(IndexGroupCommand):
             action='store_true',
             default=False,
             help='Only output packages installed in user-site.')
-        cmd_opts.add_option(cmdoptions.list_path())
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(cmdoptions.list_path())
+        self.cmd_opts.add_option(
             '--pre',
             action='store_true',
             default=False,
@@ -79,7 +82,7 @@ class ListCommand(IndexGroupCommand):
                   "pip only finds stable versions."),
         )
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--format',
             action='store',
             dest='list_format',
@@ -89,7 +92,7 @@ class ListCommand(IndexGroupCommand):
                  "or json",
         )
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--not-required',
             action='store_true',
             dest='not_required',
@@ -97,13 +100,13 @@ class ListCommand(IndexGroupCommand):
                  "installed packages.",
         )
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--exclude-editable',
             action='store_false',
             dest='include_editable',
             help='Exclude editable package from output.',
         )
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--include-editable',
             action='store_true',
             dest='include_editable',
@@ -115,13 +118,14 @@ class ListCommand(IndexGroupCommand):
         )
 
         self.parser.insert_option_group(0, index_opts)
-        self.parser.insert_option_group(0, cmd_opts)
+        self.parser.insert_option_group(0, self.cmd_opts)
 
     def _build_package_finder(self, options, session):
+        # type: (Values, PipSession) -> PackageFinder
         """
         Create a package finder appropriate to this list command.
         """
-        link_collector = make_link_collector(session, options=options)
+        link_collector = LinkCollector.create(session, options=options)
 
         # Pass allow_yanked=False to ignore yanked versions.
         selection_prefs = SelectionPreferences(
@@ -135,6 +139,7 @@ class ListCommand(IndexGroupCommand):
         )
 
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
         if options.outdated and options.uptodate:
             raise CommandError(
                 "Options --outdated and --uptodate cannot be combined.")
@@ -162,30 +167,40 @@ class ListCommand(IndexGroupCommand):
             packages = self.get_uptodate(packages, options)
 
         self.output_package_listing(packages, options)
+        return SUCCESS
 
     def get_outdated(self, packages, options):
+        # type: (List[Distribution], Values) -> List[Distribution]
         return [
             dist for dist in self.iter_packages_latest_infos(packages, options)
             if dist.latest_version > dist.parsed_version
         ]
 
     def get_uptodate(self, packages, options):
+        # type: (List[Distribution], Values) -> List[Distribution]
         return [
             dist for dist in self.iter_packages_latest_infos(packages, options)
             if dist.latest_version == dist.parsed_version
         ]
 
     def get_not_required(self, packages, options):
-        dep_keys = set()
+        # type: (List[Distribution], Values) -> List[Distribution]
+        dep_keys = set()  # type: Set[Distribution]
         for dist in packages:
             dep_keys.update(requirement.key for requirement in dist.requires())
-        return {pkg for pkg in packages if pkg.key not in dep_keys}
+
+        # Create a set to remove duplicate packages, and cast it to a list
+        # to keep the return type consistent with get_outdated and
+        # get_uptodate
+        return list({pkg for pkg in packages if pkg.key not in dep_keys})
 
     def iter_packages_latest_infos(self, packages, options):
+        # type: (List[Distribution], Values) -> Iterator[Distribution]
         with self._build_session(options) as session:
             finder = self._build_package_finder(options, session)
 
             def latest_info(dist):
+                # type: (Distribution) -> Distribution
                 typ = 'unknown'
                 all_candidates = finder.find_all_candidates(dist.key)
                 if not options.pre:
@@ -210,19 +225,12 @@ class ListCommand(IndexGroupCommand):
                 dist.latest_filetype = typ
                 return dist
 
-            # This is done for 2x speed up of requests to pypi.org
-            # so that "real time" of this function
-            # is almost equal to "user time"
-            pool = Pool(DEFAULT_POOLSIZE)
-
-            for dist in pool.imap_unordered(latest_info, packages):
+            for dist in map_multithread(latest_info, packages):
                 if dist is not None:
                     yield dist
 
-            pool.close()
-            pool.join()
-
     def output_package_listing(self, packages, options):
+        # type: (List[Distribution], Values) -> None
         packages = sorted(
             packages,
             key=lambda dist: dist.project_name.lower(),
@@ -241,6 +249,7 @@ class ListCommand(IndexGroupCommand):
             write_output(format_for_json(packages, options))
 
     def output_package_listing_columns(self, data, header):
+        # type: (List[List[str]], List[str]) -> None
         # insert the header first: we need to know the size of column names
         if len(data) > 0:
             data.insert(0, header)
@@ -256,6 +265,7 @@ class ListCommand(IndexGroupCommand):
 
 
 def format_for_columns(pkgs, options):
+    # type: (List[Distribution], Values) -> Tuple[List[List[str]], List[str]]
     """
     Convert the package data into something usable
     by output_package_listing_columns.
@@ -293,6 +303,7 @@ def format_for_columns(pkgs, options):
 
 
 def format_for_json(packages, options):
+    # type: (List[Distribution], Values) -> str
     data = []
     for dist in packages:
         info = {
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/search.py b/venv/Lib/site-packages/pip/_internal/commands/search.py
similarity index 82%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/search.py
rename to venv/Lib/site-packages/pip/_internal/commands/search.py
index e5f286e..ff09472 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/search.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/search.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import logging
@@ -22,7 +19,17 @@ from pip._internal.models.index import PyPI
 from pip._internal.network.xmlrpc import PipXmlrpcTransport
 from pip._internal.utils.compat import get_terminal_size
 from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import write_output
+from pip._internal.utils.misc import get_distribution, write_output
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from optparse import Values
+    from typing import List, Dict, Optional
+    from typing_extensions import TypedDict
+    TransformedHit = TypedDict(
+        'TransformedHit',
+        {'name': str, 'summary': str, 'versions': List[str]},
+    )
 
 logger = logging.getLogger(__name__)
 
@@ -34,8 +41,8 @@ class SearchCommand(Command, SessionCommandMixin):
       %prog [options] <query>"""
     ignore_require_venv = True
 
-    def __init__(self, *args, **kw):
-        super(SearchCommand, self).__init__(*args, **kw)
+    def add_options(self):
+        # type: () -> None
         self.cmd_opts.add_option(
             '-i', '--index',
             dest='index',
@@ -46,6 +53,7 @@ class SearchCommand(Command, SessionCommandMixin):
         self.parser.insert_option_group(0, self.cmd_opts)
 
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
         if not args:
             raise CommandError('Missing required argument (search query).')
         query = args
@@ -62,6 +70,7 @@ class SearchCommand(Command, SessionCommandMixin):
         return NO_MATCHES_FOUND
 
     def search(self, query, options):
+        # type: (List[str], Values) -> List[Dict[str, str]]
         index_url = options.index
 
         session = self.get_default_session(options)
@@ -73,12 +82,13 @@ class SearchCommand(Command, SessionCommandMixin):
 
 
 def transform_hits(hits):
+    # type: (List[Dict[str, str]]) -> List[TransformedHit]
     """
     The list from pypi is really a list of versions. We want a list of
     packages with the list of versions stored inline. This converts the
     list from pypi into one we can use.
     """
-    packages = OrderedDict()
+    packages = OrderedDict()  # type: OrderedDict[str, TransformedHit]
     for hit in hits:
         name = hit['name']
         summary = hit['summary']
@@ -101,6 +111,7 @@ def transform_hits(hits):
 
 
 def print_results(hits, name_column_width=None, terminal_width=None):
+    # type: (List[TransformedHit], Optional[int], Optional[int]) -> None
     if not hits:
         return
     if name_column_width is None:
@@ -118,8 +129,9 @@ def print_results(hits, name_column_width=None, terminal_width=None):
             target_width = terminal_width - name_column_width - 5
             if target_width > 10:
                 # wrap and indent summary to fit terminal
-                summary = textwrap.wrap(summary, target_width)
-                summary = ('\n' + ' ' * (name_column_width + 3)).join(summary)
+                summary_lines = textwrap.wrap(summary, target_width)
+                summary = ('\n' + ' ' * (name_column_width + 3)).join(
+                    summary_lines)
 
         line = '{name_latest:{name_column_width}} - {summary}'.format(
             name_latest='{name} ({latest})'.format(**locals()),
@@ -127,7 +139,8 @@ def print_results(hits, name_column_width=None, terminal_width=None):
         try:
             write_output(line)
             if name in installed_packages:
-                dist = pkg_resources.get_distribution(name)
+                dist = get_distribution(name)
+                assert dist is not None
                 with indent_log():
                     if dist.version == latest:
                         write_output('INSTALLED: %s (latest)', dist.version)
@@ -143,4 +156,5 @@ def print_results(hits, name_column_width=None, terminal_width=None):
 
 
 def highest_version(versions):
+    # type: (List[str]) -> str
     return max(versions, key=parse_version)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/show.py b/venv/Lib/site-packages/pip/_internal/commands/show.py
similarity index 93%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/show.py
rename to venv/Lib/site-packages/pip/_internal/commands/show.py
index a61294b..3892c59 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/show.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/show.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import logging
@@ -13,6 +10,11 @@ from pip._vendor.packaging.utils import canonicalize_name
 from pip._internal.cli.base_command import Command
 from pip._internal.cli.status_codes import ERROR, SUCCESS
 from pip._internal.utils.misc import write_output
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from optparse import Values
+    from typing import List, Dict, Iterator
 
 logger = logging.getLogger(__name__)
 
@@ -28,8 +30,8 @@ class ShowCommand(Command):
       %prog [options] <package> ..."""
     ignore_require_venv = True
 
-    def __init__(self, *args, **kw):
-        super(ShowCommand, self).__init__(*args, **kw)
+    def add_options(self):
+        # type: () -> None
         self.cmd_opts.add_option(
             '-f', '--files',
             dest='files',
@@ -40,6 +42,7 @@ class ShowCommand(Command):
         self.parser.insert_option_group(0, self.cmd_opts)
 
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
         if not args:
             logger.warning('ERROR: Please provide a package name or names.')
             return ERROR
@@ -53,6 +56,7 @@ class ShowCommand(Command):
 
 
 def search_packages_info(query):
+    # type: (List[str]) -> Iterator[Dict[str, str]]
     """
     Gather details from installed distributions. Print distribution name,
     version, location, and installed files. Installed files requires a
@@ -71,6 +75,7 @@ def search_packages_info(query):
         logger.warning('Package(s) not found: %s', ', '.join(missing))
 
     def get_requiring_packages(package_name):
+        # type: (str) -> List[str]
         canonical_name = canonicalize_name(package_name)
         return [
             pkg.project_name for pkg in pkg_resources.working_set
@@ -88,12 +93,12 @@ def search_packages_info(query):
             'required_by': get_requiring_packages(dist.project_name)
         }
         file_list = None
-        metadata = None
+        metadata = ''
         if isinstance(dist, pkg_resources.DistInfoDistribution):
             # RECORDs should be part of .dist-info metadatas
             if dist.has_metadata('RECORD'):
                 lines = dist.get_metadata_lines('RECORD')
-                paths = [l.split(',')[0] for l in lines]
+                paths = [line.split(',')[0] for line in lines]
                 paths = [os.path.join(dist.location, p) for p in paths]
                 file_list = [os.path.relpath(p, dist.location) for p in paths]
 
@@ -141,6 +146,7 @@ def search_packages_info(query):
 
 
 def print_results(distributions, list_files=False, verbose=False):
+    # type: (Iterator[Dict[str, str]], bool, bool) -> bool
     """
     Print the information from installed distributions found.
     """
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py b/venv/Lib/site-packages/pip/_internal/commands/uninstall.py
similarity index 90%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py
rename to venv/Lib/site-packages/pip/_internal/commands/uninstall.py
index 5db4fb4..3371fe4 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/uninstall.py
@@ -1,12 +1,10 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 from pip._vendor.packaging.utils import canonicalize_name
 
 from pip._internal.cli.base_command import Command
 from pip._internal.cli.req_command import SessionCommandMixin
+from pip._internal.cli.status_codes import SUCCESS
 from pip._internal.exceptions import InstallationError
 from pip._internal.req import parse_requirements
 from pip._internal.req.constructors import (
@@ -14,6 +12,11 @@ from pip._internal.req.constructors import (
     install_req_from_parsed_requirement,
 )
 from pip._internal.utils.misc import protect_pip_from_modification_on_windows
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from optparse import Values
+    from typing import List
 
 
 class UninstallCommand(Command, SessionCommandMixin):
@@ -31,8 +34,8 @@ class UninstallCommand(Command, SessionCommandMixin):
       %prog [options] <package> ...
       %prog [options] -r <requirements file> ..."""
 
-    def __init__(self, *args, **kw):
-        super(UninstallCommand, self).__init__(*args, **kw)
+    def add_options(self):
+        # type: () -> None
         self.cmd_opts.add_option(
             '-r', '--requirement',
             dest='requirements',
@@ -51,6 +54,7 @@ class UninstallCommand(Command, SessionCommandMixin):
         self.parser.insert_option_group(0, self.cmd_opts)
 
     def run(self, options, args):
+        # type: (Values, List[str]) -> int
         session = self.get_default_session(options)
 
         reqs_to_uninstall = {}
@@ -87,3 +91,5 @@ class UninstallCommand(Command, SessionCommandMixin):
             )
             if uninstall_pathset:
                 uninstall_pathset.commit()
+
+        return SUCCESS
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/commands/wheel.py b/venv/Lib/site-packages/pip/_internal/commands/wheel.py
similarity index 79%
rename from venv/lib/python3.8/site-packages/pip/_internal/commands/wheel.py
rename to venv/Lib/site-packages/pip/_internal/commands/wheel.py
index 48f3bfa..0f71856 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/commands/wheel.py
+++ b/venv/Lib/site-packages/pip/_internal/commands/wheel.py
@@ -1,8 +1,5 @@
 # -*- coding: utf-8 -*-
 
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import logging
@@ -12,6 +9,7 @@ import shutil
 from pip._internal.cache import WheelCache
 from pip._internal.cli import cmdoptions
 from pip._internal.cli.req_command import RequirementCommand, with_cleanup
+from pip._internal.cli.status_codes import SUCCESS
 from pip._internal.exceptions import CommandError
 from pip._internal.req.req_tracker import get_requirement_tracker
 from pip._internal.utils.misc import ensure_dir, normalize_path
@@ -21,7 +19,7 @@ from pip._internal.wheel_builder import build, should_build_for_wheel_command
 
 if MYPY_CHECK_RUNNING:
     from optparse import Values
-    from typing import Any, List
+    from typing import List
 
 
 logger = logging.getLogger(__name__)
@@ -49,12 +47,10 @@ class WheelCommand(RequirementCommand):
       %prog [options] [-e] <local project path> ...
       %prog [options] <archive url/path> ..."""
 
-    def __init__(self, *args, **kw):
-        super(WheelCommand, self).__init__(*args, **kw)
-
-        cmd_opts = self.cmd_opts
+    def add_options(self):
+        # type: () -> None
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '-w', '--wheel-dir',
             dest='wheel_dir',
             metavar='dir',
@@ -62,29 +58,29 @@ class WheelCommand(RequirementCommand):
             help=("Build wheels into <dir>, where the default is the "
                   "current working directory."),
         )
-        cmd_opts.add_option(cmdoptions.no_binary())
-        cmd_opts.add_option(cmdoptions.only_binary())
-        cmd_opts.add_option(cmdoptions.prefer_binary())
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(cmdoptions.no_binary())
+        self.cmd_opts.add_option(cmdoptions.only_binary())
+        self.cmd_opts.add_option(cmdoptions.prefer_binary())
+        self.cmd_opts.add_option(
             '--build-option',
             dest='build_options',
             metavar='options',
             action='append',
             help="Extra arguments to be supplied to 'setup.py bdist_wheel'.",
         )
-        cmd_opts.add_option(cmdoptions.no_build_isolation())
-        cmd_opts.add_option(cmdoptions.use_pep517())
-        cmd_opts.add_option(cmdoptions.no_use_pep517())
-        cmd_opts.add_option(cmdoptions.constraints())
-        cmd_opts.add_option(cmdoptions.editable())
-        cmd_opts.add_option(cmdoptions.requirements())
-        cmd_opts.add_option(cmdoptions.src())
-        cmd_opts.add_option(cmdoptions.ignore_requires_python())
-        cmd_opts.add_option(cmdoptions.no_deps())
-        cmd_opts.add_option(cmdoptions.build_dir())
-        cmd_opts.add_option(cmdoptions.progress_bar())
-
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(cmdoptions.no_build_isolation())
+        self.cmd_opts.add_option(cmdoptions.use_pep517())
+        self.cmd_opts.add_option(cmdoptions.no_use_pep517())
+        self.cmd_opts.add_option(cmdoptions.constraints())
+        self.cmd_opts.add_option(cmdoptions.editable())
+        self.cmd_opts.add_option(cmdoptions.requirements())
+        self.cmd_opts.add_option(cmdoptions.src())
+        self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
+        self.cmd_opts.add_option(cmdoptions.no_deps())
+        self.cmd_opts.add_option(cmdoptions.build_dir())
+        self.cmd_opts.add_option(cmdoptions.progress_bar())
+
+        self.cmd_opts.add_option(
             '--global-option',
             dest='global_options',
             action='append',
@@ -92,7 +88,7 @@ class WheelCommand(RequirementCommand):
             help="Extra global options to be supplied to the setup.py "
             "call before the 'bdist_wheel' command.")
 
-        cmd_opts.add_option(
+        self.cmd_opts.add_option(
             '--pre',
             action='store_true',
             default=False,
@@ -100,7 +96,7 @@ class WheelCommand(RequirementCommand):
                   "pip only finds stable versions."),
         )
 
-        cmd_opts.add_option(cmdoptions.require_hashes())
+        self.cmd_opts.add_option(cmdoptions.require_hashes())
 
         index_opts = cmdoptions.make_option_group(
             cmdoptions.index_group,
@@ -108,11 +104,11 @@ class WheelCommand(RequirementCommand):
         )
 
         self.parser.insert_option_group(0, index_opts)
-        self.parser.insert_option_group(0, cmd_opts)
+        self.parser.insert_option_group(0, self.cmd_opts)
 
     @with_cleanup
     def run(self, options, args):
-        # type: (Values, List[Any]) -> None
+        # type: (Values, List[str]) -> int
         cmdoptions.check_install_build_global(options)
 
         session = self.get_default_session(options)
@@ -188,3 +184,5 @@ class WheelCommand(RequirementCommand):
             raise CommandError(
                 "Failed to build one or more wheels"
             )
+
+        return SUCCESS
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/configuration.py b/venv/Lib/site-packages/pip/_internal/configuration.py
similarity index 91%
rename from venv/lib/python3.8/site-packages/pip/_internal/configuration.py
rename to venv/Lib/site-packages/pip/_internal/configuration.py
index 2648b8a..e49a5f4 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/configuration.py
+++ b/venv/Lib/site-packages/pip/_internal/configuration.py
@@ -11,9 +11,6 @@ Some terminology:
   A single word describing where the configuration key-value pair came from
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 import locale
 import logging
 import os
@@ -114,7 +111,7 @@ class Configuration(object):
     """
 
     def __init__(self, isolated, load_only=None):
-        # type: (bool, Kind) -> None
+        # type: (bool, Optional[Kind]) -> None
         super(Configuration, self).__init__()
 
         _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None]
@@ -124,8 +121,8 @@ class Configuration(object):
                     ", ".join(map(repr, _valid_load_only[:-1]))
                 )
             )
-        self.isolated = isolated  # type: bool
-        self.load_only = load_only  # type: Optional[Kind]
+        self.isolated = isolated
+        self.load_only = load_only
 
         # The order here determines the override order.
         self._override_order = [
@@ -185,6 +182,7 @@ class Configuration(object):
         """
         self._ensure_have_load_only()
 
+        assert self.load_only
         fname, parser = self._get_parser_to_modify()
 
         if parser is not None:
@@ -200,10 +198,10 @@ class Configuration(object):
 
     def unset_value(self, key):
         # type: (str) -> None
-        """Unset a value in the configuration.
-        """
+        """Unset a value in the configuration."""
         self._ensure_have_load_only()
 
+        assert self.load_only
         if key not in self._config[self.load_only]:
             raise ConfigurationError("No such key - {}".format(key))
 
@@ -211,30 +209,18 @@ class Configuration(object):
 
         if parser is not None:
             section, name = _disassemble_key(key)
-
-            # Remove the key in the parser
-            modified_something = False
-            if parser.has_section(section):
-                # Returns whether the option was removed or not
-                modified_something = parser.remove_option(section, name)
-
-            if modified_something:
-                # name removed from parser, section may now be empty
-                section_iter = iter(parser.items(section))
-                try:
-                    val = next(section_iter)
-                except StopIteration:
-                    val = None
-
-                if val is None:
-                    parser.remove_section(section)
-
-                self._mark_as_modified(fname, parser)
-            else:
+            if not (parser.has_section(section)
+                    and parser.remove_option(section, name)):
+                # The option was not removed.
                 raise ConfigurationError(
                     "Fatal Internal error [id=1]. Please report as a bug."
                 )
 
+            # The section may be empty after the option was removed.
+            if not parser.items(section):
+                parser.remove_section(section)
+            self._mark_as_modified(fname, parser)
+
         del self._config[self.load_only][key]
 
     def save(self):
@@ -280,7 +266,7 @@ class Configuration(object):
         # type: () -> None
         """Loads configuration from configuration files
         """
-        config_files = dict(self._iter_config_files())
+        config_files = dict(self.iter_config_files())
         if config_files[kinds.ENV][0:1] == [os.devnull]:
             logger.debug(
                 "Skipping loading configuration files due to "
@@ -342,7 +328,7 @@ class Configuration(object):
         """Loads configuration from environment variables
         """
         self._config[kinds.ENV_VAR].update(
-            self._normalized_keys(":env:", self._get_environ_vars())
+            self._normalized_keys(":env:", self.get_environ_vars())
         )
 
     def _normalized_keys(self, section, items):
@@ -358,7 +344,7 @@ class Configuration(object):
             normalized[key] = val
         return normalized
 
-    def _get_environ_vars(self):
+    def get_environ_vars(self):
         # type: () -> Iterable[Tuple[str, str]]
         """Returns a generator with all environmental vars with prefix PIP_"""
         for key, val in os.environ.items():
@@ -370,7 +356,7 @@ class Configuration(object):
                 yield key[4:].lower(), val
 
     # XXX: This is patched in the tests.
-    def _iter_config_files(self):
+    def iter_config_files(self):
         # type: () -> Iterable[Tuple[Kind, List[str]]]
         """Yields variant and configuration files associated with it.
 
@@ -401,9 +387,15 @@ class Configuration(object):
         # finally virtualenv configuration first trumping others
         yield kinds.SITE, config_files[kinds.SITE]
 
+    def get_values_in_config(self, variant):
+        # type: (Kind) -> Dict[str, Any]
+        """Get values present in a config file"""
+        return self._config[variant]
+
     def _get_parser_to_modify(self):
         # type: () -> Tuple[str, RawConfigParser]
         # Determine which parser to modify
+        assert self.load_only
         parsers = self._parsers[self.load_only]
         if not parsers:
             # This should not happen if everything works correctly.
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/distributions/__init__.py b/venv/Lib/site-packages/pip/_internal/distributions/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/distributions/__init__.py
rename to venv/Lib/site-packages/pip/_internal/distributions/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/distributions/base.py b/venv/Lib/site-packages/pip/_internal/distributions/base.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/distributions/base.py
rename to venv/Lib/site-packages/pip/_internal/distributions/base.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/distributions/installed.py b/venv/Lib/site-packages/pip/_internal/distributions/installed.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/distributions/installed.py
rename to venv/Lib/site-packages/pip/_internal/distributions/installed.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py b/venv/Lib/site-packages/pip/_internal/distributions/sdist.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py
rename to venv/Lib/site-packages/pip/_internal/distributions/sdist.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/distributions/wheel.py b/venv/Lib/site-packages/pip/_internal/distributions/wheel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/distributions/wheel.py
rename to venv/Lib/site-packages/pip/_internal/distributions/wheel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/exceptions.py b/venv/Lib/site-packages/pip/_internal/exceptions.py
similarity index 79%
rename from venv/lib/python3.8/site-packages/pip/_internal/exceptions.py
rename to venv/Lib/site-packages/pip/_internal/exceptions.py
index 8ac8548..3f26215 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/exceptions.py
+++ b/venv/Lib/site-packages/pip/_internal/exceptions.py
@@ -1,8 +1,5 @@
 """Exceptions used throughout package"""
 
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 from itertools import chain, groupby, repeat
@@ -12,10 +9,20 @@ from pip._vendor.six import iteritems
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 if MYPY_CHECK_RUNNING:
-    from typing import Optional
+    from typing import Any, Optional, List, Dict, Text
+
     from pip._vendor.pkg_resources import Distribution
+    from pip._vendor.requests.models import Response, Request
+    from pip._vendor.six import PY3
+    from pip._vendor.six.moves import configparser
+
     from pip._internal.req.req_install import InstallRequirement
 
+    if PY3:
+        from hashlib import _Hash
+    else:
+        from hashlib import _hash as _Hash
+
 
 class PipError(Exception):
     """Base pip exception"""
@@ -84,10 +91,38 @@ class CommandError(PipError):
     """Raised when there is an error in command-line arguments"""
 
 
+class SubProcessError(PipError):
+    """Raised when there is an error raised while executing a
+    command in subprocess"""
+
+
 class PreviousBuildDirError(PipError):
     """Raised when there's a previous conflicting build directory"""
 
 
+class NetworkConnectionError(PipError):
+    """HTTP connection error"""
+
+    def __init__(self, error_msg, response=None, request=None):
+        # type: (Text, Response, Request) -> None
+        """
+        Initialize NetworkConnectionError with  `request` and `response`
+        objects.
+        """
+        self.response = response
+        self.request = request
+        self.error_msg = error_msg
+        if (self.response is not None and not self.request and
+                hasattr(response, 'request')):
+            self.request = self.response.request
+        super(NetworkConnectionError, self).__init__(
+            error_msg, response, request)
+
+    def __str__(self):
+        # type: () -> str
+        return str(self.error_msg)
+
+
 class InvalidWheelFilename(InstallationError):
     """Invalid wheel filename."""
 
@@ -96,16 +131,39 @@ class UnsupportedWheel(InstallationError):
     """Unsupported wheel."""
 
 
+class MetadataInconsistent(InstallationError):
+    """Built metadata contains inconsistent information.
+
+    This is raised when the metadata contains values (e.g. name and version)
+    that do not match the information previously obtained from sdist filename
+    or user-supplied ``#egg=`` value.
+    """
+    def __init__(self, ireq, field, built):
+        # type: (InstallRequirement, str, Any) -> None
+        self.ireq = ireq
+        self.field = field
+        self.built = built
+
+    def __str__(self):
+        # type: () -> str
+        return "Requested {} has different {} in metadata: {!r}".format(
+            self.ireq, self.field, self.built,
+        )
+
+
 class HashErrors(InstallationError):
     """Multiple HashError instances rolled into one for reporting"""
 
     def __init__(self):
-        self.errors = []
+        # type: () -> None
+        self.errors = []  # type: List[HashError]
 
     def append(self, error):
+        # type: (HashError) -> None
         self.errors.append(error)
 
     def __str__(self):
+        # type: () -> str
         lines = []
         self.errors.sort(key=lambda e: e.order)
         for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__):
@@ -113,11 +171,14 @@ class HashErrors(InstallationError):
             lines.extend(e.body() for e in errors_of_cls)
         if lines:
             return '\n'.join(lines)
+        return ''
 
     def __nonzero__(self):
+        # type: () -> bool
         return bool(self.errors)
 
     def __bool__(self):
+        # type: () -> bool
         return self.__nonzero__()
 
 
@@ -139,8 +200,10 @@ class HashError(InstallationError):
     """
     req = None  # type: Optional[InstallRequirement]
     head = ''
+    order = None  # type: Optional[int]
 
     def body(self):
+        # type: () -> str
         """Return a summary of me for display under the heading.
 
         This default implementation simply prints a description of the
@@ -153,9 +216,11 @@ class HashError(InstallationError):
         return '    {}'.format(self._requirement_name())
 
     def __str__(self):
+        # type: () -> str
         return '{}\n{}'.format(self.head, self.body())
 
     def _requirement_name(self):
+        # type: () -> str
         """Return a description of the requirement that triggered me.
 
         This default implementation returns long description of the req, with
@@ -196,6 +261,7 @@ class HashMissing(HashError):
             'has a hash.)')
 
     def __init__(self, gotten_hash):
+        # type: (str) -> None
         """
         :param gotten_hash: The hash of the (possibly malicious) archive we
             just downloaded
@@ -203,6 +269,7 @@ class HashMissing(HashError):
         self.gotten_hash = gotten_hash
 
     def body(self):
+        # type: () -> str
         # Dodge circular import.
         from pip._internal.utils.hashes import FAVORITE_HASH
 
@@ -245,6 +312,7 @@ class HashMismatch(HashError):
             'someone may have tampered with them.')
 
     def __init__(self, allowed, gots):
+        # type: (Dict[str, List[str]], Dict[str, _Hash]) -> None
         """
         :param allowed: A dict of algorithm names pointing to lists of allowed
             hex digests
@@ -255,10 +323,12 @@ class HashMismatch(HashError):
         self.gots = gots
 
     def body(self):
+        # type: () -> str
         return '    {}:\n{}'.format(self._requirement_name(),
                                     self._hash_comparison())
 
     def _hash_comparison(self):
+        # type: () -> str
         """
         Return a comparison of actual and expected hash values.
 
@@ -270,11 +340,12 @@ class HashMismatch(HashError):
 
         """
         def hash_then_or(hash_name):
+            # type: (str) -> chain[str]
             # For now, all the decent hashes have 6-char names, so we can get
             # away with hard-coding space literals.
             return chain([hash_name], repeat('    or'))
 
-        lines = []
+        lines = []  # type: List[str]
         for hash_name, expecteds in iteritems(self.allowed):
             prefix = hash_then_or(hash_name)
             lines.extend(('        Expected {} {}'.format(next(prefix), e))
@@ -294,15 +365,17 @@ class ConfigurationFileCouldNotBeLoaded(ConfigurationError):
     """
 
     def __init__(self, reason="could not be loaded", fname=None, error=None):
+        # type: (str, Optional[str], Optional[configparser.Error]) -> None
         super(ConfigurationFileCouldNotBeLoaded, self).__init__(error)
         self.reason = reason
         self.fname = fname
         self.error = error
 
     def __str__(self):
+        # type: () -> str
         if self.fname is not None:
             message_part = " in {}.".format(self.fname)
         else:
             assert self.error is not None
-            message_part = ".\n{}\n".format(self.error.message)
+            message_part = ".\n{}\n".format(self.error)
         return "Configuration file {}{}".format(self.reason, message_part)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/index/__init__.py b/venv/Lib/site-packages/pip/_internal/index/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/index/__init__.py
rename to venv/Lib/site-packages/pip/_internal/index/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/index/collector.py b/venv/Lib/site-packages/pip/_internal/index/collector.py
similarity index 92%
rename from venv/lib/python3.8/site-packages/pip/_internal/index/collector.py
rename to venv/Lib/site-packages/pip/_internal/index/collector.py
index e2c800c..6c35fc6 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/index/collector.py
+++ b/venv/Lib/site-packages/pip/_internal/index/collector.py
@@ -13,11 +13,14 @@ from collections import OrderedDict
 
 from pip._vendor import html5lib, requests
 from pip._vendor.distlib.compat import unescape
-from pip._vendor.requests.exceptions import HTTPError, RetryError, SSLError
+from pip._vendor.requests.exceptions import RetryError, SSLError
 from pip._vendor.six.moves.urllib import parse as urllib_parse
 from pip._vendor.six.moves.urllib import request as urllib_request
 
+from pip._internal.exceptions import NetworkConnectionError
 from pip._internal.models.link import Link
+from pip._internal.models.search_scope import SearchScope
+from pip._internal.network.utils import raise_for_status
 from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS
 from pip._internal.utils.misc import pairwise, redact_auth_from_url
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
@@ -25,6 +28,7 @@ from pip._internal.utils.urls import path_to_url, url_to_path
 from pip._internal.vcs import is_url, vcs
 
 if MYPY_CHECK_RUNNING:
+    from optparse import Values
     from typing import (
         Callable, Iterable, List, MutableMapping, Optional,
         Protocol, Sequence, Tuple, TypeVar, Union,
@@ -33,7 +37,6 @@ if MYPY_CHECK_RUNNING:
 
     from pip._vendor.requests import Response
 
-    from pip._internal.models.search_scope import SearchScope
     from pip._internal.network.session import PipSession
 
     HTMLElement = xml.etree.ElementTree.Element
@@ -122,7 +125,7 @@ def _ensure_html_response(url, session):
         raise _NotHTTP()
 
     resp = session.head(url, allow_redirects=True)
-    resp.raise_for_status()
+    raise_for_status(resp)
 
     _ensure_html_header(resp)
 
@@ -166,7 +169,7 @@ def _get_html_response(url, session):
             "Cache-Control": "max-age=0",
         },
     )
-    resp.raise_for_status()
+    raise_for_status(resp)
 
     # The check for archives above only works if the url ends with
     # something that looks like an archive. However that is not a
@@ -434,7 +437,8 @@ def _get_html_page(link, session=None):
     # Check for VCS schemes that do not support lookup as web pages.
     vcs_scheme = _match_vcs_scheme(url)
     if vcs_scheme:
-        logger.debug('Cannot look at %s URL %s', vcs_scheme, link)
+        logger.warning('Cannot look at %s URL %s because it does not support '
+                       'lookup as web pages.', vcs_scheme, link)
         return None
 
     # Tack index.html onto file:// URLs that point to directories
@@ -450,16 +454,17 @@ def _get_html_page(link, session=None):
     try:
         resp = _get_html_response(url, session=session)
     except _NotHTTP:
-        logger.debug(
+        logger.warning(
             'Skipping page %s because it looks like an archive, and cannot '
-            'be checked by HEAD.', link,
+            'be checked by a HTTP HEAD request.', link,
         )
     except _NotHTML as exc:
-        logger.debug(
-            'Skipping page %s because the %s request got Content-Type: %s',
+        logger.warning(
+            'Skipping page %s because the %s request got Content-Type: %s.'
+            'The only supported Content-Type is text/html',
             link, exc.request_desc, exc.content_type,
         )
-    except HTTPError as exc:
+    except NetworkConnectionError as exc:
         _handle_get_page_fail(link, exc)
     except RetryError as exc:
         _handle_get_page_fail(link, exc)
@@ -524,8 +529,7 @@ def group_locations(locations, expand_dir=False):
                     urls.append(url)
                 else:
                     logger.warning(
-                        "Path '{0}' is ignored: "
-                        "it is a directory.".format(path),
+                        "Path '%s' is ignored: it is a directory.", path,
                     )
             elif os.path.isfile(path):
                 sort_path(path)
@@ -599,6 +603,33 @@ class LinkCollector(object):
         self.search_scope = search_scope
         self.session = session
 
+    @classmethod
+    def create(cls, session, options, suppress_no_index=False):
+        # type: (PipSession, Values, bool) -> LinkCollector
+        """
+        :param session: The Session to use to make requests.
+        :param suppress_no_index: Whether to ignore the --no-index option
+            when constructing the SearchScope object.
+        """
+        index_urls = [options.index_url] + options.extra_index_urls
+        if options.no_index and not suppress_no_index:
+            logger.debug(
+                'Ignoring indexes: %s',
+                ','.join(redact_auth_from_url(url) for url in index_urls),
+            )
+            index_urls = []
+
+        # Make sure find_links is a list before passing to create().
+        find_links = options.find_links or []
+
+        search_scope = SearchScope.create(
+            find_links=find_links, index_urls=index_urls,
+        )
+        link_collector = LinkCollector(
+            session=session, search_scope=search_scope,
+        )
+        return link_collector
+
     @property
     def find_links(self):
         # type: () -> List[str]
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/index/package_finder.py b/venv/Lib/site-packages/pip/_internal/index/package_finder.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_internal/index/package_finder.py
rename to venv/Lib/site-packages/pip/_internal/index/package_finder.py
index e88ad9f..8411578 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/index/package_finder.py
+++ b/venv/Lib/site-packages/pip/_internal/index/package_finder.py
@@ -556,23 +556,7 @@ class CandidateEvaluator(object):
         """
         if not candidates:
             return None
-
         best_candidate = max(candidates, key=self._sort_key)
-
-        # Log a warning per PEP 592 if necessary before returning.
-        link = best_candidate.link
-        if link.is_yanked:
-            reason = link.yanked_reason or '<none given>'
-            msg = (
-                # Mark this as a unicode string to prevent
-                # "UnicodeEncodeError: 'ascii' codec can't encode character"
-                # in Python 2 when the reason contains non-ascii characters.
-                u'The candidate selected for download or install is a '
-                'yanked version: {candidate}\n'
-                'Reason for being yanked: {reason}'
-            ).format(candidate=best_candidate, reason=reason)
-            logger.warning(msg)
-
         return best_candidate
 
     def compute_best_candidate(
@@ -674,6 +658,11 @@ class PackageFinder(object):
             ignore_requires_python=selection_prefs.ignore_requires_python,
         )
 
+    @property
+    def target_python(self):
+        # type: () -> TargetPython
+        return self._target_python
+
     @property
     def search_scope(self):
         # type: () -> SearchScope
@@ -709,6 +698,15 @@ class PackageFinder(object):
         # type: () -> None
         self._candidate_prefs.allow_all_prereleases = True
 
+    @property
+    def prefer_binary(self):
+        # type: () -> bool
+        return self._candidate_prefs.prefer_binary
+
+    def set_prefer_binary(self):
+        # type: () -> None
+        self._candidate_prefs.prefer_binary = True
+
     def make_link_evaluator(self, project_name):
         # type: (str) -> LinkEvaluator
         canonical_name = canonicalize_name(project_name)
@@ -889,11 +887,11 @@ class PackageFinder(object):
         return candidate_evaluator.compute_best_candidate(candidates)
 
     def find_requirement(self, req, upgrade):
-        # type: (InstallRequirement, bool) -> Optional[Link]
+        # type: (InstallRequirement, bool) -> Optional[InstallationCandidate]
         """Try to find a Link matching req
 
         Expects req, an InstallRequirement and upgrade, a boolean
-        Returns a Link if found,
+        Returns a InstallationCandidate if found,
         Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise
         """
         hashes = req.hashes(trust_internet=False)
@@ -967,7 +965,7 @@ class PackageFinder(object):
             best_candidate.version,
             _format_versions(best_candidate_result.iter_applicable()),
         )
-        return best_candidate.link
+        return best_candidate
 
 
 def _find_name_version_sep(fragment, canonical_name):
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/locations.py b/venv/Lib/site-packages/pip/_internal/locations.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_internal/locations.py
rename to venv/Lib/site-packages/pip/_internal/locations.py
index 0c11553..0c12354 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/locations.py
+++ b/venv/Lib/site-packages/pip/_internal/locations.py
@@ -138,7 +138,7 @@ def distutils_scheme(
 
     if running_under_virtualenv():
         scheme['headers'] = os.path.join(
-            sys.prefix,
+            i.prefix,
             'include',
             'site',
             'python{}'.format(get_major_minor_version()),
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/main.py b/venv/Lib/site-packages/pip/_internal/main.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/main.py
rename to venv/Lib/site-packages/pip/_internal/main.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/__init__.py b/venv/Lib/site-packages/pip/_internal/models/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/__init__.py
rename to venv/Lib/site-packages/pip/_internal/models/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/candidate.py b/venv/Lib/site-packages/pip/_internal/models/candidate.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/candidate.py
rename to venv/Lib/site-packages/pip/_internal/models/candidate.py
index 1dc1a57..9149e0f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/models/candidate.py
+++ b/venv/Lib/site-packages/pip/_internal/models/candidate.py
@@ -12,6 +12,8 @@ class InstallationCandidate(KeyBasedCompareMixin):
     """Represents a potential "candidate" for installation.
     """
 
+    __slots__ = ["name", "version", "link"]
+
     def __init__(self, name, version, link):
         # type: (str, str, Link) -> None
         self.name = name
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/direct_url.py b/venv/Lib/site-packages/pip/_internal/models/direct_url.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/direct_url.py
rename to venv/Lib/site-packages/pip/_internal/models/direct_url.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/format_control.py b/venv/Lib/site-packages/pip/_internal/models/format_control.py
similarity index 86%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/format_control.py
rename to venv/Lib/site-packages/pip/_internal/models/format_control.py
index 2e13727..c6275e7 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/models/format_control.py
+++ b/venv/Lib/site-packages/pip/_internal/models/format_control.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 from pip._vendor.packaging.utils import canonicalize_name
 
 from pip._internal.exceptions import CommandError
@@ -14,6 +11,8 @@ class FormatControl(object):
     """Helper for managing formats from which a package can be installed.
     """
 
+    __slots__ = ["no_binary", "only_binary"]
+
     def __init__(self, no_binary=None, only_binary=None):
         # type: (Optional[Set[str]], Optional[Set[str]]) -> None
         if no_binary is None:
@@ -26,7 +25,16 @@ class FormatControl(object):
 
     def __eq__(self, other):
         # type: (object) -> bool
-        return self.__dict__ == other.__dict__
+        if not isinstance(other, self.__class__):
+            return NotImplemented
+
+        if self.__slots__ != other.__slots__:
+            return False
+
+        return all(
+            getattr(self, k) == getattr(other, k)
+            for k in self.__slots__
+        )
 
     def __ne__(self, other):
         # type: (object) -> bool
@@ -42,7 +50,7 @@ class FormatControl(object):
 
     @staticmethod
     def handle_mutual_excludes(value, target, other):
-        # type: (str, Optional[Set[str]], Optional[Set[str]]) -> None
+        # type: (str, Set[str], Set[str]) -> None
         if value.startswith('-'):
             raise CommandError(
                 "--no-binary / --only-binary option requires 1 argument."
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/index.py b/venv/Lib/site-packages/pip/_internal/models/index.py
similarity index 91%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/index.py
rename to venv/Lib/site-packages/pip/_internal/models/index.py
index ead1efb..5b4a1fe 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/models/index.py
+++ b/venv/Lib/site-packages/pip/_internal/models/index.py
@@ -5,6 +5,9 @@ class PackageIndex(object):
     """Represents a Package Index and provides easier access to endpoints
     """
 
+    __slots__ = ['url', 'netloc', 'simple_url', 'pypi_url',
+                 'file_storage_domain']
+
     def __init__(self, url, file_storage_domain):
         # type: (str, str) -> None
         super(PackageIndex, self).__init__()
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/link.py b/venv/Lib/site-packages/pip/_internal/models/link.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/link.py
rename to venv/Lib/site-packages/pip/_internal/models/link.py
index df4f8f0..c0d278a 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/models/link.py
+++ b/venv/Lib/site-packages/pip/_internal/models/link.py
@@ -24,6 +24,15 @@ class Link(KeyBasedCompareMixin):
     """Represents a parsed link from a Package Index's simple URL
     """
 
+    __slots__ = [
+        "_parsed_url",
+        "_url",
+        "comes_from",
+        "requires_python",
+        "yanked_reason",
+        "cache_link_parsing",
+    ]
+
     def __init__(
         self,
         url,                   # type: str
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/scheme.py b/venv/Lib/site-packages/pip/_internal/models/scheme.py
similarity index 87%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/scheme.py
rename to venv/Lib/site-packages/pip/_internal/models/scheme.py
index af07b40..5040551 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/models/scheme.py
+++ b/venv/Lib/site-packages/pip/_internal/models/scheme.py
@@ -6,10 +6,16 @@ https://docs.python.org/3/install/index.html#alternate-installation.
 """
 
 
+SCHEME_KEYS = ['platlib', 'purelib', 'headers', 'scripts', 'data']
+
+
 class Scheme(object):
     """A Scheme holds paths which are used as the base directories for
     artifacts associated with a Python package.
     """
+
+    __slots__ = SCHEME_KEYS
+
     def __init__(
         self,
         platlib,  # type: str
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/search_scope.py b/venv/Lib/site-packages/pip/_internal/models/search_scope.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/search_scope.py
rename to venv/Lib/site-packages/pip/_internal/models/search_scope.py
index 7a0008e..d732504 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/models/search_scope.py
+++ b/venv/Lib/site-packages/pip/_internal/models/search_scope.py
@@ -24,6 +24,8 @@ class SearchScope(object):
     Encapsulates the locations that pip is configured to search.
     """
 
+    __slots__ = ["find_links", "index_urls"]
+
     @classmethod
     def create(
         cls,
@@ -93,8 +95,8 @@ class SearchScope(object):
                 # exceptions for malformed URLs
                 if not purl.scheme and not purl.netloc:
                     logger.warning(
-                        'The index url "{}" seems invalid, '
-                        'please provide a scheme.'.format(redacted_index_url))
+                        'The index url "%s" seems invalid, '
+                        'please provide a scheme.', redacted_index_url)
 
                 redacted_index_urls.append(redacted_index_url)
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py b/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py
similarity index 93%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py
rename to venv/Lib/site-packages/pip/_internal/models/selection_prefs.py
index f58fdce..5db3ca9 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py
+++ b/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py
@@ -6,12 +6,14 @@ if MYPY_CHECK_RUNNING:
 
 
 class SelectionPreferences(object):
-
     """
     Encapsulates the candidate selection preferences for downloading
     and installing files.
     """
 
+    __slots__ = ['allow_yanked', 'allow_all_prereleases', 'format_control',
+                 'prefer_binary', 'ignore_requires_python']
+
     # Don't include an allow_yanked default value to make sure each call
     # site considers whether yanked releases are allowed. This also causes
     # that decision to be made explicit in the calling code, which helps
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/target_python.py b/venv/Lib/site-packages/pip/_internal/models/target_python.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/target_python.py
rename to venv/Lib/site-packages/pip/_internal/models/target_python.py
index 84f1c20..6d1ca79 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/models/target_python.py
+++ b/venv/Lib/site-packages/pip/_internal/models/target_python.py
@@ -20,6 +20,16 @@ class TargetPython(object):
     for a package install, download, etc.
     """
 
+    __slots__ = [
+        "_given_py_version_info",
+        "abi",
+        "implementation",
+        "platform",
+        "py_version",
+        "py_version_info",
+        "_valid_tags",
+    ]
+
     def __init__(
         self,
         platform=None,  # type: Optional[str]
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/models/wheel.py b/venv/Lib/site-packages/pip/_internal/models/wheel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/models/wheel.py
rename to venv/Lib/site-packages/pip/_internal/models/wheel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/network/__init__.py b/venv/Lib/site-packages/pip/_internal/network/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/network/__init__.py
rename to venv/Lib/site-packages/pip/_internal/network/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/network/auth.py b/venv/Lib/site-packages/pip/_internal/network/auth.py
similarity index 93%
rename from venv/lib/python3.8/site-packages/pip/_internal/network/auth.py
rename to venv/Lib/site-packages/pip/_internal/network/auth.py
index 94da3d4..c49deaa 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/network/auth.py
+++ b/venv/Lib/site-packages/pip/_internal/network/auth.py
@@ -4,9 +4,6 @@ Contains interface (MultiDomainBasicAuth) and associated glue code for
 providing credentials in the context of network requests.
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 import logging
 
 from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
@@ -23,11 +20,12 @@ from pip._internal.utils.misc import (
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 if MYPY_CHECK_RUNNING:
-    from optparse import Values
-    from typing import Dict, Optional, Tuple
+    from typing import Dict, Optional, Tuple, List, Any
 
     from pip._internal.vcs.versioncontrol import AuthInfo
 
+    from pip._vendor.requests.models import Response, Request
+
     Credentials = Tuple[str, str, str]
 
 logger = logging.getLogger(__name__)
@@ -44,7 +42,9 @@ except Exception as exc:
 
 
 def get_keyring_auth(url, username):
+    # type: (str, str) -> Optional[AuthInfo]
     """Return the tuple auth for a given url from keyring."""
+    global keyring
     if not url or not keyring:
         return None
 
@@ -70,12 +70,14 @@ def get_keyring_auth(url, username):
         logger.warning(
             "Keyring is skipped due to an exception: %s", str(exc),
         )
+        keyring = None
+    return None
 
 
 class MultiDomainBasicAuth(AuthBase):
 
     def __init__(self, prompting=True, index_urls=None):
-        # type: (bool, Optional[Values]) -> None
+        # type: (bool, Optional[List[str]]) -> None
         self.prompting = prompting
         self.index_urls = index_urls
         self.passwords = {}  # type: Dict[str, AuthInfo]
@@ -87,6 +89,7 @@ class MultiDomainBasicAuth(AuthBase):
         self._credentials_to_save = None  # type: Optional[Credentials]
 
     def _get_index_url(self, url):
+        # type: (str) -> Optional[str]
         """Return the original index URL matching the requested URL.
 
         Cached or dynamically generated credentials may work against
@@ -106,9 +109,11 @@ class MultiDomainBasicAuth(AuthBase):
             prefix = remove_auth_from_url(u).rstrip("/") + "/"
             if url.startswith(prefix):
                 return u
+        return None
 
     def _get_new_credentials(self, original_url, allow_netrc=True,
                              allow_keyring=True):
+        # type: (str, bool, bool) -> AuthInfo
         """Find and return credentials for the specified URL."""
         # Split the credentials and netloc from the url.
         url, netloc, url_user_password = split_auth_netloc_from_url(
@@ -158,6 +163,7 @@ class MultiDomainBasicAuth(AuthBase):
         return username, password
 
     def _get_url_and_credentials(self, original_url):
+        # type: (str) -> Tuple[str, Optional[str], Optional[str]]
         """Return the credentials to use for the provided URL.
 
         If allowed, netrc and keyring may be used to obtain the
@@ -198,6 +204,7 @@ class MultiDomainBasicAuth(AuthBase):
         return url, username, password
 
     def __call__(self, req):
+        # type: (Request) -> Request
         # Get credentials for this request
         url, username, password = self._get_url_and_credentials(req.url)
 
@@ -215,22 +222,25 @@ class MultiDomainBasicAuth(AuthBase):
 
     # Factored out to allow for easy patching in tests
     def _prompt_for_password(self, netloc):
+        # type: (str) -> Tuple[Optional[str], Optional[str], bool]
         username = ask_input("User for {}: ".format(netloc))
         if not username:
-            return None, None
+            return None, None, False
         auth = get_keyring_auth(netloc, username)
-        if auth:
+        if auth and auth[0] is not None and auth[1] is not None:
             return auth[0], auth[1], False
         password = ask_password("Password: ")
         return username, password, True
 
     # Factored out to allow for easy patching in tests
     def _should_save_password_to_keyring(self):
+        # type: () -> bool
         if not keyring:
             return False
         return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y"
 
     def handle_401(self, resp, **kwargs):
+        # type: (Response, **Any) -> Response
         # We only care about 401 responses, anything else we want to just
         #   pass through the actual response
         if resp.status_code != 401:
@@ -276,6 +286,7 @@ class MultiDomainBasicAuth(AuthBase):
         return new_resp
 
     def warn_on_401(self, resp, **kwargs):
+        # type: (Response, **Any) -> None
         """Response callback to warn about incorrect credentials."""
         if resp.status_code == 401:
             logger.warning(
@@ -283,6 +294,7 @@ class MultiDomainBasicAuth(AuthBase):
             )
 
     def save_credentials(self, resp, **kwargs):
+        # type: (Response, **Any) -> None
         """Response callback to save credentials on success."""
         assert keyring is not None, "should never reach here without keyring"
         if not keyring:
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/network/cache.py b/venv/Lib/site-packages/pip/_internal/network/cache.py
similarity index 94%
rename from venv/lib/python3.8/site-packages/pip/_internal/network/cache.py
rename to venv/Lib/site-packages/pip/_internal/network/cache.py
index c9386e1..a0d55b5 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/network/cache.py
+++ b/venv/Lib/site-packages/pip/_internal/network/cache.py
@@ -1,9 +1,6 @@
 """HTTP cache implementation.
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 import os
 from contextlib import contextmanager
 
@@ -16,7 +13,7 @@ from pip._internal.utils.misc import ensure_dir
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 if MYPY_CHECK_RUNNING:
-    from typing import Optional
+    from typing import Optional, Iterator
 
 
 def is_from_cache(response):
@@ -26,6 +23,7 @@ def is_from_cache(response):
 
 @contextmanager
 def suppressed_cache_errors():
+    # type: () -> Iterator[None]
     """If we can't access the cache then we can just skip caching and process
     requests as if caching wasn't enabled.
     """
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/network/download.py b/venv/Lib/site-packages/pip/_internal/network/download.py
similarity index 76%
rename from venv/lib/python3.8/site-packages/pip/_internal/network/download.py
rename to venv/Lib/site-packages/pip/_internal/network/download.py
index 2f3e08a..44f9985 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/network/download.py
+++ b/venv/Lib/site-packages/pip/_internal/network/download.py
@@ -5,13 +5,17 @@ import logging
 import mimetypes
 import os
 
-from pip._vendor import requests
 from pip._vendor.requests.models import CONTENT_CHUNK_SIZE
 
 from pip._internal.cli.progress_bars import DownloadProgressProvider
+from pip._internal.exceptions import NetworkConnectionError
 from pip._internal.models.index import PyPI
 from pip._internal.network.cache import is_from_cache
-from pip._internal.network.utils import response_chunks
+from pip._internal.network.utils import (
+    HEADERS,
+    raise_for_status,
+    response_chunks,
+)
 from pip._internal.utils.misc import (
     format_size,
     redact_auth_from_url,
@@ -132,31 +136,8 @@ def _get_http_response_filename(resp, link):
 def _http_get_download(session, link):
     # type: (PipSession, Link) -> Response
     target_url = link.url.split('#', 1)[0]
-    resp = session.get(
-        target_url,
-        # We use Accept-Encoding: identity here because requests
-        # defaults to accepting compressed responses. This breaks in
-        # a variety of ways depending on how the server is configured.
-        # - Some servers will notice that the file isn't a compressible
-        #   file and will leave the file alone and with an empty
-        #   Content-Encoding
-        # - Some servers will notice that the file is already
-        #   compressed and will leave the file alone and will add a
-        #   Content-Encoding: gzip header
-        # - Some servers won't notice anything at all and will take
-        #   a file that's already been compressed and compress it again
-        #   and set the Content-Encoding: gzip header
-        # By setting this to request only the identity encoding We're
-        # hoping to eliminate the third case. Hopefully there does not
-        # exist a server which when given a file will notice it is
-        # already compressed and that you're not asking for a
-        # compressed file and will then decompress it before sending
-        # because if that's the case I don't think it'll ever be
-        # possible to make this work.
-        headers={"Accept-Encoding": "identity"},
-        stream=True,
-    )
-    resp.raise_for_status()
+    resp = session.get(target_url, headers=HEADERS, stream=True)
+    raise_for_status(resp)
     return resp
 
 
@@ -187,7 +168,8 @@ class Downloader(object):
         # type: (Link) -> Download
         try:
             resp = _http_get_download(self._session, link)
-        except requests.HTTPError as e:
+        except NetworkConnectionError as e:
+            assert e.response is not None
             logger.critical(
                 "HTTP error %s while getting %s", e.response.status_code, link
             )
diff --git a/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py b/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py
new file mode 100644
index 0000000..a0f9e15
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py
@@ -0,0 +1,235 @@
+"""Lazy ZIP over HTTP"""
+
+__all__ = ['HTTPRangeRequestUnsupported', 'dist_from_wheel_url']
+
+from bisect import bisect_left, bisect_right
+from contextlib import contextmanager
+from tempfile import NamedTemporaryFile
+from zipfile import BadZipfile, ZipFile
+
+from pip._vendor.requests.models import CONTENT_CHUNK_SIZE
+from pip._vendor.six.moves import range
+
+from pip._internal.network.utils import (
+    HEADERS,
+    raise_for_status,
+    response_chunks,
+)
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel
+
+if MYPY_CHECK_RUNNING:
+    from typing import Any, Dict, Iterator, List, Optional, Tuple
+
+    from pip._vendor.pkg_resources import Distribution
+    from pip._vendor.requests.models import Response
+
+    from pip._internal.network.session import PipSession
+
+
+class HTTPRangeRequestUnsupported(Exception):
+    pass
+
+
+def dist_from_wheel_url(name, url, session):
+    # type: (str, str, PipSession) -> Distribution
+    """Return a pkg_resources.Distribution from the given wheel URL.
+
+    This uses HTTP range requests to only fetch the potion of the wheel
+    containing metadata, just enough for the object to be constructed.
+    If such requests are not supported, HTTPRangeRequestUnsupported
+    is raised.
+    """
+    with LazyZipOverHTTP(url, session) as wheel:
+        # For read-only ZIP files, ZipFile only needs methods read,
+        # seek, seekable and tell, not the whole IO protocol.
+        zip_file = ZipFile(wheel)  # type: ignore
+        # After context manager exit, wheel.name
+        # is an invalid file by intention.
+        return pkg_resources_distribution_for_wheel(zip_file, name, wheel.name)
+
+
+class LazyZipOverHTTP(object):
+    """File-like object mapped to a ZIP file over HTTP.
+
+    This uses HTTP range requests to lazily fetch the file's content,
+    which is supposed to be fed to ZipFile.  If such requests are not
+    supported by the server, raise HTTPRangeRequestUnsupported
+    during initialization.
+    """
+
+    def __init__(self, url, session, chunk_size=CONTENT_CHUNK_SIZE):
+        # type: (str, PipSession, int) -> None
+        head = session.head(url, headers=HEADERS)
+        raise_for_status(head)
+        assert head.status_code == 200
+        self._session, self._url, self._chunk_size = session, url, chunk_size
+        self._length = int(head.headers['Content-Length'])
+        self._file = NamedTemporaryFile()
+        self.truncate(self._length)
+        self._left = []  # type: List[int]
+        self._right = []  # type: List[int]
+        if 'bytes' not in head.headers.get('Accept-Ranges', 'none'):
+            raise HTTPRangeRequestUnsupported('range request is not supported')
+        self._check_zip()
+
+    @property
+    def mode(self):
+        # type: () -> str
+        """Opening mode, which is always rb."""
+        return 'rb'
+
+    @property
+    def name(self):
+        # type: () -> str
+        """Path to the underlying file."""
+        return self._file.name
+
+    def seekable(self):
+        # type: () -> bool
+        """Return whether random access is supported, which is True."""
+        return True
+
+    def close(self):
+        # type: () -> None
+        """Close the file."""
+        self._file.close()
+
+    @property
+    def closed(self):
+        # type: () -> bool
+        """Whether the file is closed."""
+        return self._file.closed
+
+    def read(self, size=-1):
+        # type: (int) -> bytes
+        """Read up to size bytes from the object and return them.
+
+        As a convenience, if size is unspecified or -1,
+        all bytes until EOF are returned.  Fewer than
+        size bytes may be returned if EOF is reached.
+        """
+        download_size = max(size, self._chunk_size)
+        start, length = self.tell(), self._length
+        stop = length if size < 0 else min(start+download_size, length)
+        start = max(0, stop-download_size)
+        self._download(start, stop-1)
+        return self._file.read(size)
+
+    def readable(self):
+        # type: () -> bool
+        """Return whether the file is readable, which is True."""
+        return True
+
+    def seek(self, offset, whence=0):
+        # type: (int, int) -> int
+        """Change stream position and return the new absolute position.
+
+        Seek to offset relative position indicated by whence:
+        * 0: Start of stream (the default).  pos should be >= 0;
+        * 1: Current position - pos may be negative;
+        * 2: End of stream - pos usually negative.
+        """
+        return self._file.seek(offset, whence)
+
+    def tell(self):
+        # type: () -> int
+        """Return the current possition."""
+        return self._file.tell()
+
+    def truncate(self, size=None):
+        # type: (Optional[int]) -> int
+        """Resize the stream to the given size in bytes.
+
+        If size is unspecified resize to the current position.
+        The current stream position isn't changed.
+
+        Return the new file size.
+        """
+        return self._file.truncate(size)
+
+    def writable(self):
+        # type: () -> bool
+        """Return False."""
+        return False
+
+    def __enter__(self):
+        # type: () -> LazyZipOverHTTP
+        self._file.__enter__()
+        return self
+
+    def __exit__(self, *exc):
+        # type: (*Any) -> Optional[bool]
+        return self._file.__exit__(*exc)
+
+    @contextmanager
+    def _stay(self):
+        # type: ()-> Iterator[None]
+        """Return a context manager keeping the position.
+
+        At the end of the block, seek back to original position.
+        """
+        pos = self.tell()
+        try:
+            yield
+        finally:
+            self.seek(pos)
+
+    def _check_zip(self):
+        # type: () -> None
+        """Check and download until the file is a valid ZIP."""
+        end = self._length - 1
+        for start in reversed(range(0, end, self._chunk_size)):
+            self._download(start, end)
+            with self._stay():
+                try:
+                    # For read-only ZIP files, ZipFile only needs
+                    # methods read, seek, seekable and tell.
+                    ZipFile(self)  # type: ignore
+                except BadZipfile:
+                    pass
+                else:
+                    break
+
+    def _stream_response(self, start, end, base_headers=HEADERS):
+        # type: (int, int, Dict[str, str]) -> Response
+        """Return HTTP response to a range request from start to end."""
+        headers = base_headers.copy()
+        headers['Range'] = 'bytes={}-{}'.format(start, end)
+        # TODO: Get range requests to be correctly cached
+        headers['Cache-Control'] = 'no-cache'
+        return self._session.get(self._url, headers=headers, stream=True)
+
+    def _merge(self, start, end, left, right):
+        # type: (int, int, int, int) -> Iterator[Tuple[int, int]]
+        """Return an iterator of intervals to be fetched.
+
+        Args:
+            start (int): Start of needed interval
+            end (int): End of needed interval
+            left (int): Index of first overlapping downloaded data
+            right (int): Index after last overlapping downloaded data
+        """
+        lslice, rslice = self._left[left:right], self._right[left:right]
+        i = start = min([start]+lslice[:1])
+        end = max([end]+rslice[-1:])
+        for j, k in zip(lslice, rslice):
+            if j > i:
+                yield i, j-1
+            i = k + 1
+        if i <= end:
+            yield i, end
+        self._left[left:right], self._right[left:right] = [start], [end]
+
+    def _download(self, start, end):
+        # type: (int, int) -> None
+        """Download bytes from start to end inclusively."""
+        with self._stay():
+            left = bisect_left(self._right, start)
+            right = bisect_right(self._left, end)
+            for start, end in self._merge(start, end, left, right):
+                response = self._stream_response(start, end)
+                response.raise_for_status()
+                self.seek(start)
+                for chunk in response_chunks(response, self._chunk_size):
+                    self._file.write(chunk)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/network/session.py b/venv/Lib/site-packages/pip/_internal/network/session.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/network/session.py
rename to venv/Lib/site-packages/pip/_internal/network/session.py
diff --git a/venv/Lib/site-packages/pip/_internal/network/utils.py b/venv/Lib/site-packages/pip/_internal/network/utils.py
new file mode 100644
index 0000000..907b3fe
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_internal/network/utils.py
@@ -0,0 +1,97 @@
+from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
+
+from pip._internal.exceptions import NetworkConnectionError
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Dict, Iterator
+
+# The following comments and HTTP headers were originally added by
+# Donald Stufft in git commit 22c562429a61bb77172039e480873fb239dd8c03.
+#
+# We use Accept-Encoding: identity here because requests defaults to
+# accepting compressed responses. This breaks in a variety of ways
+# depending on how the server is configured.
+# - Some servers will notice that the file isn't a compressible file
+#   and will leave the file alone and with an empty Content-Encoding
+# - Some servers will notice that the file is already compressed and
+#   will leave the file alone, adding a Content-Encoding: gzip header
+# - Some servers won't notice anything at all and will take a file
+#   that's already been compressed and compress it again, and set
+#   the Content-Encoding: gzip header
+# By setting this to request only the identity encoding we're hoping
+# to eliminate the third case.  Hopefully there does not exist a server
+# which when given a file will notice it is already compressed and that
+# you're not asking for a compressed file and will then decompress it
+# before sending because if that's the case I don't think it'll ever be
+# possible to make this work.
+HEADERS = {'Accept-Encoding': 'identity'}  # type: Dict[str, str]
+
+
+def raise_for_status(resp):
+    # type: (Response) -> None
+    http_error_msg = u''
+    if isinstance(resp.reason, bytes):
+        # We attempt to decode utf-8 first because some servers
+        # choose to localize their reason strings. If the string
+        # isn't utf-8, we fall back to iso-8859-1 for all other
+        # encodings.
+        try:
+            reason = resp.reason.decode('utf-8')
+        except UnicodeDecodeError:
+            reason = resp.reason.decode('iso-8859-1')
+    else:
+        reason = resp.reason
+
+    if 400 <= resp.status_code < 500:
+        http_error_msg = u'%s Client Error: %s for url: %s' % (
+            resp.status_code, reason, resp.url)
+
+    elif 500 <= resp.status_code < 600:
+        http_error_msg = u'%s Server Error: %s for url: %s' % (
+            resp.status_code, reason, resp.url)
+
+    if http_error_msg:
+        raise NetworkConnectionError(http_error_msg, response=resp)
+
+
+def response_chunks(response, chunk_size=CONTENT_CHUNK_SIZE):
+    # type: (Response, int) -> Iterator[bytes]
+    """Given a requests Response, provide the data chunks.
+    """
+    try:
+        # Special case for urllib3.
+        for chunk in response.raw.stream(
+            chunk_size,
+            # We use decode_content=False here because we don't
+            # want urllib3 to mess with the raw bytes we get
+            # from the server. If we decompress inside of
+            # urllib3 then we cannot verify the checksum
+            # because the checksum will be of the compressed
+            # file. This breakage will only occur if the
+            # server adds a Content-Encoding header, which
+            # depends on how the server was configured:
+            # - Some servers will notice that the file isn't a
+            #   compressible file and will leave the file alone
+            #   and with an empty Content-Encoding
+            # - Some servers will notice that the file is
+            #   already compressed and will leave the file
+            #   alone and will add a Content-Encoding: gzip
+            #   header
+            # - Some servers won't notice anything at all and
+            #   will take a file that's already been compressed
+            #   and compress it again and set the
+            #   Content-Encoding: gzip header
+            #
+            # By setting this not to decode automatically we
+            # hope to eliminate problems with the second case.
+            decode_content=False,
+        ):
+            yield chunk
+    except AttributeError:
+        # Standard file-like object.
+        while True:
+            chunk = response.raw.read(chunk_size)
+            if not chunk:
+                break
+            yield chunk
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py b/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py
similarity index 73%
rename from venv/lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py
rename to venv/Lib/site-packages/pip/_internal/network/xmlrpc.py
index 121edd9..e611262 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py
+++ b/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py
@@ -1,17 +1,22 @@
 """xmlrpclib.Transport implementation
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 import logging
 
-from pip._vendor import requests
 # NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is
 #       why we ignore the type on this import
 from pip._vendor.six.moves import xmlrpc_client  # type: ignore
 from pip._vendor.six.moves.urllib import parse as urllib_parse
 
+from pip._internal.exceptions import NetworkConnectionError
+from pip._internal.network.utils import raise_for_status
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Dict
+    from pip._internal.network.session import PipSession
+
+
 logger = logging.getLogger(__name__)
 
 
@@ -21,22 +26,25 @@ class PipXmlrpcTransport(xmlrpc_client.Transport):
     """
 
     def __init__(self, index_url, session, use_datetime=False):
+        # type: (str, PipSession, bool) -> None
         xmlrpc_client.Transport.__init__(self, use_datetime)
         index_parts = urllib_parse.urlparse(index_url)
         self._scheme = index_parts.scheme
         self._session = session
 
     def request(self, host, handler, request_body, verbose=False):
+        # type: (str, str, Dict[str, str], bool) -> None
         parts = (self._scheme, host, handler, None, None, None)
         url = urllib_parse.urlunparse(parts)
         try:
             headers = {'Content-Type': 'text/xml'}
             response = self._session.post(url, data=request_body,
                                           headers=headers, stream=True)
-            response.raise_for_status()
+            raise_for_status(response)
             self.verbose = verbose
             return self.parse_response(response.raw)
-        except requests.HTTPError as exc:
+        except NetworkConnectionError as exc:
+            assert exc.response
             logger.critical(
                 "HTTP error %s while getting %s",
                 exc.response.status_code, url,
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/__init__.py
rename to venv/Lib/site-packages/pip/_internal/operations/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/build/__init__.py
rename to venv/Lib/site-packages/pip/_internal/operations/build/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py b/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py
rename to venv/Lib/site-packages/pip/_internal/operations/build/metadata.py
index b13fbde..cf52f8d 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py
+++ b/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py
@@ -1,7 +1,6 @@
 """Metadata generation logic for source distributions.
 """
 
-import logging
 import os
 
 from pip._internal.utils.subprocess import runner_with_spinner_message
@@ -12,8 +11,6 @@ if MYPY_CHECK_RUNNING:
     from pip._internal.build_env import BuildEnvironment
     from pip._vendor.pep517.wrappers import Pep517HookCaller
 
-logger = logging.getLogger(__name__)
-
 
 def generate_metadata(build_env, backend):
     # type: (BuildEnvironment, Pep517HookCaller) -> str
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py
rename to venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py b/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py
rename to venv/Lib/site-packages/pip/_internal/operations/build/wheel.py
index 1266ce0..0c28c49 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py
+++ b/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py
@@ -27,7 +27,7 @@ def build_wheel_pep517(
     if build_options:
         # PEP 517 does not support --build-options
         logger.error('Cannot build wheel for %s using PEP 517 when '
-                     '--build-option is present' % (name,))
+                     '--build-option is present', name)
         return None
     try:
         logger.debug('Destination directory: %s', tempd)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel_legacy.py
rename to venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/check.py b/venv/Lib/site-packages/pip/_internal/operations/check.py
similarity index 93%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/check.py
rename to venv/Lib/site-packages/pip/_internal/operations/check.py
index b85a123..5714915 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/operations/check.py
+++ b/venv/Lib/site-packages/pip/_internal/operations/check.py
@@ -1,10 +1,6 @@
 """Validation of dependencies of packages
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-# mypy: disallow-untyped-defs=False
-
 import logging
 from collections import namedtuple
 
@@ -33,6 +29,7 @@ if MYPY_CHECK_RUNNING:
     MissingDict = Dict[str, List[Missing]]
     ConflictingDict = Dict[str, List[Conflicting]]
     CheckResult = Tuple[MissingDict, ConflictingDict]
+    ConflictDetails = Tuple[PackageSet, CheckResult]
 
 PackageDetails = namedtuple('PackageDetails', ['version', 'requires'])
 
@@ -65,9 +62,6 @@ def check_package_set(package_set, should_ignore=None):
     If should_ignore is passed, it should be a callable that takes a
     package name and returns a boolean.
     """
-    if should_ignore is None:
-        def should_ignore(name):
-            return False
 
     missing = {}
     conflicting = {}
@@ -77,7 +71,7 @@ def check_package_set(package_set, should_ignore=None):
         missing_deps = set()  # type: Set[Missing]
         conflicting_deps = set()  # type: Set[Conflicting]
 
-        if should_ignore(package_name):
+        if should_ignore and should_ignore(package_name):
             continue
 
         for req in package_set[package_name].requires:
@@ -106,7 +100,7 @@ def check_package_set(package_set, should_ignore=None):
 
 
 def check_install_conflicts(to_install):
-    # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult]
+    # type: (List[InstallRequirement]) -> ConflictDetails
     """For checking if the dependency graph would be consistent after \
     installing given requirements
     """
@@ -139,6 +133,7 @@ def _simulate_installation_of(to_install, package_set):
         abstract_dist = make_distribution_for_install_requirement(inst_req)
         dist = abstract_dist.get_pkg_resources_distribution()
 
+        assert dist is not None
         name = canonicalize_name(dist.key)
         package_set[name] = PackageDetails(dist.version, dist.requires())
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/freeze.py b/venv/Lib/site-packages/pip/_internal/operations/freeze.py
similarity index 94%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/freeze.py
rename to venv/Lib/site-packages/pip/_internal/operations/freeze.py
index aa6b052..ddb9cb2 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/operations/freeze.py
+++ b/venv/Lib/site-packages/pip/_internal/operations/freeze.py
@@ -1,7 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import collections
@@ -46,8 +42,8 @@ logger = logging.getLogger(__name__)
 def freeze(
     requirement=None,  # type: Optional[List[str]]
     find_links=None,  # type: Optional[List[str]]
-    local_only=None,  # type: Optional[bool]
-    user_only=None,  # type: Optional[bool]
+    local_only=False,  # type: bool
+    user_only=False,  # type: bool
     paths=None,  # type: Optional[List[str]]
     isolated=False,  # type: bool
     wheel_cache=None,  # type: Optional[WheelCache]
@@ -60,10 +56,13 @@ def freeze(
     for link in find_links:
         yield '-f {}'.format(link)
     installations = {}  # type: Dict[str, FrozenRequirement]
-    for dist in get_installed_distributions(local_only=local_only,
-                                            skip=(),
-                                            user_only=user_only,
-                                            paths=paths):
+
+    for dist in get_installed_distributions(
+            local_only=local_only,
+            skip=(),
+            user_only=user_only,
+            paths=paths
+    ):
         try:
             req = FrozenRequirement.from_dist(dist)
         except RequirementParseError as exc:
@@ -96,13 +95,13 @@ def freeze(
                             line.strip().startswith('#') or
                             line.startswith((
                                 '-r', '--requirement',
-                                '-Z', '--always-unzip',
                                 '-f', '--find-links',
                                 '-i', '--index-url',
                                 '--pre',
                                 '--trusted-host',
                                 '--process-dependency-links',
-                                '--extra-index-url'))):
+                                '--extra-index-url',
+                                '--use-feature'))):
                         line = line.rstrip()
                         if line not in emitted_options:
                             emitted_options.add(line)
@@ -266,6 +265,7 @@ class FrozenRequirement(object):
         return cls(dist.project_name, req, editable, comments=comments)
 
     def __str__(self):
+        # type: () -> str
         req = self.req
         if self.editable:
             req = '-e {}'.format(req)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__init__.py b/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/install/__init__.py
rename to venv/Lib/site-packages/pip/_internal/operations/install/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/install/editable_legacy.py b/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/install/editable_legacy.py
rename to venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py b/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py
similarity index 84%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py
rename to venv/Lib/site-packages/pip/_internal/operations/install/legacy.py
index 0fac905..87227d5 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py
+++ b/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py
@@ -6,7 +6,7 @@ import os
 import sys
 from distutils.util import change_root
 
-from pip._internal.utils.deprecation import deprecated
+from pip._internal.exceptions import InstallationError
 from pip._internal.utils.logging import indent_log
 from pip._internal.utils.misc import ensure_dir
 from pip._internal.utils.setuptools_build import make_setuptools_install_args
@@ -106,24 +106,12 @@ def install(
             egg_info_dir = prepend_root(directory)
             break
     else:
-        deprecated(
-            reason=(
-                "{} did not indicate that it installed an "
-                ".egg-info directory. Only setup.py projects "
-                "generating .egg-info directories are supported."
-            ).format(req_description),
-            replacement=(
-                "for maintainers: updating the setup.py of {0}. "
-                "For users: contact the maintainers of {0} to let "
-                "them know to update their setup.py.".format(
-                    req_name
-                )
-            ),
-            gone_in="20.2",
-            issue=6998,
-        )
-        # FIXME: put the record somewhere
-        return True
+        message = (
+            "{} did not indicate that it installed an "
+            ".egg-info directory. Only setup.py projects "
+            "generating .egg-info directories are supported."
+        ).format(req_description)
+        raise InstallationError(message)
 
     new_lines = []
     for line in record_lines:
diff --git a/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py b/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py
new file mode 100644
index 0000000..e91b1b8
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py
@@ -0,0 +1,861 @@
+"""Support for installing and building the "wheel" binary package format.
+"""
+
+from __future__ import absolute_import
+
+import collections
+import compileall
+import contextlib
+import csv
+import importlib
+import logging
+import os.path
+import re
+import shutil
+import sys
+import warnings
+from base64 import urlsafe_b64encode
+from itertools import chain, starmap
+from zipfile import ZipFile
+
+from pip._vendor import pkg_resources
+from pip._vendor.distlib.scripts import ScriptMaker
+from pip._vendor.distlib.util import get_export_entry
+from pip._vendor.six import (
+    PY2,
+    ensure_str,
+    ensure_text,
+    itervalues,
+    reraise,
+    text_type,
+)
+from pip._vendor.six.moves import filterfalse, map
+
+from pip._internal.exceptions import InstallationError
+from pip._internal.locations import get_major_minor_version
+from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl
+from pip._internal.models.scheme import SCHEME_KEYS
+from pip._internal.utils.filesystem import adjacent_tmp_file, replace
+from pip._internal.utils.misc import (
+    captured_stdout,
+    ensure_dir,
+    hash_file,
+    partition,
+)
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.utils.unpacking import (
+    current_umask,
+    is_within_directory,
+    set_extracted_file_to_default_mode_plus_executable,
+    zip_item_is_executable,
+)
+from pip._internal.utils.wheel import (
+    parse_wheel,
+    pkg_resources_distribution_for_wheel,
+)
+
+# Use the custom cast function at runtime to make cast work,
+# and import typing.cast when performing pre-commit and type
+# checks
+if not MYPY_CHECK_RUNNING:
+    from pip._internal.utils.typing import cast
+else:
+    from email.message import Message
+    from typing import (
+        Any,
+        Callable,
+        Dict,
+        IO,
+        Iterable,
+        Iterator,
+        List,
+        NewType,
+        Optional,
+        Protocol,
+        Sequence,
+        Set,
+        Tuple,
+        Union,
+        cast,
+    )
+    from zipfile import ZipInfo
+
+    from pip._vendor.pkg_resources import Distribution
+
+    from pip._internal.models.scheme import Scheme
+    from pip._internal.utils.filesystem import NamedTemporaryFileResult
+
+    RecordPath = NewType('RecordPath', text_type)
+    InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]]
+
+    class File(Protocol):
+        src_record_path = None  # type: RecordPath
+        dest_path = None  # type: text_type
+        changed = None  # type: bool
+
+        def save(self):
+            # type: () -> None
+            pass
+
+
+logger = logging.getLogger(__name__)
+
+
+def rehash(path, blocksize=1 << 20):
+    # type: (text_type, int) -> Tuple[str, str]
+    """Return (encoded_digest, length) for path using hashlib.sha256()"""
+    h, length = hash_file(path, blocksize)
+    digest = 'sha256=' + urlsafe_b64encode(
+        h.digest()
+    ).decode('latin1').rstrip('=')
+    # unicode/str python2 issues
+    return (digest, str(length))  # type: ignore
+
+
+def csv_io_kwargs(mode):
+    # type: (str) -> Dict[str, Any]
+    """Return keyword arguments to properly open a CSV file
+    in the given mode.
+    """
+    if PY2:
+        return {'mode': '{}b'.format(mode)}
+    else:
+        return {'mode': mode, 'newline': '', 'encoding': 'utf-8'}
+
+
+def fix_script(path):
+    # type: (text_type) -> bool
+    """Replace #!python with #!/path/to/python
+    Return True if file was changed.
+    """
+    # XXX RECORD hashes will need to be updated
+    assert os.path.isfile(path)
+
+    with open(path, 'rb') as script:
+        firstline = script.readline()
+        if not firstline.startswith(b'#!python'):
+            return False
+        exename = sys.executable.encode(sys.getfilesystemencoding())
+        firstline = b'#!' + exename + os.linesep.encode("ascii")
+        rest = script.read()
+    with open(path, 'wb') as script:
+        script.write(firstline)
+        script.write(rest)
+    return True
+
+
+def wheel_root_is_purelib(metadata):
+    # type: (Message) -> bool
+    return metadata.get("Root-Is-Purelib", "").lower() == "true"
+
+
+def get_entrypoints(distribution):
+    # type: (Distribution) -> Tuple[Dict[str, str], Dict[str, str]]
+    # get the entry points and then the script names
+    try:
+        console = distribution.get_entry_map('console_scripts')
+        gui = distribution.get_entry_map('gui_scripts')
+    except KeyError:
+        # Our dict-based Distribution raises KeyError if entry_points.txt
+        # doesn't exist.
+        return {}, {}
+
+    def _split_ep(s):
+        # type: (pkg_resources.EntryPoint) -> Tuple[str, str]
+        """get the string representation of EntryPoint,
+        remove space and split on '='
+        """
+        split_parts = str(s).replace(" ", "").split("=")
+        return split_parts[0], split_parts[1]
+
+    # convert the EntryPoint objects into strings with module:function
+    console = dict(_split_ep(v) for v in console.values())
+    gui = dict(_split_ep(v) for v in gui.values())
+    return console, gui
+
+
+def message_about_scripts_not_on_PATH(scripts):
+    # type: (Sequence[str]) -> Optional[str]
+    """Determine if any scripts are not on PATH and format a warning.
+    Returns a warning message if one or more scripts are not on PATH,
+    otherwise None.
+    """
+    if not scripts:
+        return None
+
+    # Group scripts by the path they were installed in
+    grouped_by_dir = collections.defaultdict(set)  # type: Dict[str, Set[str]]
+    for destfile in scripts:
+        parent_dir = os.path.dirname(destfile)
+        script_name = os.path.basename(destfile)
+        grouped_by_dir[parent_dir].add(script_name)
+
+    # We don't want to warn for directories that are on PATH.
+    not_warn_dirs = [
+        os.path.normcase(i).rstrip(os.sep) for i in
+        os.environ.get("PATH", "").split(os.pathsep)
+    ]
+    # If an executable sits with sys.executable, we don't warn for it.
+    #     This covers the case of venv invocations without activating the venv.
+    not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable)))
+    warn_for = {
+        parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items()
+        if os.path.normcase(parent_dir) not in not_warn_dirs
+    }  # type: Dict[str, Set[str]]
+    if not warn_for:
+        return None
+
+    # Format a message
+    msg_lines = []
+    for parent_dir, dir_scripts in warn_for.items():
+        sorted_scripts = sorted(dir_scripts)  # type: List[str]
+        if len(sorted_scripts) == 1:
+            start_text = "script {} is".format(sorted_scripts[0])
+        else:
+            start_text = "scripts {} are".format(
+                ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1]
+            )
+
+        msg_lines.append(
+            "The {} installed in '{}' which is not on PATH."
+            .format(start_text, parent_dir)
+        )
+
+    last_line_fmt = (
+        "Consider adding {} to PATH or, if you prefer "
+        "to suppress this warning, use --no-warn-script-location."
+    )
+    if len(msg_lines) == 1:
+        msg_lines.append(last_line_fmt.format("this directory"))
+    else:
+        msg_lines.append(last_line_fmt.format("these directories"))
+
+    # Add a note if any directory starts with ~
+    warn_for_tilde = any(
+        i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i
+    )
+    if warn_for_tilde:
+        tilde_warning_msg = (
+            "NOTE: The current PATH contains path(s) starting with `~`, "
+            "which may not be expanded by all applications."
+        )
+        msg_lines.append(tilde_warning_msg)
+
+    # Returns the formatted multiline message
+    return "\n".join(msg_lines)
+
+
+def _normalized_outrows(outrows):
+    # type: (Iterable[InstalledCSVRow]) -> List[Tuple[str, str, str]]
+    """Normalize the given rows of a RECORD file.
+
+    Items in each row are converted into str. Rows are then sorted to make
+    the value more predictable for tests.
+
+    Each row is a 3-tuple (path, hash, size) and corresponds to a record of
+    a RECORD file (see PEP 376 and PEP 427 for details).  For the rows
+    passed to this function, the size can be an integer as an int or string,
+    or the empty string.
+    """
+    # Normally, there should only be one row per path, in which case the
+    # second and third elements don't come into play when sorting.
+    # However, in cases in the wild where a path might happen to occur twice,
+    # we don't want the sort operation to trigger an error (but still want
+    # determinism).  Since the third element can be an int or string, we
+    # coerce each element to a string to avoid a TypeError in this case.
+    # For additional background, see--
+    # https://github.com/pypa/pip/issues/5868
+    return sorted(
+        (ensure_str(record_path, encoding='utf-8'), hash_, str(size))
+        for record_path, hash_, size in outrows
+    )
+
+
+def _record_to_fs_path(record_path):
+    # type: (RecordPath) -> text_type
+    return record_path
+
+
+def _fs_to_record_path(path, relative_to=None):
+    # type: (text_type, Optional[text_type]) -> RecordPath
+    if relative_to is not None:
+        # On Windows, do not handle relative paths if they belong to different
+        # logical disks
+        if os.path.splitdrive(path)[0].lower() == \
+                os.path.splitdrive(relative_to)[0].lower():
+            path = os.path.relpath(path, relative_to)
+    path = path.replace(os.path.sep, '/')
+    return cast('RecordPath', path)
+
+
+def _parse_record_path(record_column):
+    # type: (str) -> RecordPath
+    p = ensure_text(record_column, encoding='utf-8')
+    return cast('RecordPath', p)
+
+
+def get_csv_rows_for_installed(
+    old_csv_rows,  # type: List[List[str]]
+    installed,  # type: Dict[RecordPath, RecordPath]
+    changed,  # type: Set[RecordPath]
+    generated,  # type: List[str]
+    lib_dir,  # type: str
+):
+    # type: (...) -> List[InstalledCSVRow]
+    """
+    :param installed: A map from archive RECORD path to installation RECORD
+        path.
+    """
+    installed_rows = []  # type: List[InstalledCSVRow]
+    for row in old_csv_rows:
+        if len(row) > 3:
+            logger.warning('RECORD line has more than three elements: %s', row)
+        old_record_path = _parse_record_path(row[0])
+        new_record_path = installed.pop(old_record_path, old_record_path)
+        if new_record_path in changed:
+            digest, length = rehash(_record_to_fs_path(new_record_path))
+        else:
+            digest = row[1] if len(row) > 1 else ''
+            length = row[2] if len(row) > 2 else ''
+        installed_rows.append((new_record_path, digest, length))
+    for f in generated:
+        path = _fs_to_record_path(f, lib_dir)
+        digest, length = rehash(f)
+        installed_rows.append((path, digest, length))
+    for installed_record_path in itervalues(installed):
+        installed_rows.append((installed_record_path, '', ''))
+    return installed_rows
+
+
+def get_console_script_specs(console):
+    # type: (Dict[str, str]) -> List[str]
+    """
+    Given the mapping from entrypoint name to callable, return the relevant
+    console script specs.
+    """
+    # Don't mutate caller's version
+    console = console.copy()
+
+    scripts_to_generate = []
+
+    # Special case pip and setuptools to generate versioned wrappers
+    #
+    # The issue is that some projects (specifically, pip and setuptools) use
+    # code in setup.py to create "versioned" entry points - pip2.7 on Python
+    # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into
+    # the wheel metadata at build time, and so if the wheel is installed with
+    # a *different* version of Python the entry points will be wrong. The
+    # correct fix for this is to enhance the metadata to be able to describe
+    # such versioned entry points, but that won't happen till Metadata 2.0 is
+    # available.
+    # In the meantime, projects using versioned entry points will either have
+    # incorrect versioned entry points, or they will not be able to distribute
+    # "universal" wheels (i.e., they will need a wheel per Python version).
+    #
+    # Because setuptools and pip are bundled with _ensurepip and virtualenv,
+    # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
+    # override the versioned entry points in the wheel and generate the
+    # correct ones. This code is purely a short-term measure until Metadata 2.0
+    # is available.
+    #
+    # To add the level of hack in this section of code, in order to support
+    # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment
+    # variable which will control which version scripts get installed.
+    #
+    # ENSUREPIP_OPTIONS=altinstall
+    #   - Only pipX.Y and easy_install-X.Y will be generated and installed
+    # ENSUREPIP_OPTIONS=install
+    #   - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note
+    #     that this option is technically if ENSUREPIP_OPTIONS is set and is
+    #     not altinstall
+    # DEFAULT
+    #   - The default behavior is to install pip, pipX, pipX.Y, easy_install
+    #     and easy_install-X.Y.
+    pip_script = console.pop('pip', None)
+    if pip_script:
+        if "ENSUREPIP_OPTIONS" not in os.environ:
+            scripts_to_generate.append('pip = ' + pip_script)
+
+        if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall":
+            scripts_to_generate.append(
+                'pip{} = {}'.format(sys.version_info[0], pip_script)
+            )
+
+        scripts_to_generate.append(
+            'pip{} = {}'.format(get_major_minor_version(), pip_script)
+        )
+        # Delete any other versioned pip entry points
+        pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)]
+        for k in pip_ep:
+            del console[k]
+    easy_install_script = console.pop('easy_install', None)
+    if easy_install_script:
+        if "ENSUREPIP_OPTIONS" not in os.environ:
+            scripts_to_generate.append(
+                'easy_install = ' + easy_install_script
+            )
+
+        scripts_to_generate.append(
+            'easy_install-{} = {}'.format(
+                get_major_minor_version(), easy_install_script
+            )
+        )
+        # Delete any other versioned easy_install entry points
+        easy_install_ep = [
+            k for k in console if re.match(r'easy_install(-\d\.\d)?$', k)
+        ]
+        for k in easy_install_ep:
+            del console[k]
+
+    # Generate the console entry points specified in the wheel
+    scripts_to_generate.extend(starmap('{} = {}'.format, console.items()))
+
+    return scripts_to_generate
+
+
+class ZipBackedFile(object):
+    def __init__(self, src_record_path, dest_path, zip_file):
+        # type: (RecordPath, text_type, ZipFile) -> None
+        self.src_record_path = src_record_path
+        self.dest_path = dest_path
+        self._zip_file = zip_file
+        self.changed = False
+
+    def _getinfo(self):
+        # type: () -> ZipInfo
+        if not PY2:
+            return self._zip_file.getinfo(self.src_record_path)
+        # Python 2 does not expose a way to detect a ZIP's encoding, but the
+        # wheel specification (PEP 427) explicitly mandates that paths should
+        # use UTF-8, so we assume it is true.
+        return self._zip_file.getinfo(self.src_record_path.encode("utf-8"))
+
+    def save(self):
+        # type: () -> None
+        # directory creation is lazy and after file filtering
+        # to ensure we don't install empty dirs; empty dirs can't be
+        # uninstalled.
+        parent_dir = os.path.dirname(self.dest_path)
+        ensure_dir(parent_dir)
+
+        # When we open the output file below, any existing file is truncated
+        # before we start writing the new contents. This is fine in most
+        # cases, but can cause a segfault if pip has loaded a shared
+        # object (e.g. from pyopenssl through its vendored urllib3)
+        # Since the shared object is mmap'd an attempt to call a
+        # symbol in it will then cause a segfault. Unlinking the file
+        # allows writing of new contents while allowing the process to
+        # continue to use the old copy.
+        if os.path.exists(self.dest_path):
+            os.unlink(self.dest_path)
+
+        zipinfo = self._getinfo()
+
+        with self._zip_file.open(zipinfo) as f:
+            with open(self.dest_path, "wb") as dest:
+                shutil.copyfileobj(f, dest)
+
+        if zip_item_is_executable(zipinfo):
+            set_extracted_file_to_default_mode_plus_executable(self.dest_path)
+
+
+class ScriptFile(object):
+    def __init__(self, file):
+        # type: (File) -> None
+        self._file = file
+        self.src_record_path = self._file.src_record_path
+        self.dest_path = self._file.dest_path
+        self.changed = False
+
+    def save(self):
+        # type: () -> None
+        self._file.save()
+        self.changed = fix_script(self.dest_path)
+
+
+class MissingCallableSuffix(InstallationError):
+    def __init__(self, entry_point):
+        # type: (str) -> None
+        super(MissingCallableSuffix, self).__init__(
+            "Invalid script entry point: {} - A callable "
+            "suffix is required. Cf https://packaging.python.org/"
+            "specifications/entry-points/#use-for-scripts for more "
+            "information.".format(entry_point)
+        )
+
+
+def _raise_for_invalid_entrypoint(specification):
+    # type: (str) -> None
+    entry = get_export_entry(specification)
+    if entry is not None and entry.suffix is None:
+        raise MissingCallableSuffix(str(entry))
+
+
+class PipScriptMaker(ScriptMaker):
+    def make(self, specification, options=None):
+        # type: (str, Dict[str, Any]) -> List[str]
+        _raise_for_invalid_entrypoint(specification)
+        return super(PipScriptMaker, self).make(specification, options)
+
+
+def _install_wheel(
+    name,  # type: str
+    wheel_zip,  # type: ZipFile
+    wheel_path,  # type: str
+    scheme,  # type: Scheme
+    pycompile=True,  # type: bool
+    warn_script_location=True,  # type: bool
+    direct_url=None,  # type: Optional[DirectUrl]
+    requested=False,  # type: bool
+):
+    # type: (...) -> None
+    """Install a wheel.
+
+    :param name: Name of the project to install
+    :param wheel_zip: open ZipFile for wheel being installed
+    :param scheme: Distutils scheme dictating the install directories
+    :param req_description: String used in place of the requirement, for
+        logging
+    :param pycompile: Whether to byte-compile installed Python files
+    :param warn_script_location: Whether to check that scripts are installed
+        into a directory on PATH
+    :raises UnsupportedWheel:
+        * when the directory holds an unpacked wheel with incompatible
+          Wheel-Version
+        * when the .dist-info dir does not match the wheel
+    """
+    info_dir, metadata = parse_wheel(wheel_zip, name)
+
+    if wheel_root_is_purelib(metadata):
+        lib_dir = scheme.purelib
+    else:
+        lib_dir = scheme.platlib
+
+    # Record details of the files moved
+    #   installed = files copied from the wheel to the destination
+    #   changed = files changed while installing (scripts #! line typically)
+    #   generated = files newly generated during the install (script wrappers)
+    installed = {}  # type: Dict[RecordPath, RecordPath]
+    changed = set()  # type: Set[RecordPath]
+    generated = []  # type: List[str]
+
+    def record_installed(srcfile, destfile, modified=False):
+        # type: (RecordPath, text_type, bool) -> None
+        """Map archive RECORD paths to installation RECORD paths."""
+        newpath = _fs_to_record_path(destfile, lib_dir)
+        installed[srcfile] = newpath
+        if modified:
+            changed.add(_fs_to_record_path(destfile))
+
+    def all_paths():
+        # type: () -> Iterable[RecordPath]
+        names = wheel_zip.namelist()
+        # If a flag is set, names may be unicode in Python 2. We convert to
+        # text explicitly so these are valid for lookup in RECORD.
+        decoded_names = map(ensure_text, names)
+        for name in decoded_names:
+            yield cast("RecordPath", name)
+
+    def is_dir_path(path):
+        # type: (RecordPath) -> bool
+        return path.endswith("/")
+
+    def assert_no_path_traversal(dest_dir_path, target_path):
+        # type: (text_type, text_type) -> None
+        if not is_within_directory(dest_dir_path, target_path):
+            message = (
+                "The wheel {!r} has a file {!r} trying to install"
+                " outside the target directory {!r}"
+            )
+            raise InstallationError(
+                message.format(wheel_path, target_path, dest_dir_path)
+            )
+
+    def root_scheme_file_maker(zip_file, dest):
+        # type: (ZipFile, text_type) -> Callable[[RecordPath], File]
+        def make_root_scheme_file(record_path):
+            # type: (RecordPath) -> File
+            normed_path = os.path.normpath(record_path)
+            dest_path = os.path.join(dest, normed_path)
+            assert_no_path_traversal(dest, dest_path)
+            return ZipBackedFile(record_path, dest_path, zip_file)
+
+        return make_root_scheme_file
+
+    def data_scheme_file_maker(zip_file, scheme):
+        # type: (ZipFile, Scheme) -> Callable[[RecordPath], File]
+        scheme_paths = {}
+        for key in SCHEME_KEYS:
+            encoded_key = ensure_text(key)
+            scheme_paths[encoded_key] = ensure_text(
+                getattr(scheme, key), encoding=sys.getfilesystemencoding()
+            )
+
+        def make_data_scheme_file(record_path):
+            # type: (RecordPath) -> File
+            normed_path = os.path.normpath(record_path)
+            try:
+                _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2)
+            except ValueError:
+                message = (
+                    "Unexpected file in {}: {!r}. .data directory contents"
+                    " should be named like: '<scheme key>/<path>'."
+                ).format(wheel_path, record_path)
+                raise InstallationError(message)
+
+            try:
+                scheme_path = scheme_paths[scheme_key]
+            except KeyError:
+                valid_scheme_keys = ", ".join(sorted(scheme_paths))
+                message = (
+                    "Unknown scheme key used in {}: {} (for file {!r}). .data"
+                    " directory contents should be in subdirectories named"
+                    " with a valid scheme key ({})"
+                ).format(
+                    wheel_path, scheme_key, record_path, valid_scheme_keys
+                )
+                raise InstallationError(message)
+
+            dest_path = os.path.join(scheme_path, dest_subpath)
+            assert_no_path_traversal(scheme_path, dest_path)
+            return ZipBackedFile(record_path, dest_path, zip_file)
+
+        return make_data_scheme_file
+
+    def is_data_scheme_path(path):
+        # type: (RecordPath) -> bool
+        return path.split("/", 1)[0].endswith(".data")
+
+    paths = all_paths()
+    file_paths = filterfalse(is_dir_path, paths)
+    root_scheme_paths, data_scheme_paths = partition(
+        is_data_scheme_path, file_paths
+    )
+
+    make_root_scheme_file = root_scheme_file_maker(
+        wheel_zip,
+        ensure_text(lib_dir, encoding=sys.getfilesystemencoding()),
+    )
+    files = map(make_root_scheme_file, root_scheme_paths)
+
+    def is_script_scheme_path(path):
+        # type: (RecordPath) -> bool
+        parts = path.split("/", 2)
+        return (
+            len(parts) > 2 and
+            parts[0].endswith(".data") and
+            parts[1] == "scripts"
+        )
+
+    other_scheme_paths, script_scheme_paths = partition(
+        is_script_scheme_path, data_scheme_paths
+    )
+
+    make_data_scheme_file = data_scheme_file_maker(wheel_zip, scheme)
+    other_scheme_files = map(make_data_scheme_file, other_scheme_paths)
+    files = chain(files, other_scheme_files)
+
+    # Get the defined entry points
+    distribution = pkg_resources_distribution_for_wheel(
+        wheel_zip, name, wheel_path
+    )
+    console, gui = get_entrypoints(distribution)
+
+    def is_entrypoint_wrapper(file):
+        # type: (File) -> bool
+        # EP, EP.exe and EP-script.py are scripts generated for
+        # entry point EP by setuptools
+        path = file.dest_path
+        name = os.path.basename(path)
+        if name.lower().endswith('.exe'):
+            matchname = name[:-4]
+        elif name.lower().endswith('-script.py'):
+            matchname = name[:-10]
+        elif name.lower().endswith(".pya"):
+            matchname = name[:-4]
+        else:
+            matchname = name
+        # Ignore setuptools-generated scripts
+        return (matchname in console or matchname in gui)
+
+    script_scheme_files = map(make_data_scheme_file, script_scheme_paths)
+    script_scheme_files = filterfalse(
+        is_entrypoint_wrapper, script_scheme_files
+    )
+    script_scheme_files = map(ScriptFile, script_scheme_files)
+    files = chain(files, script_scheme_files)
+
+    for file in files:
+        file.save()
+        record_installed(file.src_record_path, file.dest_path, file.changed)
+
+    def pyc_source_file_paths():
+        # type: () -> Iterator[text_type]
+        # We de-duplicate installation paths, since there can be overlap (e.g.
+        # file in .data maps to same location as file in wheel root).
+        # Sorting installation paths makes it easier to reproduce and debug
+        # issues related to permissions on existing files.
+        for installed_path in sorted(set(installed.values())):
+            full_installed_path = os.path.join(lib_dir, installed_path)
+            if not os.path.isfile(full_installed_path):
+                continue
+            if not full_installed_path.endswith('.py'):
+                continue
+            yield full_installed_path
+
+    def pyc_output_path(path):
+        # type: (text_type) -> text_type
+        """Return the path the pyc file would have been written to.
+        """
+        if PY2:
+            if sys.flags.optimize:
+                return path + 'o'
+            else:
+                return path + 'c'
+        else:
+            return importlib.util.cache_from_source(path)
+
+    # Compile all of the pyc files for the installed files
+    if pycompile:
+        with captured_stdout() as stdout:
+            with warnings.catch_warnings():
+                warnings.filterwarnings('ignore')
+                for path in pyc_source_file_paths():
+                    # Python 2's `compileall.compile_file` requires a str in
+                    # error cases, so we must convert to the native type.
+                    path_arg = ensure_str(
+                        path, encoding=sys.getfilesystemencoding()
+                    )
+                    success = compileall.compile_file(
+                        path_arg, force=True, quiet=True
+                    )
+                    if success:
+                        pyc_path = pyc_output_path(path)
+                        assert os.path.exists(pyc_path)
+                        pyc_record_path = cast(
+                            "RecordPath", pyc_path.replace(os.path.sep, "/")
+                        )
+                        record_installed(pyc_record_path, pyc_path)
+        logger.debug(stdout.getvalue())
+
+    maker = PipScriptMaker(None, scheme.scripts)
+
+    # Ensure old scripts are overwritten.
+    # See https://github.com/pypa/pip/issues/1800
+    maker.clobber = True
+
+    # Ensure we don't generate any variants for scripts because this is almost
+    # never what somebody wants.
+    # See https://bitbucket.org/pypa/distlib/issue/35/
+    maker.variants = {''}
+
+    # This is required because otherwise distlib creates scripts that are not
+    # executable.
+    # See https://bitbucket.org/pypa/distlib/issue/32/
+    maker.set_mode = True
+
+    # Generate the console and GUI entry points specified in the wheel
+    scripts_to_generate = get_console_script_specs(console)
+
+    gui_scripts_to_generate = list(starmap('{} = {}'.format, gui.items()))
+
+    generated_console_scripts = maker.make_multiple(scripts_to_generate)
+    generated.extend(generated_console_scripts)
+
+    generated.extend(
+        maker.make_multiple(gui_scripts_to_generate, {'gui': True})
+    )
+
+    if warn_script_location:
+        msg = message_about_scripts_not_on_PATH(generated_console_scripts)
+        if msg is not None:
+            logger.warning(msg)
+
+    generated_file_mode = 0o666 & ~current_umask()
+
+    @contextlib.contextmanager
+    def _generate_file(path, **kwargs):
+        # type: (str, **Any) -> Iterator[NamedTemporaryFileResult]
+        with adjacent_tmp_file(path, **kwargs) as f:
+            yield f
+        os.chmod(f.name, generated_file_mode)
+        replace(f.name, path)
+
+    dest_info_dir = os.path.join(lib_dir, info_dir)
+
+    # Record pip as the installer
+    installer_path = os.path.join(dest_info_dir, 'INSTALLER')
+    with _generate_file(installer_path) as installer_file:
+        installer_file.write(b'pip\n')
+    generated.append(installer_path)
+
+    # Record the PEP 610 direct URL reference
+    if direct_url is not None:
+        direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME)
+        with _generate_file(direct_url_path) as direct_url_file:
+            direct_url_file.write(direct_url.to_json().encode("utf-8"))
+        generated.append(direct_url_path)
+
+    # Record the REQUESTED file
+    if requested:
+        requested_path = os.path.join(dest_info_dir, 'REQUESTED')
+        with open(requested_path, "w"):
+            pass
+        generated.append(requested_path)
+
+    record_text = distribution.get_metadata('RECORD')
+    record_rows = list(csv.reader(record_text.splitlines()))
+
+    rows = get_csv_rows_for_installed(
+        record_rows,
+        installed=installed,
+        changed=changed,
+        generated=generated,
+        lib_dir=lib_dir)
+
+    # Record details of all files installed
+    record_path = os.path.join(dest_info_dir, 'RECORD')
+
+    with _generate_file(record_path, **csv_io_kwargs('w')) as record_file:
+        # The type mypy infers for record_file is different for Python 3
+        # (typing.IO[Any]) and Python 2 (typing.BinaryIO). We explicitly
+        # cast to typing.IO[str] as a workaround.
+        writer = csv.writer(cast('IO[str]', record_file))
+        writer.writerows(_normalized_outrows(rows))
+
+
+@contextlib.contextmanager
+def req_error_context(req_description):
+    # type: (str) -> Iterator[None]
+    try:
+        yield
+    except InstallationError as e:
+        message = "For req: {}. {}".format(req_description, e.args[0])
+        reraise(
+            InstallationError, InstallationError(message), sys.exc_info()[2]
+        )
+
+
+def install_wheel(
+    name,  # type: str
+    wheel_path,  # type: str
+    scheme,  # type: Scheme
+    req_description,  # type: str
+    pycompile=True,  # type: bool
+    warn_script_location=True,  # type: bool
+    direct_url=None,  # type: Optional[DirectUrl]
+    requested=False,  # type: bool
+):
+    # type: (...) -> None
+    with ZipFile(wheel_path, allowZip64=True) as z:
+        with req_error_context(req_description):
+            _install_wheel(
+                name=name,
+                wheel_zip=z,
+                wheel_path=wheel_path,
+                scheme=scheme,
+                pycompile=pycompile,
+                warn_script_location=warn_script_location,
+                direct_url=direct_url,
+                requested=requested,
+            )
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/prepare.py b/venv/Lib/site-packages/pip/_internal/operations/prepare.py
similarity index 67%
rename from venv/lib/python3.8/site-packages/pip/_internal/operations/prepare.py
rename to venv/Lib/site-packages/pip/_internal/operations/prepare.py
index 30d5e3a..a5455fc 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/operations/prepare.py
+++ b/venv/Lib/site-packages/pip/_internal/operations/prepare.py
@@ -9,7 +9,6 @@ import mimetypes
 import os
 import shutil
 
-from pip._vendor import requests
 from pip._vendor.six import PY2
 
 from pip._internal.distributions import (
@@ -21,12 +20,19 @@ from pip._internal.exceptions import (
     HashMismatch,
     HashUnpinned,
     InstallationError,
+    NetworkConnectionError,
     PreviousBuildDirError,
     VcsHashUnsupported,
 )
+from pip._internal.utils.filesystem import copy2_fixed
 from pip._internal.utils.hashes import MissingHashes
 from pip._internal.utils.logging import indent_log
-from pip._internal.utils.misc import display_path, hide_url
+from pip._internal.utils.misc import (
+    display_path,
+    hide_url,
+    path_to_display,
+    rmtree,
+)
 from pip._internal.utils.temp_dir import TempDirectory
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 from pip._internal.utils.unpacking import unpack_file
@@ -127,6 +133,59 @@ def get_http_url(
     return File(from_path, content_type)
 
 
+def _copy2_ignoring_special_files(src, dest):
+    # type: (str, str) -> None
+    """Copying special files is not supported, but as a convenience to users
+    we skip errors copying them. This supports tools that may create e.g.
+    socket files in the project source directory.
+    """
+    try:
+        copy2_fixed(src, dest)
+    except shutil.SpecialFileError as e:
+        # SpecialFileError may be raised due to either the source or
+        # destination. If the destination was the cause then we would actually
+        # care, but since the destination directory is deleted prior to
+        # copy we ignore all of them assuming it is caused by the source.
+        logger.warning(
+            "Ignoring special file error '%s' encountered copying %s to %s.",
+            str(e),
+            path_to_display(src),
+            path_to_display(dest),
+        )
+
+
+def _copy_source_tree(source, target):
+    # type: (str, str) -> None
+    target_abspath = os.path.abspath(target)
+    target_basename = os.path.basename(target_abspath)
+    target_dirname = os.path.dirname(target_abspath)
+
+    def ignore(d, names):
+        # type: (str, List[str]) -> List[str]
+        skipped = []  # type: List[str]
+        if d == source:
+            # Pulling in those directories can potentially be very slow,
+            # exclude the following directories if they appear in the top
+            # level dir (and only it).
+            # See discussion at https://github.com/pypa/pip/pull/6770
+            skipped += ['.tox', '.nox']
+        if os.path.abspath(d) == target_dirname:
+            # Prevent an infinite recursion if the target is in source.
+            # This can happen when TMPDIR is set to ${PWD}/...
+            # and we copy PWD to TMPDIR.
+            skipped += [target_basename]
+        return skipped
+
+    kwargs = dict(ignore=ignore, symlinks=True)  # type: CopytreeKwargs
+
+    if not PY2:
+        # Python 2 does not support copy_function, so we only ignore
+        # errors on special file copy in Python 3.
+        kwargs['copy_function'] = _copy2_ignoring_special_files
+
+    shutil.copytree(source, target, **kwargs)
+
+
 def get_file_url(
     link,  # type: Link
     download_dir=None,  # type: Optional[str]
@@ -180,9 +239,11 @@ def unpack_url(
         unpack_vcs_link(link, location)
         return None
 
-    # If it's a url to a local directory, we build in-place.
-    # There is nothing to be done here.
+    # If it's a url to a local directory
     if link.is_existing_dir():
+        if os.path.isdir(location):
+            rmtree(location)
+        _copy_source_tree(link.file_path, location)
         return None
 
     # file urls
@@ -199,8 +260,9 @@ def unpack_url(
         )
 
     # unpack the archive to the build dir location. even when only downloading
-    # archives, they have to be unpacked to parse dependencies
-    unpack_file(file.path, location, file.content_type)
+    # archives, they have to be unpacked to parse dependencies, except wheels
+    if not link.is_wheel:
+        unpack_file(file.path, location, file.content_type)
 
     return file
 
@@ -315,108 +377,98 @@ class RequirementPreparer(object):
             "Could not find or access download directory '{}'"
             .format(self.download_dir))
 
-    def prepare_linked_requirement(
-        self,
-        req,  # type: InstallRequirement
-    ):
-        # type: (...) -> AbstractDistribution
-        """Prepare a requirement that would be obtained from req.link
-        """
-        assert req.link
-        link = req.link
-
-        # TODO: Breakup into smaller functions
-        if link.scheme == 'file':
-            path = link.file_path
+    def _log_preparing_link(self, req):
+        # type: (InstallRequirement) -> None
+        """Log the way the link prepared."""
+        if req.link.is_file:
+            path = req.link.file_path
             logger.info('Processing %s', display_path(path))
         else:
             logger.info('Collecting %s', req.req or req)
 
-        download_dir = self.download_dir
+    def _ensure_link_req_src_dir(self, req, download_dir, parallel_builds):
+        # type: (InstallRequirement, Optional[str], bool) -> None
+        """Ensure source_dir of a linked InstallRequirement."""
+        # Since source_dir is only set for editable requirements.
+        if req.link.is_wheel:
+            # We don't need to unpack wheels, so no need for a source
+            # directory.
+            return
+        assert req.source_dir is None
+        # We always delete unpacked sdists after pip runs.
+        req.ensure_has_source_dir(
+            self.build_dir,
+            autodelete=True,
+            parallel_builds=parallel_builds,
+        )
+
+        # If a checkout exists, it's unwise to keep going.  version
+        # inconsistencies are logged later, but do not fail the
+        # installation.
+        # FIXME: this won't upgrade when there's an existing
+        # package unpacked in `req.source_dir`
+        if os.path.exists(os.path.join(req.source_dir, 'setup.py')):
+            raise PreviousBuildDirError(
+                "pip can't proceed with requirements '{}' due to a"
+                "pre-existing build directory ({}). This is likely "
+                "due to a previous installation that failed . pip is "
+                "being responsible and not assuming it can delete this. "
+                "Please delete it and try again.".format(req, req.source_dir)
+            )
+
+    def _get_linked_req_hashes(self, req):
+        # type: (InstallRequirement) -> Hashes
+        # By the time this is called, the requirement's link should have
+        # been checked so we can tell what kind of requirements req is
+        # and raise some more informative errors than otherwise.
+        # (For example, we can raise VcsHashUnsupported for a VCS URL
+        # rather than HashMissing.)
+        if not self.require_hashes:
+            return req.hashes(trust_internet=True)
+
+        # We could check these first 2 conditions inside unpack_url
+        # and save repetition of conditions, but then we would
+        # report less-useful error messages for unhashable
+        # requirements, complaining that there's no hash provided.
+        if req.link.is_vcs:
+            raise VcsHashUnsupported()
+        if req.link.is_existing_dir():
+            raise DirectoryUrlHashUnsupported()
+
+        # Unpinned packages are asking for trouble when a new version
+        # is uploaded.  This isn't a security check, but it saves users
+        # a surprising hash mismatch in the future.
+        # file:/// URLs aren't pinnable, so don't complain about them
+        # not being pinned.
+        if req.original_link is None and not req.is_pinned:
+            raise HashUnpinned()
+
+        # If known-good hashes are missing for this requirement,
+        # shim it with a facade object that will provoke hash
+        # computation and then raise a HashMissing exception
+        # showing the user what the hash should be.
+        return req.hashes(trust_internet=False) or MissingHashes()
+
+    def prepare_linked_requirement(self, req, parallel_builds=False):
+        # type: (InstallRequirement, bool) -> AbstractDistribution
+        """Prepare a requirement to be obtained from req.link."""
+        assert req.link
+        link = req.link
+        self._log_preparing_link(req)
         if link.is_wheel and self.wheel_download_dir:
-            # when doing 'pip wheel` we download wheels to a
-            # dedicated dir.
+            # Download wheels to a dedicated dir when doing `pip wheel`.
             download_dir = self.wheel_download_dir
-
-        if link.is_wheel:
-            if download_dir:
-                # When downloading, we only unpack wheels to get
-                # metadata.
-                autodelete_unpacked = True
-            else:
-                # When installing a wheel, we use the unpacked
-                # wheel.
-                autodelete_unpacked = False
         else:
-            # We always delete unpacked sdists after pip runs.
-            autodelete_unpacked = True
+            download_dir = self.download_dir
 
         with indent_log():
-            # Since source_dir is only set for editable requirements.
-            assert req.source_dir is None
-            if link.is_existing_dir():
-                # Build local directories in place.
-                req.source_dir = link.file_path
-            else:
-                req.ensure_has_source_dir(self.build_dir, autodelete_unpacked)
-                # If a checkout exists, it's unwise to keep going.  version
-                # inconsistencies are logged later, but do not fail the
-                # installation.
-                # FIXME: this won't upgrade when there's an existing
-                # package unpacked in `req.source_dir`
-                if os.path.exists(os.path.join(req.source_dir, 'setup.py')):
-                    raise PreviousBuildDirError(
-                        "pip can't proceed with requirements '{}' due to a"
-                        " pre-existing build directory ({}). This is "
-                        "likely due to a previous installation that failed"
-                        ". pip is being responsible and not assuming it "
-                        "can delete this. Please delete it and try again."
-                        .format(req, req.source_dir)
-                    )
-
-            # Now that we have the real link, we can tell what kind of
-            # requirements we have and raise some more informative errors
-            # than otherwise. (For example, we can raise VcsHashUnsupported
-            # for a VCS URL rather than HashMissing.)
-            if self.require_hashes:
-                # We could check these first 2 conditions inside
-                # unpack_url and save repetition of conditions, but then
-                # we would report less-useful error messages for
-                # unhashable requirements, complaining that there's no
-                # hash provided.
-                if link.is_vcs:
-                    raise VcsHashUnsupported()
-                elif link.is_existing_dir():
-                    raise DirectoryUrlHashUnsupported()
-                if not req.original_link and not req.is_pinned:
-                    # Unpinned packages are asking for trouble when a new
-                    # version is uploaded. This isn't a security check, but
-                    # it saves users a surprising hash mismatch in the
-                    # future.
-                    #
-                    # file:/// URLs aren't pinnable, so don't complain
-                    # about them not being pinned.
-                    raise HashUnpinned()
-
-            hashes = req.hashes(trust_internet=not self.require_hashes)
-            if self.require_hashes and not hashes:
-                # Known-good hashes are missing for this requirement, so
-                # shim it with a facade object that will provoke hash
-                # computation and then raise a HashMissing exception
-                # showing the user what the hash should be.
-                hashes = MissingHashes()
-
+            self._ensure_link_req_src_dir(req, download_dir, parallel_builds)
             try:
                 local_file = unpack_url(
                     link, req.source_dir, self.downloader, download_dir,
-                    hashes=hashes,
-                )
-            except requests.HTTPError as exc:
-                logger.critical(
-                    'Could not install requirement %s because of error %s',
-                    req,
-                    exc,
+                    hashes=self._get_linked_req_hashes(req)
                 )
+            except NetworkConnectionError as exc:
                 raise InstallationError(
                     'Could not install requirement {} because of HTTP '
                     'error {} for URL {}'.format(req, exc, link)
@@ -440,9 +492,8 @@ class RequirementPreparer(object):
                     )
                     if not os.path.exists(download_location):
                         shutil.copy(local_file.path, download_location)
-                        logger.info(
-                            'Saved %s', display_path(download_location)
-                        )
+                        download_path = display_path(download_location)
+                        logger.info('Saved %s', download_path)
 
             if self._download_should_save:
                 # Make a .zip of the source_dir we already created.
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/pyproject.py b/venv/Lib/site-packages/pip/_internal/pyproject.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/pyproject.py
rename to venv/Lib/site-packages/pip/_internal/pyproject.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/req/__init__.py b/venv/Lib/site-packages/pip/_internal/req/__init__.py
similarity index 54%
rename from venv/lib/python3.8/site-packages/pip/_internal/req/__init__.py
rename to venv/Lib/site-packages/pip/_internal/req/__init__.py
index d2d027a..8568d3f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/req/__init__.py
+++ b/venv/Lib/site-packages/pip/_internal/req/__init__.py
@@ -1,8 +1,6 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 from __future__ import absolute_import
 
+import collections
 import logging
 
 from pip._internal.utils.logging import indent_log
@@ -13,7 +11,7 @@ from .req_install import InstallRequirement
 from .req_set import RequirementSet
 
 if MYPY_CHECK_RUNNING:
-    from typing import Any, List, Sequence
+    from typing import Iterator, List, Optional, Sequence, Tuple
 
 __all__ = [
     "RequirementSet", "InstallRequirement",
@@ -33,12 +31,25 @@ class InstallationResult(object):
         return "InstallationResult(name={!r})".format(self.name)
 
 
+def _validate_requirements(
+    requirements,  # type: List[InstallRequirement]
+):
+    # type: (...) -> Iterator[Tuple[str, InstallRequirement]]
+    for req in requirements:
+        assert req.name, "invalid to-be-installed requirement: {}".format(req)
+        yield req.name, req
+
+
 def install_given_reqs(
-    to_install,  # type: List[InstallRequirement]
+    requirements,  # type: List[InstallRequirement]
     install_options,  # type: List[str]
-    global_options=(),  # type: Sequence[str]
-    *args,  # type: Any
-    **kwargs  # type: Any
+    global_options,  # type: Sequence[str]
+    root,  # type: Optional[str]
+    home,  # type: Optional[str]
+    prefix,  # type: Optional[str]
+    warn_script_location,  # type: bool
+    use_user_site,  # type: bool
+    pycompile,  # type: bool
 ):
     # type: (...) -> List[InstallationResult]
     """
@@ -46,47 +57,47 @@ def install_given_reqs(
 
     (to be called after having downloaded and unpacked the packages)
     """
+    to_install = collections.OrderedDict(_validate_requirements(requirements))
 
     if to_install:
         logger.info(
             'Installing collected packages: %s',
-            ', '.join([req.name for req in to_install]),
+            ', '.join(to_install.keys()),
         )
 
     installed = []
 
     with indent_log():
-        for requirement in to_install:
+        for req_name, requirement in to_install.items():
             if requirement.should_reinstall:
-                logger.info('Attempting uninstall: %s', requirement.name)
+                logger.info('Attempting uninstall: %s', req_name)
                 with indent_log():
                     uninstalled_pathset = requirement.uninstall(
                         auto_confirm=True
                     )
+            else:
+                uninstalled_pathset = None
+
             try:
                 requirement.install(
                     install_options,
                     global_options,
-                    *args,
-                    **kwargs
+                    root=root,
+                    home=home,
+                    prefix=prefix,
+                    warn_script_location=warn_script_location,
+                    use_user_site=use_user_site,
+                    pycompile=pycompile,
                 )
             except Exception:
-                should_rollback = (
-                    requirement.should_reinstall and
-                    not requirement.install_succeeded
-                )
                 # if install did not succeed, rollback previous uninstall
-                if should_rollback:
+                if uninstalled_pathset and not requirement.install_succeeded:
                     uninstalled_pathset.rollback()
                 raise
             else:
-                should_commit = (
-                    requirement.should_reinstall and
-                    requirement.install_succeeded
-                )
-                if should_commit:
+                if uninstalled_pathset and requirement.install_succeeded:
                     uninstalled_pathset.commit()
 
-            installed.append(InstallationResult(requirement.name))
+            installed.append(InstallationResult(req_name))
 
     return installed
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/req/constructors.py b/venv/Lib/site-packages/pip/_internal/req/constructors.py
similarity index 90%
rename from venv/lib/python3.8/site-packages/pip/_internal/req/constructors.py
rename to venv/Lib/site-packages/pip/_internal/req/constructors.py
index c9f1fe7..7a4641e 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/req/constructors.py
+++ b/venv/Lib/site-packages/pip/_internal/req/constructors.py
@@ -8,9 +8,6 @@ These are meant to be used elsewhere within pip to create instances of
 InstallRequirement.
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 import logging
 import os
 import re
@@ -26,6 +23,7 @@ from pip._internal.models.link import Link
 from pip._internal.models.wheel import Wheel
 from pip._internal.pyproject import make_pyproject_path
 from pip._internal.req.req_install import InstallRequirement
+from pip._internal.utils.deprecation import deprecated
 from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS
 from pip._internal.utils.misc import is_installable_dir, splitext
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
@@ -78,7 +76,7 @@ def convert_extras(extras):
 
 
 def parse_editable(editable_req):
-    # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]]
+    # type: (str) -> Tuple[Optional[str], str, Set[str]]
     """Parses an editable requirement into:
         - a requirement name
         - an URL
@@ -120,7 +118,7 @@ def parse_editable(editable_req):
                 Requirement("placeholder" + extras.lower()).extras,
             )
         else:
-            return package_name, url_no_extras, None
+            return package_name, url_no_extras, set()
 
     for version_control in vcs:
         if url.lower().startswith('{}:'.format(version_control)):
@@ -149,7 +147,7 @@ def parse_editable(editable_req):
             "Could not detect requirement name for '{}', please specify one "
             "with #egg=your_package_name".format(editable_req)
         )
-    return package_name, url, None
+    return package_name, url, set()
 
 
 def deduce_helpful_msg(req):
@@ -175,8 +173,9 @@ def deduce_helpful_msg(req):
                     " the packages specified within it."
                 ).format(req)
         except RequirementParseError:
-            logger.debug("Cannot parse '{}' as requirements \
-            file".format(req), exc_info=True)
+            logger.debug(
+                "Cannot parse '%s' as requirements file", req, exc_info=True
+            )
     else:
         msg += " File '{}' does not exist.".format(req)
     return msg
@@ -222,7 +221,8 @@ def install_req_from_editable(
     use_pep517=None,  # type: Optional[bool]
     isolated=False,  # type: bool
     options=None,  # type: Optional[Dict[str, Any]]
-    constraint=False  # type: bool
+    constraint=False,  # type: bool
+    user_supplied=False,  # type: bool
 ):
     # type: (...) -> InstallRequirement
 
@@ -231,6 +231,7 @@ def install_req_from_editable(
     return InstallRequirement(
         parts.requirement,
         comes_from=comes_from,
+        user_supplied=user_supplied,
         editable=True,
         link=parts.link,
         constraint=constraint,
@@ -264,7 +265,7 @@ def _looks_like_path(name):
 
 
 def _get_url_from_path(path, name):
-    # type: (str, str) -> str
+    # type: (str, str) -> Optional[str]
     """
     First, it checks whether a provided path is an installable directory
     (e.g. it has a setup.py). If it is, returns the path.
@@ -371,6 +372,17 @@ def parse_req_from_line(name, line_source):
             if add_msg:
                 msg += '\nHint: {}'.format(add_msg)
             raise InstallationError(msg)
+        else:
+            # Deprecate extras after specifiers: "name>=1.0[extras]"
+            # This currently works by accident because _strip_extras() parses
+            # any extras in the end of the string and those are saved in
+            # RequirementParts
+            for spec in req.specifier:
+                spec_str = str(spec)
+                if spec_str.endswith(']'):
+                    msg = "Extras after version '{}'.".format(spec_str)
+                    replace = "moving the extras before version specifiers"
+                    deprecated(msg, replacement=replace, gone_in="21.0")
     else:
         req = None
 
@@ -385,6 +397,7 @@ def install_req_from_line(
     options=None,  # type: Optional[Dict[str, Any]]
     constraint=False,  # type: bool
     line_source=None,  # type: Optional[str]
+    user_supplied=False,  # type: bool
 ):
     # type: (...) -> InstallRequirement
     """Creates an InstallRequirement from a name, which might be a
@@ -403,6 +416,7 @@ def install_req_from_line(
         hash_options=options.get("hashes", {}) if options else {},
         constraint=constraint,
         extras=parts.extras,
+        user_supplied=user_supplied,
     )
 
 
@@ -410,7 +424,8 @@ def install_req_from_req_string(
     req_string,  # type: str
     comes_from=None,  # type: Optional[InstallRequirement]
     isolated=False,  # type: bool
-    use_pep517=None  # type: Optional[bool]
+    use_pep517=None,  # type: Optional[bool]
+    user_supplied=False,  # type: bool
 ):
     # type: (...) -> InstallRequirement
     try:
@@ -432,14 +447,19 @@ def install_req_from_req_string(
         )
 
     return InstallRequirement(
-        req, comes_from, isolated=isolated, use_pep517=use_pep517
+        req,
+        comes_from,
+        isolated=isolated,
+        use_pep517=use_pep517,
+        user_supplied=user_supplied,
     )
 
 
 def install_req_from_parsed_requirement(
     parsed_req,  # type: ParsedRequirement
     isolated=False,  # type: bool
-    use_pep517=None  # type: Optional[bool]
+    use_pep517=None,  # type: Optional[bool]
+    user_supplied=False,  # type: bool
 ):
     # type: (...) -> InstallRequirement
     if parsed_req.is_editable:
@@ -449,6 +469,7 @@ def install_req_from_parsed_requirement(
             use_pep517=use_pep517,
             constraint=parsed_req.constraint,
             isolated=isolated,
+            user_supplied=user_supplied,
         )
 
     else:
@@ -460,5 +481,6 @@ def install_req_from_parsed_requirement(
             options=parsed_req.options,
             constraint=parsed_req.constraint,
             line_source=parsed_req.line_source,
+            user_supplied=user_supplied,
         )
     return req
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/req/req_file.py b/venv/Lib/site-packages/pip/_internal/req/req_file.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_internal/req/req_file.py
rename to venv/Lib/site-packages/pip/_internal/req/req_file.py
index 63cab76..1050582 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/req/req_file.py
+++ b/venv/Lib/site-packages/pip/_internal/req/req_file.py
@@ -2,9 +2,6 @@
 Requirements file parsing
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 from __future__ import absolute_import
 
 import optparse
@@ -21,6 +18,7 @@ from pip._internal.exceptions import (
     RequirementsFileParseError,
 )
 from pip._internal.models.search_scope import SearchScope
+from pip._internal.network.utils import raise_for_status
 from pip._internal.utils.encoding import auto_decode
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 from pip._internal.utils.urls import get_url_scheme
@@ -60,10 +58,11 @@ SUPPORTED_OPTIONS = [
     cmdoptions.find_links,
     cmdoptions.no_binary,
     cmdoptions.only_binary,
+    cmdoptions.prefer_binary,
     cmdoptions.require_hashes,
     cmdoptions.pre,
     cmdoptions.trusted_host,
-    cmdoptions.always_unzip,  # Deprecated
+    cmdoptions.use_new_feature,
 ]  # type: List[Callable[..., optparse.Option]]
 
 # options to be passed to requirements
@@ -101,7 +100,7 @@ class ParsedLine(object):
         self,
         filename,  # type: str
         lineno,  # type: int
-        comes_from,  # type: str
+        comes_from,  # type: Optional[str]
         args,  # type: str
         opts,  # type: Values
         constraint,  # type: bool
@@ -135,7 +134,7 @@ def parse_requirements(
     constraint=False,  # type: bool
 ):
     # type: (...) -> Iterator[ParsedRequirement]
-    """Parse a requirements file and yield InstallRequirement instances.
+    """Parse a requirements file and yield ParsedRequirement instances.
 
     :param filename:    Path or url of requirements file.
     :param session:     PipSession instance.
@@ -226,12 +225,18 @@ def handle_option_line(
 ):
     # type:  (...) -> None
 
-    # percolate hash-checking option upward
-    if opts.require_hashes:
-        options.require_hashes = opts.require_hashes
+    if options:
+        # percolate options upward
+        if opts.require_hashes:
+            options.require_hashes = opts.require_hashes
+        if opts.features_enabled:
+            options.features_enabled.extend(
+                f for f in opts.features_enabled
+                if f not in options.features_enabled
+            )
 
     # set finder options
-    elif finder:
+    if finder:
         find_links = finder.find_links
         index_urls = finder.index_urls
         if opts.index_url:
@@ -260,6 +265,9 @@ def handle_option_line(
         if opts.pre:
             finder.set_allow_all_prereleases()
 
+        if opts.prefer_binary:
+            finder.set_prefer_binary()
+
         if session:
             for host in opts.trusted_hosts or []:
                 source = 'line {} of {}'.format(lineno, filename)
@@ -316,7 +324,7 @@ class RequirementsFileParser(object):
         self,
         session,  # type: PipSession
         line_parser,  # type: LineParser
-        comes_from,  # type: str
+        comes_from,  # type: Optional[str]
     ):
         # type: (...) -> None
         self._session = session
@@ -478,6 +486,7 @@ def join_lines(lines_enum):
                 line = ' ' + line
             if new_line:
                 new_line.append(line)
+                assert primary_line_number is not None
                 yield primary_line_number, ''.join(new_line)
                 new_line = []
             else:
@@ -489,6 +498,7 @@ def join_lines(lines_enum):
 
     # last line contains \
     if new_line:
+        assert primary_line_number is not None
         yield primary_line_number, ''.join(new_line)
 
     # TODO: handle space after '\'.
@@ -549,7 +559,7 @@ def get_file_content(url, session, comes_from=None):
     if scheme in ['http', 'https']:
         # FIXME: catch some errors
         resp = session.get(url)
-        resp.raise_for_status()
+        raise_for_status(resp)
         return resp.url, resp.text
 
     elif scheme == 'file':
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/req/req_install.py b/venv/Lib/site-packages/pip/_internal/req/req_install.py
similarity index 91%
rename from venv/lib/python3.8/site-packages/pip/_internal/req/req_install.py
rename to venv/Lib/site-packages/pip/_internal/req/req_install.py
index 3b28209..4759f4a 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/req/req_install.py
+++ b/venv/Lib/site-packages/pip/_internal/req/req_install.py
@@ -7,6 +7,7 @@ import logging
 import os
 import shutil
 import sys
+import uuid
 import zipfile
 
 from pip._vendor import pkg_resources, six
@@ -40,6 +41,7 @@ from pip._internal.utils.misc import (
     display_path,
     dist_in_site_packages,
     dist_in_usersite,
+    get_distribution,
     get_installed_version,
     hide_url,
     redact_auth_from_url,
@@ -110,7 +112,8 @@ class InstallRequirement(object):
         global_options=None,  # type: Optional[List[str]]
         hash_options=None,  # type: Optional[Dict[str, List[str]]]
         constraint=False,  # type: bool
-        extras=()  # type: Iterable[str]
+        extras=(),  # type: Iterable[str]
+        user_supplied=False,  # type: bool
     ):
         # type: (...) -> None
         assert req is None or isinstance(req, Requirement), req
@@ -171,7 +174,10 @@ class InstallRequirement(object):
         self.hash_options = hash_options if hash_options else {}
         # Set to True after successful preparation of this requirement
         self.prepared = False
-        self.is_direct = False
+        # User supplied requirement are explicitly requested for installation
+        # by the user via CLI arguments or requirements files, as opposed to,
+        # e.g. dependencies, extras or constraints.
+        self.user_supplied = user_supplied
 
         # Set by the legacy resolver when the requirement has been downloaded
         # TODO: This introduces a strong coupling between the resolver and the
@@ -339,8 +345,8 @@ class InstallRequirement(object):
                 s += '->' + comes_from
         return s
 
-    def ensure_build_location(self, build_dir, autodelete):
-        # type: (str, bool) -> str
+    def ensure_build_location(self, build_dir, autodelete, parallel_builds):
+        # type: (str, bool, bool) -> str
         assert build_dir is not None
         if self._temp_build_dir is not None:
             assert self._temp_build_dir.path
@@ -354,16 +360,19 @@ class InstallRequirement(object):
             )
 
             return self._temp_build_dir.path
-        if self.editable:
-            name = self.name.lower()
-        else:
-            name = self.name
+
+        # When parallel builds are enabled, add a UUID to the build directory
+        # name so multiple builds do not interfere with each other.
+        dir_name = canonicalize_name(self.name)
+        if parallel_builds:
+            dir_name = "{}_{}".format(dir_name, uuid.uuid4().hex)
+
         # FIXME: Is there a better place to create the build_dir? (hg and bzr
         # need this)
         if not os.path.exists(build_dir):
             logger.debug('Creating directory %s', build_dir)
             os.makedirs(build_dir)
-        actual_build_dir = os.path.join(build_dir, name)
+        actual_build_dir = os.path.join(build_dir, dir_name)
         # `None` indicates that we respect the globally-configured deletion
         # settings, which is what we actually want when auto-deleting.
         delete_arg = None if autodelete else False
@@ -420,20 +429,13 @@ class InstallRequirement(object):
         """
         if self.req is None:
             return
-        # get_distribution() will resolve the entire list of requirements
-        # anyway, and we've already determined that we need the requirement
-        # in question, so strip the marker so that we don't try to
-        # evaluate it.
-        no_marker = Requirement(str(self.req))
-        no_marker.marker = None
-        try:
-            self.satisfied_by = pkg_resources.get_distribution(str(no_marker))
-        except pkg_resources.DistributionNotFound:
+        existing_dist = get_distribution(self.req.name)
+        if not existing_dist:
             return
-        except pkg_resources.VersionConflict:
-            existing_dist = pkg_resources.get_distribution(
-                self.req.name
-            )
+
+        existing_version = existing_dist.parsed_version
+        if not self.req.specifier.contains(existing_version, prereleases=True):
+            self.satisfied_by = None
             if use_user_site:
                 if dist_in_usersite(existing_dist):
                     self.should_reinstall = True
@@ -447,11 +449,13 @@ class InstallRequirement(object):
             else:
                 self.should_reinstall = True
         else:
-            if self.editable and self.satisfied_by:
+            if self.editable:
                 self.should_reinstall = True
                 # when installing editables, nothing pre-existing should ever
                 # satisfy
                 self.satisfied_by = None
+            else:
+                self.satisfied_by = existing_dist
 
     # Things valid for wheels
     @property
@@ -588,8 +592,13 @@ class InstallRequirement(object):
             )
 
     # For both source distributions and editables
-    def ensure_has_source_dir(self, parent_dir, autodelete=False):
-        # type: (str, bool) -> None
+    def ensure_has_source_dir(
+        self,
+        parent_dir,
+        autodelete=False,
+        parallel_builds=False,
+    ):
+        # type: (str, bool, bool) -> None
         """Ensure that a source_dir is set.
 
         This will create a temporary build dir if the name of the requirement
@@ -601,7 +610,9 @@ class InstallRequirement(object):
         """
         if self.source_dir is None:
             self.source_dir = self.ensure_build_location(
-                parent_dir, autodelete
+                parent_dir,
+                autodelete=autodelete,
+                parallel_builds=parallel_builds,
             )
 
     # For editable installations
@@ -664,13 +675,11 @@ class InstallRequirement(object):
 
         """
         assert self.req
-        try:
-            dist = pkg_resources.get_distribution(self.req.name)
-        except pkg_resources.DistributionNotFound:
+        dist = get_distribution(self.req.name)
+        if not dist:
             logger.warning("Skipping %s as it is not installed.", self.name)
             return None
-        else:
-            logger.info('Found existing installation: %s', dist)
+        logger.info('Found existing installation: %s', dist)
 
         uninstalled_pathset = UninstallPathSet.from_dist(dist)
         uninstalled_pathset.remove(auto_confirm, verbose)
@@ -809,6 +818,7 @@ class InstallRequirement(object):
                 pycompile=pycompile,
                 warn_script_location=warn_script_location,
                 direct_url=direct_url,
+                requested=self.user_supplied,
             )
             self.install_succeeded = True
             return
@@ -848,3 +858,35 @@ class InstallRequirement(object):
             raise
 
         self.install_succeeded = success
+
+
+def check_invalid_constraint_type(req):
+    # type: (InstallRequirement) -> str
+
+    # Check for unsupported forms
+    problem = ""
+    if not req.name:
+        problem = "Unnamed requirements are not allowed as constraints"
+    elif req.link:
+        problem = "Links are not allowed as constraints"
+    elif req.extras:
+        problem = "Constraints cannot have extras"
+
+    if problem:
+        deprecated(
+            reason=(
+                "Constraints are only allowed to take the form of a package "
+                "name and a version specifier. Other forms were originally "
+                "permitted as an accident of the implementation, but were "
+                "undocumented. The new implementation of the resolver no "
+                "longer supports these forms."
+            ),
+            replacement=(
+                "replacing the constraint with a requirement."
+            ),
+            # No plan yet for when the new resolver becomes default
+            gone_in=None,
+            issue=8210
+        )
+
+    return problem
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/req/req_set.py b/venv/Lib/site-packages/pip/_internal/req/req_set.py
similarity index 94%
rename from venv/lib/python3.8/site-packages/pip/_internal/req/req_set.py
rename to venv/Lib/site-packages/pip/_internal/req/req_set.py
index f168ce1..ab4b6f8 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/req/req_set.py
+++ b/venv/Lib/site-packages/pip/_internal/req/req_set.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 from __future__ import absolute_import
 
 import logging
@@ -110,9 +107,8 @@ class RequirementSet(object):
                 )
 
         # This next bit is really a sanity check.
-        assert install_req.is_direct == (parent_req_name is None), (
-            "a direct req shouldn't have a parent and also, "
-            "a non direct req should have a parent"
+        assert not install_req.user_supplied or parent_req_name is None, (
+            "a user supplied req shouldn't have a parent"
         )
 
         # Unnamed requirements are scanned again and the requirement won't be
@@ -122,7 +118,8 @@ class RequirementSet(object):
             return [install_req], None
 
         try:
-            existing_req = self.get_requirement(install_req.name)
+            existing_req = self.get_requirement(
+                install_req.name)  # type: Optional[InstallRequirement]
         except KeyError:
             existing_req = None
 
@@ -167,6 +164,10 @@ class RequirementSet(object):
         # If we're now installing a constraint, mark the existing
         # object for real installation.
         existing_req.constraint = False
+        # If we're now installing a user supplied requirement,
+        # mark the existing object as such.
+        if install_req.user_supplied:
+            existing_req.user_supplied = True
         existing_req.extras = tuple(sorted(
             set(existing_req.extras) | set(install_req.extras)
         ))
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/req/req_tracker.py b/venv/Lib/site-packages/pip/_internal/req/req_tracker.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_internal/req/req_tracker.py
rename to venv/Lib/site-packages/pip/_internal/req/req_tracker.py
index 14adeab..13fb245 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/req/req_tracker.py
+++ b/venv/Lib/site-packages/pip/_internal/req/req_tracker.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 from __future__ import absolute_import
 
 import contextlib
@@ -98,6 +95,7 @@ class RequirementTracker(object):
         """Add an InstallRequirement to build tracking.
         """
 
+        assert req.link
         # Get the file to write information about this requirement.
         entry_path = self._entry_path(req.link)
 
@@ -130,6 +128,7 @@ class RequirementTracker(object):
         """Remove an InstallRequirement from build tracking.
         """
 
+        assert req.link
         # Delete the created file and the corresponding entries.
         os.unlink(self._entry_path(req.link))
         self._entries.remove(req)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py b/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py
rename to venv/Lib/site-packages/pip/_internal/req/req_uninstall.py
index 559061a..69719d3 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py
+++ b/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py
@@ -612,8 +612,7 @@ class UninstallPthEntries(object):
         # If the file doesn't exist, log a warning and return
         if not os.path.isfile(self.file):
             logger.warning(
-                "Cannot remove entries from nonexistent file {}".format(
-                    self.file)
+                "Cannot remove entries from nonexistent file %s", self.file
             )
             return
         with open(self.file, 'rb') as fh:
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/resolution/__init__.py
rename to venv/Lib/site-packages/pip/_internal/resolution/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/base.py b/venv/Lib/site-packages/pip/_internal/resolution/base.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/resolution/base.py
rename to venv/Lib/site-packages/pip/_internal/resolution/base.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/legacy/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/resolution/legacy/__init__.py
rename to venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/legacy/resolver.py b/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py
similarity index 92%
rename from venv/lib/python3.8/site-packages/pip/_internal/resolution/legacy/resolver.py
rename to venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py
index cdb44d1..c9b4c66 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/resolution/legacy/resolver.py
+++ b/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py
@@ -28,6 +28,7 @@ from pip._internal.exceptions import (
     HashErrors,
     UnsupportedPythonVersion,
 )
+from pip._internal.req.req_install import check_invalid_constraint_type
 from pip._internal.req.req_set import RequirementSet
 from pip._internal.resolution.base import BaseResolver
 from pip._internal.utils.compatibility_tags import get_supported
@@ -46,6 +47,7 @@ if MYPY_CHECK_RUNNING:
     from pip._internal.cache import WheelCache
     from pip._internal.distributions import AbstractDistribution
     from pip._internal.index.package_finder import PackageFinder
+    from pip._internal.models.link import Link
     from pip._internal.operations.prepare import RequirementPreparer
     from pip._internal.req.req_install import InstallRequirement
     from pip._internal.resolution.base import InstallRequirementProvider
@@ -166,6 +168,8 @@ class Resolver(BaseResolver):
             check_supported_wheels=check_supported_wheels
         )
         for req in root_reqs:
+            if req.constraint:
+                check_invalid_constraint_type(req)
             requirement_set.add_requirement(req)
 
         # Actually prepare the files, and collect any exceptions. Most hash
@@ -174,7 +178,7 @@ class Resolver(BaseResolver):
         # based on link type.
         discovered_reqs = []  # type: List[InstallRequirement]
         hash_errors = HashErrors()
-        for req in chain(root_reqs, discovered_reqs):
+        for req in chain(requirement_set.all_requirements, discovered_reqs):
             try:
                 discovered_reqs.extend(self._resolve_one(requirement_set, req))
             except HashError as exc:
@@ -194,7 +198,7 @@ class Resolver(BaseResolver):
             return True
         else:
             assert self.upgrade_strategy == "only-if-needed"
-            return req.is_direct
+            return req.user_supplied or req.constraint
 
     def _set_req_to_reinstall(self, req):
         # type: (InstallRequirement) -> None
@@ -260,6 +264,29 @@ class Resolver(BaseResolver):
         self._set_req_to_reinstall(req_to_install)
         return None
 
+    def _find_requirement_link(self, req):
+        # type: (InstallRequirement) -> Optional[Link]
+        upgrade = self._is_upgrade_allowed(req)
+        best_candidate = self.finder.find_requirement(req, upgrade)
+        if not best_candidate:
+            return None
+
+        # Log a warning per PEP 592 if necessary before returning.
+        link = best_candidate.link
+        if link.is_yanked:
+            reason = link.yanked_reason or '<none given>'
+            msg = (
+                # Mark this as a unicode string to prevent
+                # "UnicodeEncodeError: 'ascii' codec can't encode character"
+                # in Python 2 when the reason contains non-ascii characters.
+                u'The candidate selected for download or install is a '
+                'yanked version: {candidate}\n'
+                'Reason for being yanked: {reason}'
+            ).format(candidate=best_candidate, reason=reason)
+            logger.warning(msg)
+
+        return link
+
     def _populate_link(self, req):
         # type: (InstallRequirement) -> None
         """Ensure that if a link can be found for this, that it is found.
@@ -274,9 +301,8 @@ class Resolver(BaseResolver):
         mismatches. Furthermore, cached wheels at present have undeterministic
         contents due to file modification times.
         """
-        upgrade = self._is_upgrade_allowed(req)
         if req.link is None:
-            req.link = self.finder.find_requirement(req, upgrade)
+            req.link = self._find_requirement_link(req)
 
         if self.wheel_cache is None or self.preparer.require_hashes:
             return
@@ -396,7 +422,7 @@ class Resolver(BaseResolver):
                 # 'unnamed' requirements will get added here
                 # 'unnamed' requirements can only come from being directly
                 # provided by the user.
-                assert req_to_install.is_direct
+                assert req_to_install.user_supplied
                 requirement_set.add_requirement(
                     req_to_install, parent_req_name=None,
                 )
@@ -412,7 +438,7 @@ class Resolver(BaseResolver):
                 )
                 for missing in missing_requested:
                     logger.warning(
-                        '%s does not provide the extra \'%s\'',
+                        "%s does not provide the extra '%s'",
                         dist, missing
                     )
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/__init__.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/__init__.py
rename to venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/base.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py
similarity index 54%
rename from venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/base.py
rename to venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py
index 5f99618..9245747 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/base.py
+++ b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py
@@ -3,14 +3,21 @@ from pip._vendor.packaging.utils import canonicalize_name
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 if MYPY_CHECK_RUNNING:
-    from typing import Optional, Sequence, Set
+    from typing import FrozenSet, Iterable, Optional, Tuple
 
-    from pip._internal.req.req_install import InstallRequirement
     from pip._vendor.packaging.version import _BaseVersion
 
+    from pip._internal.models.link import Link
+    from pip._internal.req.req_install import InstallRequirement
+
+    CandidateLookup = Tuple[
+        Optional["Candidate"],
+        Optional[InstallRequirement],
+    ]
+
 
 def format_name(project, extras):
-    # type: (str, Set[str]) -> str
+    # type: (str, FrozenSet[str]) -> str
     if not extras:
         return project
     canonical_extras = sorted(canonicalize_name(e) for e in extras)
@@ -23,14 +30,18 @@ class Requirement(object):
         # type: () -> str
         raise NotImplementedError("Subclass should override")
 
-    def find_matches(self):
-        # type: () -> Sequence[Candidate]
-        raise NotImplementedError("Subclass should override")
-
     def is_satisfied_by(self, candidate):
         # type: (Candidate) -> bool
         return False
 
+    def get_candidate_lookup(self):
+        # type: () -> CandidateLookup
+        raise NotImplementedError("Subclass should override")
+
+    def format_for_error(self):
+        # type: () -> str
+        raise NotImplementedError("Subclass should override")
+
 
 class Candidate(object):
     @property
@@ -43,10 +54,29 @@ class Candidate(object):
         # type: () -> _BaseVersion
         raise NotImplementedError("Override in subclass")
 
-    def get_dependencies(self):
-        # type: () -> Sequence[Requirement]
+    @property
+    def is_installed(self):
+        # type: () -> bool
+        raise NotImplementedError("Override in subclass")
+
+    @property
+    def is_editable(self):
+        # type: () -> bool
+        raise NotImplementedError("Override in subclass")
+
+    @property
+    def source_link(self):
+        # type: () -> Optional[Link]
+        raise NotImplementedError("Override in subclass")
+
+    def iter_dependencies(self, with_requires):
+        # type: (bool) -> Iterable[Optional[Requirement]]
         raise NotImplementedError("Override in subclass")
 
     def get_install_requirement(self):
         # type: () -> Optional[InstallRequirement]
         raise NotImplementedError("Override in subclass")
+
+    def format_for_error(self):
+        # type: () -> str
+        raise NotImplementedError("Subclass should override")
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py
similarity index 54%
rename from venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/candidates.py
rename to venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py
index f8461ad..46cc7e7 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+++ b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py
@@ -1,23 +1,30 @@
 import logging
 import sys
 
+from pip._vendor.contextlib2 import suppress
 from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet
 from pip._vendor.packaging.utils import canonicalize_name
 from pip._vendor.packaging.version import Version
 
+from pip._internal.exceptions import HashError, MetadataInconsistent
+from pip._internal.network.lazy_wheel import (
+    HTTPRangeRequestUnsupported,
+    dist_from_wheel_url,
+)
 from pip._internal.req.constructors import (
     install_req_from_editable,
     install_req_from_line,
 )
 from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.misc import normalize_version_info
+from pip._internal.utils.logging import indent_log
+from pip._internal.utils.misc import dist_is_editable, normalize_version_info
 from pip._internal.utils.packaging import get_requires_python
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 from .base import Candidate, format_name
 
 if MYPY_CHECK_RUNNING:
-    from typing import Any, Optional, Sequence, Set, Tuple, Union
+    from typing import Any, FrozenSet, Iterable, Optional, Tuple, Union
 
     from pip._vendor.packaging.version import _BaseVersion
     from pip._vendor.pkg_resources import Distribution
@@ -38,55 +45,69 @@ if MYPY_CHECK_RUNNING:
 logger = logging.getLogger(__name__)
 
 
-def make_install_req_from_link(link, parent):
+def make_install_req_from_link(link, template):
     # type: (Link, InstallRequirement) -> InstallRequirement
-    assert not parent.editable, "parent is editable"
-    return install_req_from_line(
-        link.url,
-        comes_from=parent.comes_from,
-        use_pep517=parent.use_pep517,
-        isolated=parent.isolated,
-        constraint=parent.constraint,
+    assert not template.editable, "template is editable"
+    if template.req:
+        line = str(template.req)
+    else:
+        line = link.url
+    ireq = install_req_from_line(
+        line,
+        user_supplied=template.user_supplied,
+        comes_from=template.comes_from,
+        use_pep517=template.use_pep517,
+        isolated=template.isolated,
+        constraint=template.constraint,
         options=dict(
-            install_options=parent.install_options,
-            global_options=parent.global_options,
-            hashes=parent.hash_options
+            install_options=template.install_options,
+            global_options=template.global_options,
+            hashes=template.hash_options
         ),
     )
+    ireq.original_link = template.original_link
+    ireq.link = link
+    return ireq
 
 
-def make_install_req_from_editable(link, parent):
+def make_install_req_from_editable(link, template):
     # type: (Link, InstallRequirement) -> InstallRequirement
-    assert parent.editable, "parent not editable"
+    assert template.editable, "template not editable"
     return install_req_from_editable(
         link.url,
-        comes_from=parent.comes_from,
-        use_pep517=parent.use_pep517,
-        isolated=parent.isolated,
-        constraint=parent.constraint,
+        user_supplied=template.user_supplied,
+        comes_from=template.comes_from,
+        use_pep517=template.use_pep517,
+        isolated=template.isolated,
+        constraint=template.constraint,
         options=dict(
-            install_options=parent.install_options,
-            global_options=parent.global_options,
-            hashes=parent.hash_options
+            install_options=template.install_options,
+            global_options=template.global_options,
+            hashes=template.hash_options
         ),
     )
 
 
-def make_install_req_from_dist(dist, parent):
+def make_install_req_from_dist(dist, template):
     # type: (Distribution, InstallRequirement) -> InstallRequirement
+    project_name = canonicalize_name(dist.project_name)
+    if template.req:
+        line = str(template.req)
+    elif template.link:
+        line = "{} @ {}".format(project_name, template.link.url)
+    else:
+        line = "{}=={}".format(project_name, dist.parsed_version)
     ireq = install_req_from_line(
-        "{}=={}".format(
-            canonicalize_name(dist.project_name),
-            dist.parsed_version,
-        ),
-        comes_from=parent.comes_from,
-        use_pep517=parent.use_pep517,
-        isolated=parent.isolated,
-        constraint=parent.constraint,
+        line,
+        user_supplied=template.user_supplied,
+        comes_from=template.comes_from,
+        use_pep517=template.use_pep517,
+        isolated=template.isolated,
+        constraint=template.constraint,
         options=dict(
-            install_options=parent.install_options,
-            global_options=parent.global_options,
-            hashes=parent.hash_options
+            install_options=template.install_options,
+            global_options=template.global_options,
+            hashes=template.hash_options
         ),
     )
     ireq.satisfied_by = dist
@@ -94,33 +115,56 @@ def make_install_req_from_dist(dist, parent):
 
 
 class _InstallRequirementBackedCandidate(Candidate):
+    """A candidate backed by an ``InstallRequirement``.
+
+    This represents a package request with the target not being already
+    in the environment, and needs to be fetched and installed. The backing
+    ``InstallRequirement`` is responsible for most of the leg work; this
+    class exposes appropriate information to the resolver.
+
+    :param link: The link passed to the ``InstallRequirement``. The backing
+        ``InstallRequirement`` will use this link to fetch the distribution.
+    :param source_link: The link this candidate "originates" from. This is
+        different from ``link`` when the link is found in the wheel cache.
+        ``link`` would point to the wheel cache, while this points to the
+        found remote link (e.g. from pypi.org).
+    """
+    is_installed = False
+
     def __init__(
         self,
         link,          # type: Link
+        source_link,   # type: Link
         ireq,          # type: InstallRequirement
         factory,       # type: Factory
         name=None,     # type: Optional[str]
         version=None,  # type: Optional[_BaseVersion]
     ):
         # type: (...) -> None
-        self.link = link
+        self._link = link
+        self._source_link = source_link
         self._factory = factory
         self._ireq = ireq
         self._name = name
         self._version = version
         self._dist = None  # type: Optional[Distribution]
+        self._prepared = False
 
     def __repr__(self):
         # type: () -> str
         return "{class_name}({link!r})".format(
             class_name=self.__class__.__name__,
-            link=str(self.link),
+            link=str(self._link),
         )
 
+    def __hash__(self):
+        # type: () -> int
+        return hash((self.__class__, self._link))
+
     def __eq__(self, other):
         # type: (Any) -> bool
         if isinstance(other, self.__class__):
-            return self.link == other.link
+            return self._link == other._link
         return False
 
     # Needed for Python 2, which does not implement this by default
@@ -128,6 +172,11 @@ class _InstallRequirementBackedCandidate(Candidate):
         # type: (Any) -> bool
         return not self.__eq__(other)
 
+    @property
+    def source_link(self):
+        # type: () -> Optional[Link]
+        return self._source_link
+
     @property
     def name(self):
         # type: () -> str
@@ -143,44 +192,73 @@ class _InstallRequirementBackedCandidate(Candidate):
             self._version = self.dist.parsed_version
         return self._version
 
+    def format_for_error(self):
+        # type: () -> str
+        return "{} {} (from {})".format(
+            self.name,
+            self.version,
+            self._link.file_path if self._link.is_file else self._link
+        )
+
     def _prepare_abstract_distribution(self):
         # type: () -> AbstractDistribution
         raise NotImplementedError("Override in subclass")
 
+    def _check_metadata_consistency(self):
+        # type: () -> None
+        """Check for consistency of project name and version of dist."""
+        # TODO: (Longer term) Rather than abort, reject this candidate
+        #       and backtrack. This would need resolvelib support.
+        dist = self._dist  # type: Distribution
+        name = canonicalize_name(dist.project_name)
+        if self._name is not None and self._name != name:
+            raise MetadataInconsistent(self._ireq, "name", dist.project_name)
+        version = dist.parsed_version
+        if self._version is not None and self._version != version:
+            raise MetadataInconsistent(self._ireq, "version", dist.version)
+
     def _prepare(self):
         # type: () -> None
-        if self._dist is not None:
+        if self._prepared:
             return
+        try:
+            abstract_dist = self._prepare_abstract_distribution()
+        except HashError as e:
+            e.req = self._ireq
+            raise
 
-        abstract_dist = self._prepare_abstract_distribution()
         self._dist = abstract_dist.get_pkg_resources_distribution()
         assert self._dist is not None, "Distribution already installed"
+        self._check_metadata_consistency()
+        self._prepared = True
 
-        # TODO: Abort cleanly here, as the resolution has been
-        #       based on the wrong name/version until now, and
-        #       so is wrong.
-        # TODO: (Longer term) Rather than abort, reject this candidate
-        #       and backtrack. This would need resolvelib support.
-        # These should be "proper" errors, not just asserts, as they
-        # can result from user errors like a requirement "foo @ URL"
-        # when the project at URL has a name of "bar" in its metadata.
-        assert (
-            self._name is None or
-            self._name == canonicalize_name(self._dist.project_name)
-        ), "Name mismatch: {!r} vs {!r}".format(
-            self._name, canonicalize_name(self._dist.project_name),
-        )
-        assert (
-            self._version is None or
-            self._version == self._dist.parsed_version
-        ), "Version mismatch: {!r} vs {!r}".format(
-            self._version, self._dist.parsed_version,
-        )
+    def _fetch_metadata(self):
+        # type: () -> None
+        """Fetch metadata, using lazy wheel if possible."""
+        preparer = self._factory.preparer
+        use_lazy_wheel = self._factory.use_lazy_wheel
+        remote_wheel = self._link.is_wheel and not self._link.is_file
+        if use_lazy_wheel and remote_wheel and not preparer.require_hashes:
+            assert self._name is not None
+            logger.info('Collecting %s', self._ireq.req or self._ireq)
+            # If HTTPRangeRequestUnsupported is raised, fallback silently.
+            with indent_log(), suppress(HTTPRangeRequestUnsupported):
+                logger.info(
+                    'Obtaining dependency information from %s %s',
+                    self._name, self._version,
+                )
+                url = self._link.url.split('#', 1)[0]
+                session = preparer.downloader._session
+                self._dist = dist_from_wheel_url(self._name, url, session)
+                self._check_metadata_consistency()
+        if self._dist is None:
+            self._prepare()
 
     @property
     def dist(self):
         # type: () -> Distribution
-        self._prepare()
+        if self._dist is None:
+            self._fetch_metadata()
         return self._dist
 
     def _get_requires_python_specifier(self):
@@ -197,18 +275,17 @@ class _InstallRequirementBackedCandidate(Candidate):
             return None
         return spec
 
-    def get_dependencies(self):
-        # type: () -> Sequence[Requirement]
-        deps = [
-            self._factory.make_requirement_from_spec(str(r), self._ireq)
-            for r in self.dist.requires()
-        ]
+    def iter_dependencies(self, with_requires):
+        # type: (bool) -> Iterable[Optional[Requirement]]
+        if not with_requires:
+            return
+        for r in self.dist.requires():
+            yield self._factory.make_requirement_from_spec(str(r), self._ireq)
         python_dep = self._factory.make_requires_python_requirement(
             self._get_requires_python_specifier(),
         )
         if python_dep:
-            deps.append(python_dep)
-        return deps
+            yield python_dep
 
     def get_install_requirement(self):
         # type: () -> Optional[InstallRequirement]
@@ -217,18 +294,33 @@ class _InstallRequirementBackedCandidate(Candidate):
 
 
 class LinkCandidate(_InstallRequirementBackedCandidate):
+    is_editable = False
+
     def __init__(
         self,
         link,          # type: Link
-        parent,        # type: InstallRequirement
+        template,        # type: InstallRequirement
         factory,       # type: Factory
         name=None,     # type: Optional[str]
         version=None,  # type: Optional[_BaseVersion]
     ):
         # type: (...) -> None
+        source_link = link
+        cache_entry = factory.get_wheel_cache_entry(link, name)
+        if cache_entry is not None:
+            logger.debug("Using cached wheel link: %s", cache_entry.link)
+            link = cache_entry.link
+        ireq = make_install_req_from_link(link, template)
+
+        if (cache_entry is not None and
+                cache_entry.persistent and
+                template.link is template.original_link):
+            ireq.original_link_is_in_wheel_cache = True
+
         super(LinkCandidate, self).__init__(
             link=link,
-            ireq=make_install_req_from_link(link, parent),
+            source_link=source_link,
+            ireq=ireq,
             factory=factory,
             name=name,
             version=version,
@@ -236,14 +328,18 @@ class LinkCandidate(_InstallRequirementBackedCandidate):
 
     def _prepare_abstract_distribution(self):
         # type: () -> AbstractDistribution
-        return self._factory.preparer.prepare_linked_requirement(self._ireq)
+        return self._factory.preparer.prepare_linked_requirement(
+            self._ireq, parallel_builds=True,
+        )
 
 
 class EditableCandidate(_InstallRequirementBackedCandidate):
+    is_editable = True
+
     def __init__(
         self,
         link,          # type: Link
-        parent,        # type: InstallRequirement
+        template,        # type: InstallRequirement
         factory,       # type: Factory
         name=None,     # type: Optional[str]
         version=None,  # type: Optional[_BaseVersion]
@@ -251,7 +347,8 @@ class EditableCandidate(_InstallRequirementBackedCandidate):
         # type: (...) -> None
         super(EditableCandidate, self).__init__(
             link=link,
-            ireq=make_install_req_from_editable(link, parent),
+            source_link=link,
+            ireq=make_install_req_from_editable(link, template),
             factory=factory,
             name=name,
             version=version,
@@ -263,15 +360,18 @@ class EditableCandidate(_InstallRequirementBackedCandidate):
 
 
 class AlreadyInstalledCandidate(Candidate):
+    is_installed = True
+    source_link = None
+
     def __init__(
         self,
         dist,  # type: Distribution
-        parent,  # type: InstallRequirement
+        template,  # type: InstallRequirement
         factory,  # type: Factory
     ):
         # type: (...) -> None
         self.dist = dist
-        self._ireq = make_install_req_from_dist(dist, parent)
+        self._ireq = make_install_req_from_dist(dist, template)
         self._factory = factory
 
         # This is just logging some messages, so we can do it eagerly.
@@ -288,6 +388,10 @@ class AlreadyInstalledCandidate(Candidate):
             distribution=self.dist,
         )
 
+    def __hash__(self):
+        # type: () -> int
+        return hash((self.__class__, self.name, self.version))
+
     def __eq__(self, other):
         # type: (Any) -> bool
         if isinstance(other, self.__class__):
@@ -309,12 +413,21 @@ class AlreadyInstalledCandidate(Candidate):
         # type: () -> _BaseVersion
         return self.dist.parsed_version
 
-    def get_dependencies(self):
-        # type: () -> Sequence[Requirement]
-        return [
-            self._factory.make_requirement_from_spec(str(r), self._ireq)
-            for r in self.dist.requires()
-        ]
+    @property
+    def is_editable(self):
+        # type: () -> bool
+        return dist_is_editable(self.dist)
+
+    def format_for_error(self):
+        # type: () -> str
+        return "{} {} (Installed)".format(self.name, self.version)
+
+    def iter_dependencies(self, with_requires):
+        # type: (bool) -> Iterable[Optional[Requirement]]
+        if not with_requires:
+            return
+        for r in self.dist.requires():
+            yield self._factory.make_requirement_from_spec(str(r), self._ireq)
 
     def get_install_requirement(self):
         # type: () -> Optional[InstallRequirement]
@@ -335,8 +448,8 @@ class ExtrasCandidate(Candidate):
        to treat it as a separate node in the dependency graph.
     2. When we're getting the candidate's dependencies,
        a) We specify that we want the extra dependencies as well.
-       b) We add a dependency on the base candidate (matching the name and
-          version).  See below for why this is needed.
+       b) We add a dependency on the base candidate.
+          See below for why this is needed.
     3. We return None for the underlying InstallRequirement, as the base
        candidate will provide it, and we don't want to end up with duplicates.
 
@@ -348,7 +461,7 @@ class ExtrasCandidate(Candidate):
     def __init__(
         self,
         base,  # type: BaseCandidate
-        extras,  # type: Set[str]
+        extras,  # type: FrozenSet[str]
     ):
         # type: (...) -> None
         self.base = base
@@ -362,6 +475,10 @@ class ExtrasCandidate(Candidate):
             extras=self.extras,
         )
 
+    def __hash__(self):
+        # type: () -> int
+        return hash((self.base, self.extras))
+
     def __eq__(self, other):
         # type: (Any) -> bool
         if isinstance(other, self.__class__):
@@ -384,30 +501,56 @@ class ExtrasCandidate(Candidate):
         # type: () -> _BaseVersion
         return self.base.version
 
-    def get_dependencies(self):
-        # type: () -> Sequence[Requirement]
+    def format_for_error(self):
+        # type: () -> str
+        return "{} [{}]".format(
+            self.base.format_for_error(),
+            ", ".join(sorted(self.extras))
+        )
+
+    @property
+    def is_installed(self):
+        # type: () -> bool
+        return self.base.is_installed
+
+    @property
+    def is_editable(self):
+        # type: () -> bool
+        return self.base.is_editable
+
+    @property
+    def source_link(self):
+        # type: () -> Optional[Link]
+        return self.base.source_link
+
+    def iter_dependencies(self, with_requires):
+        # type: (bool) -> Iterable[Optional[Requirement]]
         factory = self.base._factory
 
+        # Add a dependency on the exact base
+        # (See note 2b in the class docstring)
+        yield factory.make_requirement_from_candidate(self.base)
+        if not with_requires:
+            return
+
         # The user may have specified extras that the candidate doesn't
         # support. We ignore any unsupported extras here.
         valid_extras = self.extras.intersection(self.base.dist.extras)
         invalid_extras = self.extras.difference(self.base.dist.extras)
-        if invalid_extras:
+        for extra in sorted(invalid_extras):
             logger.warning(
-                "Invalid extras specified in %s: %s",
-                self.name,
-                ','.join(sorted(invalid_extras))
+                "%s %s does not provide the extra '%s'",
+                self.base.name,
+                self.version,
+                extra
             )
 
-        deps = [
-            factory.make_requirement_from_spec(str(r), self.base._ireq)
-            for r in self.base.dist.requires(valid_extras)
-        ]
-        # Add a dependency on the exact base.
-        # (See note 2b in the class docstring)
-        spec = "{}=={}".format(self.base.name, self.base.version)
-        deps.append(factory.make_requirement_from_spec(spec, self.base._ireq))
-        return deps
+        for r in self.base.dist.requires(valid_extras):
+            requirement = factory.make_requirement_from_spec(
+                str(r), self.base._ireq, valid_extras,
+            )
+            if requirement:
+                yield requirement
 
     def get_install_requirement(self):
         # type: () -> Optional[InstallRequirement]
@@ -418,6 +561,9 @@ class ExtrasCandidate(Candidate):
 
 
 class RequiresPythonCandidate(Candidate):
+    is_installed = False
+    source_link = None
+
     def __init__(self, py_version_info):
         # type: (Optional[Tuple[int, ...]]) -> None
         if py_version_info is not None:
@@ -434,16 +580,20 @@ class RequiresPythonCandidate(Candidate):
     def name(self):
         # type: () -> str
         # Avoid conflicting with the PyPI package "Python".
-        return "<Python fom Requires-Python>"
+        return "<Python from Requires-Python>"
 
     @property
     def version(self):
         # type: () -> _BaseVersion
         return self._version
 
-    def get_dependencies(self):
-        # type: () -> Sequence[Requirement]
-        return []
+    def format_for_error(self):
+        # type: () -> str
+        return "Python {}".format(self.version)
+
+    def iter_dependencies(self, with_requires):
+        # type: (bool) -> Iterable[Optional[Requirement]]
+        return ()
 
     def get_install_requirement(self):
         # type: () -> Optional[InstallRequirement]
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py
new file mode 100644
index 0000000..dab23aa
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py
@@ -0,0 +1,459 @@
+import collections
+import logging
+
+from pip._vendor import six
+from pip._vendor.packaging.utils import canonicalize_name
+
+from pip._internal.exceptions import (
+    DistributionNotFound,
+    InstallationError,
+    UnsupportedPythonVersion,
+    UnsupportedWheel,
+)
+from pip._internal.models.wheel import Wheel
+from pip._internal.req.req_install import InstallRequirement
+from pip._internal.utils.compatibility_tags import get_supported
+from pip._internal.utils.hashes import Hashes
+from pip._internal.utils.misc import (
+    dist_in_site_packages,
+    dist_in_usersite,
+    get_installed_distributions,
+)
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+from pip._internal.utils.virtualenv import running_under_virtualenv
+
+from .candidates import (
+    AlreadyInstalledCandidate,
+    EditableCandidate,
+    ExtrasCandidate,
+    LinkCandidate,
+    RequiresPythonCandidate,
+)
+from .requirements import (
+    ExplicitRequirement,
+    RequiresPythonRequirement,
+    SpecifierRequirement,
+)
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        FrozenSet,
+        Dict,
+        Iterable,
+        List,
+        Optional,
+        Sequence,
+        Set,
+        Tuple,
+        TypeVar,
+    )
+
+    from pip._vendor.packaging.specifiers import SpecifierSet
+    from pip._vendor.packaging.version import _BaseVersion
+    from pip._vendor.pkg_resources import Distribution
+    from pip._vendor.resolvelib import ResolutionImpossible
+
+    from pip._internal.cache import CacheEntry, WheelCache
+    from pip._internal.index.package_finder import PackageFinder
+    from pip._internal.models.link import Link
+    from pip._internal.operations.prepare import RequirementPreparer
+    from pip._internal.resolution.base import InstallRequirementProvider
+
+    from .base import Candidate, Requirement
+    from .candidates import BaseCandidate
+
+    C = TypeVar("C")
+    Cache = Dict[Link, C]
+    VersionCandidates = Dict[_BaseVersion, Candidate]
+
+
+logger = logging.getLogger(__name__)
+
+
+class Factory(object):
+    def __init__(
+        self,
+        finder,  # type: PackageFinder
+        preparer,  # type: RequirementPreparer
+        make_install_req,  # type: InstallRequirementProvider
+        wheel_cache,  # type: Optional[WheelCache]
+        use_user_site,  # type: bool
+        force_reinstall,  # type: bool
+        ignore_installed,  # type: bool
+        ignore_requires_python,  # type: bool
+        py_version_info=None,  # type: Optional[Tuple[int, ...]]
+        lazy_wheel=False,  # type: bool
+    ):
+        # type: (...) -> None
+        self._finder = finder
+        self.preparer = preparer
+        self._wheel_cache = wheel_cache
+        self._python_candidate = RequiresPythonCandidate(py_version_info)
+        self._make_install_req_from_spec = make_install_req
+        self._use_user_site = use_user_site
+        self._force_reinstall = force_reinstall
+        self._ignore_requires_python = ignore_requires_python
+        self.use_lazy_wheel = lazy_wheel
+
+        self._link_candidate_cache = {}  # type: Cache[LinkCandidate]
+        self._editable_candidate_cache = {}  # type: Cache[EditableCandidate]
+
+        if not ignore_installed:
+            self._installed_dists = {
+                canonicalize_name(dist.project_name): dist
+                for dist in get_installed_distributions()
+            }
+        else:
+            self._installed_dists = {}
+
+    @property
+    def force_reinstall(self):
+        # type: () -> bool
+        return self._force_reinstall
+
+    def _make_candidate_from_dist(
+        self,
+        dist,  # type: Distribution
+        extras,  # type: FrozenSet[str]
+        template,  # type: InstallRequirement
+    ):
+        # type: (...) -> Candidate
+        base = AlreadyInstalledCandidate(dist, template, factory=self)
+        if extras:
+            return ExtrasCandidate(base, extras)
+        return base
+
+    def _make_candidate_from_link(
+        self,
+        link,  # type: Link
+        extras,  # type: FrozenSet[str]
+        template,  # type: InstallRequirement
+        name,  # type: Optional[str]
+        version,  # type: Optional[_BaseVersion]
+    ):
+        # type: (...) -> Candidate
+        # TODO: Check already installed candidate, and use it if the link and
+        # editable flag match.
+        if template.editable:
+            if link not in self._editable_candidate_cache:
+                self._editable_candidate_cache[link] = EditableCandidate(
+                    link, template, factory=self, name=name, version=version,
+                )
+            base = self._editable_candidate_cache[link]  # type: BaseCandidate
+        else:
+            if link not in self._link_candidate_cache:
+                self._link_candidate_cache[link] = LinkCandidate(
+                    link, template, factory=self, name=name, version=version,
+                )
+            base = self._link_candidate_cache[link]
+        if extras:
+            return ExtrasCandidate(base, extras)
+        return base
+
+    def _iter_found_candidates(
+        self,
+        ireqs,  # type: Sequence[InstallRequirement]
+        specifier,  # type: SpecifierSet
+    ):
+        # type: (...) -> Iterable[Candidate]
+        if not ireqs:
+            return ()
+
+        # The InstallRequirement implementation requires us to give it a
+        # "template". Here we just choose the first requirement to represent
+        # all of them.
+        # Hopefully the Project model can correct this mismatch in the future.
+        template = ireqs[0]
+        name = canonicalize_name(template.req.name)
+
+        hashes = Hashes()
+        extras = frozenset()  # type: FrozenSet[str]
+        for ireq in ireqs:
+            specifier &= ireq.req.specifier
+            hashes |= ireq.hashes(trust_internet=False)
+            extras |= frozenset(ireq.extras)
+
+        # We use this to ensure that we only yield a single candidate for
+        # each version (the finder's preferred one for that version). The
+        # requirement needs to return only one candidate per version, so we
+        # implement that logic here so that requirements using this helper
+        # don't all have to do the same thing later.
+        candidates = collections.OrderedDict()  # type: VersionCandidates
+
+        # Get the installed version, if it matches, unless the user
+        # specified `--force-reinstall`, when we want the version from
+        # the index instead.
+        installed_version = None
+        installed_candidate = None
+        if not self._force_reinstall and name in self._installed_dists:
+            installed_dist = self._installed_dists[name]
+            installed_version = installed_dist.parsed_version
+            if specifier.contains(installed_version, prereleases=True):
+                installed_candidate = self._make_candidate_from_dist(
+                    dist=installed_dist,
+                    extras=extras,
+                    template=template,
+                )
+
+        found = self._finder.find_best_candidate(
+            project_name=name,
+            specifier=specifier,
+            hashes=hashes,
+        )
+        for ican in found.iter_applicable():
+            if ican.version == installed_version and installed_candidate:
+                candidate = installed_candidate
+            else:
+                candidate = self._make_candidate_from_link(
+                    link=ican.link,
+                    extras=extras,
+                    template=template,
+                    name=name,
+                    version=ican.version,
+                )
+            candidates[ican.version] = candidate
+
+        # Yield the installed version even if it is not found on the index.
+        if installed_version and installed_candidate:
+            candidates[installed_version] = installed_candidate
+
+        return six.itervalues(candidates)
+
+    def find_candidates(self, requirements, constraint):
+        # type: (Sequence[Requirement], SpecifierSet) -> Iterable[Candidate]
+        explicit_candidates = set()  # type: Set[Candidate]
+        ireqs = []  # type: List[InstallRequirement]
+        for req in requirements:
+            cand, ireq = req.get_candidate_lookup()
+            if cand is not None:
+                explicit_candidates.add(cand)
+            if ireq is not None:
+                ireqs.append(ireq)
+
+        # If none of the requirements want an explicit candidate, we can ask
+        # the finder for candidates.
+        if not explicit_candidates:
+            return self._iter_found_candidates(ireqs, constraint)
+
+        if constraint:
+            name = explicit_candidates.pop().name
+            raise InstallationError(
+                "Could not satisfy constraints for {!r}: installation from "
+                "path or url cannot be constrained to a version".format(name)
+            )
+
+        return (
+            c for c in explicit_candidates
+            if all(req.is_satisfied_by(c) for req in requirements)
+        )
+
+    def make_requirement_from_install_req(self, ireq, requested_extras):
+        # type: (InstallRequirement, Iterable[str]) -> Optional[Requirement]
+        if not ireq.match_markers(requested_extras):
+            logger.info(
+                "Ignoring %s: markers '%s' don't match your environment",
+                ireq.name, ireq.markers,
+            )
+            return None
+        if not ireq.link:
+            return SpecifierRequirement(ireq)
+        if ireq.link.is_wheel:
+            wheel = Wheel(ireq.link.filename)
+            if not wheel.supported(self._finder.target_python.get_tags()):
+                msg = "{} is not a supported wheel on this platform.".format(
+                    wheel.filename,
+                )
+                raise UnsupportedWheel(msg)
+        cand = self._make_candidate_from_link(
+            ireq.link,
+            extras=frozenset(ireq.extras),
+            template=ireq,
+            name=canonicalize_name(ireq.name) if ireq.name else None,
+            version=None,
+        )
+        return self.make_requirement_from_candidate(cand)
+
+    def make_requirement_from_candidate(self, candidate):
+        # type: (Candidate) -> ExplicitRequirement
+        return ExplicitRequirement(candidate)
+
+    def make_requirement_from_spec(
+        self,
+        specifier,  # type: str
+        comes_from,  # type: InstallRequirement
+        requested_extras=(),  # type: Iterable[str]
+    ):
+        # type: (...) -> Optional[Requirement]
+        ireq = self._make_install_req_from_spec(specifier, comes_from)
+        return self.make_requirement_from_install_req(ireq, requested_extras)
+
+    def make_requires_python_requirement(self, specifier):
+        # type: (Optional[SpecifierSet]) -> Optional[Requirement]
+        if self._ignore_requires_python or specifier is None:
+            return None
+        return RequiresPythonRequirement(specifier, self._python_candidate)
+
+    def get_wheel_cache_entry(self, link, name):
+        # type: (Link, Optional[str]) -> Optional[CacheEntry]
+        """Look up the link in the wheel cache.
+
+        If ``preparer.require_hashes`` is True, don't use the wheel cache,
+        because cached wheels, always built locally, have different hashes
+        than the files downloaded from the index server and thus throw false
+        hash mismatches. Furthermore, cached wheels at present have
+        nondeterministic contents due to file modification times.
+        """
+        if self._wheel_cache is None or self.preparer.require_hashes:
+            return None
+        return self._wheel_cache.get_cache_entry(
+            link=link,
+            package_name=name,
+            supported_tags=get_supported(),
+        )
+
+    def get_dist_to_uninstall(self, candidate):
+        # type: (Candidate) -> Optional[Distribution]
+        # TODO: Are there more cases this needs to return True? Editable?
+        dist = self._installed_dists.get(candidate.name)
+        if dist is None:  # Not installed, no uninstallation required.
+            return None
+
+        # We're installing into global site. The current installation must
+        # be uninstalled, no matter it's in global or user site, because the
+        # user site installation has precedence over global.
+        if not self._use_user_site:
+            return dist
+
+        # We're installing into user site. Remove the user site installation.
+        if dist_in_usersite(dist):
+            return dist
+
+        # We're installing into user site, but the installed incompatible
+        # package is in global site. We can't uninstall that, and would let
+        # the new user installation to "shadow" it. But shadowing won't work
+        # in virtual environments, so we error out.
+        if running_under_virtualenv() and dist_in_site_packages(dist):
+            raise InstallationError(
+                "Will not install to the user site because it will "
+                "lack sys.path precedence to {} in {}".format(
+                    dist.project_name, dist.location,
+                )
+            )
+        return None
+
+    def _report_requires_python_error(
+        self,
+        requirement,  # type: RequiresPythonRequirement
+        template,  # type: Candidate
+    ):
+        # type: (...) -> UnsupportedPythonVersion
+        message_format = (
+            "Package {package!r} requires a different Python: "
+            "{version} not in {specifier!r}"
+        )
+        message = message_format.format(
+            package=template.name,
+            version=self._python_candidate.version,
+            specifier=str(requirement.specifier),
+        )
+        return UnsupportedPythonVersion(message)
+
+    def get_installation_error(self, e):
+        # type: (ResolutionImpossible) -> InstallationError
+
+        assert e.causes, "Installation error reported with no cause"
+
+        # If one of the things we can't solve is "we need Python X.Y",
+        # that is what we report.
+        for cause in e.causes:
+            if isinstance(cause.requirement, RequiresPythonRequirement):
+                return self._report_requires_python_error(
+                    cause.requirement,
+                    cause.parent,
+                )
+
+        # Otherwise, we have a set of causes which can't all be satisfied
+        # at once.
+
+        # The simplest case is when we have *one* cause that can't be
+        # satisfied. We just report that case.
+        if len(e.causes) == 1:
+            req, parent = e.causes[0]
+            if parent is None:
+                req_disp = str(req)
+            else:
+                req_disp = '{} (from {})'.format(req, parent.name)
+            logger.critical(
+                "Could not find a version that satisfies the requirement %s",
+                req_disp,
+            )
+            return DistributionNotFound(
+                'No matching distribution found for {}'.format(req)
+            )
+
+        # OK, we now have a list of requirements that can't all be
+        # satisfied at once.
+
+        # A couple of formatting helpers
+        def text_join(parts):
+            # type: (List[str]) -> str
+            if len(parts) == 1:
+                return parts[0]
+
+            return ", ".join(parts[:-1]) + " and " + parts[-1]
+
+        def readable_form(cand):
+            # type: (Candidate) -> str
+            return "{} {}".format(cand.name, cand.version)
+
+        def describe_trigger(parent):
+            # type: (Candidate) -> str
+            ireq = parent.get_install_requirement()
+            if not ireq or not ireq.comes_from:
+                return "{} {}".format(parent.name, parent.version)
+            if isinstance(ireq.comes_from, InstallRequirement):
+                return str(ireq.comes_from.name)
+            return str(ireq.comes_from)
+
+        triggers = []
+        for req, parent in e.causes:
+            if parent is None:
+                # This is a root requirement, so we can report it directly
+                trigger = req.format_for_error()
+            else:
+                trigger = describe_trigger(parent)
+            triggers.append(trigger)
+
+        if triggers:
+            info = text_join(triggers)
+        else:
+            info = "the requested packages"
+
+        msg = "Cannot install {} because these package versions " \
+            "have conflicting dependencies.".format(info)
+        logger.critical(msg)
+        msg = "\nThe conflict is caused by:"
+        for req, parent in e.causes:
+            msg = msg + "\n    "
+            if parent:
+                msg = msg + "{} {} depends on ".format(
+                    parent.name,
+                    parent.version
+                )
+            else:
+                msg = msg + "The user requested "
+            msg = msg + req.format_for_error()
+
+        msg = msg + "\n\n" + \
+            "To fix this you could try to:\n" + \
+            "1. loosen the range of package versions you've specified\n" + \
+            "2. remove package versions to allow pip attempt to solve " + \
+            "the dependency conflict\n"
+
+        logger.info(msg)
+
+        return DistributionNotFound(
+            "ResolutionImpossible: for help visit "
+            "https://pip.pypa.io/en/latest/user_guide/"
+            "#fixing-conflicting-dependencies"
+        )
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py
new file mode 100644
index 0000000..b2eb9d0
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py
@@ -0,0 +1,153 @@
+from pip._vendor.packaging.specifiers import SpecifierSet
+from pip._vendor.resolvelib.providers import AbstractProvider
+
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import (
+        Any,
+        Dict,
+        Iterable,
+        Optional,
+        Sequence,
+        Set,
+        Tuple,
+        Union,
+    )
+
+    from .base import Requirement, Candidate
+    from .factory import Factory
+
+# Notes on the relationship between the provider, the factory, and the
+# candidate and requirement classes.
+#
+# The provider is a direct implementation of the resolvelib class. Its role
+# is to deliver the API that resolvelib expects.
+#
+# Rather than work with completely abstract "requirement" and "candidate"
+# concepts as resolvelib does, pip has concrete classes implementing these two
+# ideas. The API of Requirement and Candidate objects are defined in the base
+# classes, but essentially map fairly directly to the equivalent provider
+# methods. In particular, `find_matches` and `is_satisfied_by` are
+# requirement methods, and `get_dependencies` is a candidate method.
+#
+# The factory is the interface to pip's internal mechanisms. It is stateless,
+# and is created by the resolver and held as a property of the provider. It is
+# responsible for creating Requirement and Candidate objects, and provides
+# services to those objects (access to pip's finder and preparer).
+
+
+class PipProvider(AbstractProvider):
+    def __init__(
+        self,
+        factory,  # type: Factory
+        constraints,  # type: Dict[str, SpecifierSet]
+        ignore_dependencies,  # type: bool
+        upgrade_strategy,  # type: str
+        user_requested,  # type: Set[str]
+    ):
+        # type: (...) -> None
+        self._factory = factory
+        self._constraints = constraints
+        self._ignore_dependencies = ignore_dependencies
+        self._upgrade_strategy = upgrade_strategy
+        self.user_requested = user_requested
+
+    def _sort_matches(self, matches):
+        # type: (Iterable[Candidate]) -> Sequence[Candidate]
+
+        # The requirement is responsible for returning a sequence of potential
+        # candidates, one per version. The provider handles the logic of
+        # deciding the order in which these candidates should be passed to
+        # the resolver.
+
+        # The `matches` argument is a sequence of candidates, one per version,
+        # which are potential options to be installed. The requirement will
+        # have already sorted out whether to give us an already-installed
+        # candidate or a version from PyPI (i.e., it will deal with options
+        # like --force-reinstall and --ignore-installed).
+
+        # We now work out the correct order.
+        #
+        # 1. If no other considerations apply, later versions take priority.
+        # 2. An already installed distribution is preferred over any other,
+        #    unless the user has requested an upgrade.
+        #    Upgrades are allowed when:
+        #    * The --upgrade flag is set, and
+        #      - The project was specified on the command line, or
+        #      - The project is a dependency and the "eager" upgrade strategy
+        #        was requested.
+        def _eligible_for_upgrade(name):
+            # type: (str) -> bool
+            """Are upgrades allowed for this project?
+
+            This checks the upgrade strategy, and whether the project was one
+            that the user specified in the command line, in order to decide
+            whether we should upgrade if there's a newer version available.
+
+            (Note that we don't need access to the `--upgrade` flag, because
+            an upgrade strategy of "to-satisfy-only" means that `--upgrade`
+            was not specified).
+            """
+            if self._upgrade_strategy == "eager":
+                return True
+            elif self._upgrade_strategy == "only-if-needed":
+                return (name in self.user_requested)
+            return False
+
+        def sort_key(c):
+            # type: (Candidate) -> int
+            """Return a sort key for the matches.
+
+            The highest priority should be given to installed candidates that
+            are not eligible for upgrade. We use the integer value in the first
+            part of the key to sort these before other candidates.
+
+            We only pull the installed candidate to the bottom (i.e. most
+            preferred), but otherwise keep the ordering returned by the
+            requirement. The requirement is responsible for returning a list
+            otherwise sorted for the resolver, taking account for versions
+            and binary preferences as specified by the user.
+            """
+            if c.is_installed and not _eligible_for_upgrade(c.name):
+                return 1
+            return 0
+
+        return sorted(matches, key=sort_key)
+
+    def identify(self, dependency):
+        # type: (Union[Requirement, Candidate]) -> str
+        return dependency.name
+
+    def get_preference(
+        self,
+        resolution,  # type: Optional[Candidate]
+        candidates,  # type: Sequence[Candidate]
+        information  # type: Sequence[Tuple[Requirement, Candidate]]
+    ):
+        # type: (...) -> Any
+        # Use the "usual" value for now
+        return len(candidates)
+
+    def find_matches(self, requirements):
+        # type: (Sequence[Requirement]) -> Iterable[Candidate]
+        if not requirements:
+            return []
+        constraint = self._constraints.get(
+            requirements[0].name, SpecifierSet(),
+        )
+        candidates = self._factory.find_candidates(requirements, constraint)
+        return reversed(self._sort_matches(candidates))
+
+    def is_satisfied_by(self, requirement, candidate):
+        # type: (Requirement, Candidate) -> bool
+        return requirement.is_satisfied_by(candidate)
+
+    def get_dependencies(self, candidate):
+        # type: (Candidate) -> Sequence[Requirement]
+        with_requires = not self._ignore_dependencies
+        return [
+            r
+            for r in candidate.iter_dependencies(with_requires)
+            if r is not None
+        ]
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py
similarity index 68%
rename from venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/requirements.py
rename to venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py
index d2e4479..bc1061f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+++ b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py
@@ -5,14 +5,11 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 from .base import Requirement, format_name
 
 if MYPY_CHECK_RUNNING:
-    from typing import Sequence
-
     from pip._vendor.packaging.specifiers import SpecifierSet
 
     from pip._internal.req.req_install import InstallRequirement
 
-    from .base import Candidate
-    from .factory import Factory
+    from .base import Candidate, CandidateLookup
 
 
 class ExplicitRequirement(Requirement):
@@ -33,9 +30,13 @@ class ExplicitRequirement(Requirement):
         # No need to canonicalise - the candidate did this
         return self.candidate.name
 
-    def find_matches(self):
-        # type: () -> Sequence[Candidate]
-        return [self.candidate]
+    def format_for_error(self):
+        # type: () -> str
+        return self.candidate.format_for_error()
+
+    def get_candidate_lookup(self):
+        # type: () -> CandidateLookup
+        return self.candidate, None
 
     def is_satisfied_by(self, candidate):
         # type: (Candidate) -> bool
@@ -43,12 +44,11 @@ class ExplicitRequirement(Requirement):
 
 
 class SpecifierRequirement(Requirement):
-    def __init__(self, ireq, factory):
-        # type: (InstallRequirement, Factory) -> None
+    def __init__(self, ireq):
+        # type: (InstallRequirement) -> None
         assert ireq.link is None, "This is a link, not a specifier"
         self._ireq = ireq
-        self._factory = factory
-        self.extras = ireq.req.extras
+        self._extras = frozenset(ireq.extras)
 
     def __str__(self):
         # type: () -> str
@@ -65,12 +65,26 @@ class SpecifierRequirement(Requirement):
     def name(self):
         # type: () -> str
         canonical_name = canonicalize_name(self._ireq.req.name)
-        return format_name(canonical_name, self.extras)
+        return format_name(canonical_name, self._extras)
+
+    def format_for_error(self):
+        # type: () -> str
 
-    def find_matches(self):
-        # type: () -> Sequence[Candidate]
-        it = self._factory.iter_found_candidates(self._ireq, self.extras)
-        return list(it)
+        # Convert comma-separated specifiers into "A, B, ..., F and G"
+        # This makes the specifier a bit more "human readable", without
+        # risking a change in meaning. (Hopefully! Not all edge cases have
+        # been checked)
+        parts = [s.strip() for s in str(self).split(",")]
+        if len(parts) == 0:
+            return ""
+        elif len(parts) == 1:
+            return parts[0]
+
+        return ", ".join(parts[:-1]) + " and " + parts[-1]
+
+    def get_candidate_lookup(self):
+        # type: () -> CandidateLookup
+        return None, self._ireq
 
     def is_satisfied_by(self, candidate):
         # type: (Candidate) -> bool
@@ -104,11 +118,15 @@ class RequiresPythonRequirement(Requirement):
         # type: () -> str
         return self._candidate.name
 
-    def find_matches(self):
-        # type: () -> Sequence[Candidate]
-        if self._candidate.version in self.specifier:
-            return [self._candidate]
-        return []
+    def format_for_error(self):
+        # type: () -> str
+        return "Python " + str(self.specifier)
+
+    def get_candidate_lookup(self):
+        # type: () -> CandidateLookup
+        if self.specifier.contains(self._candidate.version, prereleases=True):
+            return self._candidate, None
+        return None, None
 
     def is_satisfied_by(self, candidate):
         # type: (Candidate) -> bool
diff --git a/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py
new file mode 100644
index 0000000..aecddb1
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py
@@ -0,0 +1,259 @@
+import functools
+import logging
+
+from pip._vendor import six
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible
+from pip._vendor.resolvelib import Resolver as RLResolver
+
+from pip._internal.exceptions import InstallationError
+from pip._internal.req.req_install import check_invalid_constraint_type
+from pip._internal.req.req_set import RequirementSet
+from pip._internal.resolution.base import BaseResolver
+from pip._internal.resolution.resolvelib.provider import PipProvider
+from pip._internal.utils.misc import dist_is_editable
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+from .factory import Factory
+
+if MYPY_CHECK_RUNNING:
+    from typing import Dict, List, Optional, Set, Tuple
+
+    from pip._vendor.packaging.specifiers import SpecifierSet
+    from pip._vendor.resolvelib.resolvers import Result
+    from pip._vendor.resolvelib.structs import Graph
+
+    from pip._internal.cache import WheelCache
+    from pip._internal.index.package_finder import PackageFinder
+    from pip._internal.operations.prepare import RequirementPreparer
+    from pip._internal.req.req_install import InstallRequirement
+    from pip._internal.resolution.base import InstallRequirementProvider
+
+
+logger = logging.getLogger(__name__)
+
+
+class Resolver(BaseResolver):
+    _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"}
+
+    def __init__(
+        self,
+        preparer,  # type: RequirementPreparer
+        finder,  # type: PackageFinder
+        wheel_cache,  # type: Optional[WheelCache]
+        make_install_req,  # type: InstallRequirementProvider
+        use_user_site,  # type: bool
+        ignore_dependencies,  # type: bool
+        ignore_installed,  # type: bool
+        ignore_requires_python,  # type: bool
+        force_reinstall,  # type: bool
+        upgrade_strategy,  # type: str
+        py_version_info=None,  # type: Optional[Tuple[int, ...]]
+        lazy_wheel=False,  # type: bool
+    ):
+        super(Resolver, self).__init__()
+        if lazy_wheel:
+            logger.warning(
+                'pip is using lazily downloaded wheels using HTTP '
+                'range requests to obtain dependency information. '
+                'This experimental feature is enabled through '
+                '--use-feature=fast-deps and it is not ready for production.'
+            )
+
+        assert upgrade_strategy in self._allowed_strategies
+
+        self.factory = Factory(
+            finder=finder,
+            preparer=preparer,
+            make_install_req=make_install_req,
+            wheel_cache=wheel_cache,
+            use_user_site=use_user_site,
+            force_reinstall=force_reinstall,
+            ignore_installed=ignore_installed,
+            ignore_requires_python=ignore_requires_python,
+            py_version_info=py_version_info,
+            lazy_wheel=lazy_wheel,
+        )
+        self.ignore_dependencies = ignore_dependencies
+        self.upgrade_strategy = upgrade_strategy
+        self._result = None  # type: Optional[Result]
+
+    def resolve(self, root_reqs, check_supported_wheels):
+        # type: (List[InstallRequirement], bool) -> RequirementSet
+
+        constraints = {}  # type: Dict[str, SpecifierSet]
+        user_requested = set()  # type: Set[str]
+        requirements = []
+        for req in root_reqs:
+            if req.constraint:
+                # Ensure we only accept valid constraints
+                problem = check_invalid_constraint_type(req)
+                if problem:
+                    raise InstallationError(problem)
+                if not req.match_markers():
+                    continue
+                name = canonicalize_name(req.name)
+                if name in constraints:
+                    constraints[name] = constraints[name] & req.specifier
+                else:
+                    constraints[name] = req.specifier
+            else:
+                if req.user_supplied and req.name:
+                    user_requested.add(canonicalize_name(req.name))
+                r = self.factory.make_requirement_from_install_req(
+                    req, requested_extras=(),
+                )
+                if r is not None:
+                    requirements.append(r)
+
+        provider = PipProvider(
+            factory=self.factory,
+            constraints=constraints,
+            ignore_dependencies=self.ignore_dependencies,
+            upgrade_strategy=self.upgrade_strategy,
+            user_requested=user_requested,
+        )
+        reporter = BaseReporter()
+        resolver = RLResolver(provider, reporter)
+
+        try:
+            try_to_avoid_resolution_too_deep = 2000000
+            self._result = resolver.resolve(
+                requirements, max_rounds=try_to_avoid_resolution_too_deep,
+            )
+
+        except ResolutionImpossible as e:
+            error = self.factory.get_installation_error(e)
+            six.raise_from(error, e)
+
+        req_set = RequirementSet(check_supported_wheels=check_supported_wheels)
+        for candidate in self._result.mapping.values():
+            ireq = candidate.get_install_requirement()
+            if ireq is None:
+                continue
+
+            # Check if there is already an installation under the same name,
+            # and set a flag for later stages to uninstall it, if needed.
+            # * There isn't, good -- no uninstalltion needed.
+            # * The --force-reinstall flag is set. Always reinstall.
+            # * The installation is different in version or editable-ness, so
+            #   we need to uninstall it to install the new distribution.
+            # * The installed version is the same as the pending distribution.
+            #   Skip this distrubiton altogether to save work.
+            installed_dist = self.factory.get_dist_to_uninstall(candidate)
+            if installed_dist is None:
+                ireq.should_reinstall = False
+            elif self.factory.force_reinstall:
+                ireq.should_reinstall = True
+            elif installed_dist.parsed_version != candidate.version:
+                ireq.should_reinstall = True
+            elif dist_is_editable(installed_dist) != candidate.is_editable:
+                ireq.should_reinstall = True
+            else:
+                continue
+
+            link = candidate.source_link
+            if link and link.is_yanked:
+                # The reason can contain non-ASCII characters, Unicode
+                # is required for Python 2.
+                msg = (
+                    u'The candidate selected for download or install is a '
+                    u'yanked version: {name!r} candidate (version {version} '
+                    u'at {link})\nReason for being yanked: {reason}'
+                ).format(
+                    name=candidate.name,
+                    version=candidate.version,
+                    link=link,
+                    reason=link.yanked_reason or u'<none given>',
+                )
+                logger.warning(msg)
+
+            req_set.add_named_requirement(ireq)
+
+        return req_set
+
+    def get_installation_order(self, req_set):
+        # type: (RequirementSet) -> List[InstallRequirement]
+        """Get order for installation of requirements in RequirementSet.
+
+        The returned list contains a requirement before another that depends on
+        it. This helps ensure that the environment is kept consistent as they
+        get installed one-by-one.
+
+        The current implementation creates a topological ordering of the
+        dependency graph, while breaking any cycles in the graph at arbitrary
+        points. We make no guarantees about where the cycle would be broken,
+        other than they would be broken.
+        """
+        assert self._result is not None, "must call resolve() first"
+
+        graph = self._result.graph
+        weights = get_topological_weights(graph)
+
+        sorted_items = sorted(
+            req_set.requirements.items(),
+            key=functools.partial(_req_set_item_sorter, weights=weights),
+            reverse=True,
+        )
+        return [ireq for _, ireq in sorted_items]
+
+
+def get_topological_weights(graph):
+    # type: (Graph) -> Dict[Optional[str], int]
+    """Assign weights to each node based on how "deep" they are.
+
+    This implementation may change at any point in the future without prior
+    notice.
+
+    We take the length for the longest path to any node from root, ignoring any
+    paths that contain a single node twice (i.e. cycles). This is done through
+    a depth-first search through the graph, while keeping track of the path to
+    the node.
+
+    Cycles in the graph result would result in node being revisited while also
+    being it's own path. In this case, take no action. This helps ensure we
+    don't get stuck in a cycle.
+
+    When assigning weight, the longer path (i.e. larger length) is preferred.
+    """
+    path = set()  # type: Set[Optional[str]]
+    weights = {}  # type: Dict[Optional[str], int]
+
+    def visit(node):
+        # type: (Optional[str]) -> None
+        if node in path:
+            # We hit a cycle, so we'll break it here.
+            return
+
+        # Time to visit the children!
+        path.add(node)
+        for child in graph.iter_children(node):
+            visit(child)
+        path.remove(node)
+
+        last_known_parent_count = weights.get(node, 0)
+        weights[node] = max(last_known_parent_count, len(path))
+
+    # `None` is guaranteed to be the root node by resolvelib.
+    visit(None)
+
+    # Sanity checks
+    assert weights[None] == 0
+    assert len(weights) == len(graph)
+
+    return weights
+
+
+def _req_set_item_sorter(
+    item,     # type: Tuple[str, InstallRequirement]
+    weights,  # type: Dict[Optional[str], int]
+):
+    # type: (...) -> Tuple[int, str]
+    """Key function used to sort install requirements for installation.
+
+    Based on the "weight" mapping calculated in ``get_installation_order()``.
+    The canonical package name is returned as the second member as a tie-
+    breaker to ensure the result is predictable, which is useful in tests.
+    """
+    name = canonicalize_name(item[0])
+    return weights[name], name
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/self_outdated_check.py b/venv/Lib/site-packages/pip/_internal/self_outdated_check.py
similarity index 82%
rename from venv/lib/python3.8/site-packages/pip/_internal/self_outdated_check.py
rename to venv/Lib/site-packages/pip/_internal/self_outdated_check.py
index 8fc3c59..fbd9dfd 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/self_outdated_check.py
+++ b/venv/Lib/site-packages/pip/_internal/self_outdated_check.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import datetime
@@ -10,13 +7,11 @@ import logging
 import os.path
 import sys
 
-from pip._vendor import pkg_resources
 from pip._vendor.packaging import version as packaging_version
 from pip._vendor.six import ensure_binary
 
 from pip._internal.index.collector import LinkCollector
 from pip._internal.index.package_finder import PackageFinder
-from pip._internal.models.search_scope import SearchScope
 from pip._internal.models.selection_prefs import SelectionPreferences
 from pip._internal.utils.filesystem import (
     adjacent_tmp_file,
@@ -25,15 +20,14 @@ from pip._internal.utils.filesystem import (
 )
 from pip._internal.utils.misc import (
     ensure_dir,
+    get_distribution,
     get_installed_version,
-    redact_auth_from_url,
 )
 from pip._internal.utils.packaging import get_installer
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 if MYPY_CHECK_RUNNING:
     import optparse
-    from optparse import Values
     from typing import Any, Dict, Text, Union
 
     from pip._internal.network.session import PipSession
@@ -45,37 +39,6 @@ SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ"
 logger = logging.getLogger(__name__)
 
 
-def make_link_collector(
-    session,  # type: PipSession
-    options,  # type: Values
-    suppress_no_index=False,  # type: bool
-):
-    # type: (...) -> LinkCollector
-    """
-    :param session: The Session to use to make requests.
-    :param suppress_no_index: Whether to ignore the --no-index option
-        when constructing the SearchScope object.
-    """
-    index_urls = [options.index_url] + options.extra_index_urls
-    if options.no_index and not suppress_no_index:
-        logger.debug(
-            'Ignoring indexes: %s',
-            ','.join(redact_auth_from_url(url) for url in index_urls),
-        )
-        index_urls = []
-
-    # Make sure find_links is a list before passing to create().
-    find_links = options.find_links or []
-
-    search_scope = SearchScope.create(
-        find_links=find_links, index_urls=index_urls,
-    )
-
-    link_collector = LinkCollector(session=session, search_scope=search_scope)
-
-    return link_collector
-
-
 def _get_statefile_name(key):
     # type: (Union[str, Text]) -> str
     key_bytes = ensure_binary(key)
@@ -104,6 +67,7 @@ class SelfCheckState(object):
 
     @property
     def key(self):
+        # type: () -> str
         return sys.prefix
 
     def save(self, pypi_version, current_time):
@@ -149,11 +113,10 @@ def was_installed_by_pip(pkg):
     This is used not to display the upgrade message when pip is in fact
     installed by system package manager, such as dnf on Fedora.
     """
-    try:
-        dist = pkg_resources.get_distribution(pkg)
-        return "pip" == get_installer(dist)
-    except pkg_resources.DistributionNotFound:
+    dist = get_distribution(pkg)
+    if not dist:
         return False
+    return "pip" == get_installer(dist)
 
 
 def pip_self_version_check(session, options):
@@ -187,7 +150,7 @@ def pip_self_version_check(session, options):
         # Refresh the version if we need to or just see if we need to warn
         if pypi_version is None:
             # Lets use PackageFinder to see what the latest pip version is
-            link_collector = make_link_collector(
+            link_collector = LinkCollector.create(
                 session,
                 options=options,
                 suppress_no_index=True,
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/__init__.py b/venv/Lib/site-packages/pip/_internal/utils/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/__init__.py
rename to venv/Lib/site-packages/pip/_internal/utils/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/appdirs.py b/venv/Lib/site-packages/pip/_internal/utils/appdirs.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/appdirs.py
rename to venv/Lib/site-packages/pip/_internal/utils/appdirs.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/compat.py b/venv/Lib/site-packages/pip/_internal/utils/compat.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/compat.py
rename to venv/Lib/site-packages/pip/_internal/utils/compat.py
index d939e21..89c5169 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/compat.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/compat.py
@@ -121,10 +121,11 @@ def str_to_display(data, desc=None):
     try:
         decoded_data = data.decode(encoding)
     except UnicodeDecodeError:
-        if desc is None:
-            desc = 'Bytes object'
-        msg_format = '{} does not appear to be encoded as %s'.format(desc)
-        logger.warning(msg_format, encoding)
+        logger.warning(
+            '%s does not appear to be encoded as %s',
+            desc or 'Bytes object',
+            encoding,
+        )
         decoded_data = data.decode(encoding, errors=backslashreplace_decode)
 
     # Make sure we can print the output, by encoding it to the output
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/compatibility_tags.py b/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/compatibility_tags.py
rename to venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py
index 47d04f0..4f21874 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/compatibility_tags.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py
@@ -3,7 +3,6 @@
 
 from __future__ import absolute_import
 
-import logging
 import re
 
 from pip._vendor.packaging.tags import (
@@ -23,8 +22,6 @@ if MYPY_CHECK_RUNNING:
 
     from pip._vendor.packaging.tags import PythonVersion
 
-logger = logging.getLogger(__name__)
-
 _osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)')
 
 
diff --git a/venv/Lib/site-packages/pip/_internal/utils/datetime.py b/venv/Lib/site-packages/pip/_internal/utils/datetime.py
new file mode 100644
index 0000000..4d0503c
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_internal/utils/datetime.py
@@ -0,0 +1,14 @@
+"""For when pip wants to check the date or time.
+"""
+
+from __future__ import absolute_import
+
+import datetime
+
+
+def today_is_later_than(year, month, day):
+    # type: (int, int, int) -> bool
+    today = datetime.date.today()
+    given = datetime.date(year, month, day)
+
+    return today > given
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/deprecation.py b/venv/Lib/site-packages/pip/_internal/utils/deprecation.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/deprecation.py
rename to venv/Lib/site-packages/pip/_internal/utils/deprecation.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/direct_url_helpers.py b/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/direct_url_helpers.py
rename to venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/distutils_args.py b/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/distutils_args.py
rename to venv/Lib/site-packages/pip/_internal/utils/distutils_args.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/encoding.py b/venv/Lib/site-packages/pip/_internal/utils/encoding.py
similarity index 86%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/encoding.py
rename to venv/Lib/site-packages/pip/_internal/utils/encoding.py
index ab4d4b9..5b83d61 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/encoding.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/encoding.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 import codecs
 import locale
 import re
@@ -35,7 +32,9 @@ def auto_decode(data):
     # Lets check the first two lines as in PEP263
     for line in data.split(b'\n')[:2]:
         if line[0:1] == b'#' and ENCODING_RE.search(line):
-            encoding = ENCODING_RE.search(line).groups()[0].decode('ascii')
+            result = ENCODING_RE.search(line)
+            assert result is not None
+            encoding = result.groups()[0].decode('ascii')
             return data.decode(encoding)
     return data.decode(
         locale.getpreferredencoding(False) or sys.getdefaultencoding(),
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/entrypoints.py b/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/entrypoints.py
rename to venv/Lib/site-packages/pip/_internal/utils/entrypoints.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py b/venv/Lib/site-packages/pip/_internal/utils/filesystem.py
similarity index 84%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py
rename to venv/Lib/site-packages/pip/_internal/utils/filesystem.py
index 85010ac..303243f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/filesystem.py
@@ -3,6 +3,8 @@ import fnmatch
 import os
 import os.path
 import random
+import shutil
+import stat
 import sys
 from contextlib import contextmanager
 from tempfile import NamedTemporaryFile
@@ -54,6 +56,36 @@ def check_path_owner(path):
     return False  # assume we don't own the path
 
 
+def copy2_fixed(src, dest):
+    # type: (str, str) -> None
+    """Wrap shutil.copy2() but map errors copying socket files to
+    SpecialFileError as expected.
+
+    See also https://bugs.python.org/issue37700.
+    """
+    try:
+        shutil.copy2(src, dest)
+    except (OSError, IOError):
+        for f in [src, dest]:
+            try:
+                is_socket_file = is_socket(f)
+            except OSError:
+                # An error has already occurred. Another error here is not
+                # a problem and we can ignore it.
+                pass
+            else:
+                if is_socket_file:
+                    raise shutil.SpecialFileError(
+                        "`{f}` is a socket".format(**locals()))
+
+        raise
+
+
+def is_socket(path):
+    # type: (str) -> bool
+    return stat.S_ISSOCK(os.lstat(path).st_mode)
+
+
 @contextmanager
 def adjacent_tmp_file(path, **kwargs):
     # type: (str, **Any) -> Iterator[NamedTemporaryFileResult]
@@ -123,7 +155,7 @@ def _test_writable_dir_win(path):
     # and we can't use tempfile: http://bugs.python.org/issue22107
     basename = 'accesstest_deleteme_fishfingers_custard_'
     alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789'
-    for i in range(10):
+    for _ in range(10):
         name = basename + ''.join(random.choice(alphabet) for _ in range(6))
         file = os.path.join(path, name)
         try:
@@ -138,6 +170,8 @@ def _test_writable_dir_win(path):
                 # This could be because there's a directory with the same name.
                 # But it's highly unlikely there's a directory called that,
                 # so we'll assume it's because the parent dir is not writable.
+                # This could as well be because the parent dir is not readable,
+                # due to non-privileged user access.
                 return False
             raise
         else:
@@ -156,7 +190,7 @@ def find_files(path, pattern):
     """Returns a list of absolute paths of files beneath path, recursively,
     with filenames which match the UNIX-style shell glob pattern."""
     result = []  # type: List[str]
-    for root, dirs, files in os.walk(path):
+    for root, _, files in os.walk(path):
         matches = fnmatch.filter(files, pattern)
         result.extend(os.path.join(root, f) for f in matches)
     return result
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/filetypes.py b/venv/Lib/site-packages/pip/_internal/utils/filetypes.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/filetypes.py
rename to venv/Lib/site-packages/pip/_internal/utils/filetypes.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/glibc.py b/venv/Lib/site-packages/pip/_internal/utils/glibc.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/glibc.py
rename to venv/Lib/site-packages/pip/_internal/utils/glibc.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/hashes.py b/venv/Lib/site-packages/pip/_internal/utils/hashes.py
similarity index 91%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/hashes.py
rename to venv/Lib/site-packages/pip/_internal/utils/hashes.py
index 396cf82..d1b062f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/hashes.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/hashes.py
@@ -46,6 +46,18 @@ class Hashes(object):
         """
         self._allowed = {} if hashes is None else hashes
 
+    def __or__(self, other):
+        # type: (Hashes) -> Hashes
+        if not isinstance(other, Hashes):
+            return NotImplemented
+        new = self._allowed.copy()
+        for alg, values in iteritems(other._allowed):
+            try:
+                new[alg] += values
+            except KeyError:
+                new[alg] = values
+        return Hashes(new)
+
     @property
     def digest_count(self):
         # type: () -> int
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/inject_securetransport.py b/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/inject_securetransport.py
rename to venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/logging.py b/venv/Lib/site-packages/pip/_internal/utils/logging.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/logging.py
rename to venv/Lib/site-packages/pip/_internal/utils/logging.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/misc.py b/venv/Lib/site-packages/pip/_internal/utils/misc.py
similarity index 89%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/misc.py
rename to venv/Lib/site-packages/pip/_internal/utils/misc.py
index 0903182..5629c60 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/misc.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/misc.py
@@ -16,13 +16,15 @@ import shutil
 import stat
 import sys
 from collections import deque
+from itertools import tee
 
 from pip._vendor import pkg_resources
+from pip._vendor.packaging.utils import canonicalize_name
 # NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is
 #       why we ignore the type on this import.
 from pip._vendor.retrying import retry  # type: ignore
 from pip._vendor.six import PY2, text_type
-from pip._vendor.six.moves import input, map, zip_longest
+from pip._vendor.six.moves import filter, filterfalse, input, map, zip_longest
 from pip._vendor.six.moves.urllib import parse as urllib_parse
 from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote
 
@@ -52,12 +54,13 @@ else:
 
 if MYPY_CHECK_RUNNING:
     from typing import (
-        Any, AnyStr, Container, Iterable, Iterator, List, Optional, Text,
-        Tuple, Union,
+        Any, AnyStr, Callable, Container, Iterable, Iterator, List, Optional,
+        Text, Tuple, TypeVar, Union,
     )
     from pip._vendor.pkg_resources import Distribution
 
     VersionInfo = Tuple[int, int, int]
+    T = TypeVar("T")
 
 
 __all__ = ['rmtree', 'display_path', 'backup_dir',
@@ -131,7 +134,7 @@ def get_prog():
 # Retry every half second for up to 3 seconds
 @retry(stop_max_delay=3000, wait_fixed=500)
 def rmtree(dir, ignore_errors=False):
-    # type: (str, bool) -> None
+    # type: (Text, bool) -> None
     shutil.rmtree(dir, ignore_errors=ignore_errors,
                   onerror=rmtree_errorhandler)
 
@@ -480,6 +483,57 @@ def get_installed_distributions(
             ]
 
 
+def _search_distribution(req_name):
+    # type: (str) -> Optional[Distribution]
+    """Find a distribution matching the ``req_name`` in the environment.
+
+    This searches from *all* distributions available in the environment, to
+    match the behavior of ``pkg_resources.get_distribution()``.
+    """
+    # Canonicalize the name before searching in the list of
+    # installed distributions and also while creating the package
+    # dictionary to get the Distribution object
+    req_name = canonicalize_name(req_name)
+    packages = get_installed_distributions(
+        local_only=False,
+        skip=(),
+        include_editables=True,
+        editables_only=False,
+        user_only=False,
+        paths=None,
+    )
+    pkg_dict = {canonicalize_name(p.key): p for p in packages}
+    return pkg_dict.get(req_name)
+
+
+def get_distribution(req_name):
+    # type: (str) -> Optional[Distribution]
+    """Given a requirement name, return the installed Distribution object.
+
+    This searches from *all* distributions available in the environment, to
+    match the behavior of ``pkg_resources.get_distribution()``.
+    """
+
+    # Search the distribution by looking through the working set
+    dist = _search_distribution(req_name)
+
+    # If distribution could not be found, call working_set.require
+    # to update the working set, and try to find the distribution
+    # again.
+    # This might happen for e.g. when you install a package
+    # twice, once using setup.py develop and again using setup.py install.
+    # Now when run pip uninstall twice, the package gets removed
+    # from the working set in the first uninstall, so we have to populate
+    # the working set again so that pip knows about it and the packages
+    # gets picked up and is successfully uninstalled the second time too.
+    if not dist:
+        try:
+            pkg_resources.working_set.require(req_name)
+        except pkg_resources.DistributionNotFound:
+            return None
+    return _search_distribution(req_name)
+
+
 def egg_link_path(dist):
     # type: (Distribution) -> Optional[str]
     """
@@ -533,7 +587,7 @@ def dist_location(dist):
 
 
 def write_output(msg, *args):
-    # type: (str, str) -> None
+    # type: (Any, Any) -> None
     logger.info(msg, *args)
 
 
@@ -541,14 +595,11 @@ class FakeFile(object):
     """Wrap a list of lines in an object with readline() to make
     ConfigParser happy."""
     def __init__(self, lines):
-        self._gen = (l for l in lines)
+        self._gen = iter(lines)
 
     def readline(self):
         try:
-            try:
-                return next(self._gen)
-            except NameError:
-                return self._gen.next()
+            return next(self._gen)
         except StopIteration:
             return ''
 
@@ -603,26 +654,6 @@ def captured_stderr():
     return captured_output('stderr')
 
 
-class cached_property(object):
-    """A property that is only computed once per instance and then replaces
-       itself with an ordinary attribute. Deleting the attribute resets the
-       property.
-
-       Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175
-    """
-
-    def __init__(self, func):
-        self.__doc__ = getattr(func, '__doc__')
-        self.func = func
-
-    def __get__(self, obj, cls):
-        if obj is None:
-            # We're being accessed from the class itself, not from an object
-            return self
-        value = obj.__dict__[self.func.__name__] = self.func(obj)
-        return value
-
-
 def get_installed_version(dist_name, working_set=None):
     """Get the installed version of dist_name avoiding pkg_resources cache"""
     # Create a requirement that we'll look for inside of setuptools.
@@ -876,7 +907,7 @@ def is_console_interactive():
 
 
 def hash_file(path, blocksize=1 << 20):
-    # type: (str, int) -> Tuple[Any, int]
+    # type: (Text, int) -> Tuple[Any, int]
     """Return (hash, length) for path using hashlib.sha256()
     """
 
@@ -911,3 +942,18 @@ def pairwise(iterable):
     """
     iterable = iter(iterable)
     return zip_longest(iterable, iterable)
+
+
+def partition(
+    pred,  # type: Callable[[T], bool]
+    iterable,  # type: Iterable[T]
+):
+    # type: (...) -> Tuple[Iterable[T], Iterable[T]]
+    """
+    Use a predicate to partition entries into false entries and true entries,
+    like
+
+        partition(is_odd, range(10)) --> 0 2 4 6 8   and  1 3 5 7 9
+    """
+    t1, t2 = tee(iterable)
+    return filterfalse(pred, t1), filter(pred, t2)
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/models.py b/venv/Lib/site-packages/pip/_internal/utils/models.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/models.py
rename to venv/Lib/site-packages/pip/_internal/utils/models.py
index 29e1441..d1c2f22 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/models.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/models.py
@@ -10,6 +10,8 @@ class KeyBasedCompareMixin(object):
     """Provides comparison capabilities that is based on a key
     """
 
+    __slots__ = ['_compare_key', '_defining_class']
+
     def __init__(self, key, defining_class):
         self._compare_key = key
         self._defining_class = defining_class
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/packaging.py b/venv/Lib/site-packages/pip/_internal/utils/packaging.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/packaging.py
rename to venv/Lib/site-packages/pip/_internal/utils/packaging.py
diff --git a/venv/Lib/site-packages/pip/_internal/utils/parallel.py b/venv/Lib/site-packages/pip/_internal/utils/parallel.py
new file mode 100644
index 0000000..9fe1fe8
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_internal/utils/parallel.py
@@ -0,0 +1,107 @@
+"""Convenient parallelization of higher order functions.
+
+This module provides two helper functions, with appropriate fallbacks on
+Python 2 and on systems lacking support for synchronization mechanisms:
+
+- map_multiprocess
+- map_multithread
+
+These helpers work like Python 3's map, with two differences:
+
+- They don't guarantee the order of processing of
+  the elements of the iterable.
+- The underlying process/thread pools chop the iterable into
+  a number of chunks, so that for very long iterables using
+  a large value for chunksize can make the job complete much faster
+  than using the default value of 1.
+"""
+
+__all__ = ['map_multiprocess', 'map_multithread']
+
+from contextlib import contextmanager
+from multiprocessing import Pool as ProcessPool
+from multiprocessing.dummy import Pool as ThreadPool
+
+from pip._vendor.requests.adapters import DEFAULT_POOLSIZE
+from pip._vendor.six import PY2
+from pip._vendor.six.moves import map
+
+from pip._internal.utils.typing import MYPY_CHECK_RUNNING
+
+if MYPY_CHECK_RUNNING:
+    from typing import Callable, Iterable, Iterator, Union, TypeVar
+    from multiprocessing import pool
+
+    Pool = Union[pool.Pool, pool.ThreadPool]
+    S = TypeVar('S')
+    T = TypeVar('T')
+
+# On platforms without sem_open, multiprocessing[.dummy] Pool
+# cannot be created.
+try:
+    import multiprocessing.synchronize  # noqa
+except ImportError:
+    LACK_SEM_OPEN = True
+else:
+    LACK_SEM_OPEN = False
+
+# Incredibly large timeout to work around bpo-8296 on Python 2.
+TIMEOUT = 2000000
+
+
+@contextmanager
+def closing(pool):
+    # type: (Pool) -> Iterator[Pool]
+    """Return a context manager making sure the pool closes properly."""
+    try:
+        yield pool
+    finally:
+        # For Pool.imap*, close and join are needed
+        # for the returned iterator to begin yielding.
+        pool.close()
+        pool.join()
+        pool.terminate()
+
+
+def _map_fallback(func, iterable, chunksize=1):
+    # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T]
+    """Make an iterator applying func to each element in iterable.
+
+    This function is the sequential fallback either on Python 2
+    where Pool.imap* doesn't react to KeyboardInterrupt
+    or when sem_open is unavailable.
+    """
+    return map(func, iterable)
+
+
+def _map_multiprocess(func, iterable, chunksize=1):
+    # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T]
+    """Chop iterable into chunks and submit them to a process pool.
+
+    For very long iterables using a large value for chunksize can make
+    the job complete much faster than using the default value of 1.
+
+    Return an unordered iterator of the results.
+    """
+    with closing(ProcessPool()) as pool:
+        return pool.imap_unordered(func, iterable, chunksize)
+
+
+def _map_multithread(func, iterable, chunksize=1):
+    # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T]
+    """Chop iterable into chunks and submit them to a thread pool.
+
+    For very long iterables using a large value for chunksize can make
+    the job complete much faster than using the default value of 1.
+
+    Return an unordered iterator of the results.
+    """
+    with closing(ThreadPool(DEFAULT_POOLSIZE)) as pool:
+        return pool.imap_unordered(func, iterable, chunksize)
+
+
+if LACK_SEM_OPEN or PY2:
+    map_multiprocess = map_multithread = _map_fallback
+else:
+    map_multiprocess = _map_multiprocess
+    map_multithread = _map_multithread
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/pkg_resources.py b/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/pkg_resources.py
rename to venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/setuptools_build.py b/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/setuptools_build.py
rename to venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/subprocess.py b/venv/Lib/site-packages/pip/_internal/utils/subprocess.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/subprocess.py
rename to venv/Lib/site-packages/pip/_internal/utils/subprocess.py
index 55c82da..d398e68 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/subprocess.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/subprocess.py
@@ -1,6 +1,3 @@
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 from __future__ import absolute_import
 
 import logging
@@ -188,6 +185,8 @@ def call_subprocess(
             stderr=subprocess.STDOUT, stdin=subprocess.PIPE,
             stdout=subprocess.PIPE, cwd=cwd, env=env,
         )
+        assert proc.stdin
+        assert proc.stdout
         proc.stdin.close()
     except Exception as exc:
         if log_failed_cmd:
@@ -208,6 +207,7 @@ def call_subprocess(
         log_subprocess(line)
         # Update the spinner.
         if use_spinner:
+            assert spinner
             spinner.spin()
     try:
         proc.wait()
@@ -218,6 +218,7 @@ def call_subprocess(
         proc.returncode and proc.returncode not in extra_ok_returncodes
     )
     if use_spinner:
+        assert spinner
         if proc_had_error:
             spinner.finish("error")
         else:
@@ -241,8 +242,10 @@ def call_subprocess(
             raise InstallationError(exc_msg)
         elif on_returncode == 'warn':
             subprocess_logger.warning(
-                'Command "{}" had error code {} in {}'.format(
-                    command_desc, proc.returncode, cwd)
+                'Command "%s" had error code %s in %s',
+                command_desc,
+                proc.returncode,
+                cwd,
             )
         elif on_returncode == 'ignore':
             pass
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py b/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py
rename to venv/Lib/site-packages/pip/_internal/utils/temp_dir.py
index 201ba6d..03aa828 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py
@@ -8,6 +8,7 @@ import tempfile
 from contextlib import contextmanager
 
 from pip._vendor.contextlib2 import ExitStack
+from pip._vendor.six import ensure_text
 
 from pip._internal.utils.misc import enum, rmtree
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
@@ -184,7 +185,7 @@ class TempDirectory(object):
         path = os.path.realpath(
             tempfile.mkdtemp(prefix="pip-{}-".format(kind))
         )
-        logger.debug("Created temporary directory: {}".format(path))
+        logger.debug("Created temporary directory: %s", path)
         return path
 
     def cleanup(self):
@@ -193,7 +194,9 @@ class TempDirectory(object):
         """
         self._deleted = True
         if os.path.exists(self._path):
-            rmtree(self._path)
+            # Make sure to pass unicode on Python 2 to make the contents also
+            # use unicode, ensuring non-ASCII names and can be represented.
+            rmtree(ensure_text(self._path))
 
 
 class AdjacentTempDirectory(TempDirectory):
@@ -267,5 +270,5 @@ class AdjacentTempDirectory(TempDirectory):
                 tempfile.mkdtemp(prefix="pip-{}-".format(kind))
             )
 
-        logger.debug("Created temporary directory: {}".format(path))
+        logger.debug("Created temporary directory: %s", path)
         return path
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/typing.py b/venv/Lib/site-packages/pip/_internal/utils/typing.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/typing.py
rename to venv/Lib/site-packages/pip/_internal/utils/typing.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/unpacking.py b/venv/Lib/site-packages/pip/_internal/utils/unpacking.py
similarity index 91%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/unpacking.py
rename to venv/Lib/site-packages/pip/_internal/utils/unpacking.py
index 7252dc2..620f31e 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/unpacking.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/unpacking.py
@@ -1,10 +1,6 @@
 """Utilities related archives.
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-# mypy: disallow-untyped-defs=False
-
 from __future__ import absolute_import
 
 import logging
@@ -26,6 +22,7 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 
 if MYPY_CHECK_RUNNING:
     from typing import Iterable, List, Optional, Text, Union
+    from zipfile import ZipInfo
 
 
 logger = logging.getLogger(__name__)
@@ -48,6 +45,7 @@ except ImportError:
 
 
 def current_umask():
+    # type: () -> int
     """Get the current umask which involves having to set it temporarily."""
     mask = os.umask(0)
     os.umask(mask)
@@ -98,6 +96,23 @@ def is_within_directory(directory, target):
     return prefix == abs_directory
 
 
+def set_extracted_file_to_default_mode_plus_executable(path):
+    # type: (Union[str, Text]) -> None
+    """
+    Make file present at path have execute for user/group/world
+    (chmod +x) is no-op on windows per python docs
+    """
+    os.chmod(path, (0o777 & ~current_umask() | 0o111))
+
+
+def zip_item_is_executable(info):
+    # type: (ZipInfo) -> bool
+    mode = info.external_attr >> 16
+    # if mode and regular file and any execute permissions for
+    # user/group/world?
+    return bool(mode and stat.S_ISREG(mode) and mode & 0o111)
+
+
 def unzip_file(filename, location, flatten=True):
     # type: (str, str, bool) -> None
     """
@@ -139,13 +154,8 @@ def unzip_file(filename, location, flatten=True):
                         shutil.copyfileobj(fp, destfp)
                 finally:
                     fp.close()
-                    mode = info.external_attr >> 16
-                    # if mode and regular file and any execute permissions for
-                    # user/group/world?
-                    if mode and stat.S_ISREG(mode) and mode & 0o111:
-                        # make dest file have execute for user/group/world
-                        # (chmod +x) no-op on windows per python docs
-                        os.chmod(fn, (0o777 - current_umask() | 0o111))
+                    if zip_item_is_executable(info):
+                        set_extracted_file_to_default_mode_plus_executable(fn)
     finally:
         zipfp.close()
 
@@ -219,6 +229,7 @@ def untar_file(filename, location):
                     )
                     continue
                 ensure_dir(os.path.dirname(path))
+                assert fp is not None
                 with open(path, 'wb') as destfp:
                     shutil.copyfileobj(fp, destfp)
                 fp.close()
@@ -227,9 +238,7 @@ def untar_file(filename, location):
                 tar.utime(member, path)  # type: ignore
                 # member have any execute permissions for user/group/world?
                 if member.mode & 0o111:
-                    # make dest file have execute for user/group/world
-                    # no-op on windows per python docs
-                    os.chmod(path, (0o777 - current_umask() | 0o111))
+                    set_extracted_file_to_default_mode_plus_executable(path)
     finally:
         tar.close()
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/urls.py b/venv/Lib/site-packages/pip/_internal/utils/urls.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/urls.py
rename to venv/Lib/site-packages/pip/_internal/utils/urls.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py b/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py
similarity index 94%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py
rename to venv/Lib/site-packages/pip/_internal/utils/virtualenv.py
index 596a69a..4a78128 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py
@@ -1,5 +1,6 @@
 from __future__ import absolute_import
 
+import io
 import logging
 import os
 import re
@@ -51,7 +52,9 @@ def _get_pyvenv_cfg_lines():
     """
     pyvenv_cfg_file = os.path.join(sys.prefix, 'pyvenv.cfg')
     try:
-        with open(pyvenv_cfg_file) as f:
+        # Although PEP 405 does not specify, the built-in venv module always
+        # writes with UTF-8. (pypa/pip#8717)
+        with io.open(pyvenv_cfg_file, encoding='utf-8') as f:
             return f.read().splitlines()  # avoids trailing newlines
     except IOError:
         return None
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/utils/wheel.py b/venv/Lib/site-packages/pip/_internal/utils/wheel.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_internal/utils/wheel.py
rename to venv/Lib/site-packages/pip/_internal/utils/wheel.py
index 3ebb771..9ce371c 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/utils/wheel.py
+++ b/venv/Lib/site-packages/pip/_internal/utils/wheel.py
@@ -121,7 +121,7 @@ def wheel_dist_info_dir(source, name):
     it doesn't match the provided name.
     """
     # Zip file path separators must be /
-    subdirs = list(set(p.split("/")[0] for p in source.namelist()))
+    subdirs = set(p.split("/", 1)[0] for p in source.namelist())
 
     info_dirs = [s for s in subdirs if s.endswith('.dist-info')]
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/vcs/__init__.py b/venv/Lib/site-packages/pip/_internal/vcs/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_internal/vcs/__init__.py
rename to venv/Lib/site-packages/pip/_internal/vcs/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py b/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py
rename to venv/Lib/site-packages/pip/_internal/vcs/bazaar.py
index 347c06f..94408c5 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py
+++ b/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py
@@ -54,8 +54,7 @@ class Bazaar(VersionControl):
 
         url, rev_options = self.get_url_rev_options(url)
         self.run_command(
-            make_command('export', location, url, rev_options.to_args()),
-            show_stdout=False,
+            make_command('export', location, url, rev_options.to_args())
         )
 
     def fetch_new(self, dest, url, rev_options):
@@ -92,7 +91,7 @@ class Bazaar(VersionControl):
 
     @classmethod
     def get_remote_url(cls, location):
-        urls = cls.run_command(['info'], show_stdout=False, cwd=location)
+        urls = cls.run_command(['info'], cwd=location)
         for line in urls.splitlines():
             line = line.strip()
             for x in ('checkout of branch: ',
@@ -107,7 +106,7 @@ class Bazaar(VersionControl):
     @classmethod
     def get_revision(cls, location):
         revision = cls.run_command(
-            ['revno'], show_stdout=False, cwd=location,
+            ['revno'], cwd=location,
         )
         return revision.splitlines()[-1]
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/vcs/git.py b/venv/Lib/site-packages/pip/_internal/vcs/git.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_internal/vcs/git.py
rename to venv/Lib/site-packages/pip/_internal/vcs/git.py
index e173ec8..a9c7fb6 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/vcs/git.py
+++ b/venv/Lib/site-packages/pip/_internal/vcs/git.py
@@ -11,7 +11,7 @@ from pip._vendor.packaging.version import parse as parse_version
 from pip._vendor.six.moves.urllib import parse as urllib_parse
 from pip._vendor.six.moves.urllib import request as urllib_request
 
-from pip._internal.exceptions import BadCommand, InstallationError
+from pip._internal.exceptions import BadCommand, SubProcessError
 from pip._internal.utils.misc import display_path, hide_url
 from pip._internal.utils.subprocess import make_command
 from pip._internal.utils.temp_dir import TempDirectory
@@ -78,7 +78,7 @@ class Git(VersionControl):
 
     def get_git_version(self):
         VERSION_PFX = 'git version '
-        version = self.run_command(['version'], show_stdout=False)
+        version = self.run_command(['version'])
         if version.startswith(VERSION_PFX):
             version = version[len(VERSION_PFX):].split()[0]
         else:
@@ -101,7 +101,7 @@ class Git(VersionControl):
         # and to suppress the message to stderr.
         args = ['symbolic-ref', '-q', 'HEAD']
         output = cls.run_command(
-            args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location,
+            args, extra_ok_returncodes=(1, ), cwd=location,
         )
         ref = output.strip()
 
@@ -120,7 +120,7 @@ class Git(VersionControl):
             self.unpack(temp_dir.path, url=url)
             self.run_command(
                 ['checkout-index', '-a', '-f', '--prefix', location],
-                show_stdout=False, cwd=temp_dir.path
+                cwd=temp_dir.path
             )
 
     @classmethod
@@ -134,8 +134,13 @@ class Git(VersionControl):
           rev: the revision name.
         """
         # Pass rev to pre-filter the list.
-        output = cls.run_command(['show-ref', rev], cwd=dest,
-                                 show_stdout=False, on_returncode='ignore')
+
+        output = ''
+        try:
+            output = cls.run_command(['show-ref', rev], cwd=dest)
+        except SubProcessError:
+            pass
+
         refs = {}
         for line in output.strip().splitlines():
             try:
@@ -286,7 +291,7 @@ class Git(VersionControl):
         # exits with return code 1 if there are no matching lines.
         stdout = cls.run_command(
             ['config', '--get-regexp', r'remote\..*\.url'],
-            extra_ok_returncodes=(1, ), show_stdout=False, cwd=location,
+            extra_ok_returncodes=(1, ), cwd=location,
         )
         remotes = stdout.splitlines()
         try:
@@ -306,7 +311,7 @@ class Git(VersionControl):
         if rev is None:
             rev = 'HEAD'
         current_rev = cls.run_command(
-            ['rev-parse', rev], show_stdout=False, cwd=location,
+            ['rev-parse', rev], cwd=location,
         )
         return current_rev.strip()
 
@@ -319,7 +324,7 @@ class Git(VersionControl):
         # find the repo root
         git_dir = cls.run_command(
             ['rev-parse', '--git-dir'],
-            show_stdout=False, cwd=location).strip()
+            cwd=location).strip()
         if not os.path.isabs(git_dir):
             git_dir = os.path.join(location, git_dir)
         repo_root = os.path.abspath(os.path.join(git_dir, '..'))
@@ -378,15 +383,13 @@ class Git(VersionControl):
             r = cls.run_command(
                 ['rev-parse', '--show-toplevel'],
                 cwd=location,
-                show_stdout=False,
-                on_returncode='raise',
                 log_failed_cmd=False,
             )
         except BadCommand:
             logger.debug("could not determine if %s is under git control "
                          "because git is not available", location)
             return None
-        except InstallationError:
+        except SubProcessError:
             return None
         return os.path.normpath(r.rstrip('\r\n'))
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py b/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py
similarity index 90%
rename from venv/lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py
rename to venv/Lib/site-packages/pip/_internal/vcs/mercurial.py
index 75e903c..69763fe 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py
+++ b/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py
@@ -8,7 +8,7 @@ import os
 
 from pip._vendor.six.moves import configparser
 
-from pip._internal.exceptions import BadCommand, InstallationError
+from pip._internal.exceptions import BadCommand, SubProcessError
 from pip._internal.utils.misc import display_path
 from pip._internal.utils.subprocess import make_command
 from pip._internal.utils.temp_dir import TempDirectory
@@ -47,7 +47,7 @@ class Mercurial(VersionControl):
             self.unpack(temp_dir.path, url=url)
 
             self.run_command(
-                ['archive', location], show_stdout=False, cwd=temp_dir.path
+                ['archive', location], cwd=temp_dir.path
             )
 
     def fetch_new(self, dest, url, rev_options):
@@ -92,7 +92,7 @@ class Mercurial(VersionControl):
     def get_remote_url(cls, location):
         url = cls.run_command(
             ['showconfig', 'paths.default'],
-            show_stdout=False, cwd=location).strip()
+            cwd=location).strip()
         if cls._is_local_repository(url):
             url = path_to_url(url)
         return url.strip()
@@ -103,8 +103,7 @@ class Mercurial(VersionControl):
         Return the repository-local changeset revision number, as an integer.
         """
         current_revision = cls.run_command(
-            ['parents', '--template={rev}'],
-            show_stdout=False, cwd=location).strip()
+            ['parents', '--template={rev}'], cwd=location).strip()
         return current_revision
 
     @classmethod
@@ -115,7 +114,7 @@ class Mercurial(VersionControl):
         """
         current_rev_hash = cls.run_command(
             ['parents', '--template={node}'],
-            show_stdout=False, cwd=location).strip()
+            cwd=location).strip()
         return current_rev_hash
 
     @classmethod
@@ -131,7 +130,7 @@ class Mercurial(VersionControl):
         """
         # find the repo root
         repo_root = cls.run_command(
-            ['root'], show_stdout=False, cwd=location).strip()
+            ['root'], cwd=location).strip()
         if not os.path.isabs(repo_root):
             repo_root = os.path.abspath(os.path.join(location, repo_root))
         return find_path_to_setup_from_repo_root(location, repo_root)
@@ -145,15 +144,13 @@ class Mercurial(VersionControl):
             r = cls.run_command(
                 ['root'],
                 cwd=location,
-                show_stdout=False,
-                on_returncode='raise',
                 log_failed_cmd=False,
             )
         except BadCommand:
             logger.debug("could not determine if %s is under hg control "
                          "because hg is not available", location)
             return None
-        except InstallationError:
+        except SubProcessError:
             return None
         return os.path.normpath(r.rstrip('\r\n'))
 
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/vcs/subversion.py b/venv/Lib/site-packages/pip/_internal/vcs/subversion.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_internal/vcs/subversion.py
rename to venv/Lib/site-packages/pip/_internal/vcs/subversion.py
index 0ec6597..ab13497 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/vcs/subversion.py
+++ b/venv/Lib/site-packages/pip/_internal/vcs/subversion.py
@@ -56,7 +56,7 @@ class Subversion(VersionControl):
         # Note: taken from setuptools.command.egg_info
         revision = 0
 
-        for base, dirs, files in os.walk(location):
+        for base, dirs, _ in os.walk(location):
             if cls.dirname not in dirs:
                 dirs[:] = []
                 continue    # no sense walking uncontrolled subdirs
@@ -132,7 +132,7 @@ class Subversion(VersionControl):
 
     @classmethod
     def _get_svn_url_rev(cls, location):
-        from pip._internal.exceptions import InstallationError
+        from pip._internal.exceptions import SubProcessError
 
         entries_path = os.path.join(location, cls.dirname, 'entries')
         if os.path.exists(entries_path):
@@ -165,13 +165,12 @@ class Subversion(VersionControl):
                 # are only potentially needed for remote server requests.
                 xml = cls.run_command(
                     ['info', '--xml', location],
-                    show_stdout=False,
                 )
                 url = _svn_info_xml_url_re.search(xml).group(1)
                 revs = [
                     int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)
                 ]
-            except InstallationError:
+            except SubProcessError:
                 url, revs = None, []
 
         if revs:
@@ -214,13 +213,16 @@ class Subversion(VersionControl):
         #      compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0
         #   svn, version 1.7.14 (r1542130)
         #      compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu
+        #   svn, version 1.12.0-SlikSvn (SlikSvn/1.12.0)
+        #      compiled May 28 2019, 13:44:56 on x86_64-microsoft-windows6.2
         version_prefix = 'svn, version '
-        version = self.run_command(['--version'], show_stdout=False)
+        version = self.run_command(['--version'])
+
         if not version.startswith(version_prefix):
             return ()
 
         version = version[len(version_prefix):].split()[0]
-        version_list = version.split('.')
+        version_list = version.partition('-')[0].split('.')
         try:
             parsed_version = tuple(map(int, version_list))
         except ValueError:
@@ -297,7 +299,7 @@ class Subversion(VersionControl):
                 'export', self.get_remote_call_options(),
                 rev_options.to_args(), url, location,
             )
-            self.run_command(cmd_args, show_stdout=False)
+            self.run_command(cmd_args)
 
     def fetch_new(self, dest, url, rev_options):
         # type: (str, HiddenText, RevOptions) -> None
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py b/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py
similarity index 87%
rename from venv/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py
rename to venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py
index 71b4650..96f830f 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py
+++ b/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py
@@ -6,13 +6,19 @@ import errno
 import logging
 import os
 import shutil
+import subprocess
 import sys
 
 from pip._vendor import pkg_resources
 from pip._vendor.six.moves.urllib import parse as urllib_parse
 
-from pip._internal.exceptions import BadCommand, InstallationError
-from pip._internal.utils.compat import samefile
+from pip._internal.exceptions import (
+    BadCommand,
+    InstallationError,
+    SubProcessError,
+)
+from pip._internal.utils.compat import console_to_str, samefile
+from pip._internal.utils.logging import subprocess_logger
 from pip._internal.utils.misc import (
     ask_path_exists,
     backup_dir,
@@ -21,16 +27,20 @@ from pip._internal.utils.misc import (
     hide_value,
     rmtree,
 )
-from pip._internal.utils.subprocess import call_subprocess, make_command
+from pip._internal.utils.subprocess import (
+    format_command_args,
+    make_command,
+    make_subprocess_output_error,
+    reveal_command_args,
+)
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
 from pip._internal.utils.urls import get_url_scheme
 
 if MYPY_CHECK_RUNNING:
     from typing import (
-        Any, Dict, Iterable, Iterator, List, Mapping, Optional, Text, Tuple,
-        Type, Union
+        Dict, Iterable, Iterator, List, Optional, Text, Tuple,
+        Type, Union, Mapping, Any
     )
-    from pip._internal.cli.spinners import SpinnerInterface
     from pip._internal.utils.misc import HiddenText
     from pip._internal.utils.subprocess import CommandArgs
 
@@ -71,6 +81,92 @@ def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None):
     return req
 
 
+def call_subprocess(
+    cmd,  # type: Union[List[str], CommandArgs]
+    cwd=None,  # type: Optional[str]
+    extra_environ=None,  # type: Optional[Mapping[str, Any]]
+    extra_ok_returncodes=None,  # type: Optional[Iterable[int]]
+    log_failed_cmd=True  # type: Optional[bool]
+):
+    # type: (...) -> Text
+    """
+    Args:
+      extra_ok_returncodes: an iterable of integer return codes that are
+        acceptable, in addition to 0. Defaults to None, which means [].
+      log_failed_cmd: if false, failed commands are not logged,
+        only raised.
+    """
+    if extra_ok_returncodes is None:
+        extra_ok_returncodes = []
+
+    # log the subprocess output at DEBUG level.
+    log_subprocess = subprocess_logger.debug
+
+    env = os.environ.copy()
+    if extra_environ:
+        env.update(extra_environ)
+
+    # Whether the subprocess will be visible in the console.
+    showing_subprocess = True
+
+    command_desc = format_command_args(cmd)
+    try:
+        proc = subprocess.Popen(
+            # Convert HiddenText objects to the underlying str.
+            reveal_command_args(cmd),
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+            cwd=cwd
+        )
+        if proc.stdin:
+            proc.stdin.close()
+    except Exception as exc:
+        if log_failed_cmd:
+            subprocess_logger.critical(
+                "Error %s while executing command %s", exc, command_desc,
+            )
+        raise
+    all_output = []
+    while True:
+        # The "line" value is a unicode string in Python 2.
+        line = None
+        if proc.stdout:
+            line = console_to_str(proc.stdout.readline())
+        if not line:
+            break
+        line = line.rstrip()
+        all_output.append(line + '\n')
+
+        # Show the line immediately.
+        log_subprocess(line)
+    try:
+        proc.wait()
+    finally:
+        if proc.stdout:
+            proc.stdout.close()
+
+    proc_had_error = (
+        proc.returncode and proc.returncode not in extra_ok_returncodes
+    )
+    if proc_had_error:
+        if not showing_subprocess and log_failed_cmd:
+            # Then the subprocess streams haven't been logged to the
+            # console yet.
+            msg = make_subprocess_output_error(
+                cmd_args=cmd,
+                cwd=cwd,
+                lines=all_output,
+                exit_status=proc.returncode,
+            )
+            subprocess_logger.error(msg)
+        exc_msg = (
+            'Command errored out with exit status {}: {} '
+            'Check the logs for full command output.'
+        ).format(proc.returncode, command_desc)
+        raise SubProcessError(exc_msg)
+    return ''.join(all_output)
+
+
 def find_path_to_setup_from_repo_root(location, repo_root):
     # type: (str, str) -> Optional[str]
     """
@@ -659,13 +755,9 @@ class VersionControl(object):
     def run_command(
         cls,
         cmd,  # type: Union[List[str], CommandArgs]
-        show_stdout=True,  # type: bool
         cwd=None,  # type: Optional[str]
-        on_returncode='raise',  # type: str
-        extra_ok_returncodes=None,  # type: Optional[Iterable[int]]
-        command_desc=None,  # type: Optional[str]
         extra_environ=None,  # type: Optional[Mapping[str, Any]]
-        spinner=None,  # type: Optional[SpinnerInterface]
+        extra_ok_returncodes=None,  # type: Optional[Iterable[int]]
         log_failed_cmd=True  # type: bool
     ):
         # type: (...) -> Text
@@ -676,13 +768,9 @@ class VersionControl(object):
         """
         cmd = make_command(cls.name, *cmd)
         try:
-            return call_subprocess(cmd, show_stdout, cwd,
-                                   on_returncode=on_returncode,
-                                   extra_ok_returncodes=extra_ok_returncodes,
-                                   command_desc=command_desc,
+            return call_subprocess(cmd, cwd,
                                    extra_environ=extra_environ,
-                                   unset_environ=cls.unset_environ,
-                                   spinner=spinner,
+                                   extra_ok_returncodes=extra_ok_returncodes,
                                    log_failed_cmd=log_failed_cmd)
         except OSError as e:
             # errno.ENOENT = no such file or directory
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/wheel_builder.py b/venv/Lib/site-packages/pip/_internal/wheel_builder.py
similarity index 92%
rename from venv/lib/python3.8/site-packages/pip/_internal/wheel_builder.py
rename to venv/Lib/site-packages/pip/_internal/wheel_builder.py
index 6d1022d..fa08016 100644
--- a/venv/lib/python3.8/site-packages/pip/_internal/wheel_builder.py
+++ b/venv/Lib/site-packages/pip/_internal/wheel_builder.py
@@ -1,9 +1,6 @@
 """Orchestrator for building wheels from InstallRequirements.
 """
 
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
 import logging
 import os.path
 import re
@@ -23,7 +20,7 @@ from pip._internal.vcs import vcs
 
 if MYPY_CHECK_RUNNING:
     from typing import (
-        Any, Callable, Iterable, List, Optional, Pattern, Tuple,
+        Any, Callable, Iterable, List, Optional, Tuple,
     )
 
     from pip._internal.cache import WheelCache
@@ -34,10 +31,11 @@ if MYPY_CHECK_RUNNING:
 
 logger = logging.getLogger(__name__)
 
+_egg_info_re = re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.IGNORECASE)
+
 
-def _contains_egg_info(
-        s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)):
-    # type: (str, Pattern[str]) -> bool
+def _contains_egg_info(s):
+    # type: (str) -> bool
     """Determine whether the string looks like an egg_info.
 
     :param s: The string to parse. E.g. foo-2.1
@@ -69,14 +67,6 @@ def _should_build(
     # From this point, this concerns the pip install command only
     # (need_wheel=False).
 
-    if not req.use_pep517 and not is_wheel_installed():
-        # we don't build legacy requirements if wheel is not installed
-        logger.info(
-            "Could not build wheels for %s, "
-            "since package 'wheel' is not installed.", req.name,
-        )
-        return False
-
     if req.editable or not req.source_dir:
         return False
 
@@ -87,6 +77,14 @@ def _should_build(
         )
         return False
 
+    if not req.use_pep517 and not is_wheel_installed():
+        # we don't build legacy requirements if wheel is not installed
+        logger.info(
+            "Using legacy 'setup.py install' for %s, "
+            "since package 'wheel' is not installed.", req.name,
+        )
+        return False
+
     return True
 
 
@@ -118,11 +116,8 @@ def _should_cache(
     wheel cache, assuming the wheel cache is available, and _should_build()
     has determined a wheel needs to be built.
     """
-    if not should_build_for_install_command(
-        req, check_binary_allowed=_always_true
-    ):
-        # never cache if pip install would not have built
-        # (editable mode, etc)
+    if req.editable or not req.source_dir:
+        # never cache editable requirements
         return False
 
     if req.link and req.link.is_vcs:
@@ -136,6 +131,7 @@ def _should_cache(
             return True
         return False
 
+    assert req.link
     base, ext = req.link.splitext()
     if _contains_egg_info(base):
         return True
@@ -153,6 +149,7 @@ def _get_cache_dir(
     wheel need to be stored.
     """
     cache_available = bool(wheel_cache.cache_dir)
+    assert req.link
     if cache_available and _should_cache(req):
         cache_dir = wheel_cache.get_path_for_link(req.link)
     else:
@@ -200,7 +197,9 @@ def _build_one_inside_env(
 ):
     # type: (...) -> Optional[str]
     with TempDirectory(kind="wheel") as temp_dir:
+        assert req.name
         if req.use_pep517:
+            assert req.metadata_directory
             wheel_path = build_wheel_pep517(
                 name=req.name,
                 backend=req.pep517_backend,
@@ -275,7 +274,7 @@ def build(
     # Build the wheels.
     logger.info(
         'Building wheels for collected packages: %s',
-        ', '.join(req.name for req in requirements),
+        ', '.join(req.name for req in requirements),  # type: ignore
     )
 
     with indent_log():
@@ -298,12 +297,12 @@ def build(
     if build_successes:
         logger.info(
             'Successfully built %s',
-            ' '.join([req.name for req in build_successes]),
+            ' '.join([req.name for req in build_successes]),  # type: ignore
         )
     if build_failures:
         logger.info(
             'Failed to build %s',
-            ' '.join([req.name for req in build_failures]),
+            ' '.join([req.name for req in build_failures]),  # type: ignore
         )
     # Return a list of requirements that failed to build
     return build_successes, build_failures
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/__init__.py b/venv/Lib/site-packages/pip/_vendor/__init__.py
similarity index 88%
rename from venv/lib/python3.8/site-packages/pip/_vendor/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/__init__.py
index c3db83f..581db54 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/__init__.py
@@ -32,15 +32,11 @@ def vendored(modulename):
     try:
         __import__(modulename, globals(), locals(), level=0)
     except ImportError:
-        # We can just silently allow import failures to pass here. If we
-        # got to this point it means that ``import pip._vendor.whatever``
-        # failed and so did ``import whatever``. Since we're importing this
-        # upfront in an attempt to alias imports, not erroring here will
-        # just mean we get a regular import error whenever pip *actually*
-        # tries to import one of these modules to use it, which actually
-        # gives us a better error message than we would have otherwise
-        # gotten.
-        pass
+        # This error used to be silenced in earlier variants of this file, to instead
+        # raise the error when pip actually tries to use the missing module. 
+        # Based on inputs in #5354, this was changed to explicitly raise the error.
+        # Re-raising the exception without modifying it is an intentional choice. 
+        raise
     else:
         sys.modules[vendored_name] = sys.modules[modulename]
         base, head = vendored_name.rsplit(".", 1)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/appdirs.py b/venv/Lib/site-packages/pip/_vendor/appdirs.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/appdirs.py
rename to venv/Lib/site-packages/pip/_vendor/appdirs.py
index 8bd9c9c..33a3b77 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/appdirs.py
+++ b/venv/Lib/site-packages/pip/_vendor/appdirs.py
@@ -13,8 +13,8 @@ See <http://github.com/ActiveState/appdirs> for details and usage.
 # - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html
 # - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
 
-__version_info__ = (1, 4, 3)
-__version__ = '.'.join(map(str, __version_info__))
+__version__ = "1.4.4"
+__version_info__ = tuple(int(segment) for segment in __version__.split("."))
 
 
 import sys
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__init__.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/_cmd.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/_cmd.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/adapter.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/adapter.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/cache.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/cache.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/compat.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/compat.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/controller.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/controller.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/filewrapper.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/heuristics.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/heuristics.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/serialize.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/serialize.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/wrapper.py b/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/cachecontrol/wrapper.py
rename to venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/certifi/__init__.py b/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py
similarity index 54%
rename from venv/lib/python3.8/site-packages/pip/_vendor/certifi/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/certifi/__init__.py
index 1e2dfac..5d52a62 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/certifi/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py
@@ -1,3 +1,3 @@
 from .core import contents, where
 
-__version__ = "2020.04.05.1"
+__version__ = "2020.06.20"
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/certifi/__main__.py b/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/certifi/__main__.py
rename to venv/Lib/site-packages/pip/_vendor/certifi/__main__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/certifi/cacert.pem b/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_vendor/certifi/cacert.pem
rename to venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem
index ece147c..0fd855f 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/certifi/cacert.pem
+++ b/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem
@@ -58,38 +58,6 @@ AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
 -----END CERTIFICATE-----
 
-# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
-# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
-# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
-# Serial: 206684696279472310254277870180966723415
-# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
-# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
-# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
-N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
-KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
-kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
-CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
-Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
-imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
-2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
-DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
-F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
-TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
-
 # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
 # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
 # Label: "Entrust.net Premium 2048 Secure Server CA"
@@ -152,39 +120,6 @@ ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
 R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
 -----END CERTIFICATE-----
 
-# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
-# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
-# Label: "AddTrust External Root"
-# Serial: 1
-# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
-# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
-# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
-IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
-MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
-bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
-dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
-H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
-uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
-mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
-a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
-E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
-WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
-VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
-Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
-IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
-AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
-YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
-Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
-c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
-mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
-
 # Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
 # Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
 # Label: "Entrust Root Certification Authority"
@@ -1499,47 +1434,6 @@ uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
 XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
 -----END CERTIFICATE-----
 
-# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
-# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
-# Label: "Staat der Nederlanden Root CA - G2"
-# Serial: 10000012
-# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
-# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
-# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
------BEGIN CERTIFICATE-----
-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
-DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
-ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
-b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
-qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
-uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
-Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
-pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
-5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
-UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
-GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
-5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
-6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
-eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
-B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
-BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
-L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
-SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
-CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
-5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
-IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
-gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
-+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
-vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
-bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
-N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
-Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
-ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
------END CERTIFICATE-----
-
 # Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
 # Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
 # Label: "Hongkong Post Root CA 1"
@@ -3788,47 +3682,6 @@ CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
 1KyLa2tJElMzrdfkviT8tQp21KW8EA==
 -----END CERTIFICATE-----
 
-# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
-# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
-# Label: "LuxTrust Global Root 2"
-# Serial: 59914338225734147123941058376788110305822489521
-# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c
-# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f
-# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5
------BEGIN CERTIFICATE-----
-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
------END CERTIFICATE-----
-
 # Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
 # Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
 # Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1"
@@ -4639,3 +4492,129 @@ IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk
 5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY
 n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw==
 -----END CERTIFICATE-----
+
+# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation
+# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation
+# Label: "Microsoft ECC Root Certificate Authority 2017"
+# Serial: 136839042543790627607696632466672567020
+# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67
+# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5
+# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02
+-----BEGIN CERTIFICATE-----
+MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw
+CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD
+VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw
+MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV
+UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy
+b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR
+ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb
+hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3
+FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV
+L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB
+iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation
+# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation
+# Label: "Microsoft RSA Root Certificate Authority 2017"
+# Serial: 40975477897264996090493496164228220339
+# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47
+# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74
+# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0
+-----BEGIN CERTIFICATE-----
+MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl
+MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
+NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
+IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG
+EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N
+aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ
+Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0
+ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1
+HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm
+gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ
+jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc
+aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG
+YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6
+W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K
+UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH
++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q
+W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC
+LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC
+gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6
+tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh
+SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2
+TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3
+pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR
+xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp
+GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9
+dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN
+AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB
+RA+GsCyRxj3qrg+E
+-----END CERTIFICATE-----
+
+# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd.
+# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd.
+# Label: "e-Szigno Root CA 2017"
+# Serial: 411379200276854331539784714
+# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98
+# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1
+# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99
+-----BEGIN CERTIFICATE-----
+MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV
+BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk
+LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv
+b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ
+BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg
+THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v
+IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv
+xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H
+Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB
+eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo
+jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ
++efcMQ==
+-----END CERTIFICATE-----
+
+# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2
+# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2
+# Label: "certSIGN Root CA G2"
+# Serial: 313609486401300475190
+# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7
+# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32
+# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05
+-----BEGIN CERTIFICATE-----
+MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV
+BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g
+Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ
+BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ
+R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF
+dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw
+vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ
+uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp
+n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs
+cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW
+xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P
+rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF
+DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx
+DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy
+LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C
+eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ
+d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq
+kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
+b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl
+qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0
+OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c
+NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk
+ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO
+pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj
+03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk
+PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE
+1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX
+QRBdJ3NghVdJIgc=
+-----END CERTIFICATE-----
diff --git a/venv/Lib/site-packages/pip/_vendor/certifi/core.py b/venv/Lib/site-packages/pip/_vendor/certifi/core.py
new file mode 100644
index 0000000..8987449
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_vendor/certifi/core.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+
+"""
+certifi.py
+~~~~~~~~~~
+
+This module returns the installation location of cacert.pem or its contents.
+"""
+import os
+
+try:
+    from importlib.resources import path as get_path, read_text
+
+    _CACERT_CTX = None
+    _CACERT_PATH = None
+
+    def where():
+        # This is slightly terrible, but we want to delay extracting the file
+        # in cases where we're inside of a zipimport situation until someone
+        # actually calls where(), but we don't want to re-extract the file
+        # on every call of where(), so we'll do it once then store it in a
+        # global variable.
+        global _CACERT_CTX
+        global _CACERT_PATH
+        if _CACERT_PATH is None:
+            # This is slightly janky, the importlib.resources API wants you to
+            # manage the cleanup of this file, so it doesn't actually return a
+            # path, it returns a context manager that will give you the path
+            # when you enter it and will do any cleanup when you leave it. In
+            # the common case of not needing a temporary file, it will just
+            # return the file system location and the __exit__() is a no-op.
+            #
+            # We also have to hold onto the actual context manager, because
+            # it will do the cleanup whenever it gets garbage collected, so
+            # we will also store that at the global level as well.
+            _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem")
+            _CACERT_PATH = str(_CACERT_CTX.__enter__())
+
+        return _CACERT_PATH
+
+
+except ImportError:
+    # This fallback will work for Python versions prior to 3.7 that lack the
+    # importlib.resources module but relies on the existing `where` function
+    # so won't address issues with environments like PyOxidizer that don't set
+    # __file__ on modules.
+    def read_text(_module, _path, encoding="ascii"):
+        with open(where(), "r", encoding=encoding) as data:
+            return data.read()
+
+    # If we don't have importlib.resources, then we will just do the old logic
+    # of assuming we're on the filesystem and munge the path directly.
+    def where():
+        f = os.path.dirname(__file__)
+
+        return os.path.join(f, "cacert.pem")
+
+
+def contents():
+    return read_text("certifi", "cacert.pem", encoding="ascii")
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/__init__.py b/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/big5freq.py b/venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/big5freq.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/big5prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/big5prober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/chardistribution.py b/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/chardistribution.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/charsetgroupprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/charsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/charsetprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/__init__.py b/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/chardetect.py b/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/cli/chardetect.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/codingstatemachine.py b/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/codingstatemachine.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/compat.py b/venv/Lib/site-packages/pip/_vendor/chardet/compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/compat.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/compat.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/cp949prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/cp949prober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/enums.py b/venv/Lib/site-packages/pip/_vendor/chardet/enums.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/enums.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/enums.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/escprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/escprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/escprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/escsm.py b/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/escsm.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/escsm.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/eucjpprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/eucjpprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/euckrfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/euckrfreq.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/euckrprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/euckrprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/euctwfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/euctwfreq.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/euctwprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/euctwprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/gb2312freq.py b/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/gb2312freq.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/gb2312prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/gb2312prober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/hebrewprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/hebrewprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/jisfreq.py b/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/jisfreq.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/jpcntx.py b/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/jpcntx.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/langcyrillicmodel.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langgreekmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/langgreekmodel.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/langhebrewmodel.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/langhungarianmodel.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langthaimodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/langthaimodel.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/langturkishmodel.py b/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/langturkishmodel.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/latin1prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/latin1prober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcharsetprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcssm.py b/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/mbcssm.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/sbcharsetprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/sjisprober.py b/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/sjisprober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/universaldetector.py b/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/universaldetector.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/utf8prober.py b/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/utf8prober.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/chardet/version.py b/venv/Lib/site-packages/pip/_vendor/chardet/version.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/chardet/version.py
rename to venv/Lib/site-packages/pip/_vendor/chardet/version.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/colorama/__init__.py b/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/colorama/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/colorama/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/colorama/ansi.py b/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/colorama/ansi.py
rename to venv/Lib/site-packages/pip/_vendor/colorama/ansi.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/colorama/ansitowin32.py b/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/colorama/ansitowin32.py
rename to venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/colorama/initialise.py b/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/colorama/initialise.py
rename to venv/Lib/site-packages/pip/_vendor/colorama/initialise.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/colorama/win32.py b/venv/Lib/site-packages/pip/_vendor/colorama/win32.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/colorama/win32.py
rename to venv/Lib/site-packages/pip/_vendor/colorama/win32.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/colorama/winterm.py b/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/colorama/winterm.py
rename to venv/Lib/site-packages/pip/_vendor/colorama/winterm.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/contextlib2.py b/venv/Lib/site-packages/pip/_vendor/contextlib2.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/contextlib2.py
rename to venv/Lib/site-packages/pip/_vendor/contextlib2.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__init__.py b/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/__init__.py
index e19aebd..63d916e 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py
@@ -6,7 +6,7 @@
 #
 import logging
 
-__version__ = '0.3.0'
+__version__ = '0.3.1'
 
 class DistlibException(Exception):
     pass
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/__init__.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/misc.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/misc.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/shutil.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/shutil.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py
index 159e49e..10ed362 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/shutil.py
+++ b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py
@@ -14,7 +14,10 @@ import sys
 import stat
 from os.path import abspath
 import fnmatch
-import collections
+try:
+    from collections.abc import Callable
+except ImportError:
+    from collections import Callable
 import errno
 from . import tarfile
 
@@ -528,7 +531,7 @@ def register_archive_format(name, function, extra_args=None, description=''):
     """
     if extra_args is None:
         extra_args = []
-    if not isinstance(function, collections.Callable):
+    if not isinstance(function, Callable):
         raise TypeError('The %s object is not callable' % function)
     if not isinstance(extra_args, (tuple, list)):
         raise TypeError('extra_args needs to be a sequence')
@@ -621,7 +624,7 @@ def _check_unpack_options(extensions, function, extra_args):
             raise RegistryError(msg % (extension,
                                        existing_extensions[extension]))
 
-    if not isinstance(function, collections.Callable):
+    if not isinstance(function, Callable):
         raise TypeError('The registered function must be a callable')
 
 
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg
rename to venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/sysconfig.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/_backport/tarfile.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/compat.py b/venv/Lib/site-packages/pip/_vendor/distlib/compat.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/compat.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/compat.py
index ff328c8..c316fd9 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/compat.py
+++ b/venv/Lib/site-packages/pip/_vendor/distlib/compat.py
@@ -319,7 +319,7 @@ except ImportError: # pragma: no cover
 try:
     callable = callable
 except NameError:   # pragma: no cover
-    from collections import Callable
+    from collections.abc import Callable
 
     def callable(obj):
         return isinstance(obj, Callable)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/database.py b/venv/Lib/site-packages/pip/_vendor/distlib/database.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/database.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/database.py
index c16c0c8..0a90c30 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/database.py
+++ b/venv/Lib/site-packages/pip/_vendor/distlib/database.py
@@ -550,7 +550,7 @@ class InstalledDistribution(BaseInstalledDistribution):
                 r = finder.find(WHEEL_METADATA_FILENAME)
             # Temporary - for legacy support
             if r is None:
-                r = finder.find('METADATA')
+                r = finder.find(LEGACY_METADATA_FILENAME)
             if r is None:
                 raise ValueError('no %s found in %s' % (METADATA_FILENAME,
                                                         path))
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/index.py b/venv/Lib/site-packages/pip/_vendor/distlib/index.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/index.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/index.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/locators.py b/venv/Lib/site-packages/pip/_vendor/distlib/locators.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/locators.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/locators.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/manifest.py b/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/manifest.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/manifest.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/markers.py b/venv/Lib/site-packages/pip/_vendor/distlib/markers.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/markers.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/markers.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/metadata.py b/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py
similarity index 92%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/metadata.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/metadata.py
index 2d61378..6d5e236 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/metadata.py
+++ b/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py
@@ -5,7 +5,7 @@
 #
 """Implementation of the Metadata for Python packages PEPs.
 
-Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental).
+Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and withdrawn 2.0).
 """
 from __future__ import unicode_literals
 
@@ -194,38 +194,12 @@ def _best_version(fields):
 
     return '2.0'
 
+# This follows the rules about transforming keys as described in
+# https://www.python.org/dev/peps/pep-0566/#id17
 _ATTR2FIELD = {
-    'metadata_version': 'Metadata-Version',
-    'name': 'Name',
-    'version': 'Version',
-    'platform': 'Platform',
-    'supported_platform': 'Supported-Platform',
-    'summary': 'Summary',
-    'description': 'Description',
-    'keywords': 'Keywords',
-    'home_page': 'Home-page',
-    'author': 'Author',
-    'author_email': 'Author-email',
-    'maintainer': 'Maintainer',
-    'maintainer_email': 'Maintainer-email',
-    'license': 'License',
-    'classifier': 'Classifier',
-    'download_url': 'Download-URL',
-    'obsoletes_dist': 'Obsoletes-Dist',
-    'provides_dist': 'Provides-Dist',
-    'requires_dist': 'Requires-Dist',
-    'setup_requires_dist': 'Setup-Requires-Dist',
-    'requires_python': 'Requires-Python',
-    'requires_external': 'Requires-External',
-    'requires': 'Requires',
-    'provides': 'Provides',
-    'obsoletes': 'Obsoletes',
-    'project_url': 'Project-URL',
-    'private_version': 'Private-Version',
-    'obsoleted_by': 'Obsoleted-By',
-    'extension': 'Extension',
-    'provides_extra': 'Provides-Extra',
+    name.lower().replace("-", "_"): name for name in _ALL_FIELDS
 }
+_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()}
 
 _PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist')
 _VERSIONS_FIELDS = ('Requires-Python',)
@@ -262,7 +236,7 @@ def _get_name_and_version(name, version, for_filename=False):
 class LegacyMetadata(object):
     """The legacy metadata of a release.
 
-    Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can
+    Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can
     instantiate the class with one of these arguments (or none):
     - *path*, the path to a metadata file
     - *fileobj* give a file-like object with metadata as content
@@ -381,6 +355,11 @@ class LegacyMetadata(object):
                 value = msg[field]
                 if value is not None and value != 'UNKNOWN':
                     self.set(field, value)
+
+        # PEP 566 specifies that the body be used for the description, if
+        # available
+        body = msg.get_payload()
+        self["Description"] = body if body else self["Description"]
         # logger.debug('Attempting to set metadata for %s', self)
         # self.set_metadata_version()
 
@@ -567,57 +546,21 @@ class LegacyMetadata(object):
 
         Field names will be converted to use the underscore-lowercase style
         instead of hyphen-mixed case (i.e. home_page instead of Home-page).
+        This is as per https://www.python.org/dev/peps/pep-0566/#id17.
         """
         self.set_metadata_version()
 
-        mapping_1_0 = (
-            ('metadata_version', 'Metadata-Version'),
-            ('name', 'Name'),
-            ('version', 'Version'),
-            ('summary', 'Summary'),
-            ('home_page', 'Home-page'),
-            ('author', 'Author'),
-            ('author_email', 'Author-email'),
-            ('license', 'License'),
-            ('description', 'Description'),
-            ('keywords', 'Keywords'),
-            ('platform', 'Platform'),
-            ('classifiers', 'Classifier'),
-            ('download_url', 'Download-URL'),
-        )
+        fields = _version2fieldlist(self['Metadata-Version'])
 
         data = {}
-        for key, field_name in mapping_1_0:
+
+        for field_name in fields:
             if not skip_missing or field_name in self._fields:
-                data[key] = self[field_name]
-
-        if self['Metadata-Version'] == '1.2':
-            mapping_1_2 = (
-                ('requires_dist', 'Requires-Dist'),
-                ('requires_python', 'Requires-Python'),
-                ('requires_external', 'Requires-External'),
-                ('provides_dist', 'Provides-Dist'),
-                ('obsoletes_dist', 'Obsoletes-Dist'),
-                ('project_url', 'Project-URL'),
-                ('maintainer', 'Maintainer'),
-                ('maintainer_email', 'Maintainer-email'),
-            )
-            for key, field_name in mapping_1_2:
-                if not skip_missing or field_name in self._fields:
-                    if key != 'project_url':
-                        data[key] = self[field_name]
-                    else:
-                        data[key] = [','.join(u) for u in self[field_name]]
-
-        elif self['Metadata-Version'] == '1.1':
-            mapping_1_1 = (
-                ('provides', 'Provides'),
-                ('requires', 'Requires'),
-                ('obsoletes', 'Obsoletes'),
-            )
-            for key, field_name in mapping_1_1:
-                if not skip_missing or field_name in self._fields:
+                key = _FIELD2ATTR[field_name]
+                if key != 'project_url':
                     data[key] = self[field_name]
+                else:
+                    data[key] = [','.join(u) for u in self[field_name]]
 
         return data
 
@@ -1003,10 +946,14 @@ class Metadata(object):
     LEGACY_MAPPING = {
         'name': 'Name',
         'version': 'Version',
-        'license': 'License',
+        ('extensions', 'python.details', 'license'): 'License',
         'summary': 'Summary',
         'description': 'Description',
-        'classifiers': 'Classifier',
+        ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page',
+        ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author',
+        ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email',
+        'source_url': 'Download-URL',
+        ('extensions', 'python.details', 'classifiers'): 'Classifier',
     }
 
     def _to_legacy(self):
@@ -1034,16 +981,29 @@ class Metadata(object):
         assert self._data and not self._legacy
         result = LegacyMetadata()
         nmd = self._data
+        # import pdb; pdb.set_trace()
         for nk, ok in self.LEGACY_MAPPING.items():
-            if nk in nmd:
-                result[ok] = nmd[nk]
+            if not isinstance(nk, tuple):
+                if nk in nmd:
+                    result[ok] = nmd[nk]
+            else:
+                d = nmd
+                found = True
+                for k in nk:
+                    try:
+                        d = d[k]
+                    except (KeyError, IndexError):
+                        found = False
+                        break
+                if found:
+                    result[ok] = d
         r1 = process_entries(self.run_requires + self.meta_requires)
         r2 = process_entries(self.build_requires + self.dev_requires)
         if self.extras:
             result['Provides-Extra'] = sorted(self.extras)
         result['Requires-Dist'] = sorted(r1)
         result['Setup-Requires-Dist'] = sorted(r2)
-        # TODO: other fields such as contacts
+        # TODO: any other fields wanted
         return result
 
     def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/resources.py b/venv/Lib/site-packages/pip/_vendor/distlib/resources.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/resources.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/resources.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/scripts.py b/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/scripts.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/scripts.py
index 5185974..03f8f21 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/scripts.py
+++ b/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py
@@ -48,7 +48,7 @@ if __name__ == '__main__':
 '''
 
 
-def _enquote_executable(executable):
+def enquote_executable(executable):
     if ' ' in executable:
         # make sure we quote only the executable in case of env
         # for example /usr/bin/env "/dir with spaces/bin/jython"
@@ -63,6 +63,8 @@ def _enquote_executable(executable):
                 executable = '"%s"' % executable
     return executable
 
+# Keep the old name around (for now), as there is at least one project using it!
+_enquote_executable = enquote_executable
 
 class ScriptMaker(object):
     """
@@ -88,6 +90,7 @@ class ScriptMaker(object):
 
         self._is_nt = os.name == 'nt' or (
             os.name == 'java' and os._name == 'nt')
+        self.version_info = sys.version_info
 
     def _get_alternate_executable(self, executable, options):
         if options.get('gui', False) and self._is_nt:  # pragma: no cover
@@ -185,7 +188,7 @@ class ScriptMaker(object):
         # If the user didn't specify an executable, it may be necessary to
         # cater for executable paths with spaces (not uncommon on Windows)
         if enquote:
-            executable = _enquote_executable(executable)
+            executable = enquote_executable(executable)
         # Issue #51: don't use fsencode, since we later try to
         # check that the shebang is decodable using utf-8.
         executable = executable.encode('utf-8')
@@ -293,10 +296,10 @@ class ScriptMaker(object):
         if '' in self.variants:
             scriptnames.add(name)
         if 'X' in self.variants:
-            scriptnames.add('%s%s' % (name, sys.version_info[0]))
+            scriptnames.add('%s%s' % (name, self.version_info[0]))
         if 'X.Y' in self.variants:
-            scriptnames.add('%s-%s.%s' % (name, sys.version_info[0],
-                            sys.version_info[1]))
+            scriptnames.add('%s-%s.%s' % (name, self.version_info[0],
+                                          self.version_info[1]))
         if options and options.get('gui', False):
             ext = 'pyw'
         else:
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/t32.exe b/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/t32.exe
rename to venv/Lib/site-packages/pip/_vendor/distlib/t32.exe
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/t64.exe b/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/t64.exe
rename to venv/Lib/site-packages/pip/_vendor/distlib/t64.exe
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/util.py b/venv/Lib/site-packages/pip/_vendor/distlib/util.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/util.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/util.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/version.py b/venv/Lib/site-packages/pip/_vendor/distlib/version.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/version.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/version.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/w32.exe b/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/w32.exe
rename to venv/Lib/site-packages/pip/_vendor/distlib/w32.exe
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/w64.exe b/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/w64.exe
rename to venv/Lib/site-packages/pip/_vendor/distlib/w64.exe
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/wheel.py b/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distlib/wheel.py
rename to venv/Lib/site-packages/pip/_vendor/distlib/wheel.py
index bd17938..1e2c7a0 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/distlib/wheel.py
+++ b/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py
@@ -26,7 +26,8 @@ import zipfile
 from . import __version__, DistlibException
 from .compat import sysconfig, ZipFile, fsdecode, text_type, filter
 from .database import InstalledDistribution
-from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME
+from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME,
+                       LEGACY_METADATA_FILENAME)
 from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache,
                    cached_property, get_cache_base, read_exports, tempdir)
 from .version import NormalizedVersion, UnsupportedVersionError
@@ -221,10 +222,12 @@ class Wheel(object):
             wheel_metadata = self.get_wheel_metadata(zf)
             wv = wheel_metadata['Wheel-Version'].split('.', 1)
             file_version = tuple([int(i) for i in wv])
-            if file_version < (1, 1):
-                fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA']
-            else:
-                fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME]
+            # if file_version < (1, 1):
+                # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME,
+                       # LEGACY_METADATA_FILENAME]
+            # else:
+                # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME]
+            fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME]
             result = None
             for fn in fns:
                 try:
@@ -299,10 +302,9 @@ class Wheel(object):
         return hash_kind, result
 
     def write_record(self, records, record_path, base):
-        records = list(records) # make a copy for sorting
+        records = list(records) # make a copy, as mutated
         p = to_posix(os.path.relpath(record_path, base))
         records.append((p, '', ''))
-        records.sort()
         with CSVWriter(record_path) as writer:
             for row in records:
                 writer.writerow(row)
@@ -425,6 +427,18 @@ class Wheel(object):
         ap = to_posix(os.path.join(info_dir, 'WHEEL'))
         archive_paths.append((ap, p))
 
+        # sort the entries by archive path. Not needed by any spec, but it
+        # keeps the archive listing and RECORD tidier than they would otherwise
+        # be. Use the number of path segments to keep directory entries together,
+        # and keep the dist-info stuff at the end.
+        def sorter(t):
+            ap = t[0]
+            n = ap.count('/')
+            if '.dist-info' in ap:
+                n += 10000
+            return (n, ap)
+        archive_paths = sorted(archive_paths, key=sorter)
+
         # Now, at last, RECORD.
         # Paths in here are archive paths - nothing else makes sense.
         self.write_records((distinfo, info_dir), libdir, archive_paths)
@@ -476,7 +490,7 @@ class Wheel(object):
         data_dir = '%s.data' % name_ver
         info_dir = '%s.dist-info' % name_ver
 
-        metadata_name = posixpath.join(info_dir, METADATA_FILENAME)
+        metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME)
         wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
         record_name = posixpath.join(info_dir, 'RECORD')
 
@@ -619,7 +633,7 @@ class Wheel(object):
                                     for v in epdata[k].values():
                                         s = '%s:%s' % (v.prefix, v.suffix)
                                         if v.flags:
-                                            s += ' %s' % v.flags
+                                            s += ' [%s]' % ','.join(v.flags)
                                         d[v.name] = s
                         except Exception:
                             logger.warning('Unable to read legacy script '
@@ -773,7 +787,7 @@ class Wheel(object):
         data_dir = '%s.data' % name_ver
         info_dir = '%s.dist-info' % name_ver
 
-        metadata_name = posixpath.join(info_dir, METADATA_FILENAME)
+        metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME)
         wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
         record_name = posixpath.join(info_dir, 'RECORD')
 
@@ -842,7 +856,7 @@ class Wheel(object):
 
         def get_version(path_map, info_dir):
             version = path = None
-            key = '%s/%s' % (info_dir, METADATA_FILENAME)
+            key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME)
             if key not in path_map:
                 key = '%s/PKG-INFO' % info_dir
             if key in path_map:
@@ -868,7 +882,7 @@ class Wheel(object):
             if updated:
                 md = Metadata(path=path)
                 md.version = updated
-                legacy = not path.endswith(METADATA_FILENAME)
+                legacy = path.endswith(LEGACY_METADATA_FILENAME)
                 md.write(path=path, legacy=legacy)
                 logger.debug('Version updated from %r to %r', version,
                              updated)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/distro.py b/venv/Lib/site-packages/pip/_vendor/distro.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/distro.py
rename to venv/Lib/site-packages/pip/_vendor/distro.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py
index 0491234..d1d82f1 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py
@@ -32,4 +32,4 @@ __all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder",
 
 # this has to be at the top level, see how setup.py parses this
 #: Distribution version number.
-__version__ = "1.0.1"
+__version__ = "1.1"
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_ihatexml.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_ihatexml.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py
index 4c77717..3ff803c 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_ihatexml.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py
@@ -136,6 +136,7 @@ def normaliseCharList(charList):
         i += j
     return rv
 
+
 # We don't really support characters above the BMP :(
 max_unicode = int("FFFF", 16)
 
@@ -254,7 +255,7 @@ class InfosetFilter(object):
         nameRest = name[1:]
         m = nonXmlNameFirstBMPRegexp.match(nameFirst)
         if m:
-            warnings.warn("Coercing non-XML name", DataLossWarning)
+            warnings.warn("Coercing non-XML name: %s" % name, DataLossWarning)
             nameFirstOutput = self.getReplacementCharacter(nameFirst)
         else:
             nameFirstOutput = nameFirst
@@ -262,7 +263,7 @@ class InfosetFilter(object):
         nameRestOutput = nameRest
         replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest))
         for char in replaceChars:
-            warnings.warn("Coercing non-XML name", DataLossWarning)
+            warnings.warn("Coercing non-XML name: %s" % name, DataLossWarning)
             replacement = self.getReplacementCharacter(char)
             nameRestOutput = nameRestOutput.replace(char, replacement)
         return nameFirstOutput + nameRestOutput
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_inputstream.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_inputstream.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py
index a65e55f..e0bb376 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_inputstream.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py
@@ -1,10 +1,11 @@
 from __future__ import absolute_import, division, unicode_literals
 
-from pip._vendor.six import text_type, binary_type
+from pip._vendor.six import text_type
 from pip._vendor.six.moves import http_client, urllib
 
 import codecs
 import re
+from io import BytesIO, StringIO
 
 from pip._vendor import webencodings
 
@@ -12,13 +13,6 @@ from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase
 from .constants import _ReparseException
 from . import _utils
 
-from io import StringIO
-
-try:
-    from io import BytesIO
-except ImportError:
-    BytesIO = StringIO
-
 # Non-unicode versions of constants for use in the pre-parser
 spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters])
 asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters])
@@ -40,13 +34,13 @@ if _utils.supports_lone_surrogates:
 else:
     invalid_unicode_re = re.compile(invalid_unicode_no_surrogate)
 
-non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE,
-                                  0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF,
-                                  0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE,
-                                  0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF,
-                                  0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,
-                                  0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF,
-                                  0x10FFFE, 0x10FFFF])
+non_bmp_invalid_codepoints = {0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE,
+                              0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF,
+                              0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE,
+                              0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF,
+                              0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE,
+                              0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF,
+                              0x10FFFE, 0x10FFFF}
 
 ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]")
 
@@ -367,7 +361,7 @@ class HTMLUnicodeInputStream(object):
     def unget(self, char):
         # Only one character is allowed to be ungotten at once - it must
         # be consumed again before any further call to unget
-        if char is not None:
+        if char is not EOF:
             if self.chunkOffset == 0:
                 # unget is called quite rarely, so it's a good idea to do
                 # more work here if it saves a bit of work in the frequently
@@ -449,7 +443,7 @@ class HTMLBinaryInputStream(HTMLUnicodeInputStream):
 
         try:
             stream.seek(stream.tell())
-        except:  # pylint:disable=bare-except
+        except Exception:
             stream = BufferedStream(stream)
 
         return stream
@@ -461,7 +455,7 @@ class HTMLBinaryInputStream(HTMLUnicodeInputStream):
         if charEncoding[0] is not None:
             return charEncoding
 
-        # If we've been overriden, we've been overriden
+        # If we've been overridden, we've been overridden
         charEncoding = lookupEncoding(self.override_encoding), "certain"
         if charEncoding[0] is not None:
             return charEncoding
@@ -664,9 +658,7 @@ class EncodingBytes(bytes):
         """Look for a sequence of bytes at the start of a string. If the bytes
         are found return True and advance the position to the byte after the
         match. Otherwise return False and leave the position alone"""
-        p = self.position
-        data = self[p:p + len(bytes)]
-        rv = data.startswith(bytes)
+        rv = self.startswith(bytes, self.position)
         if rv:
             self.position += len(bytes)
         return rv
@@ -674,15 +666,11 @@ class EncodingBytes(bytes):
     def jumpTo(self, bytes):
         """Look for the next sequence of bytes matching a given sequence. If
         a match is found advance the position to the last byte of the match"""
-        newPosition = self[self.position:].find(bytes)
-        if newPosition > -1:
-            # XXX: This is ugly, but I can't see a nicer way to fix this.
-            if self._position == -1:
-                self._position = 0
-            self._position += (newPosition + len(bytes) - 1)
-            return True
-        else:
+        try:
+            self._position = self.index(bytes, self.position) + len(bytes) - 1
+        except ValueError:
             raise StopIteration
+        return True
 
 
 class EncodingParser(object):
@@ -694,6 +682,9 @@ class EncodingParser(object):
         self.encoding = None
 
     def getEncoding(self):
+        if b"<meta" not in self.data:
+            return None
+
         methodDispatch = (
             (b"<!--", self.handleComment),
             (b"<meta", self.handleMeta),
@@ -703,6 +694,10 @@ class EncodingParser(object):
             (b"<", self.handlePossibleStartTag))
         for _ in self.data:
             keepParsing = True
+            try:
+                self.data.jumpTo(b"<")
+            except StopIteration:
+                break
             for key, method in methodDispatch:
                 if self.data.matchBytes(key):
                     try:
@@ -908,7 +903,7 @@ class ContentAttrParser(object):
 def lookupEncoding(encoding):
     """Return the python codec name corresponding to an encoding or None if the
     string doesn't correspond to a valid encoding."""
-    if isinstance(encoding, binary_type):
+    if isinstance(encoding, bytes):
         try:
             encoding = encoding.decode("ascii")
         except UnicodeDecodeError:
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_tokenizer.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_tokenizer.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py
index 178f6e7..5f00253 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_tokenizer.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py
@@ -2,7 +2,8 @@ from __future__ import absolute_import, division, unicode_literals
 
 from pip._vendor.six import unichr as chr
 
-from collections import deque
+from collections import deque, OrderedDict
+from sys import version_info
 
 from .constants import spaceCharacters
 from .constants import entities
@@ -17,6 +18,11 @@ from ._trie import Trie
 
 entitiesTrie = Trie(entities)
 
+if version_info >= (3, 7):
+    attributeMap = dict
+else:
+    attributeMap = OrderedDict
+
 
 class HTMLTokenizer(object):
     """ This class takes care of tokenizing HTML.
@@ -228,6 +234,14 @@ class HTMLTokenizer(object):
         # Add token to the queue to be yielded
         if (token["type"] in tagTokenTypes):
             token["name"] = token["name"].translate(asciiUpper2Lower)
+            if token["type"] == tokenTypes["StartTag"]:
+                raw = token["data"]
+                data = attributeMap(raw)
+                if len(raw) > len(data):
+                    # we had some duplicated attribute, fix so first wins
+                    data.update(raw[::-1])
+                token["data"] = data
+
             if token["type"] == tokenTypes["EndTag"]:
                 if token["data"]:
                     self.tokenQueue.append({"type": tokenTypes["ParseError"],
diff --git a/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py
new file mode 100644
index 0000000..07bad5d
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py
@@ -0,0 +1,5 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from .py import Trie
+
+__all__ = ["Trie"]
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/_base.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/_base.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/py.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/py.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_utils.py b/venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py
similarity index 75%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_utils.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py
index 0703afb..d7c4926 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_utils.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py
@@ -2,12 +2,20 @@ from __future__ import absolute_import, division, unicode_literals
 
 from types import ModuleType
 
-from pip._vendor.six import text_type
-
 try:
-    import xml.etree.cElementTree as default_etree
+    from collections.abc import Mapping
 except ImportError:
+    from collections import Mapping
+
+from pip._vendor.six import text_type, PY3
+
+if PY3:
     import xml.etree.ElementTree as default_etree
+else:
+    try:
+        import xml.etree.cElementTree as default_etree
+    except ImportError:
+        import xml.etree.ElementTree as default_etree
 
 
 __all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair",
@@ -27,7 +35,7 @@ try:
         # We need this with u"" because of http://bugs.jython.org/issue2039
         _x = eval('u"\\uD800"')  # pylint:disable=eval-used
         assert isinstance(_x, text_type)
-except:  # pylint:disable=bare-except
+except Exception:
     supports_lone_surrogates = False
 else:
     supports_lone_surrogates = True
@@ -47,9 +55,6 @@ class MethodDispatcher(dict):
     """
 
     def __init__(self, items=()):
-        # Using _dictEntries instead of directly assigning to self is about
-        # twice as fast. Please do careful performance testing before changing
-        # anything here.
         _dictEntries = []
         for name, value in items:
             if isinstance(name, (list, tuple, frozenset, set)):
@@ -64,6 +69,36 @@ class MethodDispatcher(dict):
     def __getitem__(self, key):
         return dict.get(self, key, self.default)
 
+    def __get__(self, instance, owner=None):
+        return BoundMethodDispatcher(instance, self)
+
+
+class BoundMethodDispatcher(Mapping):
+    """Wraps a MethodDispatcher, binding its return values to `instance`"""
+    def __init__(self, instance, dispatcher):
+        self.instance = instance
+        self.dispatcher = dispatcher
+
+    def __getitem__(self, key):
+        # see https://docs.python.org/3/reference/datamodel.html#object.__get__
+        # on a function, __get__ is used to bind a function to an instance as a bound method
+        return self.dispatcher[key].__get__(self.instance)
+
+    def get(self, key, default):
+        if key in self.dispatcher:
+            return self[key]
+        else:
+            return default
+
+    def __iter__(self):
+        return iter(self.dispatcher)
+
+    def __len__(self):
+        return len(self.dispatcher)
+
+    def __contains__(self, key):
+        return key in self.dispatcher
+
 
 # Some utility functions to deal with weirdness around UCS2 vs UCS4
 # python builds
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/constants.py b/venv/Lib/site-packages/pip/_vendor/html5lib/constants.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/constants.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/constants.py
index 1ff8041..fe3e237 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/constants.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/constants.py
@@ -519,8 +519,8 @@ adjustForeignAttributes = {
     "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"])
 }
 
-unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in
-                                  adjustForeignAttributes.items()])
+unadjustForeignAttributes = {(ns, local): qname for qname, (prefix, local, ns) in
+                             adjustForeignAttributes.items()}
 
 spaceCharacters = frozenset([
     "\t",
@@ -544,8 +544,7 @@ asciiLetters = frozenset(string.ascii_letters)
 digits = frozenset(string.digits)
 hexDigits = frozenset(string.hexdigits)
 
-asciiUpper2Lower = dict([(ord(c), ord(c.lower()))
-                         for c in string.ascii_uppercase])
+asciiUpper2Lower = {ord(c): ord(c.lower()) for c in string.ascii_uppercase}
 
 # Heading elements need to be ordered
 headingElements = (
@@ -2934,7 +2933,7 @@ tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"],
                            tokenTypes["EmptyTag"]])
 
 
-prefixes = dict([(v, k) for k, v in namespaces.items()])
+prefixes = {v: k for k, v in namespaces.items()}
 prefixes["http://www.w3.org/1998/Math/MathML"] = "math"
 
 
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/base.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/base.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/lint.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/lint.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/optionaltags.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/sanitizer.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py
index af8e77b..aa7431d 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/sanitizer.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py
@@ -1,6 +1,15 @@
+"""Deprecated from html5lib 1.1.
+
+See `here <https://github.com/html5lib/html5lib-python/issues/443>`_ for
+information about its deprecation; `Bleach <https://github.com/mozilla/bleach>`_
+is recommended as a replacement. Please let us know in the aforementioned issue
+if Bleach is unsuitable for your needs.
+
+"""
 from __future__ import absolute_import, division, unicode_literals
 
 import re
+import warnings
 from xml.sax.saxutils import escape, unescape
 
 from pip._vendor.six.moves import urllib_parse as urlparse
@@ -11,6 +20,14 @@ from ..constants import namespaces, prefixes
 __all__ = ["Filter"]
 
 
+_deprecation_msg = (
+    "html5lib's sanitizer is deprecated; see " +
+    "https://github.com/html5lib/html5lib-python/issues/443 and please let " +
+    "us know if Bleach is unsuitable for your needs"
+)
+
+warnings.warn(_deprecation_msg, DeprecationWarning)
+
 allowed_elements = frozenset((
     (namespaces['html'], 'a'),
     (namespaces['html'], 'abbr'),
@@ -750,6 +767,9 @@ class Filter(base.Filter):
 
         """
         super(Filter, self).__init__(source)
+
+        warnings.warn(_deprecation_msg, DeprecationWarning)
+
         self.allowed_elements = allowed_elements
         self.allowed_attributes = allowed_attributes
         self.allowed_css_properties = allowed_css_properties
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/filters/whitespace.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/html5parser.py b/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py
similarity index 85%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/html5parser.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py
index ae41a13..d06784f 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/html5parser.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py
@@ -2,7 +2,6 @@ from __future__ import absolute_import, division, unicode_literals
 from pip._vendor.six import with_metaclass, viewkeys
 
 import types
-from collections import OrderedDict
 
 from . import _inputstream
 from . import _tokenizer
@@ -119,8 +118,8 @@ class HTMLParser(object):
         self.tree = tree(namespaceHTMLElements)
         self.errors = []
 
-        self.phases = dict([(name, cls(self, self.tree)) for name, cls in
-                            getPhases(debug).items()])
+        self.phases = {name: cls(self, self.tree) for name, cls in
+                       getPhases(debug).items()}
 
     def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs):
 
@@ -202,7 +201,7 @@ class HTMLParser(object):
         DoctypeToken = tokenTypes["Doctype"]
         ParseErrorToken = tokenTypes["ParseError"]
 
-        for token in self.normalizedTokens():
+        for token in self.tokenizer:
             prev_token = None
             new_token = token
             while new_token is not None:
@@ -260,10 +259,6 @@ class HTMLParser(object):
             if reprocess:
                 assert self.phase not in phases
 
-    def normalizedTokens(self):
-        for token in self.tokenizer:
-            yield self.normalizeToken(token)
-
     def parse(self, stream, *args, **kwargs):
         """Parse a HTML document into a well-formed tree
 
@@ -325,17 +320,6 @@ class HTMLParser(object):
         if self.strict:
             raise ParseError(E[errorcode] % datavars)
 
-    def normalizeToken(self, token):
-        # HTML5 specific normalizations to the token stream
-        if token["type"] == tokenTypes["StartTag"]:
-            raw = token["data"]
-            token["data"] = OrderedDict(raw)
-            if len(raw) > len(token["data"]):
-                # we had some duplicated attribute, fix so first wins
-                token["data"].update(raw[::-1])
-
-        return token
-
     def adjustMathMLAttributes(self, token):
         adjust_attributes(token, adjustMathMLAttributes)
 
@@ -413,16 +397,12 @@ class HTMLParser(object):
 def getPhases(debug):
     def log(function):
         """Logger that records which phase processes each token"""
-        type_names = dict((value, key) for key, value in
-                          tokenTypes.items())
+        type_names = {value: key for key, value in tokenTypes.items()}
 
         def wrapped(self, *args, **kwargs):
             if function.__name__.startswith("process") and len(args) > 0:
                 token = args[0]
-                try:
-                    info = {"type": type_names[token['type']]}
-                except:
-                    raise
+                info = {"type": type_names[token['type']]}
                 if token['type'] in tagTokenTypes:
                     info["name"] = token['name']
 
@@ -446,10 +426,13 @@ def getPhases(debug):
     class Phase(with_metaclass(getMetaclass(debug, log))):
         """Base class for helper object that implements each phase of processing
         """
+        __slots__ = ("parser", "tree", "__startTagCache", "__endTagCache")
 
         def __init__(self, parser, tree):
             self.parser = parser
             self.tree = tree
+            self.__startTagCache = {}
+            self.__endTagCache = {}
 
         def processEOF(self):
             raise NotImplementedError
@@ -469,7 +452,21 @@ def getPhases(debug):
             self.tree.insertText(token["data"])
 
         def processStartTag(self, token):
-            return self.startTagHandler[token["name"]](token)
+            # Note the caching is done here rather than BoundMethodDispatcher as doing it there
+            # requires a circular reference to the Phase, and this ends up with a significant
+            # (CPython 2.7, 3.8) GC cost when parsing many short inputs
+            name = token["name"]
+            # In Py2, using `in` is quicker in general than try/except KeyError
+            # In Py3, `in` is quicker when there are few cache hits (typically short inputs)
+            if name in self.__startTagCache:
+                func = self.__startTagCache[name]
+            else:
+                func = self.__startTagCache[name] = self.startTagHandler[name]
+                # bound the cache size in case we get loads of unknown tags
+                while len(self.__startTagCache) > len(self.startTagHandler) * 1.1:
+                    # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7
+                    self.__startTagCache.pop(next(iter(self.__startTagCache)))
+            return func(token)
 
         def startTagHtml(self, token):
             if not self.parser.firstStartTag and token["name"] == "html":
@@ -482,9 +479,25 @@ def getPhases(debug):
             self.parser.firstStartTag = False
 
         def processEndTag(self, token):
-            return self.endTagHandler[token["name"]](token)
+            # Note the caching is done here rather than BoundMethodDispatcher as doing it there
+            # requires a circular reference to the Phase, and this ends up with a significant
+            # (CPython 2.7, 3.8) GC cost when parsing many short inputs
+            name = token["name"]
+            # In Py2, using `in` is quicker in general than try/except KeyError
+            # In Py3, `in` is quicker when there are few cache hits (typically short inputs)
+            if name in self.__endTagCache:
+                func = self.__endTagCache[name]
+            else:
+                func = self.__endTagCache[name] = self.endTagHandler[name]
+                # bound the cache size in case we get loads of unknown tags
+                while len(self.__endTagCache) > len(self.endTagHandler) * 1.1:
+                    # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7
+                    self.__endTagCache.pop(next(iter(self.__endTagCache)))
+            return func(token)
 
     class InitialPhase(Phase):
+        __slots__ = tuple()
+
         def processSpaceCharacters(self, token):
             pass
 
@@ -613,6 +626,8 @@ def getPhases(debug):
             return True
 
     class BeforeHtmlPhase(Phase):
+        __slots__ = tuple()
+
         # helper methods
         def insertHtmlElement(self):
             self.tree.insertRoot(impliedTagToken("html", "StartTag"))
@@ -648,19 +663,7 @@ def getPhases(debug):
                 return token
 
     class BeforeHeadPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("head", self.startTagHead)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                (("head", "body", "html", "br"), self.endTagImplyHead)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         def processEOF(self):
             self.startTagHead(impliedTagToken("head", "StartTag"))
@@ -693,28 +696,19 @@ def getPhases(debug):
             self.parser.parseError("end-tag-after-implied-root",
                                    {"name": token["name"]})
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", startTagHtml),
+            ("head", startTagHead)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            (("head", "body", "html", "br"), endTagImplyHead)
+        ])
+        endTagHandler.default = endTagOther
+
     class InHeadPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("title", self.startTagTitle),
-                (("noframes", "style"), self.startTagNoFramesStyle),
-                ("noscript", self.startTagNoscript),
-                ("script", self.startTagScript),
-                (("base", "basefont", "bgsound", "command", "link"),
-                 self.startTagBaseLinkCommand),
-                ("meta", self.startTagMeta),
-                ("head", self.startTagHead)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("head", self.endTagHead),
-                (("br", "html", "body"), self.endTagHtmlBodyBr)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         # the real thing
         def processEOF(self):
@@ -796,22 +790,27 @@ def getPhases(debug):
         def anythingElse(self):
             self.endTagHead(impliedTagToken("head"))
 
-    class InHeadNoscriptPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", startTagHtml),
+            ("title", startTagTitle),
+            (("noframes", "style"), startTagNoFramesStyle),
+            ("noscript", startTagNoscript),
+            ("script", startTagScript),
+            (("base", "basefont", "bgsound", "command", "link"),
+             startTagBaseLinkCommand),
+            ("meta", startTagMeta),
+            ("head", startTagHead)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            ("head", endTagHead),
+            (("br", "html", "body"), endTagHtmlBodyBr)
+        ])
+        endTagHandler.default = endTagOther
 
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand),
-                (("head", "noscript"), self.startTagHeadNoscript),
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("noscript", self.endTagNoscript),
-                ("br", self.endTagBr),
-            ])
-            self.endTagHandler.default = self.endTagOther
+    class InHeadNoscriptPhase(Phase):
+        __slots__ = tuple()
 
         def processEOF(self):
             self.parser.parseError("eof-in-head-noscript")
@@ -860,23 +859,21 @@ def getPhases(debug):
             # Caller must raise parse error first!
             self.endTagNoscript(impliedTagToken("noscript"))
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", startTagHtml),
+            (("basefont", "bgsound", "link", "meta", "noframes", "style"), startTagBaseLinkCommand),
+            (("head", "noscript"), startTagHeadNoscript),
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            ("noscript", endTagNoscript),
+            ("br", endTagBr),
+        ])
+        endTagHandler.default = endTagOther
+
     class AfterHeadPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("body", self.startTagBody),
-                ("frameset", self.startTagFrameset),
-                (("base", "basefont", "bgsound", "link", "meta", "noframes", "script",
-                  "style", "title"),
-                 self.startTagFromHead),
-                ("head", self.startTagHead)
-            ])
-            self.startTagHandler.default = self.startTagOther
-            self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"),
-                                                           self.endTagHtmlBodyBr)])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         def processEOF(self):
             self.anythingElse()
@@ -927,80 +924,30 @@ def getPhases(debug):
             self.parser.phase = self.parser.phases["inBody"]
             self.parser.framesetOK = True
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", startTagHtml),
+            ("body", startTagBody),
+            ("frameset", startTagFrameset),
+            (("base", "basefont", "bgsound", "link", "meta", "noframes", "script",
+              "style", "title"),
+             startTagFromHead),
+            ("head", startTagHead)
+        ])
+        startTagHandler.default = startTagOther
+        endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"),
+                                                  endTagHtmlBodyBr)])
+        endTagHandler.default = endTagOther
+
     class InBodyPhase(Phase):
         # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody
         # the really-really-really-very crazy mode
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
+        __slots__ = ("processSpaceCharacters",)
 
+        def __init__(self, *args, **kwargs):
+            super(InBodyPhase, self).__init__(*args, **kwargs)
             # Set this to the default handler
             self.processSpaceCharacters = self.processSpaceCharactersNonPre
 
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                (("base", "basefont", "bgsound", "command", "link", "meta",
-                  "script", "style", "title"),
-                 self.startTagProcessInHead),
-                ("body", self.startTagBody),
-                ("frameset", self.startTagFrameset),
-                (("address", "article", "aside", "blockquote", "center", "details",
-                  "dir", "div", "dl", "fieldset", "figcaption", "figure",
-                  "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p",
-                  "section", "summary", "ul"),
-                 self.startTagCloseP),
-                (headingElements, self.startTagHeading),
-                (("pre", "listing"), self.startTagPreListing),
-                ("form", self.startTagForm),
-                (("li", "dd", "dt"), self.startTagListItem),
-                ("plaintext", self.startTagPlaintext),
-                ("a", self.startTagA),
-                (("b", "big", "code", "em", "font", "i", "s", "small", "strike",
-                  "strong", "tt", "u"), self.startTagFormatting),
-                ("nobr", self.startTagNobr),
-                ("button", self.startTagButton),
-                (("applet", "marquee", "object"), self.startTagAppletMarqueeObject),
-                ("xmp", self.startTagXmp),
-                ("table", self.startTagTable),
-                (("area", "br", "embed", "img", "keygen", "wbr"),
-                 self.startTagVoidFormatting),
-                (("param", "source", "track"), self.startTagParamSource),
-                ("input", self.startTagInput),
-                ("hr", self.startTagHr),
-                ("image", self.startTagImage),
-                ("isindex", self.startTagIsIndex),
-                ("textarea", self.startTagTextarea),
-                ("iframe", self.startTagIFrame),
-                ("noscript", self.startTagNoscript),
-                (("noembed", "noframes"), self.startTagRawtext),
-                ("select", self.startTagSelect),
-                (("rp", "rt"), self.startTagRpRt),
-                (("option", "optgroup"), self.startTagOpt),
-                (("math"), self.startTagMath),
-                (("svg"), self.startTagSvg),
-                (("caption", "col", "colgroup", "frame", "head",
-                  "tbody", "td", "tfoot", "th", "thead",
-                  "tr"), self.startTagMisplaced)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("body", self.endTagBody),
-                ("html", self.endTagHtml),
-                (("address", "article", "aside", "blockquote", "button", "center",
-                  "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure",
-                  "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre",
-                  "section", "summary", "ul"), self.endTagBlock),
-                ("form", self.endTagForm),
-                ("p", self.endTagP),
-                (("dd", "dt", "li"), self.endTagListItem),
-                (headingElements, self.endTagHeading),
-                (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small",
-                  "strike", "strong", "tt", "u"), self.endTagFormatting),
-                (("applet", "marquee", "object"), self.endTagAppletMarqueeObject),
-                ("br", self.endTagBr),
-            ])
-            self.endTagHandler.default = self.endTagOther
-
         def isMatchingFormattingElement(self, node1, node2):
             return (node1.name == node2.name and
                     node1.namespace == node2.namespace and
@@ -1650,14 +1597,73 @@ def getPhases(debug):
                         self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
                         break
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            (("base", "basefont", "bgsound", "command", "link", "meta",
+              "script", "style", "title"),
+             startTagProcessInHead),
+            ("body", startTagBody),
+            ("frameset", startTagFrameset),
+            (("address", "article", "aside", "blockquote", "center", "details",
+              "dir", "div", "dl", "fieldset", "figcaption", "figure",
+              "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p",
+              "section", "summary", "ul"),
+             startTagCloseP),
+            (headingElements, startTagHeading),
+            (("pre", "listing"), startTagPreListing),
+            ("form", startTagForm),
+            (("li", "dd", "dt"), startTagListItem),
+            ("plaintext", startTagPlaintext),
+            ("a", startTagA),
+            (("b", "big", "code", "em", "font", "i", "s", "small", "strike",
+              "strong", "tt", "u"), startTagFormatting),
+            ("nobr", startTagNobr),
+            ("button", startTagButton),
+            (("applet", "marquee", "object"), startTagAppletMarqueeObject),
+            ("xmp", startTagXmp),
+            ("table", startTagTable),
+            (("area", "br", "embed", "img", "keygen", "wbr"),
+             startTagVoidFormatting),
+            (("param", "source", "track"), startTagParamSource),
+            ("input", startTagInput),
+            ("hr", startTagHr),
+            ("image", startTagImage),
+            ("isindex", startTagIsIndex),
+            ("textarea", startTagTextarea),
+            ("iframe", startTagIFrame),
+            ("noscript", startTagNoscript),
+            (("noembed", "noframes"), startTagRawtext),
+            ("select", startTagSelect),
+            (("rp", "rt"), startTagRpRt),
+            (("option", "optgroup"), startTagOpt),
+            (("math"), startTagMath),
+            (("svg"), startTagSvg),
+            (("caption", "col", "colgroup", "frame", "head",
+              "tbody", "td", "tfoot", "th", "thead",
+              "tr"), startTagMisplaced)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            ("body", endTagBody),
+            ("html", endTagHtml),
+            (("address", "article", "aside", "blockquote", "button", "center",
+              "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure",
+              "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre",
+              "section", "summary", "ul"), endTagBlock),
+            ("form", endTagForm),
+            ("p", endTagP),
+            (("dd", "dt", "li"), endTagListItem),
+            (headingElements, endTagHeading),
+            (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small",
+              "strike", "strong", "tt", "u"), endTagFormatting),
+            (("applet", "marquee", "object"), endTagAppletMarqueeObject),
+            ("br", endTagBr),
+        ])
+        endTagHandler.default = endTagOther
+
     class TextPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-            self.startTagHandler = _utils.MethodDispatcher([])
-            self.startTagHandler.default = self.startTagOther
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("script", self.endTagScript)])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         def processCharacters(self, token):
             self.tree.insertText(token["data"])
@@ -1683,30 +1689,15 @@ def getPhases(debug):
             self.tree.openElements.pop()
             self.parser.phase = self.parser.originalPhase
 
+        startTagHandler = _utils.MethodDispatcher([])
+        startTagHandler.default = startTagOther
+        endTagHandler = _utils.MethodDispatcher([
+            ("script", endTagScript)])
+        endTagHandler.default = endTagOther
+
     class InTablePhase(Phase):
         # http://www.whatwg.org/specs/web-apps/current-work/#in-table
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("caption", self.startTagCaption),
-                ("colgroup", self.startTagColgroup),
-                ("col", self.startTagCol),
-                (("tbody", "tfoot", "thead"), self.startTagRowGroup),
-                (("td", "th", "tr"), self.startTagImplyTbody),
-                ("table", self.startTagTable),
-                (("style", "script"), self.startTagStyleScript),
-                ("input", self.startTagInput),
-                ("form", self.startTagForm)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("table", self.endTagTable),
-                (("body", "caption", "col", "colgroup", "html", "tbody", "td",
-                  "tfoot", "th", "thead", "tr"), self.endTagIgnore)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         # helper methods
         def clearStackToTableContext(self):
@@ -1828,9 +1819,32 @@ def getPhases(debug):
             self.parser.phases["inBody"].processEndTag(token)
             self.tree.insertFromTable = False
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            ("caption", startTagCaption),
+            ("colgroup", startTagColgroup),
+            ("col", startTagCol),
+            (("tbody", "tfoot", "thead"), startTagRowGroup),
+            (("td", "th", "tr"), startTagImplyTbody),
+            ("table", startTagTable),
+            (("style", "script"), startTagStyleScript),
+            ("input", startTagInput),
+            ("form", startTagForm)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            ("table", endTagTable),
+            (("body", "caption", "col", "colgroup", "html", "tbody", "td",
+              "tfoot", "th", "thead", "tr"), endTagIgnore)
+        ])
+        endTagHandler.default = endTagOther
+
     class InTableTextPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
+        __slots__ = ("originalPhase", "characterTokens")
+
+        def __init__(self, *args, **kwargs):
+            super(InTableTextPhase, self).__init__(*args, **kwargs)
             self.originalPhase = None
             self.characterTokens = []
 
@@ -1875,23 +1889,7 @@ def getPhases(debug):
 
     class InCaptionPhase(Phase):
         # http://www.whatwg.org/specs/web-apps/current-work/#in-caption
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
-                  "thead", "tr"), self.startTagTableElement)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("caption", self.endTagCaption),
-                ("table", self.endTagTable),
-                (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th",
-                  "thead", "tr"), self.endTagIgnore)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         def ignoreEndTagCaption(self):
             return not self.tree.elementInScope("caption", variant="table")
@@ -1944,23 +1942,24 @@ def getPhases(debug):
         def endTagOther(self, token):
             return self.parser.phases["inBody"].processEndTag(token)
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
+              "thead", "tr"), startTagTableElement)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            ("caption", endTagCaption),
+            ("table", endTagTable),
+            (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th",
+              "thead", "tr"), endTagIgnore)
+        ])
+        endTagHandler.default = endTagOther
+
     class InColumnGroupPhase(Phase):
         # http://www.whatwg.org/specs/web-apps/current-work/#in-column
-
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("col", self.startTagCol)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("colgroup", self.endTagColgroup),
-                ("col", self.endTagCol)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         def ignoreEndTagColgroup(self):
             return self.tree.openElements[-1].name == "html"
@@ -2010,26 +2009,21 @@ def getPhases(debug):
             if not ignoreEndTag:
                 return token
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            ("col", startTagCol)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            ("colgroup", endTagColgroup),
+            ("col", endTagCol)
+        ])
+        endTagHandler.default = endTagOther
+
     class InTableBodyPhase(Phase):
         # http://www.whatwg.org/specs/web-apps/current-work/#in-table0
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("tr", self.startTagTr),
-                (("td", "th"), self.startTagTableCell),
-                (("caption", "col", "colgroup", "tbody", "tfoot", "thead"),
-                 self.startTagTableOther)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
-                ("table", self.endTagTable),
-                (("body", "caption", "col", "colgroup", "html", "td", "th",
-                  "tr"), self.endTagIgnore)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         # helper methods
         def clearStackToTableBodyContext(self):
@@ -2108,26 +2102,26 @@ def getPhases(debug):
         def endTagOther(self, token):
             return self.parser.phases["inTable"].processEndTag(token)
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            ("tr", startTagTr),
+            (("td", "th"), startTagTableCell),
+            (("caption", "col", "colgroup", "tbody", "tfoot", "thead"),
+             startTagTableOther)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            (("tbody", "tfoot", "thead"), endTagTableRowGroup),
+            ("table", endTagTable),
+            (("body", "caption", "col", "colgroup", "html", "td", "th",
+              "tr"), endTagIgnore)
+        ])
+        endTagHandler.default = endTagOther
+
     class InRowPhase(Phase):
         # http://www.whatwg.org/specs/web-apps/current-work/#in-row
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                (("td", "th"), self.startTagTableCell),
-                (("caption", "col", "colgroup", "tbody", "tfoot", "thead",
-                  "tr"), self.startTagTableOther)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("tr", self.endTagTr),
-                ("table", self.endTagTable),
-                (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
-                (("body", "caption", "col", "colgroup", "html", "td", "th"),
-                 self.endTagIgnore)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         # helper methods (XXX unify this with other table helper methods)
         def clearStackToTableRowContext(self):
@@ -2197,23 +2191,26 @@ def getPhases(debug):
         def endTagOther(self, token):
             return self.parser.phases["inTable"].processEndTag(token)
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            (("td", "th"), startTagTableCell),
+            (("caption", "col", "colgroup", "tbody", "tfoot", "thead",
+              "tr"), startTagTableOther)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            ("tr", endTagTr),
+            ("table", endTagTable),
+            (("tbody", "tfoot", "thead"), endTagTableRowGroup),
+            (("body", "caption", "col", "colgroup", "html", "td", "th"),
+             endTagIgnore)
+        ])
+        endTagHandler.default = endTagOther
+
     class InCellPhase(Phase):
         # http://www.whatwg.org/specs/web-apps/current-work/#in-cell
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
-                  "thead", "tr"), self.startTagTableOther)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                (("td", "th"), self.endTagTableCell),
-                (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore),
-                (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         # helper
         def closeCell(self):
@@ -2273,26 +2270,22 @@ def getPhases(debug):
         def endTagOther(self, token):
             return self.parser.phases["inBody"].processEndTag(token)
 
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
+              "thead", "tr"), startTagTableOther)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            (("td", "th"), endTagTableCell),
+            (("body", "caption", "col", "colgroup", "html"), endTagIgnore),
+            (("table", "tbody", "tfoot", "thead", "tr"), endTagImply)
+        ])
+        endTagHandler.default = endTagOther
+
     class InSelectPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("option", self.startTagOption),
-                ("optgroup", self.startTagOptgroup),
-                ("select", self.startTagSelect),
-                (("input", "keygen", "textarea"), self.startTagInput),
-                ("script", self.startTagScript)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("option", self.endTagOption),
-                ("optgroup", self.endTagOptgroup),
-                ("select", self.endTagSelect)
-            ])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         # http://www.whatwg.org/specs/web-apps/current-work/#in-select
         def processEOF(self):
@@ -2373,21 +2366,25 @@ def getPhases(debug):
             self.parser.parseError("unexpected-end-tag-in-select",
                                    {"name": token["name"]})
 
-    class InSelectInTablePhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
-            self.startTagHandler = _utils.MethodDispatcher([
-                (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
-                 self.startTagTable)
-            ])
-            self.startTagHandler.default = self.startTagOther
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            ("option", startTagOption),
+            ("optgroup", startTagOptgroup),
+            ("select", startTagSelect),
+            (("input", "keygen", "textarea"), startTagInput),
+            ("script", startTagScript)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            ("option", endTagOption),
+            ("optgroup", endTagOptgroup),
+            ("select", endTagSelect)
+        ])
+        endTagHandler.default = endTagOther
 
-            self.endTagHandler = _utils.MethodDispatcher([
-                (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
-                 self.endTagTable)
-            ])
-            self.endTagHandler.default = self.endTagOther
+    class InSelectInTablePhase(Phase):
+        __slots__ = tuple()
 
         def processEOF(self):
             self.parser.phases["inSelect"].processEOF()
@@ -2412,7 +2409,21 @@ def getPhases(debug):
         def endTagOther(self, token):
             return self.parser.phases["inSelect"].processEndTag(token)
 
+        startTagHandler = _utils.MethodDispatcher([
+            (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
+             startTagTable)
+        ])
+        startTagHandler.default = startTagOther
+
+        endTagHandler = _utils.MethodDispatcher([
+            (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"),
+             endTagTable)
+        ])
+        endTagHandler.default = endTagOther
+
     class InForeignContentPhase(Phase):
+        __slots__ = tuple()
+
         breakoutElements = frozenset(["b", "big", "blockquote", "body", "br",
                                       "center", "code", "dd", "div", "dl", "dt",
                                       "em", "embed", "h1", "h2", "h3",
@@ -2422,9 +2433,6 @@ def getPhases(debug):
                                       "span", "strong", "strike", "sub", "sup",
                                       "table", "tt", "u", "ul", "var"])
 
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
         def adjustSVGTagNames(self, token):
             replacements = {"altglyph": "altGlyph",
                             "altglyphdef": "altGlyphDef",
@@ -2478,7 +2486,7 @@ def getPhases(debug):
             currentNode = self.tree.openElements[-1]
             if (token["name"] in self.breakoutElements or
                 (token["name"] == "font" and
-                 set(token["data"].keys()) & set(["color", "face", "size"]))):
+                 set(token["data"].keys()) & {"color", "face", "size"})):
                 self.parser.parseError("unexpected-html-element-in-foreign-content",
                                        {"name": token["name"]})
                 while (self.tree.openElements[-1].namespace !=
@@ -2528,16 +2536,7 @@ def getPhases(debug):
             return new_token
 
     class AfterBodyPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
-
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml)
-            ])
-            self.startTagHandler.default = self.startTagOther
-
-            self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)])
-            self.endTagHandler.default = self.endTagOther
+        __slots__ = tuple()
 
         def processEOF(self):
             # Stop parsing
@@ -2574,23 +2573,17 @@ def getPhases(debug):
             self.parser.phase = self.parser.phases["inBody"]
             return token
 
-    class InFramesetPhase(Phase):
-        # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", startTagHtml)
+        ])
+        startTagHandler.default = startTagOther
 
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("frameset", self.startTagFrameset),
-                ("frame", self.startTagFrame),
-                ("noframes", self.startTagNoframes)
-            ])
-            self.startTagHandler.default = self.startTagOther
+        endTagHandler = _utils.MethodDispatcher([("html", endTagHtml)])
+        endTagHandler.default = endTagOther
 
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("frameset", self.endTagFrameset)
-            ])
-            self.endTagHandler.default = self.endTagOther
+    class InFramesetPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset
+        __slots__ = tuple()
 
         def processEOF(self):
             if self.tree.openElements[-1].name != "html":
@@ -2631,21 +2624,22 @@ def getPhases(debug):
             self.parser.parseError("unexpected-end-tag-in-frameset",
                                    {"name": token["name"]})
 
-    class AfterFramesetPhase(Phase):
-        # http://www.whatwg.org/specs/web-apps/current-work/#after3
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            ("frameset", startTagFrameset),
+            ("frame", startTagFrame),
+            ("noframes", startTagNoframes)
+        ])
+        startTagHandler.default = startTagOther
 
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("noframes", self.startTagNoframes)
-            ])
-            self.startTagHandler.default = self.startTagOther
+        endTagHandler = _utils.MethodDispatcher([
+            ("frameset", endTagFrameset)
+        ])
+        endTagHandler.default = endTagOther
 
-            self.endTagHandler = _utils.MethodDispatcher([
-                ("html", self.endTagHtml)
-            ])
-            self.endTagHandler.default = self.endTagOther
+    class AfterFramesetPhase(Phase):
+        # http://www.whatwg.org/specs/web-apps/current-work/#after3
+        __slots__ = tuple()
 
         def processEOF(self):
             # Stop parsing
@@ -2668,14 +2662,19 @@ def getPhases(debug):
             self.parser.parseError("unexpected-end-tag-after-frameset",
                                    {"name": token["name"]})
 
-    class AfterAfterBodyPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", Phase.startTagHtml),
+            ("noframes", startTagNoframes)
+        ])
+        startTagHandler.default = startTagOther
 
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml)
-            ])
-            self.startTagHandler.default = self.startTagOther
+        endTagHandler = _utils.MethodDispatcher([
+            ("html", endTagHtml)
+        ])
+        endTagHandler.default = endTagOther
+
+    class AfterAfterBodyPhase(Phase):
+        __slots__ = tuple()
 
         def processEOF(self):
             pass
@@ -2706,15 +2705,13 @@ def getPhases(debug):
             self.parser.phase = self.parser.phases["inBody"]
             return token
 
-    class AfterAfterFramesetPhase(Phase):
-        def __init__(self, parser, tree):
-            Phase.__init__(self, parser, tree)
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", startTagHtml)
+        ])
+        startTagHandler.default = startTagOther
 
-            self.startTagHandler = _utils.MethodDispatcher([
-                ("html", self.startTagHtml),
-                ("noframes", self.startTagNoFrames)
-            ])
-            self.startTagHandler.default = self.startTagOther
+    class AfterAfterFramesetPhase(Phase):
+        __slots__ = tuple()
 
         def processEOF(self):
             pass
@@ -2741,6 +2738,13 @@ def getPhases(debug):
         def processEndTag(self, token):
             self.parser.parseError("expected-eof-but-got-end-tag",
                                    {"name": token["name"]})
+
+        startTagHandler = _utils.MethodDispatcher([
+            ("html", startTagHtml),
+            ("noframes", startTagNoFrames)
+        ])
+        startTagHandler.default = startTagOther
+
     # pylint:enable=unused-argument
 
     return {
@@ -2774,8 +2778,8 @@ def getPhases(debug):
 def adjust_attributes(token, replacements):
     needs_adjustment = viewkeys(token['data']) & viewkeys(replacements)
     if needs_adjustment:
-        token['data'] = OrderedDict((replacements.get(k, k), v)
-                                    for k, v in token['data'].items())
+        token['data'] = type(token['data'])((replacements.get(k, k), v)
+                                            for k, v in token['data'].items())
 
 
 def impliedTagToken(name, type="EndTag", attributes=None,
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/serializer.py b/venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/serializer.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py
index 53f4d44..d5669d8 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/serializer.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py
@@ -274,7 +274,7 @@ class HTMLSerializer(object):
                 if token["systemId"]:
                     if token["systemId"].find('"') >= 0:
                         if token["systemId"].find("'") >= 0:
-                            self.serializeError("System identifer contains both single and double quote characters")
+                            self.serializeError("System identifier contains both single and double quote characters")
                         quote_char = "'"
                     else:
                         quote_char = '"'
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treeadapters/sax.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/base.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py
index 73973db..965fce2 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/base.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py
@@ -10,9 +10,9 @@ Marker = None
 
 listElementsMap = {
     None: (frozenset(scopingElements), False),
-    "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False),
-    "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"),
-                                              (namespaces["html"], "ul")])), False),
+    "button": (frozenset(scopingElements | {(namespaces["html"], "button")}), False),
+    "list": (frozenset(scopingElements | {(namespaces["html"], "ol"),
+                                          (namespaces["html"], "ul")}), False),
     "table": (frozenset([(namespaces["html"], "html"),
                          (namespaces["html"], "table")]), False),
     "select": (frozenset([(namespaces["html"], "optgroup"),
@@ -28,7 +28,7 @@ class Node(object):
         :arg name: The tag name associated with the node
 
         """
-        # The tag name assocaited with the node
+        # The tag name associated with the node
         self.name = name
         # The parent of the current node (or None for the document node)
         self.parent = None
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/dom.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py
index 0dedf44..ea92dc3 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py
@@ -5,6 +5,8 @@ from pip._vendor.six import text_type
 
 import re
 
+from copy import copy
+
 from . import base
 from .. import _ihatexml
 from .. import constants
@@ -61,16 +63,17 @@ def getETreeBuilder(ElementTreeImplementation, fullTree=False):
             return self._element.attrib
 
         def _setAttributes(self, attributes):
-            # Delete existing attributes first
-            # XXX - there may be a better way to do this...
-            for key in list(self._element.attrib.keys()):
-                del self._element.attrib[key]
-            for key, value in attributes.items():
-                if isinstance(key, tuple):
-                    name = "{%s}%s" % (key[2], key[1])
-                else:
-                    name = key
-                self._element.set(name, value)
+            el_attrib = self._element.attrib
+            el_attrib.clear()
+            if attributes:
+                # calling .items _always_ allocates, and the above truthy check is cheaper than the
+                # allocation on average
+                for key, value in attributes.items():
+                    if isinstance(key, tuple):
+                        name = "{%s}%s" % (key[2], key[1])
+                    else:
+                        name = key
+                    el_attrib[name] = value
 
         attributes = property(_getAttributes, _setAttributes)
 
@@ -129,8 +132,8 @@ def getETreeBuilder(ElementTreeImplementation, fullTree=False):
 
         def cloneNode(self):
             element = type(self)(self.name, self.namespace)
-            for name, value in self.attributes.items():
-                element.attributes[name] = value
+            if self._element.attrib:
+                element._element.attrib = copy(self._element.attrib)
             return element
 
         def reparentChildren(self, newParent):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py
similarity index 89%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py
index ca12a99..f037759 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py
@@ -16,6 +16,11 @@ import warnings
 import re
 import sys
 
+try:
+    from collections.abc import MutableMapping
+except ImportError:
+    from collections import MutableMapping
+
 from . import base
 from ..constants import DataLossWarning
 from .. import constants
@@ -23,6 +28,7 @@ from . import etree as etree_builders
 from .. import _ihatexml
 
 import lxml.etree as etree
+from pip._vendor.six import PY3, binary_type
 
 
 fullTree = True
@@ -44,7 +50,11 @@ class Document(object):
         self._childNodes = []
 
     def appendChild(self, element):
-        self._elementTree.getroot().addnext(element._element)
+        last = self._elementTree.getroot()
+        for last in self._elementTree.getroot().itersiblings():
+            pass
+
+        last.addnext(element._element)
 
     def _getChildNodes(self):
         return self._childNodes
@@ -185,26 +195,37 @@ class TreeBuilder(base.TreeBuilder):
         infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True)
         self.namespaceHTMLElements = namespaceHTMLElements
 
-        class Attributes(dict):
-            def __init__(self, element, value=None):
-                if value is None:
-                    value = {}
+        class Attributes(MutableMapping):
+            def __init__(self, element):
                 self._element = element
-                dict.__init__(self, value)  # pylint:disable=non-parent-init-called
-                for key, value in self.items():
-                    if isinstance(key, tuple):
-                        name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
-                    else:
-                        name = infosetFilter.coerceAttribute(key)
-                    self._element._element.attrib[name] = value
 
-            def __setitem__(self, key, value):
-                dict.__setitem__(self, key, value)
+            def _coerceKey(self, key):
                 if isinstance(key, tuple):
                     name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
                 else:
                     name = infosetFilter.coerceAttribute(key)
-                self._element._element.attrib[name] = value
+                return name
+
+            def __getitem__(self, key):
+                value = self._element._element.attrib[self._coerceKey(key)]
+                if not PY3 and isinstance(value, binary_type):
+                    value = value.decode("ascii")
+                return value
+
+            def __setitem__(self, key, value):
+                self._element._element.attrib[self._coerceKey(key)] = value
+
+            def __delitem__(self, key):
+                del self._element._element.attrib[self._coerceKey(key)]
+
+            def __iter__(self):
+                return iter(self._element._element.attrib)
+
+            def __len__(self):
+                return len(self._element._element.attrib)
+
+            def clear(self):
+                return self._element._element.attrib.clear()
 
         class Element(builder.Element):
             def __init__(self, name, namespace):
@@ -225,8 +246,10 @@ class TreeBuilder(base.TreeBuilder):
             def _getAttributes(self):
                 return self._attributes
 
-            def _setAttributes(self, attributes):
-                self._attributes = Attributes(self, attributes)
+            def _setAttributes(self, value):
+                attributes = self.attributes
+                attributes.clear()
+                attributes.update(value)
 
             attributes = property(_getAttributes, _setAttributes)
 
@@ -234,8 +257,11 @@ class TreeBuilder(base.TreeBuilder):
                 data = infosetFilter.coerceCharacters(data)
                 builder.Element.insertText(self, data, insertBefore)
 
-            def appendChild(self, child):
-                builder.Element.appendChild(self, child)
+            def cloneNode(self):
+                element = type(self)(self.name, self.namespace)
+                if self._element.attrib:
+                    element._element.attrib.update(self._element.attrib)
+                return element
 
         class Comment(builder.Comment):
             def __init__(self, data):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py
index 9bec207..b2d3aac 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py
@@ -2,10 +2,10 @@
 tree, generating tokens identical to those produced by the tokenizer
 module.
 
-To create a tree walker for a new type of tree, you need to do
+To create a tree walker for a new type of tree, you need to
 implement a tree walker object (called TreeWalker by convention) that
-implements a 'serialize' method taking a tree as sole argument and
-returning an iterator generating tokens.
+implements a 'serialize' method which takes a tree as sole argument and
+returns an iterator which generates tokens.
 """
 
 from __future__ import absolute_import, division, unicode_literals
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/base.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/dom.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/etree.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py
index 95fc0c1..837b27e 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/etree.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py
@@ -127,4 +127,5 @@ def getETreeBuilder(ElementTreeImplementation):
 
     return locals()
 
+
 getETreeModule = moduleFactoryFactory(getETreeBuilder)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py
index e81ddf3..c56af39 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py
+++ b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py
@@ -1,6 +1,8 @@
 from __future__ import absolute_import, division, unicode_literals
 from pip._vendor.six import text_type
 
+from collections import OrderedDict
+
 from lxml import etree
 from ..treebuilders.etree import tag_regexp
 
@@ -163,7 +165,7 @@ class TreeWalker(base.NonRecursiveTreeWalker):
             else:
                 namespace = None
                 tag = ensure_str(node.tag)
-            attrs = {}
+            attrs = OrderedDict()
             for name, value in list(node.attrib.items()):
                 name = ensure_str(name)
                 value = ensure_str(value)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py
rename to venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/idna/__init__.py b/venv/Lib/site-packages/pip/_vendor/idna/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/idna/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/idna/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/idna/codec.py b/venv/Lib/site-packages/pip/_vendor/idna/codec.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/idna/codec.py
rename to venv/Lib/site-packages/pip/_vendor/idna/codec.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/idna/compat.py b/venv/Lib/site-packages/pip/_vendor/idna/compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/idna/compat.py
rename to venv/Lib/site-packages/pip/_vendor/idna/compat.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/idna/core.py b/venv/Lib/site-packages/pip/_vendor/idna/core.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/idna/core.py
rename to venv/Lib/site-packages/pip/_vendor/idna/core.py
index 9c3bba2..41ec5c7 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/idna/core.py
+++ b/venv/Lib/site-packages/pip/_vendor/idna/core.py
@@ -300,6 +300,8 @@ def ulabel(label):
     label = label.lower()
     if label.startswith(_alabel_prefix):
         label = label[len(_alabel_prefix):]
+        if not label:
+            raise IDNAError('Malformed A-label, no Punycode eligible content found')
         if label.decode('ascii')[-1] == '-':
             raise IDNAError('A-label must not end with a hyphen')
     else:
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/idna/idnadata.py b/venv/Lib/site-packages/pip/_vendor/idna/idnadata.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_vendor/idna/idnadata.py
rename to venv/Lib/site-packages/pip/_vendor/idna/idnadata.py
index 2b81c52..a284e4c 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/idna/idnadata.py
+++ b/venv/Lib/site-packages/pip/_vendor/idna/idnadata.py
@@ -1,6 +1,6 @@
 # This file is automatically generated by tools/idna-data
 
-__version__ = "12.1.0"
+__version__ = "13.0.0"
 scripts = {
     'Greek': (
         0x37000000374,
@@ -48,16 +48,18 @@ scripts = {
         0x300700003008,
         0x30210000302a,
         0x30380000303c,
-        0x340000004db6,
-        0x4e0000009ff0,
+        0x340000004dc0,
+        0x4e0000009ffd,
         0xf9000000fa6e,
         0xfa700000fada,
-        0x200000002a6d7,
+        0x16ff000016ff2,
+        0x200000002a6de,
         0x2a7000002b735,
         0x2b7400002b81e,
         0x2b8200002cea2,
         0x2ceb00002ebe1,
         0x2f8000002fa1e,
+        0x300000003134b,
     ),
     'Hebrew': (
         0x591000005c8,
@@ -389,9 +391,9 @@ joining_types = {
     0x853: 68,
     0x854: 82,
     0x855: 68,
-    0x856: 85,
-    0x857: 85,
-    0x858: 85,
+    0x856: 82,
+    0x857: 82,
+    0x858: 82,
     0x860: 68,
     0x861: 85,
     0x862: 68,
@@ -432,6 +434,16 @@ joining_types = {
     0x8bb: 68,
     0x8bc: 68,
     0x8bd: 68,
+    0x8be: 68,
+    0x8bf: 68,
+    0x8c0: 68,
+    0x8c1: 68,
+    0x8c2: 68,
+    0x8c3: 68,
+    0x8c4: 68,
+    0x8c5: 68,
+    0x8c6: 68,
+    0x8c7: 68,
     0x8e2: 85,
     0x1806: 85,
     0x1807: 68,
@@ -756,6 +768,34 @@ joining_types = {
     0x10f52: 68,
     0x10f53: 68,
     0x10f54: 82,
+    0x10fb0: 68,
+    0x10fb1: 85,
+    0x10fb2: 68,
+    0x10fb3: 68,
+    0x10fb4: 82,
+    0x10fb5: 82,
+    0x10fb6: 82,
+    0x10fb7: 85,
+    0x10fb8: 68,
+    0x10fb9: 82,
+    0x10fba: 82,
+    0x10fbb: 68,
+    0x10fbc: 68,
+    0x10fbd: 82,
+    0x10fbe: 68,
+    0x10fbf: 68,
+    0x10fc0: 85,
+    0x10fc1: 68,
+    0x10fc2: 82,
+    0x10fc3: 82,
+    0x10fc4: 68,
+    0x10fc5: 85,
+    0x10fc6: 85,
+    0x10fc7: 85,
+    0x10fc8: 85,
+    0x10fc9: 82,
+    0x10fca: 68,
+    0x10fcb: 76,
     0x110bd: 85,
     0x110cd: 85,
     0x1e900: 68,
@@ -1129,7 +1169,7 @@ codepoint_classes = {
         0x8400000085c,
         0x8600000086b,
         0x8a0000008b5,
-        0x8b6000008be,
+        0x8b6000008c8,
         0x8d3000008e2,
         0x8e300000958,
         0x96000000964,
@@ -1188,7 +1228,7 @@ codepoint_classes = {
         0xb3c00000b45,
         0xb4700000b49,
         0xb4b00000b4e,
-        0xb5600000b58,
+        0xb5500000b58,
         0xb5f00000b64,
         0xb6600000b70,
         0xb7100000b72,
@@ -1233,8 +1273,7 @@ codepoint_classes = {
         0xce000000ce4,
         0xce600000cf0,
         0xcf100000cf3,
-        0xd0000000d04,
-        0xd0500000d0d,
+        0xd0000000d0d,
         0xd0e00000d11,
         0xd1200000d45,
         0xd4600000d49,
@@ -1243,7 +1282,7 @@ codepoint_classes = {
         0xd5f00000d64,
         0xd6600000d70,
         0xd7a00000d80,
-        0xd8200000d84,
+        0xd8100000d84,
         0xd8500000d97,
         0xd9a00000db2,
         0xdb300000dbc,
@@ -1358,6 +1397,7 @@ codepoint_classes = {
         0x1a9000001a9a,
         0x1aa700001aa8,
         0x1ab000001abe,
+        0x1abf00001ac1,
         0x1b0000001b4c,
         0x1b5000001b5a,
         0x1b6b00001b74,
@@ -1609,10 +1649,10 @@ codepoint_classes = {
         0x30a1000030fb,
         0x30fc000030ff,
         0x310500003130,
-        0x31a0000031bb,
+        0x31a0000031c0,
         0x31f000003200,
-        0x340000004db6,
-        0x4e0000009ff0,
+        0x340000004dc0,
+        0x4e0000009ffd,
         0xa0000000a48d,
         0xa4d00000a4fe,
         0xa5000000a60d,
@@ -1727,8 +1767,11 @@ codepoint_classes = {
         0xa7bd0000a7be,
         0xa7bf0000a7c0,
         0xa7c30000a7c4,
-        0xa7f70000a7f8,
+        0xa7c80000a7c9,
+        0xa7ca0000a7cb,
+        0xa7f60000a7f8,
         0xa7fa0000a828,
+        0xa82c0000a82d,
         0xa8400000a874,
         0xa8800000a8c6,
         0xa8d00000a8da,
@@ -1753,7 +1796,7 @@ codepoint_classes = {
         0xab200000ab27,
         0xab280000ab2f,
         0xab300000ab5b,
-        0xab600000ab68,
+        0xab600000ab6a,
         0xabc00000abeb,
         0xabec0000abee,
         0xabf00000abfa,
@@ -1827,9 +1870,13 @@ codepoint_classes = {
         0x10cc000010cf3,
         0x10d0000010d28,
         0x10d3000010d3a,
+        0x10e8000010eaa,
+        0x10eab00010ead,
+        0x10eb000010eb2,
         0x10f0000010f1d,
         0x10f2700010f28,
         0x10f3000010f51,
+        0x10fb000010fc5,
         0x10fe000010ff7,
         0x1100000011047,
         0x1106600011070,
@@ -1838,12 +1885,12 @@ codepoint_classes = {
         0x110f0000110fa,
         0x1110000011135,
         0x1113600011140,
-        0x1114400011147,
+        0x1114400011148,
         0x1115000011174,
         0x1117600011177,
         0x11180000111c5,
         0x111c9000111cd,
-        0x111d0000111db,
+        0x111ce000111db,
         0x111dc000111dd,
         0x1120000011212,
         0x1121300011238,
@@ -1872,7 +1919,7 @@ codepoint_classes = {
         0x1137000011375,
         0x114000001144b,
         0x114500001145a,
-        0x1145e00011460,
+        0x1145e00011462,
         0x11480000114c6,
         0x114c7000114c8,
         0x114d0000114da,
@@ -1889,7 +1936,14 @@ codepoint_classes = {
         0x117300001173a,
         0x118000001183b,
         0x118c0000118ea,
-        0x118ff00011900,
+        0x118ff00011907,
+        0x119090001190a,
+        0x1190c00011914,
+        0x1191500011917,
+        0x1191800011936,
+        0x1193700011939,
+        0x1193b00011944,
+        0x119500001195a,
         0x119a0000119a8,
         0x119aa000119d8,
         0x119da000119e2,
@@ -1920,6 +1974,7 @@ codepoint_classes = {
         0x11d9300011d99,
         0x11da000011daa,
         0x11ee000011ef7,
+        0x11fb000011fb1,
         0x120000001239a,
         0x1248000012544,
         0x130000001342f,
@@ -1939,9 +1994,11 @@ codepoint_classes = {
         0x16f4f00016f88,
         0x16f8f00016fa0,
         0x16fe000016fe2,
-        0x16fe300016fe4,
+        0x16fe300016fe5,
+        0x16ff000016ff2,
         0x17000000187f8,
-        0x1880000018af3,
+        0x1880000018cd6,
+        0x18d0000018d09,
         0x1b0000001b11f,
         0x1b1500001b153,
         0x1b1640001b168,
@@ -1971,11 +2028,13 @@ codepoint_classes = {
         0x1e8d00001e8d7,
         0x1e9220001e94c,
         0x1e9500001e95a,
-        0x200000002a6d7,
+        0x1fbf00001fbfa,
+        0x200000002a6de,
         0x2a7000002b735,
         0x2b7400002b81e,
         0x2b8200002cea2,
         0x2ceb00002ebe1,
+        0x300000003134b,
     ),
     'CONTEXTJ': (
         0x200c0000200e,
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/idna/intranges.py b/venv/Lib/site-packages/pip/_vendor/idna/intranges.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/idna/intranges.py
rename to venv/Lib/site-packages/pip/_vendor/idna/intranges.py
diff --git a/venv/Lib/site-packages/pip/_vendor/idna/package_data.py b/venv/Lib/site-packages/pip/_vendor/idna/package_data.py
new file mode 100644
index 0000000..ce1c521
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_vendor/idna/package_data.py
@@ -0,0 +1,2 @@
+__version__ = '2.10'
+
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/idna/uts46data.py b/venv/Lib/site-packages/pip/_vendor/idna/uts46data.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/idna/uts46data.py
rename to venv/Lib/site-packages/pip/_vendor/idna/uts46data.py
index 2711136..3766dd4 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/idna/uts46data.py
+++ b/venv/Lib/site-packages/pip/_vendor/idna/uts46data.py
@@ -4,7 +4,7 @@
 """IDNA Mapping Table from UTS46."""
 
 
-__version__ = "12.1.0"
+__version__ = "13.0.0"
 def _seg_0():
     return [
     (0x0, '3'),
@@ -1074,7 +1074,7 @@ def _seg_10():
     (0x8A0, 'V'),
     (0x8B5, 'X'),
     (0x8B6, 'V'),
-    (0x8BE, 'X'),
+    (0x8C8, 'X'),
     (0x8D3, 'V'),
     (0x8E2, 'X'),
     (0x8E3, 'V'),
@@ -1205,7 +1205,7 @@ def _seg_11():
     (0xB49, 'X'),
     (0xB4B, 'V'),
     (0xB4E, 'X'),
-    (0xB56, 'V'),
+    (0xB55, 'V'),
     (0xB58, 'X'),
     (0xB5C, 'M', u'ଡ଼'),
     (0xB5D, 'M', u'ଢ଼'),
@@ -1299,8 +1299,6 @@ def _seg_12():
     (0xCF1, 'V'),
     (0xCF3, 'X'),
     (0xD00, 'V'),
-    (0xD04, 'X'),
-    (0xD05, 'V'),
     (0xD0D, 'X'),
     (0xD0E, 'V'),
     (0xD11, 'X'),
@@ -1314,7 +1312,7 @@ def _seg_12():
     (0xD64, 'X'),
     (0xD66, 'V'),
     (0xD80, 'X'),
-    (0xD82, 'V'),
+    (0xD81, 'V'),
     (0xD84, 'X'),
     (0xD85, 'V'),
     (0xD97, 'X'),
@@ -1355,12 +1353,12 @@ def _seg_12():
     (0xEA5, 'V'),
     (0xEA6, 'X'),
     (0xEA7, 'V'),
+    (0xEB3, 'M', u'ໍາ'),
+    (0xEB4, 'V'),
     ]
 
 def _seg_13():
     return [
-    (0xEB3, 'M', u'ໍາ'),
-    (0xEB4, 'V'),
     (0xEBE, 'X'),
     (0xEC0, 'V'),
     (0xEC5, 'X'),
@@ -1459,12 +1457,12 @@ def _seg_13():
     (0x12C8, 'V'),
     (0x12D7, 'X'),
     (0x12D8, 'V'),
+    (0x1311, 'X'),
+    (0x1312, 'V'),
     ]
 
 def _seg_14():
     return [
-    (0x1311, 'X'),
-    (0x1312, 'V'),
     (0x1316, 'X'),
     (0x1318, 'V'),
     (0x135B, 'X'),
@@ -1553,7 +1551,7 @@ def _seg_14():
     (0x1AA0, 'V'),
     (0x1AAE, 'X'),
     (0x1AB0, 'V'),
-    (0x1ABF, 'X'),
+    (0x1AC1, 'X'),
     (0x1B00, 'V'),
     (0x1B4C, 'X'),
     (0x1B50, 'V'),
@@ -1563,12 +1561,12 @@ def _seg_14():
     (0x1BFC, 'V'),
     (0x1C38, 'X'),
     (0x1C3B, 'V'),
+    (0x1C4A, 'X'),
+    (0x1C4D, 'V'),
     ]
 
 def _seg_15():
     return [
-    (0x1C4A, 'X'),
-    (0x1C4D, 'V'),
     (0x1C80, 'M', u'в'),
     (0x1C81, 'M', u'д'),
     (0x1C82, 'M', u'о'),
@@ -1667,12 +1665,12 @@ def _seg_15():
     (0x1D4E, 'V'),
     (0x1D4F, 'M', u'k'),
     (0x1D50, 'M', u'm'),
+    (0x1D51, 'M', u'Å‹'),
+    (0x1D52, 'M', u'o'),
     ]
 
 def _seg_16():
     return [
-    (0x1D51, 'M', u'Å‹'),
-    (0x1D52, 'M', u'o'),
     (0x1D53, 'M', u'É”'),
     (0x1D54, 'M', u'á´–'),
     (0x1D55, 'M', u'á´—'),
@@ -1771,12 +1769,12 @@ def _seg_16():
     (0x1E1C, 'M', u'ḝ'),
     (0x1E1D, 'V'),
     (0x1E1E, 'M', u'ḟ'),
+    (0x1E1F, 'V'),
+    (0x1E20, 'M', u'ḡ'),
     ]
 
 def _seg_17():
     return [
-    (0x1E1F, 'V'),
-    (0x1E20, 'M', u'ḡ'),
     (0x1E21, 'V'),
     (0x1E22, 'M', u'ḣ'),
     (0x1E23, 'V'),
@@ -1875,12 +1873,12 @@ def _seg_17():
     (0x1E80, 'M', u'ẁ'),
     (0x1E81, 'V'),
     (0x1E82, 'M', u'ẃ'),
+    (0x1E83, 'V'),
+    (0x1E84, 'M', u'ẅ'),
     ]
 
 def _seg_18():
     return [
-    (0x1E83, 'V'),
-    (0x1E84, 'M', u'ẅ'),
     (0x1E85, 'V'),
     (0x1E86, 'M', u'ẇ'),
     (0x1E87, 'V'),
@@ -1979,12 +1977,12 @@ def _seg_18():
     (0x1EE9, 'V'),
     (0x1EEA, 'M', u'ừ'),
     (0x1EEB, 'V'),
+    (0x1EEC, 'M', u'á»­'),
+    (0x1EED, 'V'),
     ]
 
 def _seg_19():
     return [
-    (0x1EEC, 'M', u'á»­'),
-    (0x1EED, 'V'),
     (0x1EEE, 'M', u'ữ'),
     (0x1EEF, 'V'),
     (0x1EF0, 'M', u'á»±'),
@@ -2083,12 +2081,12 @@ def _seg_19():
     (0x1F80, 'M', u'ἀι'),
     (0x1F81, 'M', u'ἁι'),
     (0x1F82, 'M', u'ἂι'),
+    (0x1F83, 'M', u'ἃι'),
+    (0x1F84, 'M', u'ἄι'),
     ]
 
 def _seg_20():
     return [
-    (0x1F83, 'M', u'ἃι'),
-    (0x1F84, 'M', u'ἄι'),
     (0x1F85, 'M', u'ἅι'),
     (0x1F86, 'M', u'ἆι'),
     (0x1F87, 'M', u'ἇι'),
@@ -2187,12 +2185,12 @@ def _seg_20():
     (0x1FEE, '3', u' ̈́'),
     (0x1FEF, '3', u'`'),
     (0x1FF0, 'X'),
+    (0x1FF2, 'M', u'ὼι'),
+    (0x1FF3, 'M', u'ωι'),
     ]
 
 def _seg_21():
     return [
-    (0x1FF2, 'M', u'ὼι'),
-    (0x1FF3, 'M', u'ωι'),
     (0x1FF4, 'M', u'ώι'),
     (0x1FF5, 'X'),
     (0x1FF6, 'V'),
@@ -2291,12 +2289,12 @@ def _seg_21():
     (0x20C0, 'X'),
     (0x20D0, 'V'),
     (0x20F1, 'X'),
+    (0x2100, '3', u'a/c'),
+    (0x2101, '3', u'a/s'),
     ]
 
 def _seg_22():
     return [
-    (0x2100, '3', u'a/c'),
-    (0x2101, '3', u'a/s'),
     (0x2102, 'M', u'c'),
     (0x2103, 'M', u'°c'),
     (0x2104, 'V'),
@@ -2395,12 +2393,12 @@ def _seg_22():
     (0x2175, 'M', u'vi'),
     (0x2176, 'M', u'vii'),
     (0x2177, 'M', u'viii'),
+    (0x2178, 'M', u'ix'),
+    (0x2179, 'M', u'x'),
     ]
 
 def _seg_23():
     return [
-    (0x2178, 'M', u'ix'),
-    (0x2179, 'M', u'x'),
     (0x217A, 'M', u'xi'),
     (0x217B, 'M', u'xii'),
     (0x217C, 'M', u'l'),
@@ -2499,12 +2497,12 @@ def _seg_23():
     (0x24B5, '3', u'(z)'),
     (0x24B6, 'M', u'a'),
     (0x24B7, 'M', u'b'),
+    (0x24B8, 'M', u'c'),
+    (0x24B9, 'M', u'd'),
     ]
 
 def _seg_24():
     return [
-    (0x24B8, 'M', u'c'),
-    (0x24B9, 'M', u'd'),
     (0x24BA, 'M', u'e'),
     (0x24BB, 'M', u'f'),
     (0x24BC, 'M', u'g'),
@@ -2566,7 +2564,7 @@ def _seg_24():
     (0x2B74, 'X'),
     (0x2B76, 'V'),
     (0x2B96, 'X'),
-    (0x2B98, 'V'),
+    (0x2B97, 'V'),
     (0x2C00, 'M', u'â°°'),
     (0x2C01, 'M', u'â°±'),
     (0x2C02, 'M', u'â°²'),
@@ -2603,12 +2601,12 @@ def _seg_24():
     (0x2C21, 'M', u'ⱑ'),
     (0x2C22, 'M', u'â±’'),
     (0x2C23, 'M', u'ⱓ'),
+    (0x2C24, 'M', u'â±”'),
+    (0x2C25, 'M', u'ⱕ'),
     ]
 
 def _seg_25():
     return [
-    (0x2C24, 'M', u'â±”'),
-    (0x2C25, 'M', u'ⱕ'),
     (0x2C26, 'M', u'â±–'),
     (0x2C27, 'M', u'â±—'),
     (0x2C28, 'M', u'ⱘ'),
@@ -2707,12 +2705,12 @@ def _seg_25():
     (0x2CBA, 'M', u'â²»'),
     (0x2CBB, 'V'),
     (0x2CBC, 'M', u'â²½'),
+    (0x2CBD, 'V'),
+    (0x2CBE, 'M', u'ⲿ'),
     ]
 
 def _seg_26():
     return [
-    (0x2CBD, 'V'),
-    (0x2CBE, 'M', u'ⲿ'),
     (0x2CBF, 'V'),
     (0x2CC0, 'M', u'ⳁ'),
     (0x2CC1, 'V'),
@@ -2787,7 +2785,7 @@ def _seg_26():
     (0x2DD8, 'V'),
     (0x2DDF, 'X'),
     (0x2DE0, 'V'),
-    (0x2E50, 'X'),
+    (0x2E53, 'X'),
     (0x2E80, 'V'),
     (0x2E9A, 'X'),
     (0x2E9B, 'V'),
@@ -2811,12 +2809,12 @@ def _seg_26():
     (0x2F0D, 'M', u'冖'),
     (0x2F0E, 'M', u'冫'),
     (0x2F0F, 'M', u'几'),
+    (0x2F10, 'M', u'凵'),
+    (0x2F11, 'M', u'刀'),
     ]
 
 def _seg_27():
     return [
-    (0x2F10, 'M', u'凵'),
-    (0x2F11, 'M', u'刀'),
     (0x2F12, 'M', u'力'),
     (0x2F13, 'M', u'勹'),
     (0x2F14, 'M', u'匕'),
@@ -2915,12 +2913,12 @@ def _seg_27():
     (0x2F71, 'M', u'禸'),
     (0x2F72, 'M', u'禾'),
     (0x2F73, 'M', u'ç©´'),
+    (0x2F74, 'M', u'ç«‹'),
+    (0x2F75, 'M', u'竹'),
     ]
 
 def _seg_28():
     return [
-    (0x2F74, 'M', u'ç«‹'),
-    (0x2F75, 'M', u'竹'),
     (0x2F76, 'M', u'ç±³'),
     (0x2F77, 'M', u'糸'),
     (0x2F78, 'M', u'ç¼¶'),
@@ -3019,12 +3017,12 @@ def _seg_28():
     (0x2FD5, 'M', u'é¾ '),
     (0x2FD6, 'X'),
     (0x3000, '3', u' '),
+    (0x3001, 'V'),
+    (0x3002, 'M', u'.'),
     ]
 
 def _seg_29():
     return [
-    (0x3001, 'V'),
-    (0x3002, 'M', u'.'),
     (0x3003, 'V'),
     (0x3036, 'M', u'〒'),
     (0x3037, 'V'),
@@ -3123,12 +3121,12 @@ def _seg_29():
     (0x317C, 'M', u'ᄯ'),
     (0x317D, 'M', u'ᄲ'),
     (0x317E, 'M', u'á„¶'),
+    (0x317F, 'M', u'á…€'),
+    (0x3180, 'M', u'á…‡'),
     ]
 
 def _seg_30():
     return [
-    (0x317F, 'M', u'á…€'),
-    (0x3180, 'M', u'á…‡'),
     (0x3181, 'M', u'ᅌ'),
     (0x3182, 'M', u'ᇱ'),
     (0x3183, 'M', u'ᇲ'),
@@ -3160,8 +3158,6 @@ def _seg_30():
     (0x319E, 'M', u'地'),
     (0x319F, 'M', u'人'),
     (0x31A0, 'V'),
-    (0x31BB, 'X'),
-    (0x31C0, 'V'),
     (0x31E4, 'X'),
     (0x31F0, 'V'),
     (0x3200, '3', u'(á„€)'),
@@ -3227,14 +3223,14 @@ def _seg_30():
     (0x323C, '3', u'(監)'),
     (0x323D, '3', u'(企)'),
     (0x323E, '3', u'(資)'),
-    ]
-
-def _seg_31():
-    return [
     (0x323F, '3', u'(協)'),
     (0x3240, '3', u'(祭)'),
     (0x3241, '3', u'(休)'),
     (0x3242, '3', u'(自)'),
+    ]
+
+def _seg_31():
+    return [
     (0x3243, '3', u'(至)'),
     (0x3244, 'M', u'問'),
     (0x3245, 'M', u'å¹¼'),
@@ -3331,14 +3327,14 @@ def _seg_31():
     (0x32A7, 'M', u'å·¦'),
     (0x32A8, 'M', u'右'),
     (0x32A9, 'M', u'医'),
-    ]
-
-def _seg_32():
-    return [
     (0x32AA, 'M', u'å®—'),
     (0x32AB, 'M', u'å­¦'),
     (0x32AC, 'M', u'監'),
     (0x32AD, 'M', u'企'),
+    ]
+
+def _seg_32():
+    return [
     (0x32AE, 'M', u'資'),
     (0x32AF, 'M', u'協'),
     (0x32B0, 'M', u'夜'),
@@ -3435,14 +3431,14 @@ def _seg_32():
     (0x330B, 'M', u'カイリ'),
     (0x330C, 'M', u'カラット'),
     (0x330D, 'M', u'カロリー'),
-    ]
-
-def _seg_33():
-    return [
     (0x330E, 'M', u'ガロン'),
     (0x330F, 'M', u'ガンマ'),
     (0x3310, 'M', u'ギガ'),
     (0x3311, 'M', u'ギニー'),
+    ]
+
+def _seg_33():
+    return [
     (0x3312, 'M', u'キュリー'),
     (0x3313, 'M', u'ギルダー'),
     (0x3314, 'M', u'キロ'),
@@ -3539,14 +3535,14 @@ def _seg_33():
     (0x336F, 'M', u'23点'),
     (0x3370, 'M', u'24点'),
     (0x3371, 'M', u'hpa'),
-    ]
-
-def _seg_34():
-    return [
     (0x3372, 'M', u'da'),
     (0x3373, 'M', u'au'),
     (0x3374, 'M', u'bar'),
     (0x3375, 'M', u'ov'),
+    ]
+
+def _seg_34():
+    return [
     (0x3376, 'M', u'pc'),
     (0x3377, 'M', u'dm'),
     (0x3378, 'M', u'dm2'),
@@ -3643,14 +3639,14 @@ def _seg_34():
     (0x33D3, 'M', u'lx'),
     (0x33D4, 'M', u'mb'),
     (0x33D5, 'M', u'mil'),
-    ]
-
-def _seg_35():
-    return [
     (0x33D6, 'M', u'mol'),
     (0x33D7, 'M', u'ph'),
     (0x33D8, 'X'),
     (0x33D9, 'M', u'ppm'),
+    ]
+
+def _seg_35():
+    return [
     (0x33DA, 'M', u'pr'),
     (0x33DB, 'M', u'sr'),
     (0x33DC, 'M', u'sv'),
@@ -3690,9 +3686,7 @@ def _seg_35():
     (0x33FE, 'M', u'31æ—¥'),
     (0x33FF, 'M', u'gal'),
     (0x3400, 'V'),
-    (0x4DB6, 'X'),
-    (0x4DC0, 'V'),
-    (0x9FF0, 'X'),
+    (0x9FFD, 'X'),
     (0xA000, 'V'),
     (0xA48D, 'X'),
     (0xA490, 'V'),
@@ -3747,16 +3741,16 @@ def _seg_35():
     (0xA66D, 'V'),
     (0xA680, 'M', u'ꚁ'),
     (0xA681, 'V'),
-    ]
-
-def _seg_36():
-    return [
     (0xA682, 'M', u'ꚃ'),
     (0xA683, 'V'),
     (0xA684, 'M', u'êš…'),
     (0xA685, 'V'),
     (0xA686, 'M', u'ꚇ'),
     (0xA687, 'V'),
+    ]
+
+def _seg_36():
+    return [
     (0xA688, 'M', u'ꚉ'),
     (0xA689, 'V'),
     (0xA68A, 'M', u'êš‹'),
@@ -3851,16 +3845,16 @@ def _seg_36():
     (0xA766, 'M', u'ꝧ'),
     (0xA767, 'V'),
     (0xA768, 'M', u'ꝩ'),
-    ]
-
-def _seg_37():
-    return [
     (0xA769, 'V'),
     (0xA76A, 'M', u'ꝫ'),
     (0xA76B, 'V'),
     (0xA76C, 'M', u'ꝭ'),
     (0xA76D, 'V'),
     (0xA76E, 'M', u'ꝯ'),
+    ]
+
+def _seg_37():
+    return [
     (0xA76F, 'V'),
     (0xA770, 'M', u'ꝯ'),
     (0xA771, 'V'),
@@ -3935,12 +3929,17 @@ def _seg_37():
     (0xA7C4, 'M', u'êž”'),
     (0xA7C5, 'M', u'Ê‚'),
     (0xA7C6, 'M', u'á¶Ž'),
-    (0xA7C7, 'X'),
-    (0xA7F7, 'V'),
+    (0xA7C7, 'M', u'ꟈ'),
+    (0xA7C8, 'V'),
+    (0xA7C9, 'M', u'ꟊ'),
+    (0xA7CA, 'V'),
+    (0xA7CB, 'X'),
+    (0xA7F5, 'M', u'ꟶ'),
+    (0xA7F6, 'V'),
     (0xA7F8, 'M', u'ħ'),
     (0xA7F9, 'M', u'Å“'),
     (0xA7FA, 'V'),
-    (0xA82C, 'X'),
+    (0xA82D, 'X'),
     (0xA830, 'V'),
     (0xA83A, 'X'),
     (0xA840, 'V'),
@@ -3955,11 +3954,11 @@ def _seg_37():
     (0xA97D, 'X'),
     (0xA980, 'V'),
     (0xA9CE, 'X'),
+    (0xA9CF, 'V'),
     ]
 
 def _seg_38():
     return [
-    (0xA9CF, 'V'),
     (0xA9DA, 'X'),
     (0xA9DE, 'V'),
     (0xA9FF, 'X'),
@@ -3989,7 +3988,9 @@ def _seg_38():
     (0xAB5E, 'M', u'É«'),
     (0xAB5F, 'M', u'ê­’'),
     (0xAB60, 'V'),
-    (0xAB68, 'X'),
+    (0xAB69, 'M', u'ʍ'),
+    (0xAB6A, 'V'),
+    (0xAB6C, 'X'),
     (0xAB70, 'M', u'Ꭰ'),
     (0xAB71, 'M', u'Ꭱ'),
     (0xAB72, 'M', u'Ꭲ'),
@@ -4058,11 +4059,11 @@ def _seg_38():
     (0xABB1, 'M', u'Ꮱ'),
     (0xABB2, 'M', u'Ꮲ'),
     (0xABB3, 'M', u'Ꮳ'),
-    (0xABB4, 'M', u'Ꮴ'),
     ]
 
 def _seg_39():
     return [
+    (0xABB4, 'M', u'Ꮴ'),
     (0xABB5, 'M', u'Ꮵ'),
     (0xABB6, 'M', u'Ꮶ'),
     (0xABB7, 'M', u'Ꮷ'),
@@ -4162,11 +4163,11 @@ def _seg_39():
     (0xF94C, 'M', u'樓'),
     (0xF94D, 'M', u'æ·š'),
     (0xF94E, 'M', u'漏'),
-    (0xF94F, 'M', u'ç´¯'),
     ]
 
 def _seg_40():
     return [
+    (0xF94F, 'M', u'ç´¯'),
     (0xF950, 'M', u'縷'),
     (0xF951, 'M', u'陋'),
     (0xF952, 'M', u'å‹’'),
@@ -4266,11 +4267,11 @@ def _seg_40():
     (0xF9B0, 'M', u'聆'),
     (0xF9B1, 'M', u'鈴'),
     (0xF9B2, 'M', u'é›¶'),
-    (0xF9B3, 'M', u'靈'),
     ]
 
 def _seg_41():
     return [
+    (0xF9B3, 'M', u'靈'),
     (0xF9B4, 'M', u'é ˜'),
     (0xF9B5, 'M', u'例'),
     (0xF9B6, 'M', u'禮'),
@@ -4370,11 +4371,11 @@ def _seg_41():
     (0xFA16, 'M', u'猪'),
     (0xFA17, 'M', u'益'),
     (0xFA18, 'M', u'礼'),
-    (0xFA19, 'M', u'神'),
     ]
 
 def _seg_42():
     return [
+    (0xFA19, 'M', u'神'),
     (0xFA1A, 'M', u'祥'),
     (0xFA1B, 'M', u'福'),
     (0xFA1C, 'M', u'靖'),
@@ -4474,11 +4475,11 @@ def _seg_42():
     (0xFA7F, 'M', u'奔'),
     (0xFA80, 'M', u'å©¢'),
     (0xFA81, 'M', u'嬨'),
-    (0xFA82, 'M', u'å»’'),
     ]
 
 def _seg_43():
     return [
+    (0xFA82, 'M', u'å»’'),
     (0xFA83, 'M', u'å»™'),
     (0xFA84, 'M', u'彩'),
     (0xFA85, 'M', u'å¾­'),
@@ -4578,11 +4579,11 @@ def _seg_43():
     (0xFB14, 'M', u'Õ´Õ¥'),
     (0xFB15, 'M', u'Õ´Õ«'),
     (0xFB16, 'M', u'Õ¾Õ¶'),
-    (0xFB17, 'M', u'Õ´Õ­'),
     ]
 
 def _seg_44():
     return [
+    (0xFB17, 'M', u'Õ´Õ­'),
     (0xFB18, 'X'),
     (0xFB1D, 'M', u'×™Ö´'),
     (0xFB1E, 'V'),
@@ -4682,11 +4683,11 @@ def _seg_44():
     (0xFBEE, 'M', u'ئو'),
     (0xFBF0, 'M', u'ئۇ'),
     (0xFBF2, 'M', u'ئۆ'),
-    (0xFBF4, 'M', u'ئۈ'),
     ]
 
 def _seg_45():
     return [
+    (0xFBF4, 'M', u'ئۈ'),
     (0xFBF6, 'M', u'ئې'),
     (0xFBF9, 'M', u'ئى'),
     (0xFBFC, 'M', u'ی'),
@@ -4786,11 +4787,11 @@ def _seg_45():
     (0xFC5D, 'M', u'ىٰ'),
     (0xFC5E, '3', u' ٌّ'),
     (0xFC5F, '3', u' ٍّ'),
-    (0xFC60, '3', u' ÙŽÙ‘'),
     ]
 
 def _seg_46():
     return [
+    (0xFC60, '3', u' ÙŽÙ‘'),
     (0xFC61, '3', u' ُّ'),
     (0xFC62, '3', u' ِّ'),
     (0xFC63, '3', u' ّٰ'),
@@ -4890,11 +4891,11 @@ def _seg_46():
     (0xFCC1, 'M', u'فم'),
     (0xFCC2, 'M', u'قح'),
     (0xFCC3, 'M', u'قم'),
-    (0xFCC4, 'M', u'كج'),
     ]
 
 def _seg_47():
     return [
+    (0xFCC4, 'M', u'كج'),
     (0xFCC5, 'M', u'كح'),
     (0xFCC6, 'M', u'كخ'),
     (0xFCC7, 'M', u'كل'),
@@ -4994,11 +4995,11 @@ def _seg_47():
     (0xFD25, 'M', u'شج'),
     (0xFD26, 'M', u'شح'),
     (0xFD27, 'M', u'شخ'),
-    (0xFD28, 'M', u'شم'),
     ]
 
 def _seg_48():
     return [
+    (0xFD28, 'M', u'شم'),
     (0xFD29, 'M', u'شر'),
     (0xFD2A, 'M', u'سر'),
     (0xFD2B, 'M', u'صر'),
@@ -5098,11 +5099,11 @@ def _seg_48():
     (0xFDAC, 'M', u'لجي'),
     (0xFDAD, 'M', u'لمي'),
     (0xFDAE, 'M', u'يحي'),
-    (0xFDAF, 'M', u'يجي'),
     ]
 
 def _seg_49():
     return [
+    (0xFDAF, 'M', u'يجي'),
     (0xFDB0, 'M', u'يمي'),
     (0xFDB1, 'M', u'ممي'),
     (0xFDB2, 'M', u'قمي'),
@@ -5202,11 +5203,11 @@ def _seg_49():
     (0xFE64, '3', u'<'),
     (0xFE65, '3', u'>'),
     (0xFE66, '3', u'='),
-    (0xFE67, 'X'),
     ]
 
 def _seg_50():
     return [
+    (0xFE67, 'X'),
     (0xFE68, '3', u'\\'),
     (0xFE69, '3', u'$'),
     (0xFE6A, '3', u'%'),
@@ -5306,11 +5307,11 @@ def _seg_50():
     (0xFF21, 'M', u'a'),
     (0xFF22, 'M', u'b'),
     (0xFF23, 'M', u'c'),
-    (0xFF24, 'M', u'd'),
     ]
 
 def _seg_51():
     return [
+    (0xFF24, 'M', u'd'),
     (0xFF25, 'M', u'e'),
     (0xFF26, 'M', u'f'),
     (0xFF27, 'M', u'g'),
@@ -5410,11 +5411,11 @@ def _seg_51():
     (0xFF85, 'M', u'ナ'),
     (0xFF86, 'M', u'ニ'),
     (0xFF87, 'M', u'ヌ'),
-    (0xFF88, 'M', u'ネ'),
     ]
 
 def _seg_52():
     return [
+    (0xFF88, 'M', u'ネ'),
     (0xFF89, 'M', u'ノ'),
     (0xFF8A, 'M', u'ハ'),
     (0xFF8B, 'M', u'ヒ'),
@@ -5514,11 +5515,11 @@ def _seg_52():
     (0x10000, 'V'),
     (0x1000C, 'X'),
     (0x1000D, 'V'),
-    (0x10027, 'X'),
     ]
 
 def _seg_53():
     return [
+    (0x10027, 'X'),
     (0x10028, 'V'),
     (0x1003B, 'X'),
     (0x1003C, 'V'),
@@ -5536,7 +5537,7 @@ def _seg_53():
     (0x10137, 'V'),
     (0x1018F, 'X'),
     (0x10190, 'V'),
-    (0x1019C, 'X'),
+    (0x1019D, 'X'),
     (0x101A0, 'V'),
     (0x101A1, 'X'),
     (0x101D0, 'V'),
@@ -5618,11 +5619,11 @@ def _seg_53():
     (0x104BC, 'M', u'𐓤'),
     (0x104BD, 'M', u'𐓥'),
     (0x104BE, 'M', u'𐓦'),
-    (0x104BF, 'M', u'𐓧'),
     ]
 
 def _seg_54():
     return [
+    (0x104BF, 'M', u'𐓧'),
     (0x104C0, 'M', u'𐓨'),
     (0x104C1, 'M', u'𐓩'),
     (0x104C2, 'M', u'𐓪'),
@@ -5722,11 +5723,11 @@ def _seg_54():
     (0x10B9D, 'X'),
     (0x10BA9, 'V'),
     (0x10BB0, 'X'),
-    (0x10C00, 'V'),
     ]
 
 def _seg_55():
     return [
+    (0x10C00, 'V'),
     (0x10C49, 'X'),
     (0x10C80, 'M', u'𐳀'),
     (0x10C81, 'M', u'𐳁'),
@@ -5788,10 +5789,18 @@ def _seg_55():
     (0x10D3A, 'X'),
     (0x10E60, 'V'),
     (0x10E7F, 'X'),
+    (0x10E80, 'V'),
+    (0x10EAA, 'X'),
+    (0x10EAB, 'V'),
+    (0x10EAE, 'X'),
+    (0x10EB0, 'V'),
+    (0x10EB2, 'X'),
     (0x10F00, 'V'),
     (0x10F28, 'X'),
     (0x10F30, 'V'),
     (0x10F5A, 'X'),
+    (0x10FB0, 'V'),
+    (0x10FCC, 'X'),
     (0x10FE0, 'V'),
     (0x10FF7, 'X'),
     (0x11000, 'V'),
@@ -5809,17 +5818,19 @@ def _seg_55():
     (0x11100, 'V'),
     (0x11135, 'X'),
     (0x11136, 'V'),
-    (0x11147, 'X'),
+    (0x11148, 'X'),
     (0x11150, 'V'),
     (0x11177, 'X'),
     (0x11180, 'V'),
-    (0x111CE, 'X'),
-    (0x111D0, 'V'),
     (0x111E0, 'X'),
     (0x111E1, 'V'),
     (0x111F5, 'X'),
     (0x11200, 'V'),
     (0x11212, 'X'),
+    ]
+
+def _seg_56():
+    return [
     (0x11213, 'V'),
     (0x1123F, 'X'),
     (0x11280, 'V'),
@@ -5827,10 +5838,6 @@ def _seg_55():
     (0x11288, 'V'),
     (0x11289, 'X'),
     (0x1128A, 'V'),
-    ]
-
-def _seg_56():
-    return [
     (0x1128E, 'X'),
     (0x1128F, 'V'),
     (0x1129E, 'X'),
@@ -5871,11 +5878,9 @@ def _seg_56():
     (0x11370, 'V'),
     (0x11375, 'X'),
     (0x11400, 'V'),
-    (0x1145A, 'X'),
-    (0x1145B, 'V'),
     (0x1145C, 'X'),
     (0x1145D, 'V'),
-    (0x11460, 'X'),
+    (0x11462, 'X'),
     (0x11480, 'V'),
     (0x114C8, 'X'),
     (0x114D0, 'V'),
@@ -5926,22 +5931,36 @@ def _seg_56():
     (0x118B5, 'M', u'𑣕'),
     (0x118B6, 'M', u'ð‘£–'),
     (0x118B7, 'M', u'ð‘£—'),
+    ]
+
+def _seg_57():
+    return [
     (0x118B8, 'M', u'𑣘'),
     (0x118B9, 'M', u'ð‘£™'),
     (0x118BA, 'M', u'𑣚'),
     (0x118BB, 'M', u'ð‘£›'),
     (0x118BC, 'M', u'𑣜'),
-    ]
-
-def _seg_57():
-    return [
     (0x118BD, 'M', u'𑣝'),
     (0x118BE, 'M', u'𑣞'),
     (0x118BF, 'M', u'𑣟'),
     (0x118C0, 'V'),
     (0x118F3, 'X'),
     (0x118FF, 'V'),
-    (0x11900, 'X'),
+    (0x11907, 'X'),
+    (0x11909, 'V'),
+    (0x1190A, 'X'),
+    (0x1190C, 'V'),
+    (0x11914, 'X'),
+    (0x11915, 'V'),
+    (0x11917, 'X'),
+    (0x11918, 'V'),
+    (0x11936, 'X'),
+    (0x11937, 'V'),
+    (0x11939, 'X'),
+    (0x1193B, 'V'),
+    (0x11947, 'X'),
+    (0x11950, 'V'),
+    (0x1195A, 'X'),
     (0x119A0, 'V'),
     (0x119A8, 'X'),
     (0x119AA, 'V'),
@@ -5996,6 +6015,8 @@ def _seg_57():
     (0x11DAA, 'X'),
     (0x11EE0, 'V'),
     (0x11EF9, 'X'),
+    (0x11FB0, 'V'),
+    (0x11FB1, 'X'),
     (0x11FC0, 'V'),
     (0x11FF2, 'X'),
     (0x11FFF, 'V'),
@@ -6014,6 +6035,10 @@ def _seg_57():
     (0x16A39, 'X'),
     (0x16A40, 'V'),
     (0x16A5F, 'X'),
+    ]
+
+def _seg_58():
+    return [
     (0x16A60, 'V'),
     (0x16A6A, 'X'),
     (0x16A6E, 'V'),
@@ -6035,10 +6060,6 @@ def _seg_57():
     (0x16E40, 'M', u'ð–¹ '),
     (0x16E41, 'M', u'𖹡'),
     (0x16E42, 'M', u'ð–¹¢'),
-    ]
-
-def _seg_58():
-    return [
     (0x16E43, 'M', u'ð–¹£'),
     (0x16E44, 'M', u'𖹤'),
     (0x16E45, 'M', u'ð–¹¥'),
@@ -6077,11 +6098,15 @@ def _seg_58():
     (0x16F8F, 'V'),
     (0x16FA0, 'X'),
     (0x16FE0, 'V'),
-    (0x16FE4, 'X'),
+    (0x16FE5, 'X'),
+    (0x16FF0, 'V'),
+    (0x16FF2, 'X'),
     (0x17000, 'V'),
     (0x187F8, 'X'),
     (0x18800, 'V'),
-    (0x18AF3, 'X'),
+    (0x18CD6, 'X'),
+    (0x18D00, 'V'),
+    (0x18D09, 'X'),
     (0x1B000, 'V'),
     (0x1B11F, 'X'),
     (0x1B150, 'V'),
@@ -6114,6 +6139,10 @@ def _seg_58():
     (0x1D163, 'M', u'𝅘𝅥𝅱'),
     (0x1D164, 'M', u'𝅘𝅥𝅲'),
     (0x1D165, 'V'),
+    ]
+
+def _seg_59():
+    return [
     (0x1D173, 'X'),
     (0x1D17B, 'V'),
     (0x1D1BB, 'M', u'𝆹𝅥'),
@@ -6139,10 +6168,6 @@ def _seg_58():
     (0x1D404, 'M', u'e'),
     (0x1D405, 'M', u'f'),
     (0x1D406, 'M', u'g'),
-    ]
-
-def _seg_59():
-    return [
     (0x1D407, 'M', u'h'),
     (0x1D408, 'M', u'i'),
     (0x1D409, 'M', u'j'),
@@ -6218,6 +6243,10 @@ def _seg_59():
     (0x1D44F, 'M', u'b'),
     (0x1D450, 'M', u'c'),
     (0x1D451, 'M', u'd'),
+    ]
+
+def _seg_60():
+    return [
     (0x1D452, 'M', u'e'),
     (0x1D453, 'M', u'f'),
     (0x1D454, 'M', u'g'),
@@ -6243,10 +6272,6 @@ def _seg_59():
     (0x1D468, 'M', u'a'),
     (0x1D469, 'M', u'b'),
     (0x1D46A, 'M', u'c'),
-    ]
-
-def _seg_60():
-    return [
     (0x1D46B, 'M', u'd'),
     (0x1D46C, 'M', u'e'),
     (0x1D46D, 'M', u'f'),
@@ -6322,6 +6347,10 @@ def _seg_60():
     (0x1D4B6, 'M', u'a'),
     (0x1D4B7, 'M', u'b'),
     (0x1D4B8, 'M', u'c'),
+    ]
+
+def _seg_61():
+    return [
     (0x1D4B9, 'M', u'd'),
     (0x1D4BA, 'X'),
     (0x1D4BB, 'M', u'f'),
@@ -6347,10 +6376,6 @@ def _seg_60():
     (0x1D4CF, 'M', u'z'),
     (0x1D4D0, 'M', u'a'),
     (0x1D4D1, 'M', u'b'),
-    ]
-
-def _seg_61():
-    return [
     (0x1D4D2, 'M', u'c'),
     (0x1D4D3, 'M', u'd'),
     (0x1D4D4, 'M', u'e'),
@@ -6426,6 +6451,10 @@ def _seg_61():
     (0x1D51B, 'M', u'x'),
     (0x1D51C, 'M', u'y'),
     (0x1D51D, 'X'),
+    ]
+
+def _seg_62():
+    return [
     (0x1D51E, 'M', u'a'),
     (0x1D51F, 'M', u'b'),
     (0x1D520, 'M', u'c'),
@@ -6451,10 +6480,6 @@ def _seg_61():
     (0x1D534, 'M', u'w'),
     (0x1D535, 'M', u'x'),
     (0x1D536, 'M', u'y'),
-    ]
-
-def _seg_62():
-    return [
     (0x1D537, 'M', u'z'),
     (0x1D538, 'M', u'a'),
     (0x1D539, 'M', u'b'),
@@ -6530,6 +6555,10 @@ def _seg_62():
     (0x1D581, 'M', u'v'),
     (0x1D582, 'M', u'w'),
     (0x1D583, 'M', u'x'),
+    ]
+
+def _seg_63():
+    return [
     (0x1D584, 'M', u'y'),
     (0x1D585, 'M', u'z'),
     (0x1D586, 'M', u'a'),
@@ -6555,10 +6584,6 @@ def _seg_62():
     (0x1D59A, 'M', u'u'),
     (0x1D59B, 'M', u'v'),
     (0x1D59C, 'M', u'w'),
-    ]
-
-def _seg_63():
-    return [
     (0x1D59D, 'M', u'x'),
     (0x1D59E, 'M', u'y'),
     (0x1D59F, 'M', u'z'),
@@ -6634,6 +6659,10 @@ def _seg_63():
     (0x1D5E5, 'M', u'r'),
     (0x1D5E6, 'M', u's'),
     (0x1D5E7, 'M', u't'),
+    ]
+
+def _seg_64():
+    return [
     (0x1D5E8, 'M', u'u'),
     (0x1D5E9, 'M', u'v'),
     (0x1D5EA, 'M', u'w'),
@@ -6659,10 +6688,6 @@ def _seg_63():
     (0x1D5FE, 'M', u'q'),
     (0x1D5FF, 'M', u'r'),
     (0x1D600, 'M', u's'),
-    ]
-
-def _seg_64():
-    return [
     (0x1D601, 'M', u't'),
     (0x1D602, 'M', u'u'),
     (0x1D603, 'M', u'v'),
@@ -6738,6 +6763,10 @@ def _seg_64():
     (0x1D649, 'M', u'n'),
     (0x1D64A, 'M', u'o'),
     (0x1D64B, 'M', u'p'),
+    ]
+
+def _seg_65():
+    return [
     (0x1D64C, 'M', u'q'),
     (0x1D64D, 'M', u'r'),
     (0x1D64E, 'M', u's'),
@@ -6763,10 +6792,6 @@ def _seg_64():
     (0x1D662, 'M', u'm'),
     (0x1D663, 'M', u'n'),
     (0x1D664, 'M', u'o'),
-    ]
-
-def _seg_65():
-    return [
     (0x1D665, 'M', u'p'),
     (0x1D666, 'M', u'q'),
     (0x1D667, 'M', u'r'),
@@ -6842,6 +6867,10 @@ def _seg_65():
     (0x1D6AE, 'M', u'η'),
     (0x1D6AF, 'M', u'θ'),
     (0x1D6B0, 'M', u'ι'),
+    ]
+
+def _seg_66():
+    return [
     (0x1D6B1, 'M', u'κ'),
     (0x1D6B2, 'M', u'λ'),
     (0x1D6B3, 'M', u'μ'),
@@ -6867,10 +6896,6 @@ def _seg_65():
     (0x1D6C7, 'M', u'ζ'),
     (0x1D6C8, 'M', u'η'),
     (0x1D6C9, 'M', u'θ'),
-    ]
-
-def _seg_66():
-    return [
     (0x1D6CA, 'M', u'ι'),
     (0x1D6CB, 'M', u'κ'),
     (0x1D6CC, 'M', u'λ'),
@@ -6946,6 +6971,10 @@ def _seg_66():
     (0x1D714, 'M', u'ω'),
     (0x1D715, 'M', u'∂'),
     (0x1D716, 'M', u'ε'),
+    ]
+
+def _seg_67():
+    return [
     (0x1D717, 'M', u'θ'),
     (0x1D718, 'M', u'κ'),
     (0x1D719, 'M', u'φ'),
@@ -6971,10 +7000,6 @@ def _seg_66():
     (0x1D72D, 'M', u'θ'),
     (0x1D72E, 'M', u'σ'),
     (0x1D72F, 'M', u'Ï„'),
-    ]
-
-def _seg_67():
-    return [
     (0x1D730, 'M', u'Ï…'),
     (0x1D731, 'M', u'φ'),
     (0x1D732, 'M', u'χ'),
@@ -7050,6 +7075,10 @@ def _seg_67():
     (0x1D779, 'M', u'κ'),
     (0x1D77A, 'M', u'λ'),
     (0x1D77B, 'M', u'μ'),
+    ]
+
+def _seg_68():
+    return [
     (0x1D77C, 'M', u'ν'),
     (0x1D77D, 'M', u'ξ'),
     (0x1D77E, 'M', u'ο'),
@@ -7075,10 +7104,6 @@ def _seg_67():
     (0x1D793, 'M', u'δ'),
     (0x1D794, 'M', u'ε'),
     (0x1D795, 'M', u'ζ'),
-    ]
-
-def _seg_68():
-    return [
     (0x1D796, 'M', u'η'),
     (0x1D797, 'M', u'θ'),
     (0x1D798, 'M', u'ι'),
@@ -7154,6 +7179,10 @@ def _seg_68():
     (0x1D7E1, 'M', u'9'),
     (0x1D7E2, 'M', u'0'),
     (0x1D7E3, 'M', u'1'),
+    ]
+
+def _seg_69():
+    return [
     (0x1D7E4, 'M', u'2'),
     (0x1D7E5, 'M', u'3'),
     (0x1D7E6, 'M', u'4'),
@@ -7179,10 +7208,6 @@ def _seg_68():
     (0x1D7FA, 'M', u'4'),
     (0x1D7FB, 'M', u'5'),
     (0x1D7FC, 'M', u'6'),
-    ]
-
-def _seg_69():
-    return [
     (0x1D7FD, 'M', u'7'),
     (0x1D7FE, 'M', u'8'),
     (0x1D7FF, 'M', u'9'),
@@ -7258,6 +7283,10 @@ def _seg_69():
     (0x1E95A, 'X'),
     (0x1E95E, 'V'),
     (0x1E960, 'X'),
+    ]
+
+def _seg_70():
+    return [
     (0x1EC71, 'V'),
     (0x1ECB5, 'X'),
     (0x1ED01, 'V'),
@@ -7283,10 +7312,6 @@ def _seg_69():
     (0x1EE12, 'M', u'Ù‚'),
     (0x1EE13, 'M', u'ر'),
     (0x1EE14, 'M', u'Ø´'),
-    ]
-
-def _seg_70():
-    return [
     (0x1EE15, 'M', u'ت'),
     (0x1EE16, 'M', u'Ø«'),
     (0x1EE17, 'M', u'Ø®'),
@@ -7362,6 +7387,10 @@ def _seg_70():
     (0x1EE68, 'M', u'Ø·'),
     (0x1EE69, 'M', u'ÙŠ'),
     (0x1EE6A, 'M', u'Ùƒ'),
+    ]
+
+def _seg_71():
+    return [
     (0x1EE6B, 'X'),
     (0x1EE6C, 'M', u'Ù…'),
     (0x1EE6D, 'M', u'Ù†'),
@@ -7387,10 +7416,6 @@ def _seg_70():
     (0x1EE81, 'M', u'ب'),
     (0x1EE82, 'M', u'ج'),
     (0x1EE83, 'M', u'د'),
-    ]
-
-def _seg_71():
-    return [
     (0x1EE84, 'M', u'Ù‡'),
     (0x1EE85, 'M', u'Ùˆ'),
     (0x1EE86, 'M', u'ز'),
@@ -7466,10 +7491,13 @@ def _seg_71():
     (0x1F106, '3', u'5,'),
     (0x1F107, '3', u'6,'),
     (0x1F108, '3', u'7,'),
+    ]
+
+def _seg_72():
+    return [
     (0x1F109, '3', u'8,'),
     (0x1F10A, '3', u'9,'),
     (0x1F10B, 'V'),
-    (0x1F10D, 'X'),
     (0x1F110, '3', u'(a)'),
     (0x1F111, '3', u'(b)'),
     (0x1F112, '3', u'(c)'),
@@ -7491,10 +7519,6 @@ def _seg_71():
     (0x1F122, '3', u'(s)'),
     (0x1F123, '3', u'(t)'),
     (0x1F124, '3', u'(u)'),
-    ]
-
-def _seg_72():
-    return [
     (0x1F125, '3', u'(v)'),
     (0x1F126, '3', u'(w)'),
     (0x1F127, '3', u'(x)'),
@@ -7542,11 +7566,10 @@ def _seg_72():
     (0x1F16A, 'M', u'mc'),
     (0x1F16B, 'M', u'md'),
     (0x1F16C, 'M', u'mr'),
-    (0x1F16D, 'X'),
-    (0x1F170, 'V'),
+    (0x1F16D, 'V'),
     (0x1F190, 'M', u'dj'),
     (0x1F191, 'V'),
-    (0x1F1AD, 'X'),
+    (0x1F1AE, 'X'),
     (0x1F1E6, 'V'),
     (0x1F200, 'M', u'ほか'),
     (0x1F201, 'M', u'ココ'),
@@ -7572,6 +7595,10 @@ def _seg_72():
     (0x1F221, 'M', u'終'),
     (0x1F222, 'M', u'生'),
     (0x1F223, 'M', u'販'),
+    ]
+
+def _seg_73():
+    return [
     (0x1F224, 'M', u'声'),
     (0x1F225, 'M', u'吹'),
     (0x1F226, 'M', u'æ¼”'),
@@ -7595,10 +7622,6 @@ def _seg_72():
     (0x1F238, 'M', u'申'),
     (0x1F239, 'M', u'割'),
     (0x1F23A, 'M', u'å–¶'),
-    ]
-
-def _seg_73():
-    return [
     (0x1F23B, 'M', u'配'),
     (0x1F23C, 'X'),
     (0x1F240, 'M', u'〔本〕'),
@@ -7617,11 +7640,11 @@ def _seg_73():
     (0x1F260, 'V'),
     (0x1F266, 'X'),
     (0x1F300, 'V'),
-    (0x1F6D6, 'X'),
+    (0x1F6D8, 'X'),
     (0x1F6E0, 'V'),
     (0x1F6ED, 'X'),
     (0x1F6F0, 'V'),
-    (0x1F6FB, 'X'),
+    (0x1F6FD, 'X'),
     (0x1F700, 'V'),
     (0x1F774, 'X'),
     (0x1F780, 'V'),
@@ -7638,32 +7661,51 @@ def _seg_73():
     (0x1F888, 'X'),
     (0x1F890, 'V'),
     (0x1F8AE, 'X'),
+    (0x1F8B0, 'V'),
+    (0x1F8B2, 'X'),
     (0x1F900, 'V'),
-    (0x1F90C, 'X'),
-    (0x1F90D, 'V'),
-    (0x1F972, 'X'),
-    (0x1F973, 'V'),
-    (0x1F977, 'X'),
+    (0x1F979, 'X'),
     (0x1F97A, 'V'),
-    (0x1F9A3, 'X'),
-    (0x1F9A5, 'V'),
-    (0x1F9AB, 'X'),
-    (0x1F9AE, 'V'),
-    (0x1F9CB, 'X'),
+    (0x1F9CC, 'X'),
     (0x1F9CD, 'V'),
     (0x1FA54, 'X'),
     (0x1FA60, 'V'),
     (0x1FA6E, 'X'),
     (0x1FA70, 'V'),
-    (0x1FA74, 'X'),
+    (0x1FA75, 'X'),
     (0x1FA78, 'V'),
     (0x1FA7B, 'X'),
     (0x1FA80, 'V'),
-    (0x1FA83, 'X'),
+    (0x1FA87, 'X'),
     (0x1FA90, 'V'),
-    (0x1FA96, 'X'),
+    (0x1FAA9, 'X'),
+    (0x1FAB0, 'V'),
+    (0x1FAB7, 'X'),
+    (0x1FAC0, 'V'),
+    (0x1FAC3, 'X'),
+    (0x1FAD0, 'V'),
+    (0x1FAD7, 'X'),
+    (0x1FB00, 'V'),
+    (0x1FB93, 'X'),
+    (0x1FB94, 'V'),
+    (0x1FBCB, 'X'),
+    (0x1FBF0, 'M', u'0'),
+    (0x1FBF1, 'M', u'1'),
+    (0x1FBF2, 'M', u'2'),
+    (0x1FBF3, 'M', u'3'),
+    (0x1FBF4, 'M', u'4'),
+    (0x1FBF5, 'M', u'5'),
+    (0x1FBF6, 'M', u'6'),
+    (0x1FBF7, 'M', u'7'),
+    (0x1FBF8, 'M', u'8'),
+    (0x1FBF9, 'M', u'9'),
+    ]
+
+def _seg_74():
+    return [
+    (0x1FBFA, 'X'),
     (0x20000, 'V'),
-    (0x2A6D7, 'X'),
+    (0x2A6DE, 'X'),
     (0x2A700, 'V'),
     (0x2B735, 'X'),
     (0x2B740, 'V'),
@@ -7699,10 +7741,6 @@ def _seg_73():
     (0x2F818, 'M', u'冤'),
     (0x2F819, 'M', u'仌'),
     (0x2F81A, 'M', u'冬'),
-    ]
-
-def _seg_74():
-    return [
     (0x2F81B, 'M', u'况'),
     (0x2F81C, 'M', u'𩇟'),
     (0x2F81D, 'M', u'凵'),
@@ -7765,6 +7803,10 @@ def _seg_74():
     (0x2F859, 'M', u'𡓤'),
     (0x2F85A, 'M', u'売'),
     (0x2F85B, 'M', u'壷'),
+    ]
+
+def _seg_75():
+    return [
     (0x2F85C, 'M', u'夆'),
     (0x2F85D, 'M', u'多'),
     (0x2F85E, 'M', u'夢'),
@@ -7803,10 +7845,6 @@ def _seg_74():
     (0x2F880, 'M', u'åµ¼'),
     (0x2F881, 'M', u'å·¡'),
     (0x2F882, 'M', u'å·¢'),
-    ]
-
-def _seg_75():
-    return [
     (0x2F883, 'M', u'ã ¯'),
     (0x2F884, 'M', u'å·½'),
     (0x2F885, 'M', u'帨'),
@@ -7869,6 +7907,10 @@ def _seg_75():
     (0x2F8C0, 'M', u'揅'),
     (0x2F8C1, 'M', u'掩'),
     (0x2F8C2, 'M', u'㨮'),
+    ]
+
+def _seg_76():
+    return [
     (0x2F8C3, 'M', u'æ‘©'),
     (0x2F8C4, 'M', u'摾'),
     (0x2F8C5, 'M', u'撝'),
@@ -7907,10 +7949,6 @@ def _seg_75():
     (0x2F8E6, 'M', u'椔'),
     (0x2F8E7, 'M', u'㮝'),
     (0x2F8E8, 'M', u'楂'),
-    ]
-
-def _seg_76():
-    return [
     (0x2F8E9, 'M', u'榣'),
     (0x2F8EA, 'M', u'槪'),
     (0x2F8EB, 'M', u'檨'),
@@ -7973,6 +8011,10 @@ def _seg_76():
     (0x2F924, 'M', u'犀'),
     (0x2F925, 'M', u'犕'),
     (0x2F926, 'M', u'𤜵'),
+    ]
+
+def _seg_77():
+    return [
     (0x2F927, 'M', u'𤠔'),
     (0x2F928, 'M', u'獺'),
     (0x2F929, 'M', u'王'),
@@ -8011,10 +8053,6 @@ def _seg_76():
     (0x2F94C, 'M', u'ä‚–'),
     (0x2F94D, 'M', u'𥐝'),
     (0x2F94E, 'M', u'硎'),
-    ]
-
-def _seg_77():
-    return [
     (0x2F94F, 'M', u'碌'),
     (0x2F950, 'M', u'磌'),
     (0x2F951, 'M', u'䃣'),
@@ -8077,6 +8115,10 @@ def _seg_77():
     (0x2F98B, 'M', u'舁'),
     (0x2F98C, 'M', u'舄'),
     (0x2F98D, 'M', u'辞'),
+    ]
+
+def _seg_78():
+    return [
     (0x2F98E, 'M', u'ä‘«'),
     (0x2F98F, 'M', u'芑'),
     (0x2F990, 'M', u'芋'),
@@ -8115,10 +8157,6 @@ def _seg_77():
     (0x2F9B1, 'M', u'𧃒'),
     (0x2F9B2, 'M', u'ä•«'),
     (0x2F9B3, 'M', u'虐'),
-    ]
-
-def _seg_78():
-    return [
     (0x2F9B4, 'M', u'虜'),
     (0x2F9B5, 'M', u'è™§'),
     (0x2F9B6, 'M', u'虩'),
@@ -8181,6 +8219,10 @@ def _seg_78():
     (0x2F9EF, 'M', u'䦕'),
     (0x2F9F0, 'M', u'é–·'),
     (0x2F9F1, 'M', u'𨵷'),
+    ]
+
+def _seg_79():
+    return [
     (0x2F9F2, 'M', u'䧦'),
     (0x2F9F3, 'M', u'雃'),
     (0x2F9F4, 'M', u'å¶²'),
@@ -8219,16 +8261,14 @@ def _seg_78():
     (0x2FA16, 'M', u'äµ–'),
     (0x2FA17, 'M', u'黹'),
     (0x2FA18, 'M', u'黾'),
-    ]
-
-def _seg_79():
-    return [
     (0x2FA19, 'M', u'é¼…'),
     (0x2FA1A, 'M', u'鼏'),
     (0x2FA1B, 'M', u'é¼–'),
     (0x2FA1C, 'M', u'é¼»'),
     (0x2FA1D, 'M', u'𪘀'),
     (0x2FA1E, 'X'),
+    (0x30000, 'V'),
+    (0x3134B, 'X'),
     (0xE0100, 'I'),
     (0xE01F0, 'X'),
     ]
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/ipaddress.py b/venv/Lib/site-packages/pip/_vendor/ipaddress.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/ipaddress.py
rename to venv/Lib/site-packages/pip/_vendor/ipaddress.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/__init__.py b/venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/msgpack/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/_version.py b/venv/Lib/site-packages/pip/_vendor/msgpack/_version.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/msgpack/_version.py
rename to venv/Lib/site-packages/pip/_vendor/msgpack/_version.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/exceptions.py b/venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/msgpack/exceptions.py
rename to venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/ext.py b/venv/Lib/site-packages/pip/_vendor/msgpack/ext.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/msgpack/ext.py
rename to venv/Lib/site-packages/pip/_vendor/msgpack/ext.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/msgpack/fallback.py b/venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/msgpack/fallback.py
rename to venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py b/venv/Lib/site-packages/pip/_vendor/packaging/__about__.py
similarity index 90%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/__about__.py
index dc95138..4d99857 100644
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/__about__.py
@@ -18,10 +18,10 @@ __title__ = "packaging"
 __summary__ = "Core utilities for Python packages"
 __uri__ = "https://github.com/pypa/packaging"
 
-__version__ = "19.2"
+__version__ = "20.4"
 
 __author__ = "Donald Stufft and individual contributors"
 __email__ = "donald@stufft.io"
 
-__license__ = "BSD or Apache License, Version 2.0"
+__license__ = "BSD-2-Clause or Apache-2.0"
 __copyright__ = "Copyright 2014-2019 %s" % __author__
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__init__.py b/venv/Lib/site-packages/pip/_vendor/packaging/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/_compat.py b/venv/Lib/site-packages/pip/_vendor/packaging/_compat.py
similarity index 92%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/_compat.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/_compat.py
index a145f7e..e54bd4e 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/_compat.py
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/_compat.py
@@ -5,9 +5,9 @@ from __future__ import absolute_import, division, print_function
 
 import sys
 
-from ._typing import MYPY_CHECK_RUNNING
+from ._typing import TYPE_CHECKING
 
-if MYPY_CHECK_RUNNING:  # pragma: no cover
+if TYPE_CHECKING:  # pragma: no cover
     from typing import Any, Dict, Tuple, Type
 
 
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/_structures.py b/venv/Lib/site-packages/pip/_vendor/packaging/_structures.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/_structures.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/_structures.py
diff --git a/venv/Lib/site-packages/pip/_vendor/packaging/_typing.py b/venv/Lib/site-packages/pip/_vendor/packaging/_typing.py
new file mode 100644
index 0000000..2846133
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/_typing.py
@@ -0,0 +1,48 @@
+"""For neatly implementing static typing in packaging.
+
+`mypy` - the static type analysis tool we use - uses the `typing` module, which
+provides core functionality fundamental to mypy's functioning.
+
+Generally, `typing` would be imported at runtime and used in that fashion -
+it acts as a no-op at runtime and does not have any run-time overhead by
+design.
+
+As it turns out, `typing` is not vendorable - it uses separate sources for
+Python 2/Python 3. Thus, this codebase can not expect it to be present.
+To work around this, mypy allows the typing import to be behind a False-y
+optional to prevent it from running at runtime and type-comments can be used
+to remove the need for the types to be accessible directly during runtime.
+
+This module provides the False-y guard in a nicely named fashion so that a
+curious maintainer can reach here to read this.
+
+In packaging, all static-typing related imports should be guarded as follows:
+
+    from pip._vendor.packaging._typing import TYPE_CHECKING
+
+    if TYPE_CHECKING:
+        from typing import ...
+
+Ref: https://github.com/python/mypy/issues/3216
+"""
+
+__all__ = ["TYPE_CHECKING", "cast"]
+
+# The TYPE_CHECKING constant defined by the typing module is False at runtime
+# but True while type checking.
+if False:  # pragma: no cover
+    from typing import TYPE_CHECKING
+else:
+    TYPE_CHECKING = False
+
+# typing's cast syntax requires calling typing.cast at runtime, but we don't
+# want to import typing at runtime. Here, we inform the type checkers that
+# we're importing `typing.cast` as `cast` and re-implement typing.cast's
+# runtime behavior in a block that is ignored by type checkers.
+if TYPE_CHECKING:  # pragma: no cover
+    # not executed at runtime
+    from typing import cast
+else:
+    # executed at runtime
+    def cast(type_, value):  # noqa
+        return value
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/markers.py b/venv/Lib/site-packages/pip/_vendor/packaging/markers.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/markers.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/markers.py
index b24f8ed..ed642b0 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/markers.py
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/markers.py
@@ -13,10 +13,10 @@ from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString
 from pip._vendor.pyparsing import Literal as L  # noqa
 
 from ._compat import string_types
-from ._typing import MYPY_CHECK_RUNNING
+from ._typing import TYPE_CHECKING
 from .specifiers import Specifier, InvalidSpecifier
 
-if MYPY_CHECK_RUNNING:  # pragma: no cover
+if TYPE_CHECKING:  # pragma: no cover
     from typing import Any, Callable, Dict, List, Optional, Tuple, Union
 
     Operator = Callable[[str, str], bool]
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/requirements.py b/venv/Lib/site-packages/pip/_vendor/packaging/requirements.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/requirements.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/requirements.py
index 1e32a93..5e64101 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/requirements.py
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/requirements.py
@@ -11,11 +11,11 @@ from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine
 from pip._vendor.pyparsing import Literal as L  # noqa
 from pip._vendor.six.moves.urllib import parse as urlparse
 
-from ._typing import MYPY_CHECK_RUNNING
+from ._typing import TYPE_CHECKING
 from .markers import MARKER_EXPR, Marker
 from .specifiers import LegacySpecifier, Specifier, SpecifierSet
 
-if MYPY_CHECK_RUNNING:  # pragma: no cover
+if TYPE_CHECKING:  # pragma: no cover
     from typing import List
 
 
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/specifiers.py b/venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/specifiers.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py
index 9498748..fe09bb1 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/specifiers.py
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py
@@ -9,10 +9,11 @@ import itertools
 import re
 
 from ._compat import string_types, with_metaclass
-from ._typing import MYPY_CHECK_RUNNING
+from ._typing import TYPE_CHECKING
+from .utils import canonicalize_version
 from .version import Version, LegacyVersion, parse
 
-if MYPY_CHECK_RUNNING:  # pragma: no cover
+if TYPE_CHECKING:  # pragma: no cover
     from typing import (
         List,
         Dict,
@@ -132,9 +133,14 @@ class _IndividualSpecifier(BaseSpecifier):
         # type: () -> str
         return "{0}{1}".format(*self._spec)
 
+    @property
+    def _canonical_spec(self):
+        # type: () -> Tuple[str, Union[Version, str]]
+        return self._spec[0], canonicalize_version(self._spec[1])
+
     def __hash__(self):
         # type: () -> int
-        return hash(self._spec)
+        return hash(self._canonical_spec)
 
     def __eq__(self, other):
         # type: (object) -> bool
@@ -146,7 +152,7 @@ class _IndividualSpecifier(BaseSpecifier):
         elif not isinstance(other, self.__class__):
             return NotImplemented
 
-        return self._spec == other._spec
+        return self._canonical_spec == other._canonical_spec
 
     def __ne__(self, other):
         # type: (object) -> bool
@@ -510,12 +516,20 @@ class Specifier(_IndividualSpecifier):
     @_require_version_compare
     def _compare_less_than_equal(self, prospective, spec):
         # type: (ParsedVersion, str) -> bool
-        return prospective <= Version(spec)
+
+        # NB: Local version identifiers are NOT permitted in the version
+        # specifier, so local version labels can be universally removed from
+        # the prospective version.
+        return Version(prospective.public) <= Version(spec)
 
     @_require_version_compare
     def _compare_greater_than_equal(self, prospective, spec):
         # type: (ParsedVersion, str) -> bool
-        return prospective >= Version(spec)
+
+        # NB: Local version identifiers are NOT permitted in the version
+        # specifier, so local version labels can be universally removed from
+        # the prospective version.
+        return Version(prospective.public) >= Version(spec)
 
     @_require_version_compare
     def _compare_less_than(self, prospective, spec_str):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/tags.py b/venv/Lib/site-packages/pip/_vendor/packaging/tags.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/tags.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/tags.py
index 300faab..9064910 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/tags.py
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/tags.py
@@ -22,9 +22,9 @@ import sys
 import sysconfig
 import warnings
 
-from ._typing import MYPY_CHECK_RUNNING, cast
+from ._typing import TYPE_CHECKING, cast
 
-if MYPY_CHECK_RUNNING:  # pragma: no cover
+if TYPE_CHECKING:  # pragma: no cover
     from typing import (
         Dict,
         FrozenSet,
@@ -58,6 +58,12 @@ _32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32
 
 
 class Tag(object):
+    """
+    A representation of the tag triple for a wheel.
+
+    Instances are considered immutable and thus are hashable. Equality checking
+    is also supported.
+    """
 
     __slots__ = ["_interpreter", "_abi", "_platform"]
 
@@ -108,6 +114,12 @@ class Tag(object):
 
 def parse_tag(tag):
     # type: (str) -> FrozenSet[Tag]
+    """
+    Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances.
+
+    Returning a set is required due to the possibility that the tag is a
+    compressed tag set.
+    """
     tags = set()
     interpreters, abis, platforms = tag.split("-")
     for interpreter in interpreters.split("."):
@@ -541,7 +553,7 @@ class _ELFFileHeader(object):
         def unpack(fmt):
             # type: (str) -> int
             try:
-                result, = struct.unpack(
+                (result,) = struct.unpack(
                     fmt, file.read(struct.calcsize(fmt))
                 )  # type: (int, )
             except struct.error:
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/utils.py b/venv/Lib/site-packages/pip/_vendor/packaging/utils.py
similarity index 83%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/utils.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/utils.py
index 44f1bf9..19579c1 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/utils.py
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/utils.py
@@ -5,19 +5,22 @@ from __future__ import absolute_import, division, print_function
 
 import re
 
-from ._typing import MYPY_CHECK_RUNNING
+from ._typing import TYPE_CHECKING, cast
 from .version import InvalidVersion, Version
 
-if MYPY_CHECK_RUNNING:  # pragma: no cover
-    from typing import Union
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import NewType, Union
+
+    NormalizedName = NewType("NormalizedName", str)
 
 _canonicalize_regex = re.compile(r"[-_.]+")
 
 
 def canonicalize_name(name):
-    # type: (str) -> str
+    # type: (str) -> NormalizedName
     # This is taken from PEP 503.
-    return _canonicalize_regex.sub("-", name).lower()
+    value = _canonicalize_regex.sub("-", name).lower()
+    return cast("NormalizedName", value)
 
 
 def canonicalize_version(_version):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/version.py b/venv/Lib/site-packages/pip/_vendor/packaging/version.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/version.py
rename to venv/Lib/site-packages/pip/_vendor/packaging/version.py
index f39a2a1..00371e8 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/version.py
+++ b/venv/Lib/site-packages/pip/_vendor/packaging/version.py
@@ -8,9 +8,9 @@ import itertools
 import re
 
 from ._structures import Infinity, NegativeInfinity
-from ._typing import MYPY_CHECK_RUNNING
+from ._typing import TYPE_CHECKING
 
-if MYPY_CHECK_RUNNING:  # pragma: no cover
+if TYPE_CHECKING:  # pragma: no cover
     from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union
 
     from ._structures import InfinityType, NegativeInfinityType
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/__init__.py b/venv/Lib/site-packages/pip/_vendor/pep517/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py b/venv/Lib/site-packages/pip/_vendor/pep517/_in_process.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/_in_process.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/build.py b/venv/Lib/site-packages/pip/_vendor/pep517/build.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/build.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/build.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/check.py b/venv/Lib/site-packages/pip/_vendor/pep517/check.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/check.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/check.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/colorlog.py b/venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/colorlog.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/compat.py b/venv/Lib/site-packages/pip/_vendor/pep517/compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/compat.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/compat.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/dirtools.py b/venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/dirtools.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/envbuild.py b/venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/envbuild.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/meta.py b/venv/Lib/site-packages/pip/_vendor/pep517/meta.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/meta.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/meta.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pep517/wrappers.py b/venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pep517/wrappers.py
rename to venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pkg_resources/__init__.py b/venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pkg_resources/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pkg_resources/py31compat.py b/venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pkg_resources/py31compat.py
rename to venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/progress/__init__.py b/venv/Lib/site-packages/pip/_vendor/progress/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/progress/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/progress/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/progress/bar.py b/venv/Lib/site-packages/pip/_vendor/progress/bar.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/progress/bar.py
rename to venv/Lib/site-packages/pip/_vendor/progress/bar.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/progress/counter.py b/venv/Lib/site-packages/pip/_vendor/progress/counter.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/progress/counter.py
rename to venv/Lib/site-packages/pip/_vendor/progress/counter.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/progress/spinner.py b/venv/Lib/site-packages/pip/_vendor/progress/spinner.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/progress/spinner.py
rename to venv/Lib/site-packages/pip/_vendor/progress/spinner.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/pyparsing.py b/venv/Lib/site-packages/pip/_vendor/pyparsing.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/pyparsing.py
rename to venv/Lib/site-packages/pip/_vendor/pyparsing.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/__init__.py b/venv/Lib/site-packages/pip/_vendor/requests/__init__.py
similarity index 88%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/requests/__init__.py
index e47bcb2..517458b 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/requests/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/requests/__init__.py
@@ -90,18 +90,29 @@ except (AssertionError, ValueError):
                   "version!".format(urllib3.__version__, chardet.__version__),
                   RequestsDependencyWarning)
 
-# Attempt to enable urllib3's SNI support, if possible
-from pip._internal.utils.compat import WINDOWS
-if not WINDOWS:
+# Attempt to enable urllib3's fallback for SNI support
+# if the standard library doesn't support SNI or the
+# 'ssl' library isn't available.
+try:
+    # Note: This logic prevents upgrading cryptography on Windows, if imported
+    #       as part of pip.
+    from pip._internal.utils.compat import WINDOWS
+    if not WINDOWS:
+        raise ImportError("pip internals: don't import cryptography on Windows")
     try:
+        import ssl
+    except ImportError:
+        ssl = None
+
+    if not getattr(ssl, "HAS_SNI", False):
         from pip._vendor.urllib3.contrib import pyopenssl
         pyopenssl.inject_into_urllib3()
 
         # Check cryptography version
         from cryptography import __version__ as cryptography_version
         _check_cryptography(cryptography_version)
-    except ImportError:
-        pass
+except ImportError:
+    pass
 
 # urllib3's DependencyWarnings should be silenced.
 from pip._vendor.urllib3.exceptions import DependencyWarning
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/__version__.py b/venv/Lib/site-packages/pip/_vendor/requests/__version__.py
similarity index 90%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/__version__.py
rename to venv/Lib/site-packages/pip/_vendor/requests/__version__.py
index b9e7df4..531e26c 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/requests/__version__.py
+++ b/venv/Lib/site-packages/pip/_vendor/requests/__version__.py
@@ -5,8 +5,8 @@
 __title__ = 'requests'
 __description__ = 'Python HTTP for Humans.'
 __url__ = 'https://requests.readthedocs.io'
-__version__ = '2.23.0'
-__build__ = 0x022300
+__version__ = '2.24.0'
+__build__ = 0x022400
 __author__ = 'Kenneth Reitz'
 __author_email__ = 'me@kennethreitz.org'
 __license__ = 'Apache 2.0'
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/_internal_utils.py b/venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/_internal_utils.py
rename to venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/adapters.py b/venv/Lib/site-packages/pip/_vendor/requests/adapters.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/adapters.py
rename to venv/Lib/site-packages/pip/_vendor/requests/adapters.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/api.py b/venv/Lib/site-packages/pip/_vendor/requests/api.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/api.py
rename to venv/Lib/site-packages/pip/_vendor/requests/api.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/auth.py b/venv/Lib/site-packages/pip/_vendor/requests/auth.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/auth.py
rename to venv/Lib/site-packages/pip/_vendor/requests/auth.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/certs.py b/venv/Lib/site-packages/pip/_vendor/requests/certs.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/certs.py
rename to venv/Lib/site-packages/pip/_vendor/requests/certs.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/compat.py b/venv/Lib/site-packages/pip/_vendor/requests/compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/compat.py
rename to venv/Lib/site-packages/pip/_vendor/requests/compat.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/cookies.py b/venv/Lib/site-packages/pip/_vendor/requests/cookies.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/cookies.py
rename to venv/Lib/site-packages/pip/_vendor/requests/cookies.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/exceptions.py b/venv/Lib/site-packages/pip/_vendor/requests/exceptions.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/exceptions.py
rename to venv/Lib/site-packages/pip/_vendor/requests/exceptions.py
index a91e1fd..9ef9e6e 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/requests/exceptions.py
+++ b/venv/Lib/site-packages/pip/_vendor/requests/exceptions.py
@@ -94,11 +94,11 @@ class ChunkedEncodingError(RequestException):
 
 
 class ContentDecodingError(RequestException, BaseHTTPError):
-    """Failed to decode response content"""
+    """Failed to decode response content."""
 
 
 class StreamConsumedError(RequestException, TypeError):
-    """The content for this response was already consumed"""
+    """The content for this response was already consumed."""
 
 
 class RetryError(RequestException):
@@ -106,21 +106,18 @@ class RetryError(RequestException):
 
 
 class UnrewindableBodyError(RequestException):
-    """Requests encountered an error when trying to rewind a body"""
+    """Requests encountered an error when trying to rewind a body."""
 
 # Warnings
 
 
 class RequestsWarning(Warning):
     """Base warning for Requests."""
-    pass
 
 
 class FileModeWarning(RequestsWarning, DeprecationWarning):
     """A file was opened in text mode, but Requests determined its binary length."""
-    pass
 
 
 class RequestsDependencyWarning(RequestsWarning):
     """An imported dependency doesn't match the expected version range."""
-    pass
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/help.py b/venv/Lib/site-packages/pip/_vendor/requests/help.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/help.py
rename to venv/Lib/site-packages/pip/_vendor/requests/help.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/hooks.py b/venv/Lib/site-packages/pip/_vendor/requests/hooks.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/hooks.py
rename to venv/Lib/site-packages/pip/_vendor/requests/hooks.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/models.py b/venv/Lib/site-packages/pip/_vendor/requests/models.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/models.py
rename to venv/Lib/site-packages/pip/_vendor/requests/models.py
index 8a3085d..015e715 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/requests/models.py
+++ b/venv/Lib/site-packages/pip/_vendor/requests/models.py
@@ -473,12 +473,12 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
             not isinstance(data, (basestring, list, tuple, Mapping))
         ])
 
-        try:
-            length = super_len(data)
-        except (TypeError, AttributeError, UnsupportedOperation):
-            length = None
-
         if is_stream:
+            try:
+                length = super_len(data)
+            except (TypeError, AttributeError, UnsupportedOperation):
+                length = None
+
             body = data
 
             if getattr(body, 'tell', None) is not None:
@@ -916,7 +916,7 @@ class Response(object):
         return l
 
     def raise_for_status(self):
-        """Raises stored :class:`HTTPError`, if one occurred."""
+        """Raises :class:`HTTPError`, if one occurred."""
 
         http_error_msg = ''
         if isinstance(self.reason, bytes):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/packages.py b/venv/Lib/site-packages/pip/_vendor/requests/packages.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/packages.py
rename to venv/Lib/site-packages/pip/_vendor/requests/packages.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/sessions.py b/venv/Lib/site-packages/pip/_vendor/requests/sessions.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/sessions.py
rename to venv/Lib/site-packages/pip/_vendor/requests/sessions.py
index 2845880..e8e2d60 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/requests/sessions.py
+++ b/venv/Lib/site-packages/pip/_vendor/requests/sessions.py
@@ -658,11 +658,13 @@ class Session(SessionRedirectMixin):
 
         extract_cookies_to_jar(self.cookies, request, r.raw)
 
-        # Redirect resolving generator.
-        gen = self.resolve_redirects(r, request, **kwargs)
-
         # Resolve redirects if allowed.
-        history = [resp for resp in gen] if allow_redirects else []
+        if allow_redirects:
+            # Redirect resolving generator.
+            gen = self.resolve_redirects(r, request, **kwargs)
+            history = [resp for resp in gen]
+        else:
+            history = []
 
         # Shuffle things around if there's history.
         if history:
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/status_codes.py b/venv/Lib/site-packages/pip/_vendor/requests/status_codes.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/status_codes.py
rename to venv/Lib/site-packages/pip/_vendor/requests/status_codes.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/structures.py b/venv/Lib/site-packages/pip/_vendor/requests/structures.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/structures.py
rename to venv/Lib/site-packages/pip/_vendor/requests/structures.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/requests/utils.py b/venv/Lib/site-packages/pip/_vendor/requests/utils.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/requests/utils.py
rename to venv/Lib/site-packages/pip/_vendor/requests/utils.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/__init__.py b/venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py
index aaba5b3..3b44454 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py
@@ -11,7 +11,7 @@ __all__ = [
     "ResolutionTooDeep",
 ]
 
-__version__ = "0.3.0"
+__version__ = "0.4.0"
 
 
 from .providers import AbstractProvider, AbstractResolver
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py
diff --git a/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py b/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py
new file mode 100644
index 0000000..366cc5e
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py
@@ -0,0 +1,6 @@
+__all__ = ["Sequence"]
+
+try:
+    from collections.abc import Sequence
+except ImportError:
+    from collections import Sequence
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/providers.py b/venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py
similarity index 70%
rename from venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/providers.py
rename to venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py
index db16821..68b7290 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/providers.py
+++ b/venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py
@@ -27,7 +27,7 @@ class AbstractProvider(object):
 
         * `requirement` specifies a requirement contributing to the current
           candidate list
-        * `parent` specifies the candidate that provids (dependend on) the
+        * `parent` specifies the candidate that provides (dependend on) the
           requirement, or `None` to indicate a root requirement.
 
         The preference could depend on a various of issues, including (not
@@ -48,23 +48,28 @@ class AbstractProvider(object):
         """
         raise NotImplementedError
 
-    def find_matches(self, requirement):
-        """Find all possible candidates that satisfy a requirement.
+    def find_matches(self, requirements):
+        """Find all possible candidates that satisfy the given requirements.
 
-        This should try to get candidates based on the requirement's type.
+        This should try to get candidates based on the requirements' types.
         For VCS, local, and archive requirements, the one-and-only match is
         returned, and for a "named" requirement, the index(es) should be
         consulted to find concrete candidates for this requirement.
 
-        The returned candidates should be sorted by reversed preference, e.g.
-        the most preferred should be LAST. This is done so list-popping can be
-        as efficient as possible.
+        :param requirements: A collection of requirements which all of the the
+            returned candidates must match. All requirements are guaranteed to
+            have the same identifier. The collection is never empty.
+        :returns: An iterable that orders candidates by preference, e.g. the
+            most preferred candidate should come first.
         """
         raise NotImplementedError
 
     def is_satisfied_by(self, requirement, candidate):
         """Whether the given requirement can be satisfied by a candidate.
 
+        The candidate is guarenteed to have been generated from the
+        requirement.
+
         A boolean should be returned to indicate whether `candidate` is a
         viable solution to the requirement.
         """
@@ -92,30 +97,13 @@ class AbstractResolver(object):
     def resolve(self, requirements, **kwargs):
         """Take a collection of constraints, spit out the resolution result.
 
-        Parameters
-        ----------
-        requirements : Collection
-            A collection of constraints
-        kwargs : optional
-            Additional keyword arguments that subclasses may accept.
-
-        Raises
-        ------
-        self.base_exception
-            Any raised exception is guaranteed to be a subclass of
-            self.base_exception. The string representation of an exception
-            should be human readable and provide context for why it occurred.
-
-        Returns
-        -------
-        retval : object
-            A representation of the final resolution state. It can be any object
-            with a `mapping` attribute that is a Mapping. Other attributes can
-            be used to provide resolver-specific information.
-
-            The `mapping` attribute MUST be key-value pair is an identifier of a
-            requirement (as returned by the provider's `identify` method) mapped
-            to the resolved candidate (chosen from the return value of the
-            provider's `find_matches` method).
+        This returns a representation of the final resolution state, with one
+        guarenteed attribute ``mapping`` that contains resolved candidates as
+        values. The keys are their respective identifiers.
+
+        :param requirements: A collection of constraints.
+        :param kwargs: Additional keyword arguments that subclasses may accept.
+
+        :raises: ``self.base_exception`` or its subclass.
         """
         raise NotImplementedError
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/reporters.py b/venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py
similarity index 62%
rename from venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/reporters.py
rename to venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py
index c7e9e88..a0a2a45 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/reporters.py
+++ b/venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py
@@ -23,12 +23,18 @@ class BaseReporter(object):
         """Called before the resolution ends successfully.
         """
 
-    def adding_requirement(self, requirement):
-        """Called when the resolver adds a new requirement into the resolve criteria.
+    def adding_requirement(self, requirement, parent):
+        """Called when adding a new requirement into the resolve criteria.
+
+        :param requirement: The additional requirement to be applied to filter
+            the available candidaites.
+        :param parent: The candidate that requires ``requirement`` as a
+            dependency, or None if ``requirement`` is one of the root
+            requirements passed in from ``Resolver.resolve()``.
         """
 
     def backtracking(self, candidate):
-        """Called when the resolver rejects a candidate during backtracking.
+        """Called when rejecting a candidate during backtracking.
         """
 
     def pinning(self, candidate):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/resolvers.py b/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py
similarity index 90%
rename from venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/resolvers.py
rename to venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py
index b51d337..4497f97 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/resolvers.py
+++ b/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py
@@ -1,5 +1,6 @@
 import collections
 
+from .compat import collections_abc
 from .providers import AbstractResolver
 from .structs import DirectedGraph
 
@@ -68,16 +69,18 @@ class Criterion(object):
 
     def __repr__(self):
         requirements = ", ".join(
-            "{!r} from {!r}".format(req, parent)
+            "({!r}, via={!r})".format(req, parent)
             for req, parent in self.information
         )
-        return "<Criterion {}>".format(requirements)
+        return "Criterion({})".format(requirements)
 
     @classmethod
     def from_requirement(cls, provider, requirement, parent):
         """Build an instance from a requirement.
         """
-        candidates = provider.find_matches(requirement)
+        candidates = provider.find_matches([requirement])
+        if not isinstance(candidates, collections_abc.Sequence):
+            candidates = list(candidates)
         criterion = cls(
             candidates=candidates,
             information=[RequirementInformation(requirement, parent)],
@@ -98,11 +101,9 @@ class Criterion(object):
         """
         infos = list(self.information)
         infos.append(RequirementInformation(requirement, parent))
-        candidates = [
-            c
-            for c in self.candidates
-            if provider.is_satisfied_by(requirement, c)
-        ]
+        candidates = provider.find_matches([r for r, _ in infos])
+        if not isinstance(candidates, collections_abc.Sequence):
+            candidates = list(candidates)
         criterion = type(self)(candidates, infos, list(self.incompatibilities))
         if not candidates:
             raise RequirementsConflicted(criterion)
@@ -179,7 +180,7 @@ class Resolution(object):
         self._states.append(state)
 
     def _merge_into_criterion(self, requirement, parent):
-        self._r.adding_requirement(requirement)
+        self._r.adding_requirement(requirement, parent)
         name = self._p.identify(requirement)
         try:
             crit = self.state.criteria[name]
@@ -218,13 +219,24 @@ class Resolution(object):
 
     def _attempt_to_pin_criterion(self, name, criterion):
         causes = []
-        for candidate in reversed(criterion.candidates):
+        for candidate in criterion.candidates:
             try:
                 criteria = self._get_criteria_to_update(candidate)
             except RequirementsConflicted as e:
                 causes.append(e.criterion)
                 continue
 
+            # Check the newly-pinned candidate actually works. This should
+            # always pass under normal circumstances, but in the case of a
+            # faulty provider, we will raise an error to notify the implementer
+            # to fix find_matches() and/or is_satisfied_by().
+            satisfied = all(
+                self._p.is_satisfied_by(r, candidate)
+                for r in criterion.iter_requirement()
+            )
+            if not satisfied:
+                raise InconsistentCandidate(candidate, criterion)
+
             # Put newly-pinned candidate at the end. This is essential because
             # backtracking looks at this mapping to get the last pin.
             self._r.pinning(candidate)
@@ -232,13 +244,6 @@ class Resolution(object):
             self.state.mapping[name] = candidate
             self.state.criteria.update(criteria)
 
-            # Check the newly-pinned candidate actually works. This should
-            # always pass under normal circumstances, but in the case of a
-            # faulty provider, we will raise an error to notify the implementer
-            # to fix find_matches() and/or is_satisfied_by().
-            if not self._is_current_pin_satisfying(name, criterion):
-                raise InconsistentCandidate(candidate, criterion)
-
             return []
 
         # All candidates tried, nothing works. This criterion is a dead
@@ -246,23 +251,32 @@ class Resolution(object):
         return causes
 
     def _backtrack(self):
-        # We need at least 3 states here:
-        # (a) One known not working, to drop.
-        # (b) One to backtrack to.
-        # (c) One to restore state (b) to its state prior to candidate-pinning,
+        # Drop the current state, it's known not to work.
+        del self._states[-1]
+
+        # We need at least 2 states here:
+        # (a) One to backtrack to.
+        # (b) One to restore state (a) to its state prior to candidate-pinning,
         #     so we can pin another one instead.
-        while len(self._states) >= 3:
-            del self._states[-1]
 
-            # Retract the last candidate pin, and create a new (b).
-            name, candidate = self._states.pop().mapping.popitem()
+        while len(self._states) >= 2:
+            # Retract the last candidate pin.
+            prev_state = self._states.pop()
+            try:
+                name, candidate = prev_state.mapping.popitem()
+            except KeyError:
+                continue
             self._r.backtracking(candidate)
+
+            # Create a new state to work on, with the newly known not-working
+            # candidate excluded.
             self._push_new_state()
 
             # Mark the retracted candidate as incompatible.
             criterion = self.state.criteria[name].excluded_of(candidate)
             if criterion is None:
                 # This state still does not work. Try the still previous state.
+                del self._states[-1]
                 continue
             self.state.criteria[name] = criterion
 
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/structs.py b/venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/resolvelib/structs.py
rename to venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/retrying.py b/venv/Lib/site-packages/pip/_vendor/retrying.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/retrying.py
rename to venv/Lib/site-packages/pip/_vendor/retrying.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/six.py b/venv/Lib/site-packages/pip/_vendor/six.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/pip/_vendor/six.py
rename to venv/Lib/site-packages/pip/_vendor/six.py
index 5fe9f8e..83f6978 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/six.py
+++ b/venv/Lib/site-packages/pip/_vendor/six.py
@@ -29,7 +29,7 @@ import sys
 import types
 
 __author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.14.0"
+__version__ = "1.15.0"
 
 
 # Useful for very coarse version differentiation.
@@ -890,12 +890,11 @@ def ensure_binary(s, encoding='utf-8', errors='strict'):
       - `str` -> encoded to `bytes`
       - `bytes` -> `bytes`
     """
+    if isinstance(s, binary_type):
+        return s
     if isinstance(s, text_type):
         return s.encode(encoding, errors)
-    elif isinstance(s, binary_type):
-        return s
-    else:
-        raise TypeError("not expecting type '%s'" % type(s))
+    raise TypeError("not expecting type '%s'" % type(s))
 
 
 def ensure_str(s, encoding='utf-8', errors='strict'):
@@ -909,12 +908,15 @@ def ensure_str(s, encoding='utf-8', errors='strict'):
       - `str` -> `str`
       - `bytes` -> decoded to `str`
     """
-    if not isinstance(s, (text_type, binary_type)):
-        raise TypeError("not expecting type '%s'" % type(s))
+    # Optimization: Fast return for the common case.
+    if type(s) is str:
+        return s
     if PY2 and isinstance(s, text_type):
-        s = s.encode(encoding, errors)
+        return s.encode(encoding, errors)
     elif PY3 and isinstance(s, binary_type):
-        s = s.decode(encoding, errors)
+        return s.decode(encoding, errors)
+    elif not isinstance(s, (text_type, binary_type)):
+        raise TypeError("not expecting type '%s'" % type(s))
     return s
 
 
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/toml/__init__.py b/venv/Lib/site-packages/pip/_vendor/toml/__init__.py
similarity index 67%
rename from venv/lib/python3.8/site-packages/pip/_vendor/toml/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/toml/__init__.py
index 015d73c..7a08fe7 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/toml/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/toml/__init__.py
@@ -6,16 +6,20 @@ Released under the MIT license.
 from pip._vendor.toml import encoder
 from pip._vendor.toml import decoder
 
-__version__ = "0.10.0"
+__version__ = "0.10.1"
 _spec_ = "0.5.0"
 
 load = decoder.load
 loads = decoder.loads
 TomlDecoder = decoder.TomlDecoder
 TomlDecodeError = decoder.TomlDecodeError
+TomlPreserveCommentDecoder = decoder.TomlPreserveCommentDecoder
 
 dump = encoder.dump
 dumps = encoder.dumps
 TomlEncoder = encoder.TomlEncoder
 TomlArraySeparatorEncoder = encoder.TomlArraySeparatorEncoder
 TomlPreserveInlineDictEncoder = encoder.TomlPreserveInlineDictEncoder
+TomlNumpyEncoder = encoder.TomlNumpyEncoder
+TomlPreserveCommentEncoder = encoder.TomlPreserveCommentEncoder
+TomlPathlibEncoder = encoder.TomlPathlibEncoder
diff --git a/venv/Lib/site-packages/pip/_vendor/toml/common.py b/venv/Lib/site-packages/pip/_vendor/toml/common.py
new file mode 100644
index 0000000..a5d673d
--- /dev/null
+++ b/venv/Lib/site-packages/pip/_vendor/toml/common.py
@@ -0,0 +1,6 @@
+# content after the \
+escapes = ['0', 'b', 'f', 'n', 'r', 't', '"']
+# What it should be replaced by
+escapedchars = ['\0', '\b', '\f', '\n', '\r', '\t', '\"']
+# Used for substitution
+escape_to_escapedchars = dict(zip(_escapes, _escapedchars))
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/toml/decoder.py b/venv/Lib/site-packages/pip/_vendor/toml/decoder.py
similarity index 87%
rename from venv/lib/python3.8/site-packages/pip/_vendor/toml/decoder.py
rename to venv/Lib/site-packages/pip/_vendor/toml/decoder.py
index 20be459..e488777 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/toml/decoder.py
+++ b/venv/Lib/site-packages/pip/_vendor/toml/decoder.py
@@ -24,7 +24,7 @@ def _detect_pathlib_path(p):
 
 
 def _ispath(p):
-    if isinstance(p, basestring):
+    if isinstance(p, (bytes, basestring)):
         return True
     return _detect_pathlib_path(p)
 
@@ -44,7 +44,7 @@ except NameError:
     FNFError = IOError
 
 
-TIME_RE = re.compile("([0-9]{2}):([0-9]{2}):([0-9]{2})(\.([0-9]{3,6}))?")
+TIME_RE = re.compile(r"([0-9]{2}):([0-9]{2}):([0-9]{2})(\.([0-9]{3,6}))?")
 
 
 class TomlDecodeError(ValueError):
@@ -66,6 +66,27 @@ class TomlDecodeError(ValueError):
 _number_with_underscores = re.compile('([0-9])(_([0-9]))*')
 
 
+class CommentValue(object):
+    def __init__(self, val, comment, beginline, _dict):
+        self.val = val
+        separator = "\n" if beginline else " "
+        self.comment = separator + comment
+        self._dict = _dict
+
+    def __getitem__(self, key):
+        return self.val[key]
+
+    def __setitem__(self, key, value):
+        self.val[key] = value
+
+    def dump(self, dump_value_func):
+        retstr = dump_value_func(self.val)
+        if isinstance(self.val, self._dict):
+            return self.comment + "\n" + unicode(retstr)
+        else:
+            return unicode(retstr) + self.comment
+
+
 def _strictly_valid_num(n):
     n = n.strip()
     if not n:
@@ -96,6 +117,7 @@ def load(f, _dict=dict, decoder=None):
         f: Path to the file to open, array of files to read into single dict
            or a file descriptor
         _dict: (optional) Specifies the class of the returned toml dictionary
+        decoder: The decoder to use
 
     Returns:
         Parsed toml file represented as a dictionary
@@ -120,9 +142,9 @@ def load(f, _dict=dict, decoder=None):
                           "existing file.")
             raise FNFError(error_msg)
         if decoder is None:
-            decoder = TomlDecoder()
+            decoder = TomlDecoder(_dict)
         d = decoder.get_empty_table()
-        for l in f:
+        for l in f:  # noqa: E741
             if op.exists(l):
                 d.update(load(l, _dict, decoder))
             else:
@@ -177,19 +199,30 @@ def loads(s, _dict=dict, decoder=None):
     keygroup = False
     dottedkey = False
     keyname = 0
+    key = ''
+    prev_key = ''
+    line_no = 1
+
     for i, item in enumerate(sl):
         if item == '\r' and sl[i + 1] == '\n':
             sl[i] = ' '
             continue
         if keyname:
+            key += item
             if item == '\n':
                 raise TomlDecodeError("Key name found without value."
                                       " Reached end of line.", original, i)
             if openstring:
                 if item == openstrchar:
-                    keyname = 2
-                    openstring = False
-                    openstrchar = ""
+                    oddbackslash = False
+                    k = 1
+                    while i >= k and sl[i - k] == '\\':
+                        oddbackslash = not oddbackslash
+                        k += 1
+                    if not oddbackslash:
+                        keyname = 2
+                        openstring = False
+                        openstrchar = ""
                 continue
             elif keyname == 1:
                 if item.isspace():
@@ -220,6 +253,8 @@ def loads(s, _dict=dict, decoder=None):
                     continue
             if item == '=':
                 keyname = 0
+                prev_key = key[:-1].rstrip()
+                key = ''
                 dottedkey = False
             else:
                 raise TomlDecodeError("Found invalid character in key name: '" +
@@ -272,12 +307,16 @@ def loads(s, _dict=dict, decoder=None):
         if item == '#' and (not openstring and not keygroup and
                             not arrayoftables):
             j = i
+            comment = ""
             try:
                 while sl[j] != '\n':
+                    comment += s[j]
                     sl[j] = ' '
                     j += 1
             except IndexError:
                 break
+            if not openarr:
+                decoder.preserve_comment(line_no, prev_key, comment, beginline)
         if item == '[' and (not openstring and not keygroup and
                             not arrayoftables):
             if beginline:
@@ -308,12 +347,20 @@ def loads(s, _dict=dict, decoder=None):
                 sl[i] = ' '
             else:
                 beginline = True
+            line_no += 1
         elif beginline and sl[i] != ' ' and sl[i] != '\t':
             beginline = False
             if not keygroup and not arrayoftables:
                 if sl[i] == '=':
                     raise TomlDecodeError("Found empty keyname. ", original, i)
                 keyname = 1
+                key += item
+    if keyname:
+        raise TomlDecodeError("Key name found without value."
+                              " Reached end of file.", original, len(s))
+    if openstring:  # reached EOF and have an unterminated string
+        raise TomlDecodeError("Unterminated string found."
+                              " Reached end of file.", original, len(s))
     s = ''.join(sl)
     s = s.split('\n')
     multikey = None
@@ -323,6 +370,9 @@ def loads(s, _dict=dict, decoder=None):
     for idx, line in enumerate(s):
         if idx > 0:
             pos += len(s[idx - 1]) + 1
+
+        decoder.embed_comments(idx, currentlevel)
+
         if not multilinestr or multibackslash or '\n' not in multilinestr:
             line = line.strip()
         if line == "" and (not multikey or multibackslash):
@@ -333,9 +383,14 @@ def loads(s, _dict=dict, decoder=None):
             else:
                 multilinestr += line
             multibackslash = False
-            if len(line) > 2 and (line[-1] == multilinestr[0] and
-                                  line[-2] == multilinestr[0] and
-                                  line[-3] == multilinestr[0]):
+            closed = False
+            if multilinestr[0] == '[':
+                closed = line[-1] == ']'
+            elif len(line) > 2:
+                closed = (line[-1] == multilinestr[0] and
+                          line[-2] == multilinestr[0] and
+                          line[-3] == multilinestr[0])
+            if closed:
                 try:
                     value, vtype = decoder.load_value(multilinestr)
                 except ValueError as err:
@@ -663,7 +718,8 @@ class TomlDecoder(object):
         while len(pair[-1]) and (pair[-1][0] != ' ' and pair[-1][0] != '\t' and
                                  pair[-1][0] != "'" and pair[-1][0] != '"' and
                                  pair[-1][0] != '[' and pair[-1][0] != '{' and
-                                 pair[-1] != 'true' and pair[-1] != 'false'):
+                                 pair[-1].strip() != 'true' and
+                                 pair[-1].strip() != 'false'):
             try:
                 float(pair[-1])
                 break
@@ -671,6 +727,8 @@ class TomlDecoder(object):
                 pass
             if _load_date(pair[-1]) is not None:
                 break
+            if TIME_RE.match(pair[-1]):
+                break
             i += 1
             prev_val = pair[-1]
             pair = line.split('=', i)
@@ -704,16 +762,10 @@ class TomlDecoder(object):
             pair[0] = levels[-1].strip()
         elif (pair[0][0] == '"' or pair[0][0] == "'") and \
                 (pair[0][-1] == pair[0][0]):
-            pair[0] = pair[0][1:-1]
-        if len(pair[1]) > 2 and ((pair[1][0] == '"' or pair[1][0] == "'") and
-                                 pair[1][1] == pair[1][0] and
-                                 pair[1][2] == pair[1][0] and
-                                 not (len(pair[1]) > 5 and
-                                      pair[1][-1] == pair[1][0] and
-                                      pair[1][-2] == pair[1][0] and
-                                      pair[1][-3] == pair[1][0])):
-            k = len(pair[1]) - 1
-            while k > -1 and pair[1][k] == '\\':
+            pair[0] = _unescape(pair[0][1:-1])
+        k, koffset = self._load_line_multiline_str(pair[1])
+        if k > -1:
+            while k > -1 and pair[1][k + koffset] == '\\':
                 multibackslash = not multibackslash
                 k -= 1
             if multibackslash:
@@ -734,6 +786,26 @@ class TomlDecoder(object):
             else:
                 currentlevel[pair[0]] = value
 
+    def _load_line_multiline_str(self, p):
+        poffset = 0
+        if len(p) < 3:
+            return -1, poffset
+        if p[0] == '[' and (p.strip()[-1] != ']' and
+                            self._load_array_isstrarray(p)):
+            newp = p[1:].strip().split(',')
+            while len(newp) > 1 and newp[-1][0] != '"' and newp[-1][0] != "'":
+                newp = newp[:-2] + [newp[-2] + ',' + newp[-1]]
+            newp = newp[-1]
+            poffset = len(p) - len(newp)
+            p = newp
+        if p[0] != '"' and p[0] != "'":
+            return -1, poffset
+        if p[1] != p[0] or p[2] != p[0]:
+            return -1, poffset
+        if len(p) > 5 and p[-1] == p[0] and p[-2] == p[0] and p[-3] == p[0]:
+            return -1, poffset
+        return len(p) - 1, poffset
+
     def load_value(self, v, strictly_valid=True):
         if not v:
             raise ValueError("Empty value is invalid")
@@ -769,7 +841,8 @@ class TomlDecoder(object):
                         pass
                     if not oddbackslash:
                         if closed:
-                            raise ValueError("Stuff after closed string. WTF?")
+                            raise ValueError("Found tokens after a closed " +
+                                             "string. Invalid TOML.")
                         else:
                             if not triplequote or triplequotecount > 1:
                                 closed = True
@@ -857,15 +930,18 @@ class TomlDecoder(object):
                 break
         return not backslash
 
+    def _load_array_isstrarray(self, a):
+        a = a[1:-1].strip()
+        if a != '' and (a[0] == '"' or a[0] == "'"):
+            return True
+        return False
+
     def load_array(self, a):
         atype = None
         retval = []
         a = a.strip()
         if '[' not in a[1:-1] or "" != a[1:-1].split('[')[0].strip():
-            strarray = False
-            tmpa = a[1:-1].strip()
-            if tmpa != '' and (tmpa[0] == '"' or tmpa[0] == "'"):
-                strarray = True
+            strarray = self._load_array_isstrarray(a)
             if not a[1:-1].strip().startswith('{'):
                 a = a[1:-1].split(',')
             else:
@@ -874,6 +950,7 @@ class TomlDecoder(object):
                 new_a = []
                 start_group_index = 1
                 end_group_index = 2
+                open_bracket_count = 1 if a[start_group_index] == '{' else 0
                 in_str = False
                 while end_group_index < len(a[1:]):
                     if a[end_group_index] == '"' or a[end_group_index] == "'":
@@ -884,9 +961,15 @@ class TomlDecoder(object):
                                 in_str = not in_str
                                 backslash_index -= 1
                         in_str = not in_str
+                    if not in_str and a[end_group_index] == '{':
+                        open_bracket_count += 1
                     if in_str or a[end_group_index] != '}':
                         end_group_index += 1
                         continue
+                    elif a[end_group_index] == '}' and open_bracket_count > 1:
+                        open_bracket_count -= 1
+                        end_group_index += 1
+                        continue
 
                     # Increase end_group_index by 1 to get the closing bracket
                     end_group_index += 1
@@ -943,3 +1026,27 @@ class TomlDecoder(object):
                     atype = ntype
                 retval.append(nval)
         return retval
+
+    def preserve_comment(self, line_no, key, comment, beginline):
+        pass
+
+    def embed_comments(self, idx, currentlevel):
+        pass
+
+
+class TomlPreserveCommentDecoder(TomlDecoder):
+
+    def __init__(self, _dict=dict):
+        self.saved_comments = {}
+        super(TomlPreserveCommentDecoder, self).__init__(_dict)
+
+    def preserve_comment(self, line_no, key, comment, beginline):
+        self.saved_comments[line_no] = (key, comment, beginline)
+
+    def embed_comments(self, idx, currentlevel):
+        if idx not in self.saved_comments:
+            return
+
+        key, comment, beginline = self.saved_comments[idx]
+        currentlevel[key] = CommentValue(currentlevel[key], comment, beginline,
+                                         self._dict)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/toml/encoder.py b/venv/Lib/site-packages/pip/_vendor/toml/encoder.py
similarity index 78%
rename from venv/lib/python3.8/site-packages/pip/_vendor/toml/encoder.py
rename to venv/Lib/site-packages/pip/_vendor/toml/encoder.py
index 53b0bd5..a8b03c7 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/toml/encoder.py
+++ b/venv/Lib/site-packages/pip/_vendor/toml/encoder.py
@@ -1,6 +1,7 @@
 import datetime
 import re
 import sys
+from decimal import Decimal
 
 from pip._vendor.toml.decoder import InlineTableDict
 
@@ -8,12 +9,13 @@ if sys.version_info >= (3,):
     unicode = str
 
 
-def dump(o, f):
+def dump(o, f, encoder=None):
     """Writes out dict as toml to a file
 
     Args:
         o: Object to dump into toml
         f: File descriptor where the toml should be stored
+        encoder: The ``TomlEncoder`` to use for constructing the output string
 
     Returns:
         String containing the toml corresponding to dictionary
@@ -24,7 +26,7 @@ def dump(o, f):
 
     if not f.write:
         raise TypeError("You can only dump an object to a file descriptor")
-    d = dumps(o)
+    d = dumps(o, encoder=encoder)
     f.write(d)
     return d
 
@@ -34,11 +36,22 @@ def dumps(o, encoder=None):
 
     Args:
         o: Object to dump into toml
-
-        preserve: Boolean parameter. If true, preserve inline tables.
+        encoder: The ``TomlEncoder`` to use for constructing the output string
 
     Returns:
         String containing the toml corresponding to dict
+
+    Examples:
+        ```python
+        >>> import toml
+        >>> output = {
+        ... 'a': "I'm a string",
+        ... 'b': ["I'm", "a", "list"],
+        ... 'c': 2400
+        ... }
+        >>> toml.dumps(output)
+        'a = "I\'m a string"\nb = [ "I\'m", "a", "list",]\nc = 2400\n'
+        ```
     """
 
     retval = ""
@@ -46,7 +59,13 @@ def dumps(o, encoder=None):
         encoder = TomlEncoder(o.__class__)
     addtoretval, sections = encoder.dump_sections(o, "")
     retval += addtoretval
+    outer_objs = [id(o)]
     while sections:
+        section_ids = [id(section) for section in sections]
+        for outer_obj in outer_objs:
+            if outer_obj in section_ids:
+                raise ValueError("Circular reference detected")
+        outer_objs += section_ids
         newsections = encoder.get_empty_table()
         for section in sections:
             addtoretval, addtosections = encoder.dump_sections(
@@ -96,7 +115,7 @@ def _dump_str(v):
 
 
 def _dump_float(v):
-    return "{0:.16}".format(v).replace("e+0", "e+").replace("e-0", "e-")
+    return "{}".format(v).replace("e+0", "e+").replace("e-0", "e-")
 
 
 def _dump_time(v):
@@ -119,6 +138,7 @@ class TomlEncoder(object):
             bool: lambda v: unicode(v).lower(),
             int: lambda v: v,
             float: _dump_float,
+            Decimal: _dump_float,
             datetime.datetime: lambda v: v.isoformat().replace('+00:00', 'Z'),
             datetime.time: _dump_time,
             datetime.date: lambda v: v.isoformat()
@@ -169,10 +189,7 @@ class TomlEncoder(object):
             section = unicode(section)
             qsection = section
             if not re.match(r'^[A-Za-z0-9_-]+$', section):
-                if '"' in section:
-                    qsection = "'" + section + "'"
-                else:
-                    qsection = '"' + section + '"'
+                qsection = _dump_str(section)
             if not isinstance(o[section], dict):
                 arrayoftables = False
                 if isinstance(o[section], list):
@@ -248,3 +265,40 @@ class TomlArraySeparatorEncoder(TomlEncoder):
             t = s
         retval += "]"
         return retval
+
+
+class TomlNumpyEncoder(TomlEncoder):
+
+    def __init__(self, _dict=dict, preserve=False):
+        import numpy as np
+        super(TomlNumpyEncoder, self).__init__(_dict, preserve)
+        self.dump_funcs[np.float16] = _dump_float
+        self.dump_funcs[np.float32] = _dump_float
+        self.dump_funcs[np.float64] = _dump_float
+        self.dump_funcs[np.int16] = self._dump_int
+        self.dump_funcs[np.int32] = self._dump_int
+        self.dump_funcs[np.int64] = self._dump_int
+
+    def _dump_int(self, v):
+        return "{}".format(int(v))
+
+
+class TomlPreserveCommentEncoder(TomlEncoder):
+
+    def __init__(self, _dict=dict, preserve=False):
+        from pip._vendor.toml.decoder import CommentValue
+        super(TomlPreserveCommentEncoder, self).__init__(_dict, preserve)
+        self.dump_funcs[CommentValue] = lambda v: v.dump(self.dump_value)
+
+
+class TomlPathlibEncoder(TomlEncoder):
+
+    def _dump_pathlib_path(self, v):
+        return _dump_str(str(v))
+
+    def dump_value(self, v):
+        if (3, 4) <= sys.version_info:
+            import pathlib
+            if isinstance(v, pathlib.PurePath):
+                v = str(v)
+        return super(TomlPathlibEncoder, self).dump_value(v)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/toml/ordered.py b/venv/Lib/site-packages/pip/_vendor/toml/ordered.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/toml/ordered.py
rename to venv/Lib/site-packages/pip/_vendor/toml/ordered.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/toml/tz.py b/venv/Lib/site-packages/pip/_vendor/toml/tz.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/toml/tz.py
rename to venv/Lib/site-packages/pip/_vendor/toml/tz.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__init__.py b/venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py
index 9bd8323..667e9bc 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/__init__.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py
@@ -22,7 +22,7 @@ from logging import NullHandler
 
 __author__ = "Andrey Petrov (andrey.petrov@shazow.net)"
 __license__ = "MIT"
-__version__ = "1.25.8"
+__version__ = "1.25.9"
 
 __all__ = (
     "HTTPConnectionPool",
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/_collections.py b/venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/_collections.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/connection.py b/venv/Lib/site-packages/pip/_vendor/urllib3/connection.py
similarity index 94%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/connection.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/connection.py
index 71e6790..6da1cf4 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/connection.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/connection.py
@@ -1,4 +1,5 @@
 from __future__ import absolute_import
+import re
 import datetime
 import logging
 import os
@@ -58,6 +59,8 @@ port_by_scheme = {"http": 80, "https": 443}
 # (ie test_recent_date is failing) update it to ~6 months before the current date.
 RECENT_DATE = datetime.date(2019, 1, 1)
 
+_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]")
+
 
 class DummyConnection(object):
     """Used to detect a failed ConnectionCls import."""
@@ -184,6 +187,17 @@ class HTTPConnection(_HTTPConnection, object):
         conn = self._new_conn()
         self._prepare_conn(conn)
 
+    def putrequest(self, method, url, *args, **kwargs):
+        """Send a request to the server"""
+        match = _CONTAINS_CONTROL_CHAR_RE.search(method)
+        if match:
+            raise ValueError(
+                "Method cannot contain non-token characters %r (found at least %r)"
+                % (method, match.group())
+            )
+
+        return _HTTPConnection.putrequest(self, method, url, *args, **kwargs)
+
     def request_chunked(self, method, url, body=None, headers=None):
         """
         Alternative to the common request method, which sends the
@@ -223,7 +237,12 @@ class HTTPConnection(_HTTPConnection, object):
 class HTTPSConnection(HTTPConnection):
     default_port = port_by_scheme["https"]
 
+    cert_reqs = None
+    ca_certs = None
+    ca_cert_dir = None
+    ca_cert_data = None
     ssl_version = None
+    assert_fingerprint = None
 
     def __init__(
         self,
@@ -251,19 +270,6 @@ class HTTPSConnection(HTTPConnection):
         # HTTPS requests to go out as HTTP. (See Issue #356)
         self._protocol = "https"
 
-
-class VerifiedHTTPSConnection(HTTPSConnection):
-    """
-    Based on httplib.HTTPSConnection but wraps the socket with
-    SSL certification.
-    """
-
-    cert_reqs = None
-    ca_certs = None
-    ca_cert_dir = None
-    ssl_version = None
-    assert_fingerprint = None
-
     def set_cert(
         self,
         key_file=None,
@@ -274,6 +280,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
         assert_hostname=None,
         assert_fingerprint=None,
         ca_cert_dir=None,
+        ca_cert_data=None,
     ):
         """
         This method should only be called once, before the connection is used.
@@ -294,6 +301,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
         self.assert_fingerprint = assert_fingerprint
         self.ca_certs = ca_certs and os.path.expanduser(ca_certs)
         self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir)
+        self.ca_cert_data = ca_cert_data
 
     def connect(self):
         # Add certificate verification
@@ -344,6 +352,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
         if (
             not self.ca_certs
             and not self.ca_cert_dir
+            and not self.ca_cert_data
             and default_ssl_context
             and hasattr(context, "load_default_certs")
         ):
@@ -356,6 +365,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
             key_password=self.key_password,
             ca_certs=self.ca_certs,
             ca_cert_dir=self.ca_cert_dir,
+            ca_cert_data=self.ca_cert_data,
             server_hostname=server_hostname,
             ssl_context=context,
         )
@@ -406,9 +416,8 @@ def _match_hostname(cert, asserted_hostname):
         raise
 
 
-if ssl:
-    # Make a copy for testing.
-    UnverifiedHTTPSConnection = HTTPSConnection
-    HTTPSConnection = VerifiedHTTPSConnection
-else:
-    HTTPSConnection = DummyConnection
+if not ssl:
+    HTTPSConnection = DummyConnection  # noqa: F811
+
+
+VerifiedHTTPSConnection = HTTPSConnection
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/connectionpool.py b/venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/connectionpool.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py
index d42eb7b..5f044db 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/connectionpool.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py
@@ -65,6 +65,11 @@ class ConnectionPool(object):
     """
     Base class for all connection pools, such as
     :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`.
+
+    .. note::
+       ConnectionPool.urlopen() does not normalize or percent-encode target URIs
+       which is useful if your target server doesn't support percent-encoded
+       target URIs.
     """
 
     scheme = None
@@ -760,21 +765,6 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
                 **response_kw
             )
 
-        def drain_and_release_conn(response):
-            try:
-                # discard any remaining response body, the connection will be
-                # released back to the pool once the entire response is read
-                response.read()
-            except (
-                TimeoutError,
-                HTTPException,
-                SocketError,
-                ProtocolError,
-                BaseSSLError,
-                SSLError,
-            ):
-                pass
-
         # Handle redirect?
         redirect_location = redirect and response.get_redirect_location()
         if redirect_location:
@@ -785,15 +775,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
                 retries = retries.increment(method, url, response=response, _pool=self)
             except MaxRetryError:
                 if retries.raise_on_redirect:
-                    # Drain and release the connection for this response, since
-                    # we're not returning it to be released manually.
-                    drain_and_release_conn(response)
+                    response.drain_conn()
                     raise
                 return response
 
-            # drain and return the connection to the pool before recursing
-            drain_and_release_conn(response)
-
+            response.drain_conn()
             retries.sleep_for_retry(response)
             log.debug("Redirecting %s -> %s", url, redirect_location)
             return self.urlopen(
@@ -819,15 +805,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
                 retries = retries.increment(method, url, response=response, _pool=self)
             except MaxRetryError:
                 if retries.raise_on_status:
-                    # Drain and release the connection for this response, since
-                    # we're not returning it to be released manually.
-                    drain_and_release_conn(response)
+                    response.drain_conn()
                     raise
                 return response
 
-            # drain and return the connection to the pool before recursing
-            drain_and_release_conn(response)
-
+            response.drain_conn()
             retries.sleep(response)
             log.debug("Retry: %s", url)
             return self.urlopen(
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/appengine.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py
index fc99d34..d8fe062 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py
@@ -450,9 +450,12 @@ class PyOpenSSLContext(object):
             cafile = cafile.encode("utf-8")
         if capath is not None:
             capath = capath.encode("utf-8")
-        self._ctx.load_verify_locations(cafile, capath)
-        if cadata is not None:
-            self._ctx.load_verify_locations(BytesIO(cadata))
+        try:
+            self._ctx.load_verify_locations(cafile, capath)
+            if cadata is not None:
+                self._ctx.load_verify_locations(BytesIO(cadata))
+        except OpenSSL.SSL.Error as e:
+            raise ssl.SSLError("unable to load trusted certificates: %r" % e)
 
     def load_cert_chain(self, certfile, keyfile=None, password=None):
         self._ctx.use_certificate_chain_file(certfile)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
index 87d844a..a6b7e94 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
@@ -819,6 +819,11 @@ class SecureTransportContext(object):
         if capath is not None:
             raise ValueError("SecureTransport does not support cert directories")
 
+        # Raise if cafile does not exist.
+        if cafile is not None:
+            with open(cafile):
+                pass
+
         self._trust_bundle = cafile or cadata
 
     def load_cert_chain(self, certfile, keyfile=None, password=None):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/socks.py b/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/contrib/socks.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/exceptions.py b/venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py
similarity index 92%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/exceptions.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py
index 0a74c79..5cc4d8a 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/exceptions.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py
@@ -45,7 +45,10 @@ class SSLError(HTTPError):
 
 class ProxyError(HTTPError):
     "Raised when the connection to a proxy fails."
-    pass
+
+    def __init__(self, message, error, *args):
+        super(ProxyError, self).__init__(message, error, *args)
+        self.original_error = error
 
 
 class DecodeError(HTTPError):
@@ -195,6 +198,20 @@ class DependencyWarning(HTTPWarning):
     pass
 
 
+class InvalidProxyConfigurationWarning(HTTPWarning):
+    """
+    Warned when using an HTTPS proxy and an HTTPS URL. Currently
+    urllib3 doesn't support HTTPS proxies and the proxy will be
+    contacted via HTTP instead. This warning can be fixed by
+    changing your HTTPS proxy URL into an HTTP proxy URL.
+
+    If you encounter this warning read this:
+    https://github.com/urllib3/urllib3/issues/1850
+    """
+
+    pass
+
+
 class ResponseNotChunked(ProtocolError, ValueError):
     "Response needs to be chunked in order to read it as chunks."
     pass
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/fields.py b/venv/Lib/site-packages/pip/_vendor/urllib3/fields.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/fields.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/fields.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/filepost.py b/venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/filepost.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/__init__.py b/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__init__.py b/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/six.py b/venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/six.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/poolmanager.py b/venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/poolmanager.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py
index 242a2f8..e2bd3bd 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/poolmanager.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py
@@ -2,11 +2,17 @@ from __future__ import absolute_import
 import collections
 import functools
 import logging
+import warnings
 
 from ._collections import RecentlyUsedContainer
 from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool
 from .connectionpool import port_by_scheme
-from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown
+from .exceptions import (
+    LocationValueError,
+    MaxRetryError,
+    ProxySchemeUnknown,
+    InvalidProxyConfigurationWarning,
+)
 from .packages import six
 from .packages.six.moves.urllib.parse import urljoin
 from .request import RequestMethods
@@ -359,6 +365,7 @@ class PoolManager(RequestMethods):
             retries = retries.increment(method, url, response=response, _pool=conn)
         except MaxRetryError:
             if retries.raise_on_redirect:
+                response.drain_conn()
                 raise
             return response
 
@@ -366,6 +373,8 @@ class PoolManager(RequestMethods):
         kw["redirect"] = redirect
 
         log.info("Redirecting %s -> %s", url, redirect_location)
+
+        response.drain_conn()
         return self.urlopen(method, redirect_location, **kw)
 
 
@@ -452,9 +461,22 @@ class ProxyManager(PoolManager):
             headers_.update(headers)
         return headers_
 
+    def _validate_proxy_scheme_url_selection(self, url_scheme):
+        if url_scheme == "https" and self.proxy.scheme == "https":
+            warnings.warn(
+                "Your proxy configuration specified an HTTPS scheme for the proxy. "
+                "Are you sure you want to use HTTPS to contact the proxy? "
+                "This most likely indicates an error in your configuration. "
+                "Read this issue for more info: "
+                "https://github.com/urllib3/urllib3/issues/1850",
+                InvalidProxyConfigurationWarning,
+                stacklevel=3,
+            )
+
     def urlopen(self, method, url, redirect=True, **kw):
         "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute."
         u = parse_url(url)
+        self._validate_proxy_scheme_url_selection(u.scheme)
 
         if u.scheme == "http":
             # For proxied HTTPS requests, httplib sets the necessary headers
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/request.py b/venv/Lib/site-packages/pip/_vendor/urllib3/request.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/request.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/request.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/response.py b/venv/Lib/site-packages/pip/_vendor/urllib3/response.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/response.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/response.py
index 6090a73..7dc9b93 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/response.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/response.py
@@ -20,6 +20,7 @@ from .exceptions import (
     ResponseNotChunked,
     IncompleteRead,
     InvalidHeader,
+    HTTPError,
 )
 from .packages.six import string_types as basestring, PY3
 from .packages.six.moves import http_client as httplib
@@ -277,6 +278,17 @@ class HTTPResponse(io.IOBase):
         self._pool._put_conn(self._connection)
         self._connection = None
 
+    def drain_conn(self):
+        """
+        Read and discard any remaining HTTP response data in the response connection.
+
+        Unread data in the HTTPResponse connection blocks the connection from being released back to the pool.
+        """
+        try:
+            self.read()
+        except (HTTPError, SocketError, BaseSSLError, HTTPException):
+            pass
+
     @property
     def data(self):
         # For backwords-compat with earlier urllib3 0.4 and earlier.
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__init__.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/connection.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/connection.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/queue.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/queue.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/request.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/request.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/response.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/response.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/retry.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/retry.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py
index 5a049fe..ee30c91 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/retry.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py
@@ -13,6 +13,7 @@ from ..exceptions import (
     ReadTimeoutError,
     ResponseError,
     InvalidHeader,
+    ProxyError,
 )
 from ..packages import six
 
@@ -306,6 +307,8 @@ class Retry(object):
         """ Errors when we're fairly sure that the server did not receive the
         request, so it should be safe to retry.
         """
+        if isinstance(err, ProxyError):
+            err = err.original_error
         return isinstance(err, ConnectTimeoutError)
 
     def _is_read_error(self, err):
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/ssl_.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/ssl_.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py
index 3f78296..d3b463d 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/ssl_.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py
@@ -119,12 +119,15 @@ except ImportError:
             self.certfile = certfile
             self.keyfile = keyfile
 
-        def load_verify_locations(self, cafile=None, capath=None):
+        def load_verify_locations(self, cafile=None, capath=None, cadata=None):
             self.ca_certs = cafile
 
             if capath is not None:
                 raise SSLError("CA directories not supported in older Pythons")
 
+            if cadata is not None:
+                raise SSLError("CA data not supported in older Pythons")
+
         def set_ciphers(self, cipher_suite):
             self.ciphers = cipher_suite
 
@@ -305,6 +308,7 @@ def ssl_wrap_socket(
     ssl_context=None,
     ca_cert_dir=None,
     key_password=None,
+    ca_cert_data=None,
 ):
     """
     All arguments except for server_hostname, ssl_context, and ca_cert_dir have
@@ -323,6 +327,9 @@ def ssl_wrap_socket(
         SSLContext.load_verify_locations().
     :param key_password:
         Optional password if the keyfile is encrypted.
+    :param ca_cert_data:
+        Optional string containing CA certificates in PEM format suitable for
+        passing as the cadata parameter to SSLContext.load_verify_locations()
     """
     context = ssl_context
     if context is None:
@@ -331,9 +338,9 @@ def ssl_wrap_socket(
         # this code.
         context = create_urllib3_context(ssl_version, cert_reqs, ciphers=ciphers)
 
-    if ca_certs or ca_cert_dir:
+    if ca_certs or ca_cert_dir or ca_cert_data:
         try:
-            context.load_verify_locations(ca_certs, ca_cert_dir)
+            context.load_verify_locations(ca_certs, ca_cert_dir, ca_cert_data)
         except IOError as e:  # Platform-specific: Python 2.7
             raise SSLError(e)
         # Py33 raises FileNotFoundError which subclasses OSError
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/timeout.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/timeout.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py
index 9883700..b61fea7 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/timeout.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py
@@ -98,7 +98,7 @@ class Timeout(object):
         self.total = self._validate_timeout(total, "total")
         self._start_connect = None
 
-    def __str__(self):
+    def __repr__(self):
         return "%s(connect=%r, read=%r, total=%r)" % (
             type(self).__name__,
             self._connect,
@@ -106,6 +106,9 @@ class Timeout(object):
             self.total,
         )
 
+    # __str__ provided for backwards compatibility
+    __str__ = __repr__
+
     @classmethod
     def _validate_timeout(cls, value, name):
         """ Check that a timeout attribute is valid.
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/url.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/url.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py
index 5f8aee6..0eb0b6a 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/url.py
+++ b/venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py
@@ -18,7 +18,7 @@ PERCENT_RE = re.compile(r"%[a-fA-F0-9]{2}")
 SCHEME_RE = re.compile(r"^(?:[a-zA-Z][a-zA-Z0-9+-]*:|/)")
 URI_RE = re.compile(
     r"^(?:([a-zA-Z][a-zA-Z0-9+.-]*):)?"
-    r"(?://([^/?#]*))?"
+    r"(?://([^\\/?#]*))?"
     r"([^?#]*)"
     r"(?:\?([^#]*))?"
     r"(?:#(.*))?$",
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/wait.py b/venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/urllib3/util/wait.py
rename to venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/vendor.txt b/venv/Lib/site-packages/pip/_vendor/vendor.txt
similarity index 58%
rename from venv/lib/python3.8/site-packages/pip/_vendor/vendor.txt
rename to venv/Lib/site-packages/pip/_vendor/vendor.txt
index 74ecca4..06fa135 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/vendor.txt
+++ b/venv/Lib/site-packages/pip/_vendor/vendor.txt
@@ -1,24 +1,24 @@
-appdirs==1.4.3
+appdirs==1.4.4
 CacheControl==0.12.6
 colorama==0.4.3
 contextlib2==0.6.0.post1
-distlib==0.3.0
+distlib==0.3.1
 distro==1.5.0
-html5lib==1.0.1
+html5lib==1.1
 ipaddress==1.0.23  # Only needed on 2.6 and 2.7
 msgpack==1.0.0
-packaging==20.3
+packaging==20.4
 pep517==0.8.2
 progress==1.5
 pyparsing==2.4.7
-requests==2.23.0
-    certifi==2020.04.05.1
+requests==2.24.0
+    certifi==2020.06.20
     chardet==3.0.4
-    idna==2.9
-    urllib3==1.25.8
-resolvelib==0.3.0
+    idna==2.10
+    urllib3==1.25.9
+resolvelib==0.4.0
 retrying==1.3.3
 setuptools==44.0.0
-six==1.14.0
-toml==0.10.0
+six==1.15.0
+toml==0.10.1
 webencodings==0.5.1
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/__init__.py b/venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/webencodings/__init__.py
rename to venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/labels.py b/venv/Lib/site-packages/pip/_vendor/webencodings/labels.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/webencodings/labels.py
rename to venv/Lib/site-packages/pip/_vendor/webencodings/labels.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/mklabels.py b/venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/webencodings/mklabels.py
rename to venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/tests.py b/venv/Lib/site-packages/pip/_vendor/webencodings/tests.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/webencodings/tests.py
rename to venv/Lib/site-packages/pip/_vendor/webencodings/tests.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/webencodings/x_user_defined.py b/venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pip/_vendor/webencodings/x_user_defined.py
rename to venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/__init__.py b/venv/Lib/site-packages/pkg_resources/__init__.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/pkg_resources/__init__.py
rename to venv/Lib/site-packages/pkg_resources/__init__.py
index 15a4401..b585e85 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/__init__.py
+++ b/venv/Lib/site-packages/pkg_resources/__init__.py
@@ -55,7 +55,7 @@ except NameError:
     FileExistsError = OSError
 
 from pkg_resources.extern import six
-from pkg_resources.extern.six.moves import urllib, map, filter
+from pkg_resources.extern.six.moves import map, filter
 
 # capture these to bypass sandboxing
 from os import utime
@@ -76,14 +76,12 @@ try:
 except ImportError:
     importlib_machinery = None
 
-from . import py31compat
 from pkg_resources.extern import appdirs
 from pkg_resources.extern import packaging
 __import__('pkg_resources.extern.packaging.version')
 __import__('pkg_resources.extern.packaging.specifiers')
 __import__('pkg_resources.extern.packaging.requirements')
 __import__('pkg_resources.extern.packaging.markers')
-__import__('pkg_resources.py2_warn')
 
 
 __metaclass__ = type
@@ -179,10 +177,10 @@ def get_supported_platform():
     """Return this platform's maximum compatible version.
 
     distutils.util.get_platform() normally reports the minimum version
-    of Mac OS X that would be required to *use* extensions produced by
+    of macOS that would be required to *use* extensions produced by
     distutils.  But what we want when checking compatibility is to know the
-    version of Mac OS X that we are *running*.  To allow usage of packages that
-    explicitly require a newer version of Mac OS X, we must also know the
+    version of macOS that we are *running*.  To allow usage of packages that
+    explicitly require a newer version of macOS, we must also know the
     current version of the OS.
 
     If this condition occurs for any other platform with a version in its
@@ -192,9 +190,9 @@ def get_supported_platform():
     m = macosVersionString.match(plat)
     if m is not None and sys.platform == "darwin":
         try:
-            plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3))
+            plat = 'macosx-%s-%s' % ('.'.join(_macos_vers()[:2]), m.group(3))
         except ValueError:
-            # not Mac OS X
+            # not macOS
             pass
     return plat
 
@@ -365,7 +363,7 @@ def get_provider(moduleOrReq):
     return _find_adapter(_provider_factories, loader)(module)
 
 
-def _macosx_vers(_cache=[]):
+def _macos_vers(_cache=[]):
     if not _cache:
         version = platform.mac_ver()[0]
         # fallback for MacPorts
@@ -381,7 +379,7 @@ def _macosx_vers(_cache=[]):
     return _cache[0]
 
 
-def _macosx_arch(machine):
+def _macos_arch(machine):
     return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine)
 
 
@@ -389,18 +387,18 @@ def get_build_platform():
     """Return this platform's string for platform-specific distributions
 
     XXX Currently this is the same as ``distutils.util.get_platform()``, but it
-    needs some hacks for Linux and Mac OS X.
+    needs some hacks for Linux and macOS.
     """
     from sysconfig import get_platform
 
     plat = get_platform()
     if sys.platform == "darwin" and not plat.startswith('macosx-'):
         try:
-            version = _macosx_vers()
+            version = _macos_vers()
             machine = os.uname()[4].replace(" ", "_")
             return "macosx-%d.%d-%s" % (
                 int(version[0]), int(version[1]),
-                _macosx_arch(machine),
+                _macos_arch(machine),
             )
         except ValueError:
             # if someone is running a non-Mac darwin system, this will fall
@@ -426,7 +424,7 @@ def compatible_platforms(provided, required):
         # easy case
         return True
 
-    # Mac OS X special cases
+    # macOS special cases
     reqMac = macosVersionString.match(required)
     if reqMac:
         provMac = macosVersionString.match(provided)
@@ -435,7 +433,7 @@ def compatible_platforms(provided, required):
         if not provMac:
             # this is backwards compatibility for packages built before
             # setuptools 0.6. All packages built after this point will
-            # use the new macosx designation.
+            # use the new macOS designation.
             provDarwin = darwinVersionString.match(provided)
             if provDarwin:
                 dversion = int(provDarwin.group(1))
@@ -443,7 +441,7 @@ def compatible_platforms(provided, required):
                 if dversion == 7 and macosversion >= "10.3" or \
                         dversion == 8 and macosversion >= "10.4":
                     return True
-            # egg isn't macosx or legacy darwin
+            # egg isn't macOS or legacy darwin
             return False
 
         # are they the same major version and machine type?
@@ -1379,7 +1377,7 @@ def evaluate_marker(text, extra=None):
         marker = packaging.markers.Marker(text)
         return marker.evaluate()
     except packaging.markers.InvalidMarker as e:
-        raise SyntaxError(e)
+        raise SyntaxError(e) from e
 
 
 class NullProvider:
@@ -1459,7 +1457,8 @@ class NullProvider:
         script_filename = self._fn(self.egg_info, script)
         namespace['__file__'] = script_filename
         if os.path.exists(script_filename):
-            source = open(script_filename).read()
+            with open(script_filename) as fid:
+                source = fid.read()
             code = compile(source, script_filename, 'exec')
             exec(code, namespace, namespace)
         else:
@@ -1577,6 +1576,17 @@ is not allowed.
 register_loader_type(object, NullProvider)
 
 
+def _parents(path):
+    """
+    yield all parents of path including path
+    """
+    last = None
+    while path != last:
+        yield path
+        last = path
+        path, _ = os.path.split(path)
+
+
 class EggProvider(NullProvider):
     """Provider based on a virtual filesystem"""
 
@@ -1585,18 +1595,16 @@ class EggProvider(NullProvider):
         self._setup_prefix()
 
     def _setup_prefix(self):
-        # we assume here that our metadata may be nested inside a "basket"
-        # of multiple eggs; that's why we use module_path instead of .archive
-        path = self.module_path
-        old = None
-        while path != old:
-            if _is_egg_path(path):
-                self.egg_name = os.path.basename(path)
-                self.egg_info = os.path.join(path, 'EGG-INFO')
-                self.egg_root = path
-                break
-            old = path
-            path, base = os.path.split(path)
+        # Assume that metadata may be nested inside a "basket"
+        # of multiple eggs and use module_path instead of .archive.
+        eggs = filter(_is_egg_path, _parents(self.module_path))
+        egg = next(eggs, None)
+        egg and self._set_egg(egg)
+
+    def _set_egg(self, path):
+        self.egg_name = os.path.basename(path)
+        self.egg_info = os.path.join(path, 'EGG-INFO')
+        self.egg_root = path
 
 
 class DefaultProvider(EggProvider):
@@ -2048,7 +2056,10 @@ def find_on_path(importer, path_item, only=False):
         )
         return
 
-    entries = safe_listdir(path_item)
+    entries = (
+        os.path.join(path_item, child)
+        for child in safe_listdir(path_item)
+    )
 
     # for performance, before sorting by version,
     # screen entries for only those that will yield
@@ -2069,11 +2080,14 @@ def find_on_path(importer, path_item, only=False):
 
 
 def dist_factory(path_item, entry, only):
-    """
-    Return a dist_factory for a path_item and entry
-    """
+    """Return a dist_factory for the given entry."""
     lower = entry.lower()
-    is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info')))
+    is_egg_info = lower.endswith('.egg-info')
+    is_dist_info = (
+        lower.endswith('.dist-info') and
+        os.path.isdir(os.path.join(path_item, entry))
+    )
+    is_meta = is_egg_info or is_dist_info
     return (
         distributions_from_metadata
         if is_meta else
@@ -2276,8 +2290,8 @@ def declare_namespace(packageName):
                 __import__(parent)
             try:
                 path = sys.modules[parent].__path__
-            except AttributeError:
-                raise TypeError("Not a package:", parent)
+            except AttributeError as e:
+                raise TypeError("Not a package:", parent) from e
 
         # Track what packages are namespaces, so when new path items are added,
         # they can be updated
@@ -2361,7 +2375,15 @@ def _is_egg_path(path):
     """
     Determine if given path appears to be an egg.
     """
-    return path.lower().endswith('.egg')
+    return _is_zip_egg(path) or _is_unpacked_egg(path)
+
+
+def _is_zip_egg(path):
+    return (
+        path.lower().endswith('.egg') and
+        os.path.isfile(path) and
+        zipfile.is_zipfile(path)
+    )
 
 
 def _is_unpacked_egg(path):
@@ -2369,7 +2391,7 @@ def _is_unpacked_egg(path):
     Determine if given path appears to be an unpacked egg.
     """
     return (
-        _is_egg_path(path) and
+        path.lower().endswith('.egg') and
         os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO'))
     )
 
@@ -2457,7 +2479,7 @@ class EntryPoint:
         try:
             return functools.reduce(getattr, self.attrs, module)
         except AttributeError as exc:
-            raise ImportError(str(exc))
+            raise ImportError(str(exc)) from exc
 
     def require(self, env=None, installer=None):
         if self.extras and not self.dist:
@@ -2543,15 +2565,6 @@ class EntryPoint:
         return maps
 
 
-def _remove_md5_fragment(location):
-    if not location:
-        return ''
-    parsed = urllib.parse.urlparse(location)
-    if parsed[-1].startswith('md5='):
-        return urllib.parse.urlunparse(parsed[:-1] + ('',))
-    return location
-
-
 def _version_from_file(lines):
     """
     Given an iterable of lines from a Metadata file, return
@@ -2608,7 +2621,7 @@ class Distribution:
             self.parsed_version,
             self.precedence,
             self.key,
-            _remove_md5_fragment(self.location),
+            self.location,
             self.py_version or '',
             self.platform or '',
         )
@@ -2686,14 +2699,14 @@ class Distribution:
     def version(self):
         try:
             return self._version
-        except AttributeError:
+        except AttributeError as e:
             version = self._get_version()
             if version is None:
                 path = self._get_metadata_path_for_display(self.PKG_INFO)
                 msg = (
                     "Missing 'Version:' header and/or {} file at path: {}"
                 ).format(self.PKG_INFO, path)
-                raise ValueError(msg, self)
+                raise ValueError(msg, self) from e
 
             return version
 
@@ -2746,10 +2759,10 @@ class Distribution:
         for ext in extras:
             try:
                 deps.extend(dm[safe_extra(ext)])
-            except KeyError:
+            except KeyError as e:
                 raise UnknownExtra(
                     "%s has no such extra feature %r" % (self, ext)
-                )
+                ) from e
         return deps
 
     def _get_metadata_path_for_display(self, name):
@@ -3074,11 +3087,6 @@ def issue_warning(*args, **kw):
     warnings.warn(stacklevel=level + 1, *args, **kw)
 
 
-class RequirementParseError(ValueError):
-    def __str__(self):
-        return ' '.join(self.args)
-
-
 def parse_requirements(strs):
     """Yield ``Requirement`` objects for each specification in `strs`
 
@@ -3101,13 +3109,14 @@ def parse_requirements(strs):
         yield Requirement(line)
 
 
+class RequirementParseError(packaging.requirements.InvalidRequirement):
+    "Compatibility wrapper for InvalidRequirement"
+
+
 class Requirement(packaging.requirements.Requirement):
     def __init__(self, requirement_string):
         """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
-        try:
-            super(Requirement, self).__init__(requirement_string)
-        except packaging.requirements.InvalidRequirement as e:
-            raise RequirementParseError(str(e))
+        super(Requirement, self).__init__(requirement_string)
         self.unsafe_name = self.name
         project_name = safe_name(self.name)
         self.project_name, self.key = project_name, project_name.lower()
@@ -3177,7 +3186,7 @@ def _find_adapter(registry, ob):
 def ensure_directory(path):
     """Ensure that the parent directory of `path` exists"""
     dirname = os.path.dirname(path)
-    py31compat.makedirs(dirname, exist_ok=True)
+    os.makedirs(dirname, exist_ok=True)
 
 
 def _bypass_ensure_directory(path):
diff --git a/venv/lib/python3.8/site-packages/serial/tools/__init__.py b/venv/Lib/site-packages/pkg_resources/_vendor/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/serial/tools/__init__.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/appdirs.py b/venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/appdirs.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__about__.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py
similarity index 90%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/__about__.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py
index 5161d14..4d99857 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/__about__.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py
@@ -18,10 +18,10 @@ __title__ = "packaging"
 __summary__ = "Core utilities for Python packages"
 __uri__ = "https://github.com/pypa/packaging"
 
-__version__ = "20.3"
+__version__ = "20.4"
 
 __author__ = "Donald Stufft and individual contributors"
 __email__ = "donald@stufft.io"
 
-__license__ = "BSD or Apache License, Version 2.0"
+__license__ = "BSD-2-Clause or Apache-2.0"
 __copyright__ = "Copyright 2014-2019 %s" % __author__
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__init__.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__init__.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py
similarity index 74%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py
index 25da473..e54bd4e 100644
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py
@@ -5,6 +5,11 @@ from __future__ import absolute_import, division, print_function
 
 import sys
 
+from ._typing import TYPE_CHECKING
+
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import Any, Dict, Tuple, Type
+
 
 PY2 = sys.version_info[0] == 2
 PY3 = sys.version_info[0] == 3
@@ -18,14 +23,16 @@ else:
 
 
 def with_metaclass(meta, *bases):
+    # type: (Type[Any], Tuple[Type[Any], ...]) -> Any
     """
     Create a base class with a metaclass.
     """
     # This requires a bit of explanation: the basic idea is to make a dummy
     # metaclass for one level of class instantiation that replaces itself with
     # the actual metaclass.
-    class metaclass(meta):
+    class metaclass(meta):  # type: ignore
         def __new__(cls, name, this_bases, d):
+            # type: (Type[Any], str, Tuple[Any], Dict[Any, Any]) -> Any
             return meta(name, bases, d)
 
     return type.__new__(metaclass, "temporary_class", (), {})
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py
similarity index 64%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py
index 68dcca6..800d5c5 100644
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py
@@ -4,65 +4,83 @@
 from __future__ import absolute_import, division, print_function
 
 
-class Infinity(object):
+class InfinityType(object):
     def __repr__(self):
+        # type: () -> str
         return "Infinity"
 
     def __hash__(self):
+        # type: () -> int
         return hash(repr(self))
 
     def __lt__(self, other):
+        # type: (object) -> bool
         return False
 
     def __le__(self, other):
+        # type: (object) -> bool
         return False
 
     def __eq__(self, other):
+        # type: (object) -> bool
         return isinstance(other, self.__class__)
 
     def __ne__(self, other):
+        # type: (object) -> bool
         return not isinstance(other, self.__class__)
 
     def __gt__(self, other):
+        # type: (object) -> bool
         return True
 
     def __ge__(self, other):
+        # type: (object) -> bool
         return True
 
     def __neg__(self):
+        # type: (object) -> NegativeInfinityType
         return NegativeInfinity
 
 
-Infinity = Infinity()
+Infinity = InfinityType()
 
 
-class NegativeInfinity(object):
+class NegativeInfinityType(object):
     def __repr__(self):
+        # type: () -> str
         return "-Infinity"
 
     def __hash__(self):
+        # type: () -> int
         return hash(repr(self))
 
     def __lt__(self, other):
+        # type: (object) -> bool
         return True
 
     def __le__(self, other):
+        # type: (object) -> bool
         return True
 
     def __eq__(self, other):
+        # type: (object) -> bool
         return isinstance(other, self.__class__)
 
     def __ne__(self, other):
+        # type: (object) -> bool
         return not isinstance(other, self.__class__)
 
     def __gt__(self, other):
+        # type: (object) -> bool
         return False
 
     def __ge__(self, other):
+        # type: (object) -> bool
         return False
 
     def __neg__(self):
+        # type: (object) -> InfinityType
         return Infinity
 
 
-NegativeInfinity = NegativeInfinity()
+NegativeInfinity = NegativeInfinityType()
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/_typing.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_typing.py
similarity index 57%
rename from venv/lib/python3.8/site-packages/pip/_vendor/packaging/_typing.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/_typing.py
index 945b39c..77a8b91 100644
--- a/venv/lib/python3.8/site-packages/pip/_vendor/packaging/_typing.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_typing.py
@@ -18,22 +18,31 @@ curious maintainer can reach here to read this.
 
 In packaging, all static-typing related imports should be guarded as follows:
 
-    from pip._vendor.packaging._typing import MYPY_CHECK_RUNNING
+    from packaging._typing import TYPE_CHECKING
 
-    if MYPY_CHECK_RUNNING:
+    if TYPE_CHECKING:
         from typing import ...
 
 Ref: https://github.com/python/mypy/issues/3216
 """
 
-MYPY_CHECK_RUNNING = False
+__all__ = ["TYPE_CHECKING", "cast"]
 
-if MYPY_CHECK_RUNNING:  # pragma: no cover
-    import typing
-
-    cast = typing.cast
+# The TYPE_CHECKING constant defined by the typing module is False at runtime
+# but True while type checking.
+if False:  # pragma: no cover
+    from typing import TYPE_CHECKING
+else:
+    TYPE_CHECKING = False
+
+# typing's cast syntax requires calling typing.cast at runtime, but we don't
+# want to import typing at runtime. Here, we inform the type checkers that
+# we're importing `typing.cast` as `cast` and re-implement typing.cast's
+# runtime behavior in a block that is ignored by type checkers.
+if TYPE_CHECKING:  # pragma: no cover
+    # not executed at runtime
+    from typing import cast
 else:
-    # typing's cast() is needed at runtime, but we don't want to import typing.
-    # Thus, we use a dummy no-op version, which we tell mypy to ignore.
-    def cast(type_, value):  # type: ignore
+    # executed at runtime
+    def cast(type_, value):  # noqa
         return value
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py
similarity index 68%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py
index 892e578..fd1559c 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py
@@ -13,12 +13,21 @@ from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedStr
 from pkg_resources.extern.pyparsing import Literal as L  # noqa
 
 from ._compat import string_types
+from ._typing import TYPE_CHECKING
 from .specifiers import Specifier, InvalidSpecifier
 
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import Any, Callable, Dict, List, Optional, Tuple, Union
+
+    Operator = Callable[[str, str], bool]
+
 
 __all__ = [
-    "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName",
-    "Marker", "default_environment",
+    "InvalidMarker",
+    "UndefinedComparison",
+    "UndefinedEnvironmentName",
+    "Marker",
+    "default_environment",
 ]
 
 
@@ -42,77 +51,73 @@ class UndefinedEnvironmentName(ValueError):
 
 
 class Node(object):
-
     def __init__(self, value):
+        # type: (Any) -> None
         self.value = value
 
     def __str__(self):
+        # type: () -> str
         return str(self.value)
 
     def __repr__(self):
+        # type: () -> str
         return "<{0}({1!r})>".format(self.__class__.__name__, str(self))
 
     def serialize(self):
+        # type: () -> str
         raise NotImplementedError
 
 
 class Variable(Node):
-
     def serialize(self):
+        # type: () -> str
         return str(self)
 
 
 class Value(Node):
-
     def serialize(self):
+        # type: () -> str
         return '"{0}"'.format(self)
 
 
 class Op(Node):
-
     def serialize(self):
+        # type: () -> str
         return str(self)
 
 
 VARIABLE = (
-    L("implementation_version") |
-    L("platform_python_implementation") |
-    L("implementation_name") |
-    L("python_full_version") |
-    L("platform_release") |
-    L("platform_version") |
-    L("platform_machine") |
-    L("platform_system") |
-    L("python_version") |
-    L("sys_platform") |
-    L("os_name") |
-    L("os.name") |  # PEP-345
-    L("sys.platform") |  # PEP-345
-    L("platform.version") |  # PEP-345
-    L("platform.machine") |  # PEP-345
-    L("platform.python_implementation") |  # PEP-345
-    L("python_implementation") |  # undocumented setuptools legacy
-    L("extra")
+    L("implementation_version")
+    | L("platform_python_implementation")
+    | L("implementation_name")
+    | L("python_full_version")
+    | L("platform_release")
+    | L("platform_version")
+    | L("platform_machine")
+    | L("platform_system")
+    | L("python_version")
+    | L("sys_platform")
+    | L("os_name")
+    | L("os.name")  # PEP-345
+    | L("sys.platform")  # PEP-345
+    | L("platform.version")  # PEP-345
+    | L("platform.machine")  # PEP-345
+    | L("platform.python_implementation")  # PEP-345
+    | L("python_implementation")  # undocumented setuptools legacy
+    | L("extra")  # PEP-508
 )
 ALIASES = {
-    'os.name': 'os_name',
-    'sys.platform': 'sys_platform',
-    'platform.version': 'platform_version',
-    'platform.machine': 'platform_machine',
-    'platform.python_implementation': 'platform_python_implementation',
-    'python_implementation': 'platform_python_implementation'
+    "os.name": "os_name",
+    "sys.platform": "sys_platform",
+    "platform.version": "platform_version",
+    "platform.machine": "platform_machine",
+    "platform.python_implementation": "platform_python_implementation",
+    "python_implementation": "platform_python_implementation",
 }
 VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))
 
 VERSION_CMP = (
-    L("===") |
-    L("==") |
-    L(">=") |
-    L("<=") |
-    L("!=") |
-    L("~=") |
-    L(">") |
-    L("<")
+    L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<")
 )
 
 MARKER_OP = VERSION_CMP | L("not in") | L("in")
@@ -139,6 +144,7 @@ MARKER = stringStart + MARKER_EXPR + stringEnd
 
 
 def _coerce_parse_result(results):
+    # type: (Union[ParseResults, List[Any]]) -> List[Any]
     if isinstance(results, ParseResults):
         return [_coerce_parse_result(i) for i in results]
     else:
@@ -146,14 +152,19 @@ def _coerce_parse_result(results):
 
 
 def _format_marker(marker, first=True):
+    # type: (Union[List[str], Tuple[Node, ...], str], Optional[bool]) -> str
+
     assert isinstance(marker, (list, tuple, string_types))
 
     # Sometimes we have a structure like [[...]] which is a single item list
     # where the single item is itself it's own list. In that case we want skip
     # the rest of this function so that we don't get extraneous () on the
     # outside.
-    if (isinstance(marker, list) and len(marker) == 1 and
-            isinstance(marker[0], (list, tuple))):
+    if (
+        isinstance(marker, list)
+        and len(marker) == 1
+        and isinstance(marker[0], (list, tuple))
+    ):
         return _format_marker(marker[0])
 
     if isinstance(marker, list):
@@ -177,10 +188,11 @@ _operators = {
     "!=": operator.ne,
     ">=": operator.ge,
     ">": operator.gt,
-}
+}  # type: Dict[str, Operator]
 
 
 def _eval_op(lhs, op, rhs):
+    # type: (str, Op, str) -> bool
     try:
         spec = Specifier("".join([op.serialize(), rhs]))
     except InvalidSpecifier:
@@ -188,7 +200,7 @@ def _eval_op(lhs, op, rhs):
     else:
         return spec.contains(lhs)
 
-    oper = _operators.get(op.serialize())
+    oper = _operators.get(op.serialize())  # type: Optional[Operator]
     if oper is None:
         raise UndefinedComparison(
             "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
@@ -197,13 +209,18 @@ def _eval_op(lhs, op, rhs):
     return oper(lhs, rhs)
 
 
-_undefined = object()
+class Undefined(object):
+    pass
+
+
+_undefined = Undefined()
 
 
 def _get_env(environment, name):
-    value = environment.get(name, _undefined)
+    # type: (Dict[str, str], str) -> str
+    value = environment.get(name, _undefined)  # type: Union[str, Undefined]
 
-    if value is _undefined:
+    if isinstance(value, Undefined):
         raise UndefinedEnvironmentName(
             "{0!r} does not exist in evaluation environment.".format(name)
         )
@@ -212,7 +229,8 @@ def _get_env(environment, name):
 
 
 def _evaluate_markers(markers, environment):
-    groups = [[]]
+    # type: (List[Any], Dict[str, str]) -> bool
+    groups = [[]]  # type: List[List[bool]]
 
     for marker in markers:
         assert isinstance(marker, (list, tuple, string_types))
@@ -239,20 +257,25 @@ def _evaluate_markers(markers, environment):
 
 
 def format_full_version(info):
-    version = '{0.major}.{0.minor}.{0.micro}'.format(info)
+    # type: (sys._version_info) -> str
+    version = "{0.major}.{0.minor}.{0.micro}".format(info)
     kind = info.releaselevel
-    if kind != 'final':
+    if kind != "final":
         version += kind[0] + str(info.serial)
     return version
 
 
 def default_environment():
-    if hasattr(sys, 'implementation'):
-        iver = format_full_version(sys.implementation.version)
-        implementation_name = sys.implementation.name
+    # type: () -> Dict[str, str]
+    if hasattr(sys, "implementation"):
+        # Ignoring the `sys.implementation` reference for type checking due to
+        # mypy not liking that the attribute doesn't exist in Python 2.7 when
+        # run with the `--py27` flag.
+        iver = format_full_version(sys.implementation.version)  # type: ignore
+        implementation_name = sys.implementation.name  # type: ignore
     else:
-        iver = '0'
-        implementation_name = ''
+        iver = "0"
+        implementation_name = ""
 
     return {
         "implementation_name": implementation_name,
@@ -264,28 +287,32 @@ def default_environment():
         "platform_version": platform.version(),
         "python_full_version": platform.python_version(),
         "platform_python_implementation": platform.python_implementation(),
-        "python_version": platform.python_version()[:3],
+        "python_version": ".".join(platform.python_version_tuple()[:2]),
         "sys_platform": sys.platform,
     }
 
 
 class Marker(object):
-
     def __init__(self, marker):
+        # type: (str) -> None
         try:
             self._markers = _coerce_parse_result(MARKER.parseString(marker))
         except ParseException as e:
             err_str = "Invalid marker: {0!r}, parse error at {1!r}".format(
-                marker, marker[e.loc:e.loc + 8])
+                marker, marker[e.loc : e.loc + 8]
+            )
             raise InvalidMarker(err_str)
 
     def __str__(self):
+        # type: () -> str
         return _format_marker(self._markers)
 
     def __repr__(self):
+        # type: () -> str
         return "<Marker({0!r})>".format(str(self))
 
     def evaluate(self, environment=None):
+        # type: (Optional[Dict[str, str]]) -> bool
         """Evaluate a marker.
 
         Return the boolean from evaluating the given marker against the
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py
similarity index 71%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py
index 0c8c4a3..8282a63 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py
@@ -11,9 +11,13 @@ from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Co
 from pkg_resources.extern.pyparsing import Literal as L  # noqa
 from pkg_resources.extern.six.moves.urllib import parse as urlparse
 
+from ._typing import TYPE_CHECKING
 from .markers import MARKER_EXPR, Marker
 from .specifiers import LegacySpecifier, Specifier, SpecifierSet
 
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import List
+
 
 class InvalidRequirement(ValueError):
     """
@@ -38,8 +42,8 @@ IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))
 NAME = IDENTIFIER("name")
 EXTRA = IDENTIFIER
 
-URI = Regex(r'[^ ]+')("url")
-URL = (AT + URI)
+URI = Regex(r"[^ ]+")("url")
+URL = AT + URI
 
 EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
 EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")
@@ -48,28 +52,31 @@ VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE)
 VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE)
 
 VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY
-VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE),
-                       joinString=",", adjacent=False)("_raw_spec")
+VERSION_MANY = Combine(
+    VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False
+)("_raw_spec")
 _VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY))
-_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '')
+_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "")
 
 VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier")
 VERSION_SPEC.setParseAction(lambda s, l, t: t[1])
 
 MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
 MARKER_EXPR.setParseAction(
-    lambda s, l, t: Marker(s[t._original_start:t._original_end])
+    lambda s, l, t: Marker(s[t._original_start : t._original_end])
 )
-MARKER_SEPERATOR = SEMICOLON
-MARKER = MARKER_SEPERATOR + MARKER_EXPR
+MARKER_SEPARATOR = SEMICOLON
+MARKER = MARKER_SEPARATOR + MARKER_EXPR
 
 VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER)
 URL_AND_MARKER = URL + Optional(MARKER)
 
-NAMED_REQUIREMENT = \
-    NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER)
+NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER)
 
 REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd
+# pkg_resources.extern.pyparsing isn't thread safe during initialization, so we do it eagerly, see
+# issue #104
+REQUIREMENT.parseString("x[]")
 
 
 class Requirement(object):
@@ -86,19 +93,26 @@ class Requirement(object):
     # TODO: Can we normalize the name and extra name?
 
     def __init__(self, requirement_string):
+        # type: (str) -> None
         try:
             req = REQUIREMENT.parseString(requirement_string)
         except ParseException as e:
             raise InvalidRequirement(
-                "Invalid requirement, parse error at \"{0!r}\"".format(
-                    requirement_string[e.loc:e.loc + 8]))
+                'Parse error at "{0!r}": {1}'.format(
+                    requirement_string[e.loc : e.loc + 8], e.msg
+                )
+            )
 
         self.name = req.name
         if req.url:
             parsed_url = urlparse.urlparse(req.url)
-            if not (parsed_url.scheme and parsed_url.netloc) or (
-                    not parsed_url.scheme and not parsed_url.netloc):
-                raise InvalidRequirement("Invalid URL given")
+            if parsed_url.scheme == "file":
+                if urlparse.urlunparse(parsed_url) != req.url:
+                    raise InvalidRequirement("Invalid URL given")
+            elif not (parsed_url.scheme and parsed_url.netloc) or (
+                not parsed_url.scheme and not parsed_url.netloc
+            ):
+                raise InvalidRequirement("Invalid URL: {0}".format(req.url))
             self.url = req.url
         else:
             self.url = None
@@ -107,7 +121,8 @@ class Requirement(object):
         self.marker = req.marker if req.marker else None
 
     def __str__(self):
-        parts = [self.name]
+        # type: () -> str
+        parts = [self.name]  # type: List[str]
 
         if self.extras:
             parts.append("[{0}]".format(",".join(sorted(self.extras))))
@@ -117,6 +132,8 @@ class Requirement(object):
 
         if self.url:
             parts.append("@ {0}".format(self.url))
+            if self.marker:
+                parts.append(" ")
 
         if self.marker:
             parts.append("; {0}".format(self.marker))
@@ -124,4 +141,5 @@ class Requirement(object):
         return "".join(parts)
 
     def __repr__(self):
+        # type: () -> str
         return "<Requirement({0!r})>".format(str(self))
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py
similarity index 81%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py
index 743576a..fe09bb1 100644
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py
@@ -9,8 +9,27 @@ import itertools
 import re
 
 from ._compat import string_types, with_metaclass
+from ._typing import TYPE_CHECKING
+from .utils import canonicalize_version
 from .version import Version, LegacyVersion, parse
 
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import (
+        List,
+        Dict,
+        Union,
+        Iterable,
+        Iterator,
+        Optional,
+        Callable,
+        Tuple,
+        FrozenSet,
+    )
+
+    ParsedVersion = Union[Version, LegacyVersion]
+    UnparsedVersion = Union[Version, LegacyVersion, str]
+    CallableOperator = Callable[[ParsedVersion, str], bool]
+
 
 class InvalidSpecifier(ValueError):
     """
@@ -18,9 +37,10 @@ class InvalidSpecifier(ValueError):
     """
 
 
-class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
+class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):  # type: ignore
     @abc.abstractmethod
     def __str__(self):
+        # type: () -> str
         """
         Returns the str representation of this Specifier like object. This
         should be representative of the Specifier itself.
@@ -28,12 +48,14 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @abc.abstractmethod
     def __hash__(self):
+        # type: () -> int
         """
         Returns a hash value for this Specifier like object.
         """
 
     @abc.abstractmethod
     def __eq__(self, other):
+        # type: (object) -> bool
         """
         Returns a boolean representing whether or not the two Specifier like
         objects are equal.
@@ -41,6 +63,7 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @abc.abstractmethod
     def __ne__(self, other):
+        # type: (object) -> bool
         """
         Returns a boolean representing whether or not the two Specifier like
         objects are not equal.
@@ -48,6 +71,7 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @abc.abstractproperty
     def prereleases(self):
+        # type: () -> Optional[bool]
         """
         Returns whether or not pre-releases as a whole are allowed by this
         specifier.
@@ -55,6 +79,7 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @prereleases.setter
     def prereleases(self, value):
+        # type: (bool) -> None
         """
         Sets whether or not pre-releases as a whole are allowed by this
         specifier.
@@ -62,12 +87,14 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @abc.abstractmethod
     def contains(self, item, prereleases=None):
+        # type: (str, Optional[bool]) -> bool
         """
         Determines if the given item is contained within this specifier.
         """
 
     @abc.abstractmethod
     def filter(self, iterable, prereleases=None):
+        # type: (Iterable[UnparsedVersion], Optional[bool]) -> Iterable[UnparsedVersion]
         """
         Takes an iterable of items and filters them so that only items which
         are contained within this specifier are allowed in it.
@@ -76,19 +103,24 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
 class _IndividualSpecifier(BaseSpecifier):
 
-    _operators = {}
+    _operators = {}  # type: Dict[str, str]
 
     def __init__(self, spec="", prereleases=None):
+        # type: (str, Optional[bool]) -> None
         match = self._regex.search(spec)
         if not match:
             raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec))
 
-        self._spec = (match.group("operator").strip(), match.group("version").strip())
+        self._spec = (
+            match.group("operator").strip(),
+            match.group("version").strip(),
+        )  # type: Tuple[str, str]
 
         # Store whether or not this Specifier should accept prereleases
         self._prereleases = prereleases
 
     def __repr__(self):
+        # type: () -> str
         pre = (
             ", prereleases={0!r}".format(self.prereleases)
             if self._prereleases is not None
@@ -98,26 +130,35 @@ class _IndividualSpecifier(BaseSpecifier):
         return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre)
 
     def __str__(self):
+        # type: () -> str
         return "{0}{1}".format(*self._spec)
 
+    @property
+    def _canonical_spec(self):
+        # type: () -> Tuple[str, Union[Version, str]]
+        return self._spec[0], canonicalize_version(self._spec[1])
+
     def __hash__(self):
-        return hash(self._spec)
+        # type: () -> int
+        return hash(self._canonical_spec)
 
     def __eq__(self, other):
+        # type: (object) -> bool
         if isinstance(other, string_types):
             try:
-                other = self.__class__(other)
+                other = self.__class__(str(other))
             except InvalidSpecifier:
                 return NotImplemented
         elif not isinstance(other, self.__class__):
             return NotImplemented
 
-        return self._spec == other._spec
+        return self._canonical_spec == other._canonical_spec
 
     def __ne__(self, other):
+        # type: (object) -> bool
         if isinstance(other, string_types):
             try:
-                other = self.__class__(other)
+                other = self.__class__(str(other))
             except InvalidSpecifier:
                 return NotImplemented
         elif not isinstance(other, self.__class__):
@@ -126,52 +167,67 @@ class _IndividualSpecifier(BaseSpecifier):
         return self._spec != other._spec
 
     def _get_operator(self, op):
-        return getattr(self, "_compare_{0}".format(self._operators[op]))
+        # type: (str) -> CallableOperator
+        operator_callable = getattr(
+            self, "_compare_{0}".format(self._operators[op])
+        )  # type: CallableOperator
+        return operator_callable
 
     def _coerce_version(self, version):
+        # type: (UnparsedVersion) -> ParsedVersion
         if not isinstance(version, (LegacyVersion, Version)):
             version = parse(version)
         return version
 
     @property
     def operator(self):
+        # type: () -> str
         return self._spec[0]
 
     @property
     def version(self):
+        # type: () -> str
         return self._spec[1]
 
     @property
     def prereleases(self):
+        # type: () -> Optional[bool]
         return self._prereleases
 
     @prereleases.setter
     def prereleases(self, value):
+        # type: (bool) -> None
         self._prereleases = value
 
     def __contains__(self, item):
+        # type: (str) -> bool
         return self.contains(item)
 
     def contains(self, item, prereleases=None):
+        # type: (UnparsedVersion, Optional[bool]) -> bool
+
         # Determine if prereleases are to be allowed or not.
         if prereleases is None:
             prereleases = self.prereleases
 
         # Normalize item to a Version or LegacyVersion, this allows us to have
         # a shortcut for ``"2.0" in Specifier(">=2")
-        item = self._coerce_version(item)
+        normalized_item = self._coerce_version(item)
 
         # Determine if we should be supporting prereleases in this specifier
         # or not, if we do not support prereleases than we can short circuit
         # logic if this version is a prereleases.
-        if item.is_prerelease and not prereleases:
+        if normalized_item.is_prerelease and not prereleases:
             return False
 
         # Actually do the comparison to determine if this item is contained
         # within this Specifier or not.
-        return self._get_operator(self.operator)(item, self.version)
+        operator_callable = self._get_operator(self.operator)  # type: CallableOperator
+        return operator_callable(normalized_item, self.version)
 
     def filter(self, iterable, prereleases=None):
+        # type: (Iterable[UnparsedVersion], Optional[bool]) -> Iterable[UnparsedVersion]
+
         yielded = False
         found_prereleases = []
 
@@ -230,32 +286,43 @@ class LegacySpecifier(_IndividualSpecifier):
     }
 
     def _coerce_version(self, version):
+        # type: (Union[ParsedVersion, str]) -> LegacyVersion
         if not isinstance(version, LegacyVersion):
             version = LegacyVersion(str(version))
         return version
 
     def _compare_equal(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective == self._coerce_version(spec)
 
     def _compare_not_equal(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective != self._coerce_version(spec)
 
     def _compare_less_than_equal(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective <= self._coerce_version(spec)
 
     def _compare_greater_than_equal(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective >= self._coerce_version(spec)
 
     def _compare_less_than(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective < self._coerce_version(spec)
 
     def _compare_greater_than(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective > self._coerce_version(spec)
 
 
-def _require_version_compare(fn):
+def _require_version_compare(
+    fn  # type: (Callable[[Specifier, ParsedVersion, str], bool])
+):
+    # type: (...) -> Callable[[Specifier, ParsedVersion, str], bool]
     @functools.wraps(fn)
     def wrapped(self, prospective, spec):
+        # type: (Specifier, ParsedVersion, str) -> bool
         if not isinstance(prospective, Version):
             return False
         return fn(self, prospective, spec)
@@ -373,6 +440,8 @@ class Specifier(_IndividualSpecifier):
 
     @_require_version_compare
     def _compare_compatible(self, prospective, spec):
+        # type: (ParsedVersion, str) -> bool
+
         # Compatible releases have an equivalent combination of >= and ==. That
         # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to
         # implement this in terms of the other specifiers instead of
@@ -400,56 +469,75 @@ class Specifier(_IndividualSpecifier):
 
     @_require_version_compare
     def _compare_equal(self, prospective, spec):
+        # type: (ParsedVersion, str) -> bool
+
         # We need special logic to handle prefix matching
         if spec.endswith(".*"):
             # In the case of prefix matching we want to ignore local segment.
             prospective = Version(prospective.public)
             # Split the spec out by dots, and pretend that there is an implicit
             # dot in between a release segment and a pre-release segment.
-            spec = _version_split(spec[:-2])  # Remove the trailing .*
+            split_spec = _version_split(spec[:-2])  # Remove the trailing .*
 
             # Split the prospective version out by dots, and pretend that there
             # is an implicit dot in between a release segment and a pre-release
             # segment.
-            prospective = _version_split(str(prospective))
+            split_prospective = _version_split(str(prospective))
 
             # Shorten the prospective version to be the same length as the spec
             # so that we can determine if the specifier is a prefix of the
             # prospective version or not.
-            prospective = prospective[: len(spec)]
+            shortened_prospective = split_prospective[: len(split_spec)]
 
             # Pad out our two sides with zeros so that they both equal the same
             # length.
-            spec, prospective = _pad_version(spec, prospective)
+            padded_spec, padded_prospective = _pad_version(
+                split_spec, shortened_prospective
+            )
+
+            return padded_prospective == padded_spec
         else:
             # Convert our spec string into a Version
-            spec = Version(spec)
+            spec_version = Version(spec)
 
             # If the specifier does not have a local segment, then we want to
             # act as if the prospective version also does not have a local
             # segment.
-            if not spec.local:
+            if not spec_version.local:
                 prospective = Version(prospective.public)
 
-        return prospective == spec
+            return prospective == spec_version
 
     @_require_version_compare
     def _compare_not_equal(self, prospective, spec):
+        # type: (ParsedVersion, str) -> bool
         return not self._compare_equal(prospective, spec)
 
     @_require_version_compare
     def _compare_less_than_equal(self, prospective, spec):
-        return prospective <= Version(spec)
+        # type: (ParsedVersion, str) -> bool
+
+        # NB: Local version identifiers are NOT permitted in the version
+        # specifier, so local version labels can be universally removed from
+        # the prospective version.
+        return Version(prospective.public) <= Version(spec)
 
     @_require_version_compare
     def _compare_greater_than_equal(self, prospective, spec):
-        return prospective >= Version(spec)
+        # type: (ParsedVersion, str) -> bool
+
+        # NB: Local version identifiers are NOT permitted in the version
+        # specifier, so local version labels can be universally removed from
+        # the prospective version.
+        return Version(prospective.public) >= Version(spec)
 
     @_require_version_compare
-    def _compare_less_than(self, prospective, spec):
+    def _compare_less_than(self, prospective, spec_str):
+        # type: (ParsedVersion, str) -> bool
+
         # Convert our spec to a Version instance, since we'll want to work with
         # it as a version.
-        spec = Version(spec)
+        spec = Version(spec_str)
 
         # Check to see if the prospective version is less than the spec
         # version. If it's not we can short circuit and just return False now
@@ -471,10 +559,12 @@ class Specifier(_IndividualSpecifier):
         return True
 
     @_require_version_compare
-    def _compare_greater_than(self, prospective, spec):
+    def _compare_greater_than(self, prospective, spec_str):
+        # type: (ParsedVersion, str) -> bool
+
         # Convert our spec to a Version instance, since we'll want to work with
         # it as a version.
-        spec = Version(spec)
+        spec = Version(spec_str)
 
         # Check to see if the prospective version is greater than the spec
         # version. If it's not we can short circuit and just return False now
@@ -502,10 +592,13 @@ class Specifier(_IndividualSpecifier):
         return True
 
     def _compare_arbitrary(self, prospective, spec):
+        # type: (Version, str) -> bool
         return str(prospective).lower() == str(spec).lower()
 
     @property
     def prereleases(self):
+        # type: () -> bool
+
         # If there is an explicit prereleases set for this, then we'll just
         # blindly use that.
         if self._prereleases is not None:
@@ -530,6 +623,7 @@ class Specifier(_IndividualSpecifier):
 
     @prereleases.setter
     def prereleases(self, value):
+        # type: (bool) -> None
         self._prereleases = value
 
 
@@ -537,7 +631,8 @@ _prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")
 
 
 def _version_split(version):
-    result = []
+    # type: (str) -> List[str]
+    result = []  # type: List[str]
     for item in version.split("."):
         match = _prefix_regex.search(item)
         if match:
@@ -548,6 +643,7 @@ def _version_split(version):
 
 
 def _pad_version(left, right):
+    # type: (List[str], List[str]) -> Tuple[List[str], List[str]]
     left_split, right_split = [], []
 
     # Get the release segment of our versions
@@ -567,14 +663,16 @@ def _pad_version(left, right):
 
 class SpecifierSet(BaseSpecifier):
     def __init__(self, specifiers="", prereleases=None):
-        # Split on , to break each indidivual specifier into it's own item, and
+        # type: (str, Optional[bool]) -> None
+
+        # Split on , to break each individual specifier into it's own item, and
         # strip each item to remove leading/trailing whitespace.
-        specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
+        split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
 
         # Parsed each individual specifier, attempting first to make it a
         # Specifier and falling back to a LegacySpecifier.
         parsed = set()
-        for specifier in specifiers:
+        for specifier in split_specifiers:
             try:
                 parsed.add(Specifier(specifier))
             except InvalidSpecifier:
@@ -588,6 +686,7 @@ class SpecifierSet(BaseSpecifier):
         self._prereleases = prereleases
 
     def __repr__(self):
+        # type: () -> str
         pre = (
             ", prereleases={0!r}".format(self.prereleases)
             if self._prereleases is not None
@@ -597,12 +696,15 @@ class SpecifierSet(BaseSpecifier):
         return "<SpecifierSet({0!r}{1})>".format(str(self), pre)
 
     def __str__(self):
+        # type: () -> str
         return ",".join(sorted(str(s) for s in self._specs))
 
     def __hash__(self):
+        # type: () -> int
         return hash(self._specs)
 
     def __and__(self, other):
+        # type: (Union[SpecifierSet, str]) -> SpecifierSet
         if isinstance(other, string_types):
             other = SpecifierSet(other)
         elif not isinstance(other, SpecifierSet):
@@ -626,9 +728,8 @@ class SpecifierSet(BaseSpecifier):
         return specifier
 
     def __eq__(self, other):
-        if isinstance(other, string_types):
-            other = SpecifierSet(other)
-        elif isinstance(other, _IndividualSpecifier):
+        # type: (object) -> bool
+        if isinstance(other, (string_types, _IndividualSpecifier)):
             other = SpecifierSet(str(other))
         elif not isinstance(other, SpecifierSet):
             return NotImplemented
@@ -636,9 +737,8 @@ class SpecifierSet(BaseSpecifier):
         return self._specs == other._specs
 
     def __ne__(self, other):
-        if isinstance(other, string_types):
-            other = SpecifierSet(other)
-        elif isinstance(other, _IndividualSpecifier):
+        # type: (object) -> bool
+        if isinstance(other, (string_types, _IndividualSpecifier)):
             other = SpecifierSet(str(other))
         elif not isinstance(other, SpecifierSet):
             return NotImplemented
@@ -646,13 +746,17 @@ class SpecifierSet(BaseSpecifier):
         return self._specs != other._specs
 
     def __len__(self):
+        # type: () -> int
         return len(self._specs)
 
     def __iter__(self):
+        # type: () -> Iterator[FrozenSet[_IndividualSpecifier]]
         return iter(self._specs)
 
     @property
     def prereleases(self):
+        # type: () -> Optional[bool]
+
         # If we have been given an explicit prerelease modifier, then we'll
         # pass that through here.
         if self._prereleases is not None:
@@ -670,12 +774,16 @@ class SpecifierSet(BaseSpecifier):
 
     @prereleases.setter
     def prereleases(self, value):
+        # type: (bool) -> None
         self._prereleases = value
 
     def __contains__(self, item):
+        # type: (Union[ParsedVersion, str]) -> bool
         return self.contains(item)
 
     def contains(self, item, prereleases=None):
+        # type: (Union[ParsedVersion, str], Optional[bool]) -> bool
+
         # Ensure that our item is a Version or LegacyVersion instance.
         if not isinstance(item, (LegacyVersion, Version)):
             item = parse(item)
@@ -701,7 +809,13 @@ class SpecifierSet(BaseSpecifier):
         #       will always return True, this is an explicit design decision.
         return all(s.contains(item, prereleases=prereleases) for s in self._specs)
 
-    def filter(self, iterable, prereleases=None):
+    def filter(
+        self,
+        iterable,  # type: Iterable[Union[ParsedVersion, str]]
+        prereleases=None,  # type: Optional[bool]
+    ):
+        # type: (...) -> Iterable[Union[ParsedVersion, str]]
+
         # Determine if we're forcing a prerelease or not, if we're not forcing
         # one for this particular filter call, then we'll use whatever the
         # SpecifierSet thinks for whether or not we should support prereleases.
@@ -719,8 +833,8 @@ class SpecifierSet(BaseSpecifier):
         # which will filter out any pre-releases, unless there are no final
         # releases, and which will filter out LegacyVersion in general.
         else:
-            filtered = []
-            found_prereleases = []
+            filtered = []  # type: List[Union[ParsedVersion, str]]
+            found_prereleases = []  # type: List[Union[ParsedVersion, str]]
 
             for item in iterable:
                 # Ensure that we some kind of Version class for this item.
diff --git a/venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py
new file mode 100644
index 0000000..9064910
--- /dev/null
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py
@@ -0,0 +1,751 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+
+from __future__ import absolute_import
+
+import distutils.util
+
+try:
+    from importlib.machinery import EXTENSION_SUFFIXES
+except ImportError:  # pragma: no cover
+    import imp
+
+    EXTENSION_SUFFIXES = [x[0] for x in imp.get_suffixes()]
+    del imp
+import logging
+import os
+import platform
+import re
+import struct
+import sys
+import sysconfig
+import warnings
+
+from ._typing import TYPE_CHECKING, cast
+
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import (
+        Dict,
+        FrozenSet,
+        IO,
+        Iterable,
+        Iterator,
+        List,
+        Optional,
+        Sequence,
+        Tuple,
+        Union,
+    )
+
+    PythonVersion = Sequence[int]
+    MacVersion = Tuple[int, int]
+    GlibcVersion = Tuple[int, int]
+
+
+logger = logging.getLogger(__name__)
+
+INTERPRETER_SHORT_NAMES = {
+    "python": "py",  # Generic.
+    "cpython": "cp",
+    "pypy": "pp",
+    "ironpython": "ip",
+    "jython": "jy",
+}  # type: Dict[str, str]
+
+
+_32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32
+
+
+class Tag(object):
+    """
+    A representation of the tag triple for a wheel.
+
+    Instances are considered immutable and thus are hashable. Equality checking
+    is also supported.
+    """
+
+    __slots__ = ["_interpreter", "_abi", "_platform"]
+
+    def __init__(self, interpreter, abi, platform):
+        # type: (str, str, str) -> None
+        self._interpreter = interpreter.lower()
+        self._abi = abi.lower()
+        self._platform = platform.lower()
+
+    @property
+    def interpreter(self):
+        # type: () -> str
+        return self._interpreter
+
+    @property
+    def abi(self):
+        # type: () -> str
+        return self._abi
+
+    @property
+    def platform(self):
+        # type: () -> str
+        return self._platform
+
+    def __eq__(self, other):
+        # type: (object) -> bool
+        if not isinstance(other, Tag):
+            return NotImplemented
+
+        return (
+            (self.platform == other.platform)
+            and (self.abi == other.abi)
+            and (self.interpreter == other.interpreter)
+        )
+
+    def __hash__(self):
+        # type: () -> int
+        return hash((self._interpreter, self._abi, self._platform))
+
+    def __str__(self):
+        # type: () -> str
+        return "{}-{}-{}".format(self._interpreter, self._abi, self._platform)
+
+    def __repr__(self):
+        # type: () -> str
+        return "<{self} @ {self_id}>".format(self=self, self_id=id(self))
+
+
+def parse_tag(tag):
+    # type: (str) -> FrozenSet[Tag]
+    """
+    Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances.
+
+    Returning a set is required due to the possibility that the tag is a
+    compressed tag set.
+    """
+    tags = set()
+    interpreters, abis, platforms = tag.split("-")
+    for interpreter in interpreters.split("."):
+        for abi in abis.split("."):
+            for platform_ in platforms.split("."):
+                tags.add(Tag(interpreter, abi, platform_))
+    return frozenset(tags)
+
+
+def _warn_keyword_parameter(func_name, kwargs):
+    # type: (str, Dict[str, bool]) -> bool
+    """
+    Backwards-compatibility with Python 2.7 to allow treating 'warn' as keyword-only.
+    """
+    if not kwargs:
+        return False
+    elif len(kwargs) > 1 or "warn" not in kwargs:
+        kwargs.pop("warn", None)
+        arg = next(iter(kwargs.keys()))
+        raise TypeError(
+            "{}() got an unexpected keyword argument {!r}".format(func_name, arg)
+        )
+    return kwargs["warn"]
+
+
+def _get_config_var(name, warn=False):
+    # type: (str, bool) -> Union[int, str, None]
+    value = sysconfig.get_config_var(name)
+    if value is None and warn:
+        logger.debug(
+            "Config variable '%s' is unset, Python ABI tag may be incorrect", name
+        )
+    return value
+
+
+def _normalize_string(string):
+    # type: (str) -> str
+    return string.replace(".", "_").replace("-", "_")
+
+
+def _abi3_applies(python_version):
+    # type: (PythonVersion) -> bool
+    """
+    Determine if the Python version supports abi3.
+
+    PEP 384 was first implemented in Python 3.2.
+    """
+    return len(python_version) > 1 and tuple(python_version) >= (3, 2)
+
+
+def _cpython_abis(py_version, warn=False):
+    # type: (PythonVersion, bool) -> List[str]
+    py_version = tuple(py_version)  # To allow for version comparison.
+    abis = []
+    version = _version_nodot(py_version[:2])
+    debug = pymalloc = ucs4 = ""
+    with_debug = _get_config_var("Py_DEBUG", warn)
+    has_refcount = hasattr(sys, "gettotalrefcount")
+    # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled
+    # extension modules is the best option.
+    # https://github.com/pypa/pip/issues/3383#issuecomment-173267692
+    has_ext = "_d.pyd" in EXTENSION_SUFFIXES
+    if with_debug or (with_debug is None and (has_refcount or has_ext)):
+        debug = "d"
+    if py_version < (3, 8):
+        with_pymalloc = _get_config_var("WITH_PYMALLOC", warn)
+        if with_pymalloc or with_pymalloc is None:
+            pymalloc = "m"
+        if py_version < (3, 3):
+            unicode_size = _get_config_var("Py_UNICODE_SIZE", warn)
+            if unicode_size == 4 or (
+                unicode_size is None and sys.maxunicode == 0x10FFFF
+            ):
+                ucs4 = "u"
+    elif debug:
+        # Debug builds can also load "normal" extension modules.
+        # We can also assume no UCS-4 or pymalloc requirement.
+        abis.append("cp{version}".format(version=version))
+    abis.insert(
+        0,
+        "cp{version}{debug}{pymalloc}{ucs4}".format(
+            version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4
+        ),
+    )
+    return abis
+
+
+def cpython_tags(
+    python_version=None,  # type: Optional[PythonVersion]
+    abis=None,  # type: Optional[Iterable[str]]
+    platforms=None,  # type: Optional[Iterable[str]]
+    **kwargs  # type: bool
+):
+    # type: (...) -> Iterator[Tag]
+    """
+    Yields the tags for a CPython interpreter.
+
+    The tags consist of:
+    - cp<python_version>-<abi>-<platform>
+    - cp<python_version>-abi3-<platform>
+    - cp<python_version>-none-<platform>
+    - cp<less than python_version>-abi3-<platform>  # Older Python versions down to 3.2.
+
+    If python_version only specifies a major version then user-provided ABIs and
+    the 'none' ABItag will be used.
+
+    If 'abi3' or 'none' are specified in 'abis' then they will be yielded at
+    their normal position and not at the beginning.
+    """
+    warn = _warn_keyword_parameter("cpython_tags", kwargs)
+    if not python_version:
+        python_version = sys.version_info[:2]
+
+    interpreter = "cp{}".format(_version_nodot(python_version[:2]))
+
+    if abis is None:
+        if len(python_version) > 1:
+            abis = _cpython_abis(python_version, warn)
+        else:
+            abis = []
+    abis = list(abis)
+    # 'abi3' and 'none' are explicitly handled later.
+    for explicit_abi in ("abi3", "none"):
+        try:
+            abis.remove(explicit_abi)
+        except ValueError:
+            pass
+
+    platforms = list(platforms or _platform_tags())
+    for abi in abis:
+        for platform_ in platforms:
+            yield Tag(interpreter, abi, platform_)
+    if _abi3_applies(python_version):
+        for tag in (Tag(interpreter, "abi3", platform_) for platform_ in platforms):
+            yield tag
+    for tag in (Tag(interpreter, "none", platform_) for platform_ in platforms):
+        yield tag
+
+    if _abi3_applies(python_version):
+        for minor_version in range(python_version[1] - 1, 1, -1):
+            for platform_ in platforms:
+                interpreter = "cp{version}".format(
+                    version=_version_nodot((python_version[0], minor_version))
+                )
+                yield Tag(interpreter, "abi3", platform_)
+
+
+def _generic_abi():
+    # type: () -> Iterator[str]
+    abi = sysconfig.get_config_var("SOABI")
+    if abi:
+        yield _normalize_string(abi)
+
+
+def generic_tags(
+    interpreter=None,  # type: Optional[str]
+    abis=None,  # type: Optional[Iterable[str]]
+    platforms=None,  # type: Optional[Iterable[str]]
+    **kwargs  # type: bool
+):
+    # type: (...) -> Iterator[Tag]
+    """
+    Yields the tags for a generic interpreter.
+
+    The tags consist of:
+    - <interpreter>-<abi>-<platform>
+
+    The "none" ABI will be added if it was not explicitly provided.
+    """
+    warn = _warn_keyword_parameter("generic_tags", kwargs)
+    if not interpreter:
+        interp_name = interpreter_name()
+        interp_version = interpreter_version(warn=warn)
+        interpreter = "".join([interp_name, interp_version])
+    if abis is None:
+        abis = _generic_abi()
+    platforms = list(platforms or _platform_tags())
+    abis = list(abis)
+    if "none" not in abis:
+        abis.append("none")
+    for abi in abis:
+        for platform_ in platforms:
+            yield Tag(interpreter, abi, platform_)
+
+
+def _py_interpreter_range(py_version):
+    # type: (PythonVersion) -> Iterator[str]
+    """
+    Yields Python versions in descending order.
+
+    After the latest version, the major-only version will be yielded, and then
+    all previous versions of that major version.
+    """
+    if len(py_version) > 1:
+        yield "py{version}".format(version=_version_nodot(py_version[:2]))
+    yield "py{major}".format(major=py_version[0])
+    if len(py_version) > 1:
+        for minor in range(py_version[1] - 1, -1, -1):
+            yield "py{version}".format(version=_version_nodot((py_version[0], minor)))
+
+
+def compatible_tags(
+    python_version=None,  # type: Optional[PythonVersion]
+    interpreter=None,  # type: Optional[str]
+    platforms=None,  # type: Optional[Iterable[str]]
+):
+    # type: (...) -> Iterator[Tag]
+    """
+    Yields the sequence of tags that are compatible with a specific version of Python.
+
+    The tags consist of:
+    - py*-none-<platform>
+    - <interpreter>-none-any  # ... if `interpreter` is provided.
+    - py*-none-any
+    """
+    if not python_version:
+        python_version = sys.version_info[:2]
+    platforms = list(platforms or _platform_tags())
+    for version in _py_interpreter_range(python_version):
+        for platform_ in platforms:
+            yield Tag(version, "none", platform_)
+    if interpreter:
+        yield Tag(interpreter, "none", "any")
+    for version in _py_interpreter_range(python_version):
+        yield Tag(version, "none", "any")
+
+
+def _mac_arch(arch, is_32bit=_32_BIT_INTERPRETER):
+    # type: (str, bool) -> str
+    if not is_32bit:
+        return arch
+
+    if arch.startswith("ppc"):
+        return "ppc"
+
+    return "i386"
+
+
+def _mac_binary_formats(version, cpu_arch):
+    # type: (MacVersion, str) -> List[str]
+    formats = [cpu_arch]
+    if cpu_arch == "x86_64":
+        if version < (10, 4):
+            return []
+        formats.extend(["intel", "fat64", "fat32"])
+
+    elif cpu_arch == "i386":
+        if version < (10, 4):
+            return []
+        formats.extend(["intel", "fat32", "fat"])
+
+    elif cpu_arch == "ppc64":
+        # TODO: Need to care about 32-bit PPC for ppc64 through 10.2?
+        if version > (10, 5) or version < (10, 4):
+            return []
+        formats.append("fat64")
+
+    elif cpu_arch == "ppc":
+        if version > (10, 6):
+            return []
+        formats.extend(["fat32", "fat"])
+
+    formats.append("universal")
+    return formats
+
+
+def mac_platforms(version=None, arch=None):
+    # type: (Optional[MacVersion], Optional[str]) -> Iterator[str]
+    """
+    Yields the platform tags for a macOS system.
+
+    The `version` parameter is a two-item tuple specifying the macOS version to
+    generate platform tags for. The `arch` parameter is the CPU architecture to
+    generate platform tags for. Both parameters default to the appropriate value
+    for the current system.
+    """
+    version_str, _, cpu_arch = platform.mac_ver()  # type: ignore
+    if version is None:
+        version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2])))
+    else:
+        version = version
+    if arch is None:
+        arch = _mac_arch(cpu_arch)
+    else:
+        arch = arch
+    for minor_version in range(version[1], -1, -1):
+        compat_version = version[0], minor_version
+        binary_formats = _mac_binary_formats(compat_version, arch)
+        for binary_format in binary_formats:
+            yield "macosx_{major}_{minor}_{binary_format}".format(
+                major=compat_version[0],
+                minor=compat_version[1],
+                binary_format=binary_format,
+            )
+
+
+# From PEP 513.
+def _is_manylinux_compatible(name, glibc_version):
+    # type: (str, GlibcVersion) -> bool
+    # Check for presence of _manylinux module.
+    try:
+        import _manylinux  # noqa
+
+        return bool(getattr(_manylinux, name + "_compatible"))
+    except (ImportError, AttributeError):
+        # Fall through to heuristic check below.
+        pass
+
+    return _have_compatible_glibc(*glibc_version)
+
+
+def _glibc_version_string():
+    # type: () -> Optional[str]
+    # Returns glibc version string, or None if not using glibc.
+    return _glibc_version_string_confstr() or _glibc_version_string_ctypes()
+
+
+def _glibc_version_string_confstr():
+    # type: () -> Optional[str]
+    """
+    Primary implementation of glibc_version_string using os.confstr.
+    """
+    # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely
+    # to be broken or missing. This strategy is used in the standard library
+    # platform module.
+    # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183
+    try:
+        # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17".
+        version_string = os.confstr(  # type: ignore[attr-defined] # noqa: F821
+            "CS_GNU_LIBC_VERSION"
+        )
+        assert version_string is not None
+        _, version = version_string.split()  # type: Tuple[str, str]
+    except (AssertionError, AttributeError, OSError, ValueError):
+        # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)...
+        return None
+    return version
+
+
+def _glibc_version_string_ctypes():
+    # type: () -> Optional[str]
+    """
+    Fallback implementation of glibc_version_string using ctypes.
+    """
+    try:
+        import ctypes
+    except ImportError:
+        return None
+
+    # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
+    # manpage says, "If filename is NULL, then the returned handle is for the
+    # main program". This way we can let the linker do the work to figure out
+    # which libc our process is actually using.
+    #
+    # Note: typeshed is wrong here so we are ignoring this line.
+    process_namespace = ctypes.CDLL(None)  # type: ignore
+    try:
+        gnu_get_libc_version = process_namespace.gnu_get_libc_version
+    except AttributeError:
+        # Symbol doesn't exist -> therefore, we are not linked to
+        # glibc.
+        return None
+
+    # Call gnu_get_libc_version, which returns a string like "2.5"
+    gnu_get_libc_version.restype = ctypes.c_char_p
+    version_str = gnu_get_libc_version()  # type: str
+    # py2 / py3 compatibility:
+    if not isinstance(version_str, str):
+        version_str = version_str.decode("ascii")
+
+    return version_str
+
+
+# Separated out from have_compatible_glibc for easier unit testing.
+def _check_glibc_version(version_str, required_major, minimum_minor):
+    # type: (str, int, int) -> bool
+    # Parse string and check against requested version.
+    #
+    # We use a regexp instead of str.split because we want to discard any
+    # random junk that might come after the minor version -- this might happen
+    # in patched/forked versions of glibc (e.g. Linaro's version of glibc
+    # uses version strings like "2.20-2014.11"). See gh-3588.
+    m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str)
+    if not m:
+        warnings.warn(
+            "Expected glibc version with 2 components major.minor,"
+            " got: %s" % version_str,
+            RuntimeWarning,
+        )
+        return False
+    return (
+        int(m.group("major")) == required_major
+        and int(m.group("minor")) >= minimum_minor
+    )
+
+
+def _have_compatible_glibc(required_major, minimum_minor):
+    # type: (int, int) -> bool
+    version_str = _glibc_version_string()
+    if version_str is None:
+        return False
+    return _check_glibc_version(version_str, required_major, minimum_minor)
+
+
+# Python does not provide platform information at sufficient granularity to
+# identify the architecture of the running executable in some cases, so we
+# determine it dynamically by reading the information from the running
+# process. This only applies on Linux, which uses the ELF format.
+class _ELFFileHeader(object):
+    # https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
+    class _InvalidELFFileHeader(ValueError):
+        """
+        An invalid ELF file header was found.
+        """
+
+    ELF_MAGIC_NUMBER = 0x7F454C46
+    ELFCLASS32 = 1
+    ELFCLASS64 = 2
+    ELFDATA2LSB = 1
+    ELFDATA2MSB = 2
+    EM_386 = 3
+    EM_S390 = 22
+    EM_ARM = 40
+    EM_X86_64 = 62
+    EF_ARM_ABIMASK = 0xFF000000
+    EF_ARM_ABI_VER5 = 0x05000000
+    EF_ARM_ABI_FLOAT_HARD = 0x00000400
+
+    def __init__(self, file):
+        # type: (IO[bytes]) -> None
+        def unpack(fmt):
+            # type: (str) -> int
+            try:
+                (result,) = struct.unpack(
+                    fmt, file.read(struct.calcsize(fmt))
+                )  # type: (int, )
+            except struct.error:
+                raise _ELFFileHeader._InvalidELFFileHeader()
+            return result
+
+        self.e_ident_magic = unpack(">I")
+        if self.e_ident_magic != self.ELF_MAGIC_NUMBER:
+            raise _ELFFileHeader._InvalidELFFileHeader()
+        self.e_ident_class = unpack("B")
+        if self.e_ident_class not in {self.ELFCLASS32, self.ELFCLASS64}:
+            raise _ELFFileHeader._InvalidELFFileHeader()
+        self.e_ident_data = unpack("B")
+        if self.e_ident_data not in {self.ELFDATA2LSB, self.ELFDATA2MSB}:
+            raise _ELFFileHeader._InvalidELFFileHeader()
+        self.e_ident_version = unpack("B")
+        self.e_ident_osabi = unpack("B")
+        self.e_ident_abiversion = unpack("B")
+        self.e_ident_pad = file.read(7)
+        format_h = "<H" if self.e_ident_data == self.ELFDATA2LSB else ">H"
+        format_i = "<I" if self.e_ident_data == self.ELFDATA2LSB else ">I"
+        format_q = "<Q" if self.e_ident_data == self.ELFDATA2LSB else ">Q"
+        format_p = format_i if self.e_ident_class == self.ELFCLASS32 else format_q
+        self.e_type = unpack(format_h)
+        self.e_machine = unpack(format_h)
+        self.e_version = unpack(format_i)
+        self.e_entry = unpack(format_p)
+        self.e_phoff = unpack(format_p)
+        self.e_shoff = unpack(format_p)
+        self.e_flags = unpack(format_i)
+        self.e_ehsize = unpack(format_h)
+        self.e_phentsize = unpack(format_h)
+        self.e_phnum = unpack(format_h)
+        self.e_shentsize = unpack(format_h)
+        self.e_shnum = unpack(format_h)
+        self.e_shstrndx = unpack(format_h)
+
+
+def _get_elf_header():
+    # type: () -> Optional[_ELFFileHeader]
+    try:
+        with open(sys.executable, "rb") as f:
+            elf_header = _ELFFileHeader(f)
+    except (IOError, OSError, TypeError, _ELFFileHeader._InvalidELFFileHeader):
+        return None
+    return elf_header
+
+
+def _is_linux_armhf():
+    # type: () -> bool
+    # hard-float ABI can be detected from the ELF header of the running
+    # process
+    # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf
+    elf_header = _get_elf_header()
+    if elf_header is None:
+        return False
+    result = elf_header.e_ident_class == elf_header.ELFCLASS32
+    result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB
+    result &= elf_header.e_machine == elf_header.EM_ARM
+    result &= (
+        elf_header.e_flags & elf_header.EF_ARM_ABIMASK
+    ) == elf_header.EF_ARM_ABI_VER5
+    result &= (
+        elf_header.e_flags & elf_header.EF_ARM_ABI_FLOAT_HARD
+    ) == elf_header.EF_ARM_ABI_FLOAT_HARD
+    return result
+
+
+def _is_linux_i686():
+    # type: () -> bool
+    elf_header = _get_elf_header()
+    if elf_header is None:
+        return False
+    result = elf_header.e_ident_class == elf_header.ELFCLASS32
+    result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB
+    result &= elf_header.e_machine == elf_header.EM_386
+    return result
+
+
+def _have_compatible_manylinux_abi(arch):
+    # type: (str) -> bool
+    if arch == "armv7l":
+        return _is_linux_armhf()
+    if arch == "i686":
+        return _is_linux_i686()
+    return True
+
+
+def _linux_platforms(is_32bit=_32_BIT_INTERPRETER):
+    # type: (bool) -> Iterator[str]
+    linux = _normalize_string(distutils.util.get_platform())
+    if is_32bit:
+        if linux == "linux_x86_64":
+            linux = "linux_i686"
+        elif linux == "linux_aarch64":
+            linux = "linux_armv7l"
+    manylinux_support = []
+    _, arch = linux.split("_", 1)
+    if _have_compatible_manylinux_abi(arch):
+        if arch in {"x86_64", "i686", "aarch64", "armv7l", "ppc64", "ppc64le", "s390x"}:
+            manylinux_support.append(
+                ("manylinux2014", (2, 17))
+            )  # CentOS 7 w/ glibc 2.17 (PEP 599)
+        if arch in {"x86_64", "i686"}:
+            manylinux_support.append(
+                ("manylinux2010", (2, 12))
+            )  # CentOS 6 w/ glibc 2.12 (PEP 571)
+            manylinux_support.append(
+                ("manylinux1", (2, 5))
+            )  # CentOS 5 w/ glibc 2.5 (PEP 513)
+    manylinux_support_iter = iter(manylinux_support)
+    for name, glibc_version in manylinux_support_iter:
+        if _is_manylinux_compatible(name, glibc_version):
+            yield linux.replace("linux", name)
+            break
+    # Support for a later manylinux implies support for an earlier version.
+    for name, _ in manylinux_support_iter:
+        yield linux.replace("linux", name)
+    yield linux
+
+
+def _generic_platforms():
+    # type: () -> Iterator[str]
+    yield _normalize_string(distutils.util.get_platform())
+
+
+def _platform_tags():
+    # type: () -> Iterator[str]
+    """
+    Provides the platform tags for this installation.
+    """
+    if platform.system() == "Darwin":
+        return mac_platforms()
+    elif platform.system() == "Linux":
+        return _linux_platforms()
+    else:
+        return _generic_platforms()
+
+
+def interpreter_name():
+    # type: () -> str
+    """
+    Returns the name of the running interpreter.
+    """
+    try:
+        name = sys.implementation.name  # type: ignore
+    except AttributeError:  # pragma: no cover
+        # Python 2.7 compatibility.
+        name = platform.python_implementation().lower()
+    return INTERPRETER_SHORT_NAMES.get(name) or name
+
+
+def interpreter_version(**kwargs):
+    # type: (bool) -> str
+    """
+    Returns the version of the running interpreter.
+    """
+    warn = _warn_keyword_parameter("interpreter_version", kwargs)
+    version = _get_config_var("py_version_nodot", warn=warn)
+    if version:
+        version = str(version)
+    else:
+        version = _version_nodot(sys.version_info[:2])
+    return version
+
+
+def _version_nodot(version):
+    # type: (PythonVersion) -> str
+    if any(v >= 10 for v in version):
+        sep = "_"
+    else:
+        sep = ""
+    return sep.join(map(str, version))
+
+
+def sys_tags(**kwargs):
+    # type: (bool) -> Iterator[Tag]
+    """
+    Returns the sequence of tag triples for the running interpreter.
+
+    The order of the sequence corresponds to priority order for the
+    interpreter, from most to least important.
+    """
+    warn = _warn_keyword_parameter("sys_tags", kwargs)
+
+    interp_name = interpreter_name()
+    if interp_name == "cp":
+        for tag in cpython_tags(warn=warn):
+            yield tag
+    else:
+        for tag in generic_tags():
+            yield tag
+
+    for tag in compatible_tags():
+        yield tag
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py
similarity index 75%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py
index 8841878..19579c1 100644
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py
@@ -5,28 +5,36 @@ from __future__ import absolute_import, division, print_function
 
 import re
 
+from ._typing import TYPE_CHECKING, cast
 from .version import InvalidVersion, Version
 
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import NewType, Union
+
+    NormalizedName = NewType("NormalizedName", str)
 
 _canonicalize_regex = re.compile(r"[-_.]+")
 
 
 def canonicalize_name(name):
+    # type: (str) -> NormalizedName
     # This is taken from PEP 503.
-    return _canonicalize_regex.sub("-", name).lower()
+    value = _canonicalize_regex.sub("-", name).lower()
+    return cast("NormalizedName", value)
 
 
-def canonicalize_version(version):
+def canonicalize_version(_version):
+    # type: (str) -> Union[Version, str]
     """
-    This is very similar to Version.__str__, but has one subtle differences
+    This is very similar to Version.__str__, but has one subtle difference
     with the way it handles the release segment.
     """
 
     try:
-        version = Version(version)
+        version = Version(_version)
     except InvalidVersion:
         # Legacy versions cannot be normalized
-        return version
+        return _version
 
     parts = []
 
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py
similarity index 73%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py
index 95157a1..00371e8 100644
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py
+++ b/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py
@@ -7,8 +7,35 @@ import collections
 import itertools
 import re
 
-from ._structures import Infinity
-
+from ._structures import Infinity, NegativeInfinity
+from ._typing import TYPE_CHECKING
+
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union
+
+    from ._structures import InfinityType, NegativeInfinityType
+
+    InfiniteTypes = Union[InfinityType, NegativeInfinityType]
+    PrePostDevType = Union[InfiniteTypes, Tuple[str, int]]
+    SubLocalType = Union[InfiniteTypes, int, str]
+    LocalType = Union[
+        NegativeInfinityType,
+        Tuple[
+            Union[
+                SubLocalType,
+                Tuple[SubLocalType, str],
+                Tuple[NegativeInfinityType, SubLocalType],
+            ],
+            ...,
+        ],
+    ]
+    CmpKey = Tuple[
+        int, Tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType
+    ]
+    LegacyCmpKey = Tuple[int, Tuple[str, ...]]
+    VersionComparisonMethod = Callable[
+        [Union[CmpKey, LegacyCmpKey], Union[CmpKey, LegacyCmpKey]], bool
+    ]
 
 __all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"]
 
@@ -19,6 +46,7 @@ _Version = collections.namedtuple(
 
 
 def parse(version):
+    # type: (str) -> Union[LegacyVersion, Version]
     """
     Parse the given version string and return either a :class:`Version` object
     or a :class:`LegacyVersion` object depending on if the given version is
@@ -37,28 +65,38 @@ class InvalidVersion(ValueError):
 
 
 class _BaseVersion(object):
+    _key = None  # type: Union[CmpKey, LegacyCmpKey]
+
     def __hash__(self):
+        # type: () -> int
         return hash(self._key)
 
     def __lt__(self, other):
+        # type: (_BaseVersion) -> bool
         return self._compare(other, lambda s, o: s < o)
 
     def __le__(self, other):
+        # type: (_BaseVersion) -> bool
         return self._compare(other, lambda s, o: s <= o)
 
     def __eq__(self, other):
+        # type: (object) -> bool
         return self._compare(other, lambda s, o: s == o)
 
     def __ge__(self, other):
+        # type: (_BaseVersion) -> bool
         return self._compare(other, lambda s, o: s >= o)
 
     def __gt__(self, other):
+        # type: (_BaseVersion) -> bool
         return self._compare(other, lambda s, o: s > o)
 
     def __ne__(self, other):
+        # type: (object) -> bool
         return self._compare(other, lambda s, o: s != o)
 
     def _compare(self, other, method):
+        # type: (object, VersionComparisonMethod) -> Union[bool, NotImplemented]
         if not isinstance(other, _BaseVersion):
             return NotImplemented
 
@@ -67,57 +105,71 @@ class _BaseVersion(object):
 
 class LegacyVersion(_BaseVersion):
     def __init__(self, version):
+        # type: (str) -> None
         self._version = str(version)
         self._key = _legacy_cmpkey(self._version)
 
     def __str__(self):
+        # type: () -> str
         return self._version
 
     def __repr__(self):
+        # type: () -> str
         return "<LegacyVersion({0})>".format(repr(str(self)))
 
     @property
     def public(self):
+        # type: () -> str
         return self._version
 
     @property
     def base_version(self):
+        # type: () -> str
         return self._version
 
     @property
     def epoch(self):
+        # type: () -> int
         return -1
 
     @property
     def release(self):
+        # type: () -> None
         return None
 
     @property
     def pre(self):
+        # type: () -> None
         return None
 
     @property
     def post(self):
+        # type: () -> None
         return None
 
     @property
     def dev(self):
+        # type: () -> None
         return None
 
     @property
     def local(self):
+        # type: () -> None
         return None
 
     @property
     def is_prerelease(self):
+        # type: () -> bool
         return False
 
     @property
     def is_postrelease(self):
+        # type: () -> bool
         return False
 
     @property
     def is_devrelease(self):
+        # type: () -> bool
         return False
 
 
@@ -133,6 +185,7 @@ _legacy_version_replacement_map = {
 
 
 def _parse_version_parts(s):
+    # type: (str) -> Iterator[str]
     for part in _legacy_version_component_re.split(s):
         part = _legacy_version_replacement_map.get(part, part)
 
@@ -150,6 +203,8 @@ def _parse_version_parts(s):
 
 
 def _legacy_cmpkey(version):
+    # type: (str) -> LegacyCmpKey
+
     # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch
     # greater than or equal to 0. This will effectively put the LegacyVersion,
     # which uses the defacto standard originally implemented by setuptools,
@@ -158,7 +213,7 @@ def _legacy_cmpkey(version):
 
     # This scheme is taken from pkg_resources.parse_version setuptools prior to
     # it's adoption of the packaging library.
-    parts = []
+    parts = []  # type: List[str]
     for part in _parse_version_parts(version.lower()):
         if part.startswith("*"):
             # remove "-" before a prerelease tag
@@ -171,9 +226,8 @@ def _legacy_cmpkey(version):
                 parts.pop()
 
         parts.append(part)
-    parts = tuple(parts)
 
-    return epoch, parts
+    return epoch, tuple(parts)
 
 
 # Deliberately not anchored to the start and end of the string, to make it
@@ -215,6 +269,8 @@ class Version(_BaseVersion):
     _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
 
     def __init__(self, version):
+        # type: (str) -> None
+
         # Validate the version and parse it into pieces
         match = self._regex.search(version)
         if not match:
@@ -243,9 +299,11 @@ class Version(_BaseVersion):
         )
 
     def __repr__(self):
+        # type: () -> str
         return "<Version({0})>".format(repr(str(self)))
 
     def __str__(self):
+        # type: () -> str
         parts = []
 
         # Epoch
@@ -275,26 +333,35 @@ class Version(_BaseVersion):
 
     @property
     def epoch(self):
-        return self._version.epoch
+        # type: () -> int
+        _epoch = self._version.epoch  # type: int
+        return _epoch
 
     @property
     def release(self):
-        return self._version.release
+        # type: () -> Tuple[int, ...]
+        _release = self._version.release  # type: Tuple[int, ...]
+        return _release
 
     @property
     def pre(self):
-        return self._version.pre
+        # type: () -> Optional[Tuple[str, int]]
+        _pre = self._version.pre  # type: Optional[Tuple[str, int]]
+        return _pre
 
     @property
     def post(self):
+        # type: () -> Optional[Tuple[str, int]]
         return self._version.post[1] if self._version.post else None
 
     @property
     def dev(self):
+        # type: () -> Optional[Tuple[str, int]]
         return self._version.dev[1] if self._version.dev else None
 
     @property
     def local(self):
+        # type: () -> Optional[str]
         if self._version.local:
             return ".".join(str(x) for x in self._version.local)
         else:
@@ -302,10 +369,12 @@ class Version(_BaseVersion):
 
     @property
     def public(self):
+        # type: () -> str
         return str(self).split("+", 1)[0]
 
     @property
     def base_version(self):
+        # type: () -> str
         parts = []
 
         # Epoch
@@ -319,18 +388,41 @@ class Version(_BaseVersion):
 
     @property
     def is_prerelease(self):
+        # type: () -> bool
         return self.dev is not None or self.pre is not None
 
     @property
     def is_postrelease(self):
+        # type: () -> bool
         return self.post is not None
 
     @property
     def is_devrelease(self):
+        # type: () -> bool
         return self.dev is not None
 
+    @property
+    def major(self):
+        # type: () -> int
+        return self.release[0] if len(self.release) >= 1 else 0
+
+    @property
+    def minor(self):
+        # type: () -> int
+        return self.release[1] if len(self.release) >= 2 else 0
+
+    @property
+    def micro(self):
+        # type: () -> int
+        return self.release[2] if len(self.release) >= 3 else 0
+
+
+def _parse_letter_version(
+    letter,  # type: str
+    number,  # type: Union[str, bytes, SupportsInt]
+):
+    # type: (...) -> Optional[Tuple[str, int]]
 
-def _parse_letter_version(letter, number):
     if letter:
         # We consider there to be an implicit 0 in a pre-release if there is
         # not a numeral associated with it.
@@ -360,11 +452,14 @@ def _parse_letter_version(letter, number):
 
         return letter, int(number)
 
+    return None
+
 
 _local_version_separators = re.compile(r"[\._-]")
 
 
 def _parse_local_version(local):
+    # type: (str) -> Optional[LocalType]
     """
     Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
     """
@@ -373,15 +468,25 @@ def _parse_local_version(local):
             part.lower() if not part.isdigit() else int(part)
             for part in _local_version_separators.split(local)
         )
+    return None
+
 
+def _cmpkey(
+    epoch,  # type: int
+    release,  # type: Tuple[int, ...]
+    pre,  # type: Optional[Tuple[str, int]]
+    post,  # type: Optional[Tuple[str, int]]
+    dev,  # type: Optional[Tuple[str, int]]
+    local,  # type: Optional[Tuple[SubLocalType]]
+):
+    # type: (...) -> CmpKey
 
-def _cmpkey(epoch, release, pre, post, dev, local):
     # When we compare a release version, we want to compare it with all of the
     # trailing zeros removed. So we'll use a reverse the list, drop all the now
     # leading zeros until we come to something non zero, then take the rest
     # re-reverse it back into the correct order and make it a tuple and use
     # that for our sorting key.
-    release = tuple(
+    _release = tuple(
         reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
     )
 
@@ -390,23 +495,31 @@ def _cmpkey(epoch, release, pre, post, dev, local):
     # if there is not a pre or a post segment. If we have one of those then
     # the normal sorting rules will handle this case correctly.
     if pre is None and post is None and dev is not None:
-        pre = -Infinity
+        _pre = NegativeInfinity  # type: PrePostDevType
     # Versions without a pre-release (except as noted above) should sort after
     # those with one.
     elif pre is None:
-        pre = Infinity
+        _pre = Infinity
+    else:
+        _pre = pre
 
     # Versions without a post segment should sort before those with one.
     if post is None:
-        post = -Infinity
+        _post = NegativeInfinity  # type: PrePostDevType
+
+    else:
+        _post = post
 
     # Versions without a development segment should sort after those with one.
     if dev is None:
-        dev = Infinity
+        _dev = Infinity  # type: PrePostDevType
+
+    else:
+        _dev = dev
 
     if local is None:
         # Versions without a local segment should sort before those with one.
-        local = -Infinity
+        _local = NegativeInfinity  # type: LocalType
     else:
         # Versions with a local segment need that segment parsed to implement
         # the sorting rules in PEP440.
@@ -415,6 +528,8 @@ def _cmpkey(epoch, release, pre, post, dev, local):
         # - Numeric segments sort numerically
         # - Shorter versions sort before longer versions when the prefixes
         #   match exactly
-        local = tuple((i, "") if isinstance(i, int) else (-Infinity, i) for i in local)
+        _local = tuple(
+            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
+        )
 
-    return epoch, release, pre, post, dev, local
+    return epoch, _release, _pre, _post, _dev, _local
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/pyparsing.py b/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/pyparsing.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/six.py b/venv/Lib/site-packages/pkg_resources/_vendor/six.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/six.py
rename to venv/Lib/site-packages/pkg_resources/_vendor/six.py
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/extern/__init__.py b/venv/Lib/site-packages/pkg_resources/extern/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/pkg_resources/extern/__init__.py
rename to venv/Lib/site-packages/pkg_resources/extern/__init__.py
diff --git a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/INSTALLER b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/INSTALLER
similarity index 100%
rename from venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/INSTALLER
rename to venv/Lib/site-packages/setuptools-49.6.0.dist-info/INSTALLER
diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/LICENSE b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/LICENSE
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/LICENSE
rename to venv/Lib/site-packages/setuptools-49.6.0.dist-info/LICENSE
diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/METADATA b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/METADATA
similarity index 94%
rename from venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/METADATA
rename to venv/Lib/site-packages/setuptools-49.6.0.dist-info/METADATA
index b897050..c028e1f 100644
--- a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/METADATA
+++ b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/METADATA
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: setuptools
-Version: 46.1.3
+Version: 49.6.0
 Summary: Easily download, build, install, upgrade, and uninstall Python packages
 Home-page: https://github.com/pypa/setuptools
 Author: Python Packaging Authority
@@ -31,6 +31,7 @@ Provides-Extra: docs
 Requires-Dist: sphinx ; extra == 'docs'
 Requires-Dist: jaraco.packaging (>=6.1) ; extra == 'docs'
 Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
+Requires-Dist: pygments-github-lexers (==0.0.5) ; extra == 'docs'
 Provides-Extra: ssl
 Requires-Dist: wincertstore (==0.2) ; (sys_platform == "win32") and extra == 'ssl'
 Provides-Extra: tests
@@ -43,6 +44,7 @@ Requires-Dist: wheel ; extra == 'tests'
 Requires-Dist: coverage (>=4.5.1) ; extra == 'tests'
 Requires-Dist: pytest-cov (>=2.5.1) ; extra == 'tests'
 Requires-Dist: pip (>=19.1) ; extra == 'tests'
+Requires-Dist: jaraco.envs ; extra == 'tests'
 Requires-Dist: futures ; (python_version == "2.7") and extra == 'tests'
 Requires-Dist: flake8-2020 ; (python_version >= "3.6") and extra == 'tests'
 Requires-Dist: paver ; (python_version >= "3.6") and extra == 'tests'
@@ -55,7 +57,7 @@ Requires-Dist: paver ; (python_version >= "3.6") and extra == 'tests'
 
 .. _PyPI link: https://pypi.org/project/setuptools
 
-.. image:: https://dev.azure.com/jaraco/setuptools/_apis/build/status/jaraco.setuptools?branchName=master
+.. image:: https://dev.azure.com/jaraco/setuptools/_apis/build/status/pypa.setuptools?branchName=master
    :target: https://dev.azure.com/jaraco/setuptools/_build/latest?definitionId=1&branchName=master
 
 .. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20CI&logo=travis&logoColor=white
@@ -103,6 +105,6 @@ Code of Conduct
 
 Everyone interacting in the setuptools project's codebases, issue trackers,
 chat rooms, and mailing lists is expected to follow the
-`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_.
+`PSF Code of Conduct <https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md>`_.
 
 
diff --git a/venv/Lib/site-packages/setuptools-49.6.0.dist-info/RECORD b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/RECORD
new file mode 100644
index 0000000..b81b7c0
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/RECORD
@@ -0,0 +1,303 @@
+../../Scripts/easy_install-3.8.exe,sha256=ADa4o1Ym6OOvHtex9G7wYDSEZ9fGBePftyxIhHRQ3Yk,106390
+../../Scripts/easy_install.exe,sha256=ADa4o1Ym6OOvHtex9G7wYDSEZ9fGBePftyxIhHRQ3Yk,106390
+__pycache__/easy_install.cpython-38.pyc,,
+_distutils_hack/__init__.py,sha256=hwxvSGnUCddDTH73uZF1VoCVtVQaxiFTjl2BRf0BGU8,2849
+_distutils_hack/__pycache__/__init__.cpython-38.pyc,,
+_distutils_hack/__pycache__/override.cpython-38.pyc,,
+_distutils_hack/override.py,sha256=Eu_s-NF6VIZ4Cqd0tbbA5wtWky2IZPNd8et6GLt1mzo,44
+distutils-precedence.pth,sha256=8XAcQu-0yOeR-7MU7QhDx_g3ROcBZ9JHXnUoibeGLYs,131
+easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126
+pkg_resources/__init__.py,sha256=xbJnjxvLW5bAL_iJa5y6bgmDmnmfiuuuIvBwhBQl4Ro,108726
+pkg_resources/__pycache__/__init__.cpython-38.pyc,,
+pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc,,
+pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc,,
+pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc,,
+pkg_resources/_vendor/__pycache__/six.cpython-38.pyc,,
+pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701
+pkg_resources/_vendor/packaging/__about__.py,sha256=PNMsaZn4UcCHyubgROH1bl6CluduPjI5kFrSp_Zgklo,736
+pkg_resources/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562
+pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/_typing.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/tags.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/utils.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc,,
+pkg_resources/_vendor/packaging/_compat.py,sha256=MXdsGpSE_W-ZrHoC87andI4LV2FAwU7HLL-eHe_CjhU,1128
+pkg_resources/_vendor/packaging/_structures.py,sha256=ozkCX8Q8f2qE1Eic3YiQ4buDVfgz2iYevY9e7R2y3iY,2022
+pkg_resources/_vendor/packaging/_typing.py,sha256=x59EhQ57TMT-kTRyLZV25HZvYGGwbucTo6iKh_O0tMw,1812
+pkg_resources/_vendor/packaging/markers.py,sha256=YSntQkMnKyw1_FG6oRNNnGxLL6bAxcGXOtuFE-YTS3k,9518
+pkg_resources/_vendor/packaging/requirements.py,sha256=g9TyOOhqBY1CJMjYeaisQ_OUbJO8M85sefT-b-hLpSY,4960
+pkg_resources/_vendor/packaging/specifiers.py,sha256=uYp9l13F0LcknS6d4N60ytiBgFmIhKideOq9AnsxTco,31944
+pkg_resources/_vendor/packaging/tags.py,sha256=NKMS37Zo_nWrZxgsD6zbXsXgc9edn9m160cBiLmHJdE,24067
+pkg_resources/_vendor/packaging/utils.py,sha256=RShlvnjO2CtYSD8uri32frMMFMTmB-3ihsq1-ghzLEw,1811
+pkg_resources/_vendor/packaging/version.py,sha256=Cnbm-OO9D_qd8ZTFxzFcjSavexSYFZmyeaoPvMsjgPc,15470
+pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055
+pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
+pkg_resources/extern/__init__.py,sha256=w_3T8ntsvFFioQYOgYoGGqafDiv4sLzecQRDjsB5yeE,2101
+pkg_resources/extern/__pycache__/__init__.cpython-38.pyc,,
+setuptools-49.6.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+setuptools-49.6.0.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078
+setuptools-49.6.0.dist-info/METADATA,sha256=2-2CJwCc1LSm84_CbrMiaW1ZT2Xelmod9L4lUDn0NsA,4865
+setuptools-49.6.0.dist-info/RECORD,,
+setuptools-49.6.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
+setuptools-49.6.0.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239
+setuptools-49.6.0.dist-info/entry_points.txt,sha256=1K5Fr0-5Ph3ZRZFuwNaw8ERGiNLVqHvdKDNt3oXGS6w,3143
+setuptools-49.6.0.dist-info/top_level.txt,sha256=Xc47-_bn9IXa0F2lP6dE-l-ySe5Xmv_ihIWX-aUjAgg,54
+setuptools-49.6.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
+setuptools/__init__.py,sha256=EJRi29JzzcWtevlsyrGro1gekW01y_oM3eSEOsEUCfw,7875
+setuptools/__pycache__/__init__.cpython-38.pyc,,
+setuptools/__pycache__/_deprecation_warning.cpython-38.pyc,,
+setuptools/__pycache__/_imp.cpython-38.pyc,,
+setuptools/__pycache__/archive_util.cpython-38.pyc,,
+setuptools/__pycache__/build_meta.cpython-38.pyc,,
+setuptools/__pycache__/config.cpython-38.pyc,,
+setuptools/__pycache__/dep_util.cpython-38.pyc,,
+setuptools/__pycache__/depends.cpython-38.pyc,,
+setuptools/__pycache__/dist.cpython-38.pyc,,
+setuptools/__pycache__/errors.cpython-38.pyc,,
+setuptools/__pycache__/extension.cpython-38.pyc,,
+setuptools/__pycache__/glob.cpython-38.pyc,,
+setuptools/__pycache__/installer.cpython-38.pyc,,
+setuptools/__pycache__/launch.cpython-38.pyc,,
+setuptools/__pycache__/lib2to3_ex.cpython-38.pyc,,
+setuptools/__pycache__/monkey.cpython-38.pyc,,
+setuptools/__pycache__/msvc.cpython-38.pyc,,
+setuptools/__pycache__/namespaces.cpython-38.pyc,,
+setuptools/__pycache__/package_index.cpython-38.pyc,,
+setuptools/__pycache__/py27compat.cpython-38.pyc,,
+setuptools/__pycache__/py31compat.cpython-38.pyc,,
+setuptools/__pycache__/py33compat.cpython-38.pyc,,
+setuptools/__pycache__/py34compat.cpython-38.pyc,,
+setuptools/__pycache__/sandbox.cpython-38.pyc,,
+setuptools/__pycache__/ssl_support.cpython-38.pyc,,
+setuptools/__pycache__/unicode_utils.cpython-38.pyc,,
+setuptools/__pycache__/version.cpython-38.pyc,,
+setuptools/__pycache__/wheel.cpython-38.pyc,,
+setuptools/__pycache__/windows_support.cpython-38.pyc,,
+setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218
+setuptools/_distutils/__init__.py,sha256=lpQAphR_7uhWC2fbSEps4Ja9W4YwezN_IX_LJEt3khU,250
+setuptools/_distutils/__pycache__/__init__.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/_msvccompiler.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/archive_util.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/bcppcompiler.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/ccompiler.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/cmd.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/config.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/core.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/cygwinccompiler.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/debug.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/dep_util.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/dir_util.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/dist.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/errors.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/extension.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/fancy_getopt.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/file_util.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/filelist.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/log.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/msvc9compiler.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/msvccompiler.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/spawn.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/sysconfig.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/text_file.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/unixccompiler.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/util.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/version.cpython-38.pyc,,
+setuptools/_distutils/__pycache__/versionpredicate.cpython-38.pyc,,
+setuptools/_distutils/_msvccompiler.py,sha256=RHCjIg5d2O6BxWDRotab1dgX-lhcSglHtzF2ZZgHwbA,19968
+setuptools/_distutils/archive_util.py,sha256=qW-uiGwYexTvK5e-iSel_31Dshx-CqTanNPK6snwf98,8572
+setuptools/_distutils/bcppcompiler.py,sha256=OJDVpCUmX6H8v_7lV1zifV1fcx92Cr2dhiUh6989UJI,14894
+setuptools/_distutils/ccompiler.py,sha256=4cqQgq06NbGo0vazGMT2aPZ6K2Z-HcuRn9Pfz_bQUPw,47437
+setuptools/_distutils/cmd.py,sha256=eco6LAGUtobLuPafuhmgKgkwRRL_WY8KJ4YeDCHpcls,18079
+setuptools/_distutils/command/__init__.py,sha256=2TA-rlNDlzeI-csbWHXFjGD8uOYqALMfyWOhT49nC6g,799
+setuptools/_distutils/command/__pycache__/__init__.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/bdist.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/bdist_msi.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/build.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/build_clib.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/build_ext.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/build_py.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/build_scripts.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/check.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/clean.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/config.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/install.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/install_data.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/install_egg_info.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/install_headers.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/install_lib.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/install_scripts.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/register.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/sdist.cpython-38.pyc,,
+setuptools/_distutils/command/__pycache__/upload.cpython-38.pyc,,
+setuptools/_distutils/command/bdist.py,sha256=2z4eudRl_n7m3lG9leL0IYqes4bsm8c0fxfZuiafjMg,5562
+setuptools/_distutils/command/bdist_dumb.py,sha256=BTur9jcIppyP7Piavjfsk7YjElqvxeYO2npUyPPOekc,4913
+setuptools/_distutils/command/bdist_msi.py,sha256=EVFQYN_X-ExeeP8gmdV9JcINsuUGsLJUz9afMU0Rt8c,35579
+setuptools/_distutils/command/bdist_rpm.py,sha256=gjOw22GhDSbcq0bdq25cTb-n6HWWm0bShLQad_mkJ4k,21537
+setuptools/_distutils/command/bdist_wininst.py,sha256=iGlaI-VfElHOneeczKHWnSN5a10-7IMcJaXuR1mdS3c,16030
+setuptools/_distutils/command/build.py,sha256=11NyR2UAUzalrkTZ2ph0BAHFWFC2jtSsN7gIaF-NC08,5767
+setuptools/_distutils/command/build_clib.py,sha256=bgVTHh28eLQA2Gkw68amApd_j7qQBX4MTI-zTvAK_J4,8022
+setuptools/_distutils/command/build_ext.py,sha256=MMJPCxHlf9rgUkizn4Kjq9vYeAEfxyqfq8XsTE-EpWM,31635
+setuptools/_distutils/command/build_py.py,sha256=S_Nlw4hZE8PnIgqX5OFMdmt-GSmOhPQQ4f2jr1uBnoU,17190
+setuptools/_distutils/command/build_scripts.py,sha256=aKycJJPx3LfZ1cvZgSJaxnD2LnvRM5WJ-8xkpdgcLsI,6232
+setuptools/_distutils/command/check.py,sha256=5qDtI75ccZg3sAItQWeaIu8y3FR314O4rr9Smz4HsEo,5637
+setuptools/_distutils/command/clean.py,sha256=2TCt47ru4hZZM0RfVfUYj5bbpicpGLP4Qhw5jBtvp9k,2776
+setuptools/_distutils/command/config.py,sha256=2aTjww3PwjMB8-ZibCe4P7B-qG1hM1gn_rJXYyxRz6c,13117
+setuptools/_distutils/command/install.py,sha256=oOM2rD7l_SglARNVDmiZn8u6DAfidXRF_yE5QS328B4,27482
+setuptools/_distutils/command/install_data.py,sha256=YhGOAwh3gJPqF7em5XA0rmpR42z1bLh80ooElzDyUvk,2822
+setuptools/_distutils/command/install_egg_info.py,sha256=0kW0liVMeadkjX0ZcRfMptKFen07Gw6gyw1VHT5KIwc,2603
+setuptools/_distutils/command/install_headers.py,sha256=XQ6idkbIDfr1ljXCOznuVUMvOFpHBn6cK0Wz9gIM2b4,1298
+setuptools/_distutils/command/install_lib.py,sha256=9AofR-MO9lAtjwwuukCptepOaJEKMZW2VHiyR5hU7HA,8397
+setuptools/_distutils/command/install_scripts.py,sha256=_CLUeQwGJRcY2kik7azPMn5IdtDCrjWdUvZ1khlG6ck,2017
+setuptools/_distutils/command/register.py,sha256=2jaq9968rt2puRVDBx1HbNiXv27uOk8idE_4lPf_3VM,11712
+setuptools/_distutils/command/sdist.py,sha256=qotJjAOzyhJjq2-oDImjNFrOtaSneEFDJTB-sEk1wnU,19005
+setuptools/_distutils/command/upload.py,sha256=BLO1w7eSAqsCjCLXtf_CRVSjwF1WmyOByGVGNdcQ8oY,7597
+setuptools/_distutils/config.py,sha256=dtHgblx9JhfyrKx1-J7Jlxw_f7s8ZbPFQii2UWMTZpY,4827
+setuptools/_distutils/core.py,sha256=jbdOkpOK09xi-56vhhwvn3fYdhLb5DJO8q3K1fnQz0Q,8876
+setuptools/_distutils/cygwinccompiler.py,sha256=9U4JAusUzlAGJl0Y5nToPkQ3ldzseAtiye434mwJ0ow,16380
+setuptools/_distutils/debug.py,sha256=N6MrTAqK6l9SVk6tWweR108PM8Ol7qNlfyV-nHcLhsY,139
+setuptools/_distutils/dep_util.py,sha256=GuR9Iw_jzZRkyemJ5HX8rB_wRGxkIBcBm1qh54r7zhk,3491
+setuptools/_distutils/dir_util.py,sha256=UwhBOUTcV65GTwce4SPuTXR8Z8q3LYEcmttqcGb0bYo,7778
+setuptools/_distutils/dist.py,sha256=Biuf6ca8uiFfMScRFsYUKtb5neMPtxKxRtXn50_1f3U,50421
+setuptools/_distutils/errors.py,sha256=Yr6tKZGdzBoNi53vBtiq0UJ__X05CmxSdQJqOWaw6SY,3577
+setuptools/_distutils/extension.py,sha256=bTb3Q0CoevGKYv5dX1ls--Ln8tlB0-UEOsi9BwzlZ-s,10515
+setuptools/_distutils/fancy_getopt.py,sha256=OPxp2CxHi1Yp_d1D8JxW4Ueq9fC71tegQFaafh58GGU,17784
+setuptools/_distutils/file_util.py,sha256=0hUqfItN_x2DVihR0MHdA4KCMVCOO8VoByaFp_a6MDg,8148
+setuptools/_distutils/filelist.py,sha256=8bRxhzp2FsaoHT7TuKD4Qjcuh_B9Ow_xTt_htZJvN2Q,12832
+setuptools/_distutils/log.py,sha256=hWBmdUC2K927QcVv3REMW3HMPclxccPQngxLSuUXQl0,1969
+setuptools/_distutils/msvc9compiler.py,sha256=uv0TAfoWrxEBOQL-Z2uws5g4AXoTPahUEMuq6FLkCYY,30453
+setuptools/_distutils/msvccompiler.py,sha256=ZYsnUgIC4tZT2WkJbTkTUyVSCAc2nFM9DVKIuIfPBU0,23540
+setuptools/_distutils/spawn.py,sha256=XBmUqzhxXfay_JE18RkaalHf9kgi7NvXeBPW9BfTqmw,4408
+setuptools/_distutils/sysconfig.py,sha256=5z55MU7gXeceL_G9FK6ex-2OvdeIXJRZJafrtthJcfU,21349
+setuptools/_distutils/text_file.py,sha256=PsuAJeWdKJoLSV_6N6IpB5-0Pa84KzLUucJMFRazw3I,12483
+setuptools/_distutils/unixccompiler.py,sha256=E65edChYLoHY8wi4OxFu_wKt3hJe3GySF6v51G_ZzL0,14696
+setuptools/_distutils/util.py,sha256=Z-FtpvCo1szNkssI-it-uWhA35996XHcttLZiUzc1_Y,20913
+setuptools/_distutils/version.py,sha256=8NogP6NPPQpp3EUMZcT9czEHia-ehqPo8spo_e7AgUU,12514
+setuptools/_distutils/versionpredicate.py,sha256=ZxpEA-TQv88mUWc6hetUO4qSqA2sa7ipjZ3QEK5evDk,5133
+setuptools/_imp.py,sha256=Qx0LJzEBaWk_6PfICamJtfBN2rh5K9sJq1wXvtZW-mc,2388
+setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+setuptools/_vendor/__pycache__/__init__.cpython-38.pyc,,
+setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc,,
+setuptools/_vendor/__pycache__/pyparsing.cpython-38.pyc,,
+setuptools/_vendor/__pycache__/six.cpython-38.pyc,,
+setuptools/_vendor/ordered_set.py,sha256=dbaCcs27dyN9gnMWGF5nA_BrVn6Q-NrjKYJpV9_fgBs,15130
+setuptools/_vendor/packaging/__about__.py,sha256=PNMsaZn4UcCHyubgROH1bl6CluduPjI5kFrSp_Zgklo,736
+setuptools/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562
+setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/_typing.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/markers.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/requirements.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc,,
+setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc,,
+setuptools/_vendor/packaging/_compat.py,sha256=MXdsGpSE_W-ZrHoC87andI4LV2FAwU7HLL-eHe_CjhU,1128
+setuptools/_vendor/packaging/_structures.py,sha256=ozkCX8Q8f2qE1Eic3YiQ4buDVfgz2iYevY9e7R2y3iY,2022
+setuptools/_vendor/packaging/_typing.py,sha256=x59EhQ57TMT-kTRyLZV25HZvYGGwbucTo6iKh_O0tMw,1812
+setuptools/_vendor/packaging/markers.py,sha256=BCCxZbt8xgysH8v5pqbLkdtQnRZHIGkJQqlNBGek4nQ,9509
+setuptools/_vendor/packaging/requirements.py,sha256=drh7At0bf55RVRCjRZWqcKNYC__UcbuWeXNYpdsd60o,4945
+setuptools/_vendor/packaging/specifiers.py,sha256=uYp9l13F0LcknS6d4N60ytiBgFmIhKideOq9AnsxTco,31944
+setuptools/_vendor/packaging/tags.py,sha256=NKMS37Zo_nWrZxgsD6zbXsXgc9edn9m160cBiLmHJdE,24067
+setuptools/_vendor/packaging/utils.py,sha256=RShlvnjO2CtYSD8uri32frMMFMTmB-3ihsq1-ghzLEw,1811
+setuptools/_vendor/packaging/version.py,sha256=Cnbm-OO9D_qd8ZTFxzFcjSavexSYFZmyeaoPvMsjgPc,15470
+setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055
+setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
+setuptools/archive_util.py,sha256=F1-XrQJTdXHRPRA09kxPWwm9Z2Ms1lE_IQZKG_JZ7rM,6638
+setuptools/build_meta.py,sha256=T0ZYFIokoOvhMipI2LXVko7NMTYsXxEWxzhOVDEiAxw,10544
+setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
+setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752
+setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
+setuptools/command/__init__.py,sha256=QCAuA9whnq8Bnoc0bBaS6Lw_KAUO0DiHYZQXEMNn5hg,568
+setuptools/command/__pycache__/__init__.cpython-38.pyc,,
+setuptools/command/__pycache__/alias.cpython-38.pyc,,
+setuptools/command/__pycache__/bdist_egg.cpython-38.pyc,,
+setuptools/command/__pycache__/bdist_rpm.cpython-38.pyc,,
+setuptools/command/__pycache__/bdist_wininst.cpython-38.pyc,,
+setuptools/command/__pycache__/build_clib.cpython-38.pyc,,
+setuptools/command/__pycache__/build_ext.cpython-38.pyc,,
+setuptools/command/__pycache__/build_py.cpython-38.pyc,,
+setuptools/command/__pycache__/develop.cpython-38.pyc,,
+setuptools/command/__pycache__/dist_info.cpython-38.pyc,,
+setuptools/command/__pycache__/easy_install.cpython-38.pyc,,
+setuptools/command/__pycache__/egg_info.cpython-38.pyc,,
+setuptools/command/__pycache__/install.cpython-38.pyc,,
+setuptools/command/__pycache__/install_egg_info.cpython-38.pyc,,
+setuptools/command/__pycache__/install_lib.cpython-38.pyc,,
+setuptools/command/__pycache__/install_scripts.cpython-38.pyc,,
+setuptools/command/__pycache__/py36compat.cpython-38.pyc,,
+setuptools/command/__pycache__/register.cpython-38.pyc,,
+setuptools/command/__pycache__/rotate.cpython-38.pyc,,
+setuptools/command/__pycache__/saveopts.cpython-38.pyc,,
+setuptools/command/__pycache__/sdist.cpython-38.pyc,,
+setuptools/command/__pycache__/setopt.cpython-38.pyc,,
+setuptools/command/__pycache__/test.cpython-38.pyc,,
+setuptools/command/__pycache__/upload.cpython-38.pyc,,
+setuptools/command/__pycache__/upload_docs.cpython-38.pyc,,
+setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426
+setuptools/command/bdist_egg.py,sha256=GVbfse0EOWUtH-kboRShnxq-2cDqa7VrB277T0-73eU,18543
+setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508
+setuptools/command/bdist_wininst.py,sha256=Tmqa9wW0F8i_72KHWpu9pDdnCN6Er_8uJUs2UmCAwTA,922
+setuptools/command/build_clib.py,sha256=fWHSFGkk10VCddBWCszvNhowbG9Z9CZXVjQ2uSInoOs,4415
+setuptools/command/build_ext.py,sha256=mgHI-hdO6tMjYns2nwp9-wLWEK_FMj4tl6CJGmuLnGo,13278
+setuptools/command/build_py.py,sha256=fho10QRGOaJcc3vttQ5vk5KYMV6HdZwj9HUIob6NHDM,9737
+setuptools/command/develop.py,sha256=wF2CiU9wjCF8ZcfFzn02j2ylez8r13z_fEco6vWx3DM,8118
+setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960
+setuptools/command/easy_install.py,sha256=T1d_3uQFLur6qNrNtEiiRVzleECvHBe9etr7o3Imquw,86924
+setuptools/command/egg_info.py,sha256=LKrhZuy-IoRJZ59orIB2-_Gj7NBj9MHm5uu16zZdE7U,25560
+setuptools/command/install.py,sha256=8doMxeQEDoK4Eco0mO2WlXXzzp9QnsGJQ7Z7yWkZPG8,4705
+setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203
+setuptools/command/install_lib.py,sha256=Uz42McsyHZAjrB6cw9E7Bz0xsaTbzxnM1PI9CBhiPtE,3875
+setuptools/command/install_scripts.py,sha256=x7sdEICuyFpaf5LuWXcTp49oYt8EeNbwKkW2Pv-TVXI,2519
+setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628
+setuptools/command/py36compat.py,sha256=TKqF6CPv-vsEFpOJUYmjBzmck-mCv_zHJMXO500PEAI,4994
+setuptools/command/register.py,sha256=kk3DxXCb5lXTvqnhfwx2g6q7iwbUmgTyXUCaBooBOUk,468
+setuptools/command/rotate.py,sha256=1KD9hHoDWpyvsbc2L7ULrQxUpJsG5zIMlPfx8yLowk4,2176
+setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658
+setuptools/command/sdist.py,sha256=14kBw_QOZ9L_RQDqgf9DAlEuoj0zC30X5mfDWeiyZwU,8092
+setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085
+setuptools/command/test.py,sha256=okVw2id6qYh8hFAVGziX6dEYekAbaYfMtEx7XhgsSbg,9623
+setuptools/command/upload.py,sha256=XT3YFVfYPAmA5qhGg0euluU98ftxRUW-PzKcODMLxUs,462
+setuptools/command/upload_docs.py,sha256=G2gHjeNPcUGe_pr3EEk_6AoVD0E6nCp52mZgU2nkCpU,7314
+setuptools/config.py,sha256=Ncxt5IQTVyM9qvX3PxB-Eb67-zoZLq5WbDuyu3I2gd0,21782
+setuptools/dep_util.py,sha256=BDx1BkzNQntvAB4alypHbW5UVBzjqths000PrUL4Zqc,949
+setuptools/depends.py,sha256=qt2RWllArRvhnm8lxsyRpcthEZYp4GHQgREl1q0LkFw,5517
+setuptools/dist.py,sha256=Of69bBpUzFWt9o_RTptPt-3MWVc3k_LId3b7hh8rBQs,39350
+setuptools/errors.py,sha256=MVOcv381HNSajDgEUWzOQ4J6B5BHCBMSjHfaWcEwA1o,524
+setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729
+setuptools/extern/__init__.py,sha256=BilMS9Hq18nBaUOzcCrzoI9HnIhju45iVJBscqTqlDI,2128
+setuptools/extern/__pycache__/__init__.cpython-38.pyc,,
+setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084
+setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
+setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264
+setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
+setuptools/installer.py,sha256=mJ6SdRmhWpZ1Cg3H_LWd1IoZoeC2t4BSkkXMuvhYeKw,5343
+setuptools/launch.py,sha256=TyPT-Ic1T2EnYvGO26gfNRP4ysBlrhpbRjQxWsiO414,812
+setuptools/lib2to3_ex.py,sha256=lrjhfs4QVtWp65PuATWjPBcXxwubg9d81e0qrv0qOpI,2384
+setuptools/monkey.py,sha256=V5jLWXWE5g58h6WWEih9cgk4fX9ywDQvrs-YlP4OuIQ,5263
+setuptools/msvc.py,sha256=8xIqn20nZ_poynw6sDvZuUECN_KlOjdTNfossrlSMcY,51225
+setuptools/namespaces.py,sha256=QuvIR8S5-u_S8_fLjPpn_utruUIsu2twdRu_KJPrKU0,3223
+setuptools/package_index.py,sha256=oKRvghWBzlqlQV4iRUERwbpBs_rXL5mwlzNZdKI2yXs,40777
+setuptools/py27compat.py,sha256=CWHkWWAYodu3QgiIAr8-34T-G6fiSgiVF0y7h11Ld7U,1504
+setuptools/py31compat.py,sha256=h2rtZghOfwoGYd8sQ0-auaKiF3TcL3qX0bX3VessqcE,838
+setuptools/py33compat.py,sha256=SMF9Z8wnGicTOkU1uRNwZ_kz5Z_bj29PUBbqdqeeNsc,1330
+setuptools/py34compat.py,sha256=KYOd6ybRxjBW8NJmYD8t_UyyVmysppFXqHpFLdslGXU,245
+setuptools/sandbox.py,sha256=eN1OS3BRfgRi-FHDN3kasvrbLT_k1YQjRNogSSZY-Gk,14478
+setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218
+setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138
+setuptools/ssl_support.py,sha256=TNNOq3VyV-4wkRwm0dmyIzF-iXBeWv4yIQ99eWa_bV8,8543
+setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996
+setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144
+setuptools/wheel.py,sha256=YLN2fczDVxkX3wjHlt_EMh-4MfHO6Ns6ldRpnkn-aa8,8371
+setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714
diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/WHEEL b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/WHEEL
similarity index 65%
rename from venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/WHEEL
rename to venv/Lib/site-packages/setuptools-49.6.0.dist-info/WHEEL
index 3b5c403..b552003 100644
--- a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/WHEEL
+++ b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/WHEEL
@@ -1,5 +1,5 @@
 Wheel-Version: 1.0
-Generator: bdist_wheel (0.33.6)
+Generator: bdist_wheel (0.34.2)
 Root-Is-Purelib: true
 Tag: py3-none-any
 
diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/dependency_links.txt b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/dependency_links.txt
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/dependency_links.txt
rename to venv/Lib/site-packages/setuptools-49.6.0.dist-info/dependency_links.txt
diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/entry_points.txt b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/entry_points.txt
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/entry_points.txt
rename to venv/Lib/site-packages/setuptools-49.6.0.dist-info/entry_points.txt
diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/top_level.txt b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/top_level.txt
similarity index 70%
rename from venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/top_level.txt
rename to venv/Lib/site-packages/setuptools-49.6.0.dist-info/top_level.txt
index 4577c6a..0ba4b25 100644
--- a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/top_level.txt
+++ b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/top_level.txt
@@ -1,3 +1,4 @@
+_distutils_hack
 easy_install
 pkg_resources
 setuptools
diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/zip-safe b/venv/Lib/site-packages/setuptools-49.6.0.dist-info/zip-safe
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/zip-safe
rename to venv/Lib/site-packages/setuptools-49.6.0.dist-info/zip-safe
diff --git a/venv/lib/python3.8/site-packages/setuptools/__init__.py b/venv/Lib/site-packages/setuptools/__init__.py
similarity index 91%
rename from venv/lib/python3.8/site-packages/setuptools/__init__.py
rename to venv/Lib/site-packages/setuptools/__init__.py
index 811f3fd..9909423 100644
--- a/venv/lib/python3.8/site-packages/setuptools/__init__.py
+++ b/venv/Lib/site-packages/setuptools/__init__.py
@@ -1,13 +1,15 @@
 """Extensions to the 'distutils' for large or complex distributions"""
 
-import os
+from fnmatch import fnmatchcase
 import functools
-import distutils.core
-import distutils.filelist
+import os
 import re
+
+import _distutils_hack.override  # noqa: F401
+
+import distutils.core
 from distutils.errors import DistutilsOptionError
 from distutils.util import convert_path
-from fnmatch import fnmatchcase
 
 from ._deprecation_warning import SetuptoolsDeprecationWarning
 
@@ -128,10 +130,27 @@ if PY3:
 def _install_setup_requires(attrs):
     # Note: do not use `setuptools.Distribution` directly, as
     # our PEP 517 backend patch `distutils.core.Distribution`.
-    dist = distutils.core.Distribution(dict(
-        (k, v) for k, v in attrs.items()
-        if k in ('dependency_links', 'setup_requires')
-    ))
+    class MinimalDistribution(distutils.core.Distribution):
+        """
+        A minimal version of a distribution for supporting the
+        fetch_build_eggs interface.
+        """
+        def __init__(self, attrs):
+            _incl = 'dependency_links', 'setup_requires'
+            filtered = {
+                k: attrs[k]
+                for k in set(_incl) & set(attrs)
+            }
+            distutils.core.Distribution.__init__(self, filtered)
+
+        def finalize_options(self):
+            """
+            Disable finalize_options to avoid building the working set.
+            Ref #2158.
+            """
+
+    dist = MinimalDistribution(attrs)
+
     # Honor setup.cfg's options.
     dist.parse_config_files(ignore_option_errors=True)
     if dist.setup_requires:
diff --git a/venv/lib/python3.8/site-packages/setuptools/_deprecation_warning.py b/venv/Lib/site-packages/setuptools/_deprecation_warning.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/_deprecation_warning.py
rename to venv/Lib/site-packages/setuptools/_deprecation_warning.py
diff --git a/venv/Lib/site-packages/setuptools/_distutils/__init__.py b/venv/Lib/site-packages/setuptools/_distutils/__init__.py
new file mode 100644
index 0000000..7dac55b
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/__init__.py
@@ -0,0 +1,15 @@
+"""distutils
+
+The main package for the Python Module Distribution Utilities.  Normally
+used from a setup script as
+
+   from distutils.core import setup
+
+   setup (...)
+"""
+
+import sys
+
+__version__ = sys.version[:sys.version.index(' ')]
+
+local = True
diff --git a/venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py b/venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py
new file mode 100644
index 0000000..2d56ee0
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py
@@ -0,0 +1,537 @@
+"""distutils._msvccompiler
+
+Contains MSVCCompiler, an implementation of the abstract CCompiler class
+for Microsoft Visual Studio 2015.
+
+The module is compatible with VS 2015 and later. You can find legacy support
+for older versions in distutils.msvc9compiler and distutils.msvccompiler.
+"""
+
+# Written by Perry Stoll
+# hacked by Robin Becker and Thomas Heller to do a better job of
+#   finding DevStudio (through the registry)
+# ported to VS 2005 and VS 2008 by Christian Heimes
+# ported to VS 2015 by Steve Dower
+
+import os
+import subprocess
+import contextlib
+with contextlib.suppress(ImportError):
+    import winreg
+
+from distutils.errors import DistutilsExecError, DistutilsPlatformError, \
+                             CompileError, LibError, LinkError
+from distutils.ccompiler import CCompiler, gen_lib_options
+from distutils import log
+from distutils.util import get_platform
+
+from itertools import count
+
+def _find_vc2015():
+    try:
+        key = winreg.OpenKeyEx(
+            winreg.HKEY_LOCAL_MACHINE,
+            r"Software\Microsoft\VisualStudio\SxS\VC7",
+            access=winreg.KEY_READ | winreg.KEY_WOW64_32KEY
+        )
+    except OSError:
+        log.debug("Visual C++ is not registered")
+        return None, None
+
+    best_version = 0
+    best_dir = None
+    with key:
+        for i in count():
+            try:
+                v, vc_dir, vt = winreg.EnumValue(key, i)
+            except OSError:
+                break
+            if v and vt == winreg.REG_SZ and os.path.isdir(vc_dir):
+                try:
+                    version = int(float(v))
+                except (ValueError, TypeError):
+                    continue
+                if version >= 14 and version > best_version:
+                    best_version, best_dir = version, vc_dir
+    return best_version, best_dir
+
+def _find_vc2017():
+    """Returns "15, path" based on the result of invoking vswhere.exe
+    If no install is found, returns "None, None"
+
+    The version is returned to avoid unnecessarily changing the function
+    result. It may be ignored when the path is not None.
+
+    If vswhere.exe is not available, by definition, VS 2017 is not
+    installed.
+    """
+    root = os.environ.get("ProgramFiles(x86)") or os.environ.get("ProgramFiles")
+    if not root:
+        return None, None
+
+    try:
+        path = subprocess.check_output([
+            os.path.join(root, "Microsoft Visual Studio", "Installer", "vswhere.exe"),
+            "-latest",
+            "-prerelease",
+            "-requires", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
+            "-property", "installationPath",
+            "-products", "*",
+        ], encoding="mbcs", errors="strict").strip()
+    except (subprocess.CalledProcessError, OSError, UnicodeDecodeError):
+        return None, None
+
+    path = os.path.join(path, "VC", "Auxiliary", "Build")
+    if os.path.isdir(path):
+        return 15, path
+
+    return None, None
+
+PLAT_SPEC_TO_RUNTIME = {
+    'x86' : 'x86',
+    'x86_amd64' : 'x64',
+    'x86_arm' : 'arm',
+    'x86_arm64' : 'arm64'
+}
+
+def _find_vcvarsall(plat_spec):
+    # bpo-38597: Removed vcruntime return value
+    _, best_dir = _find_vc2017()
+
+    if not best_dir:
+        best_version, best_dir = _find_vc2015()
+
+    if not best_dir:
+        log.debug("No suitable Visual C++ version found")
+        return None, None
+
+    vcvarsall = os.path.join(best_dir, "vcvarsall.bat")
+    if not os.path.isfile(vcvarsall):
+        log.debug("%s cannot be found", vcvarsall)
+        return None, None
+
+    return vcvarsall, None
+
+def _get_vc_env(plat_spec):
+    if os.getenv("DISTUTILS_USE_SDK"):
+        return {
+            key.lower(): value
+            for key, value in os.environ.items()
+        }
+
+    vcvarsall, _ = _find_vcvarsall(plat_spec)
+    if not vcvarsall:
+        raise DistutilsPlatformError("Unable to find vcvarsall.bat")
+
+    try:
+        out = subprocess.check_output(
+            'cmd /u /c "{}" {} && set'.format(vcvarsall, plat_spec),
+            stderr=subprocess.STDOUT,
+        ).decode('utf-16le', errors='replace')
+    except subprocess.CalledProcessError as exc:
+        log.error(exc.output)
+        raise DistutilsPlatformError("Error executing {}"
+                .format(exc.cmd))
+
+    env = {
+        key.lower(): value
+        for key, _, value in
+        (line.partition('=') for line in out.splitlines())
+        if key and value
+    }
+
+    return env
+
+def _find_exe(exe, paths=None):
+    """Return path to an MSVC executable program.
+
+    Tries to find the program in several places: first, one of the
+    MSVC program search paths from the registry; next, the directories
+    in the PATH environment variable.  If any of those work, return an
+    absolute path that is known to exist.  If none of them work, just
+    return the original program name, 'exe'.
+    """
+    if not paths:
+        paths = os.getenv('path').split(os.pathsep)
+    for p in paths:
+        fn = os.path.join(os.path.abspath(p), exe)
+        if os.path.isfile(fn):
+            return fn
+    return exe
+
+# A map keyed by get_platform() return values to values accepted by
+# 'vcvarsall.bat'. Always cross-compile from x86 to work with the
+# lighter-weight MSVC installs that do not include native 64-bit tools.
+PLAT_TO_VCVARS = {
+    'win32' : 'x86',
+    'win-amd64' : 'x86_amd64',
+    'win-arm32' : 'x86_arm',
+    'win-arm64' : 'x86_arm64'
+}
+
+class MSVCCompiler(CCompiler) :
+    """Concrete class that implements an interface to Microsoft Visual C++,
+       as defined by the CCompiler abstract class."""
+
+    compiler_type = 'msvc'
+
+    # Just set this so CCompiler's constructor doesn't barf.  We currently
+    # don't use the 'set_executables()' bureaucracy provided by CCompiler,
+    # as it really isn't necessary for this sort of single-compiler class.
+    # Would be nice to have a consistent interface with UnixCCompiler,
+    # though, so it's worth thinking about.
+    executables = {}
+
+    # Private class data (need to distinguish C from C++ source for compiler)
+    _c_extensions = ['.c']
+    _cpp_extensions = ['.cc', '.cpp', '.cxx']
+    _rc_extensions = ['.rc']
+    _mc_extensions = ['.mc']
+
+    # Needed for the filename generation methods provided by the
+    # base class, CCompiler.
+    src_extensions = (_c_extensions + _cpp_extensions +
+                      _rc_extensions + _mc_extensions)
+    res_extension = '.res'
+    obj_extension = '.obj'
+    static_lib_extension = '.lib'
+    shared_lib_extension = '.dll'
+    static_lib_format = shared_lib_format = '%s%s'
+    exe_extension = '.exe'
+
+
+    def __init__(self, verbose=0, dry_run=0, force=0):
+        CCompiler.__init__ (self, verbose, dry_run, force)
+        # target platform (.plat_name is consistent with 'bdist')
+        self.plat_name = None
+        self.initialized = False
+
+    def initialize(self, plat_name=None):
+        # multi-init means we would need to check platform same each time...
+        assert not self.initialized, "don't init multiple times"
+        if plat_name is None:
+            plat_name = get_platform()
+        # sanity check for platforms to prevent obscure errors later.
+        if plat_name not in PLAT_TO_VCVARS:
+            raise DistutilsPlatformError("--plat-name must be one of {}"
+                                         .format(tuple(PLAT_TO_VCVARS)))
+
+        # Get the vcvarsall.bat spec for the requested platform.
+        plat_spec = PLAT_TO_VCVARS[plat_name]
+
+        vc_env = _get_vc_env(plat_spec)
+        if not vc_env:
+            raise DistutilsPlatformError("Unable to find a compatible "
+                "Visual Studio installation.")
+
+        self._paths = vc_env.get('path', '')
+        paths = self._paths.split(os.pathsep)
+        self.cc = _find_exe("cl.exe", paths)
+        self.linker = _find_exe("link.exe", paths)
+        self.lib = _find_exe("lib.exe", paths)
+        self.rc = _find_exe("rc.exe", paths)   # resource compiler
+        self.mc = _find_exe("mc.exe", paths)   # message compiler
+        self.mt = _find_exe("mt.exe", paths)   # message compiler
+
+        for dir in vc_env.get('include', '').split(os.pathsep):
+            if dir:
+                self.add_include_dir(dir.rstrip(os.sep))
+
+        for dir in vc_env.get('lib', '').split(os.pathsep):
+            if dir:
+                self.add_library_dir(dir.rstrip(os.sep))
+
+        self.preprocess_options = None
+        # bpo-38597: Always compile with dynamic linking
+        # Future releases of Python 3.x will include all past
+        # versions of vcruntime*.dll for compatibility.
+        self.compile_options = [
+            '/nologo', '/Ox', '/W3', '/GL', '/DNDEBUG', '/MD'
+        ]
+
+        self.compile_options_debug = [
+            '/nologo', '/Od', '/MDd', '/Zi', '/W3', '/D_DEBUG'
+        ]
+
+        ldflags = [
+            '/nologo', '/INCREMENTAL:NO', '/LTCG'
+        ]
+
+        ldflags_debug = [
+            '/nologo', '/INCREMENTAL:NO', '/LTCG', '/DEBUG:FULL'
+        ]
+
+        self.ldflags_exe = [*ldflags, '/MANIFEST:EMBED,ID=1']
+        self.ldflags_exe_debug = [*ldflags_debug, '/MANIFEST:EMBED,ID=1']
+        self.ldflags_shared = [*ldflags, '/DLL', '/MANIFEST:EMBED,ID=2', '/MANIFESTUAC:NO']
+        self.ldflags_shared_debug = [*ldflags_debug, '/DLL', '/MANIFEST:EMBED,ID=2', '/MANIFESTUAC:NO']
+        self.ldflags_static = [*ldflags]
+        self.ldflags_static_debug = [*ldflags_debug]
+
+        self._ldflags = {
+            (CCompiler.EXECUTABLE, None): self.ldflags_exe,
+            (CCompiler.EXECUTABLE, False): self.ldflags_exe,
+            (CCompiler.EXECUTABLE, True): self.ldflags_exe_debug,
+            (CCompiler.SHARED_OBJECT, None): self.ldflags_shared,
+            (CCompiler.SHARED_OBJECT, False): self.ldflags_shared,
+            (CCompiler.SHARED_OBJECT, True): self.ldflags_shared_debug,
+            (CCompiler.SHARED_LIBRARY, None): self.ldflags_static,
+            (CCompiler.SHARED_LIBRARY, False): self.ldflags_static,
+            (CCompiler.SHARED_LIBRARY, True): self.ldflags_static_debug,
+        }
+
+        self.initialized = True
+
+    # -- Worker methods ------------------------------------------------
+
+    def object_filenames(self,
+                         source_filenames,
+                         strip_dir=0,
+                         output_dir=''):
+        ext_map = {
+            **{ext: self.obj_extension for ext in self.src_extensions},
+            **{ext: self.res_extension for ext in self._rc_extensions + self._mc_extensions},
+        }
+
+        output_dir = output_dir or ''
+
+        def make_out_path(p):
+            base, ext = os.path.splitext(p)
+            if strip_dir:
+                base = os.path.basename(base)
+            else:
+                _, base = os.path.splitdrive(base)
+                if base.startswith((os.path.sep, os.path.altsep)):
+                    base = base[1:]
+            try:
+                # XXX: This may produce absurdly long paths. We should check
+                # the length of the result and trim base until we fit within
+                # 260 characters.
+                return os.path.join(output_dir, base + ext_map[ext])
+            except LookupError:
+                # Better to raise an exception instead of silently continuing
+                # and later complain about sources and targets having
+                # different lengths
+                raise CompileError("Don't know how to compile {}".format(p))
+
+        return list(map(make_out_path, source_filenames))
+
+
+    def compile(self, sources,
+                output_dir=None, macros=None, include_dirs=None, debug=0,
+                extra_preargs=None, extra_postargs=None, depends=None):
+
+        if not self.initialized:
+            self.initialize()
+        compile_info = self._setup_compile(output_dir, macros, include_dirs,
+                                           sources, depends, extra_postargs)
+        macros, objects, extra_postargs, pp_opts, build = compile_info
+
+        compile_opts = extra_preargs or []
+        compile_opts.append('/c')
+        if debug:
+            compile_opts.extend(self.compile_options_debug)
+        else:
+            compile_opts.extend(self.compile_options)
+
+
+        add_cpp_opts = False
+
+        for obj in objects:
+            try:
+                src, ext = build[obj]
+            except KeyError:
+                continue
+            if debug:
+                # pass the full pathname to MSVC in debug mode,
+                # this allows the debugger to find the source file
+                # without asking the user to browse for it
+                src = os.path.abspath(src)
+
+            if ext in self._c_extensions:
+                input_opt = "/Tc" + src
+            elif ext in self._cpp_extensions:
+                input_opt = "/Tp" + src
+                add_cpp_opts = True
+            elif ext in self._rc_extensions:
+                # compile .RC to .RES file
+                input_opt = src
+                output_opt = "/fo" + obj
+                try:
+                    self.spawn([self.rc] + pp_opts + [output_opt, input_opt])
+                except DistutilsExecError as msg:
+                    raise CompileError(msg)
+                continue
+            elif ext in self._mc_extensions:
+                # Compile .MC to .RC file to .RES file.
+                #   * '-h dir' specifies the directory for the
+                #     generated include file
+                #   * '-r dir' specifies the target directory of the
+                #     generated RC file and the binary message resource
+                #     it includes
+                #
+                # For now (since there are no options to change this),
+                # we use the source-directory for the include file and
+                # the build directory for the RC file and message
+                # resources. This works at least for win32all.
+                h_dir = os.path.dirname(src)
+                rc_dir = os.path.dirname(obj)
+                try:
+                    # first compile .MC to .RC and .H file
+                    self.spawn([self.mc, '-h', h_dir, '-r', rc_dir, src])
+                    base, _ = os.path.splitext(os.path.basename (src))
+                    rc_file = os.path.join(rc_dir, base + '.rc')
+                    # then compile .RC to .RES file
+                    self.spawn([self.rc, "/fo" + obj, rc_file])
+
+                except DistutilsExecError as msg:
+                    raise CompileError(msg)
+                continue
+            else:
+                # how to handle this file?
+                raise CompileError("Don't know how to compile {} to {}"
+                                   .format(src, obj))
+
+            args = [self.cc] + compile_opts + pp_opts
+            if add_cpp_opts:
+                args.append('/EHsc')
+            args.append(input_opt)
+            args.append("/Fo" + obj)
+            args.extend(extra_postargs)
+
+            try:
+                self.spawn(args)
+            except DistutilsExecError as msg:
+                raise CompileError(msg)
+
+        return objects
+
+
+    def create_static_lib(self,
+                          objects,
+                          output_libname,
+                          output_dir=None,
+                          debug=0,
+                          target_lang=None):
+
+        if not self.initialized:
+            self.initialize()
+        objects, output_dir = self._fix_object_args(objects, output_dir)
+        output_filename = self.library_filename(output_libname,
+                                                output_dir=output_dir)
+
+        if self._need_link(objects, output_filename):
+            lib_args = objects + ['/OUT:' + output_filename]
+            if debug:
+                pass # XXX what goes here?
+            try:
+                log.debug('Executing "%s" %s', self.lib, ' '.join(lib_args))
+                self.spawn([self.lib] + lib_args)
+            except DistutilsExecError as msg:
+                raise LibError(msg)
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+
+    def link(self,
+             target_desc,
+             objects,
+             output_filename,
+             output_dir=None,
+             libraries=None,
+             library_dirs=None,
+             runtime_library_dirs=None,
+             export_symbols=None,
+             debug=0,
+             extra_preargs=None,
+             extra_postargs=None,
+             build_temp=None,
+             target_lang=None):
+
+        if not self.initialized:
+            self.initialize()
+        objects, output_dir = self._fix_object_args(objects, output_dir)
+        fixed_args = self._fix_lib_args(libraries, library_dirs,
+                                        runtime_library_dirs)
+        libraries, library_dirs, runtime_library_dirs = fixed_args
+
+        if runtime_library_dirs:
+            self.warn("I don't know what to do with 'runtime_library_dirs': "
+                       + str(runtime_library_dirs))
+
+        lib_opts = gen_lib_options(self,
+                                   library_dirs, runtime_library_dirs,
+                                   libraries)
+        if output_dir is not None:
+            output_filename = os.path.join(output_dir, output_filename)
+
+        if self._need_link(objects, output_filename):
+            ldflags = self._ldflags[target_desc, debug]
+
+            export_opts = ["/EXPORT:" + sym for sym in (export_symbols or [])]
+
+            ld_args = (ldflags + lib_opts + export_opts +
+                       objects + ['/OUT:' + output_filename])
+
+            # The MSVC linker generates .lib and .exp files, which cannot be
+            # suppressed by any linker switches. The .lib files may even be
+            # needed! Make sure they are generated in the temporary build
+            # directory. Since they have different names for debug and release
+            # builds, they can go into the same directory.
+            build_temp = os.path.dirname(objects[0])
+            if export_symbols is not None:
+                (dll_name, dll_ext) = os.path.splitext(
+                    os.path.basename(output_filename))
+                implib_file = os.path.join(
+                    build_temp,
+                    self.library_filename(dll_name))
+                ld_args.append ('/IMPLIB:' + implib_file)
+
+            if extra_preargs:
+                ld_args[:0] = extra_preargs
+            if extra_postargs:
+                ld_args.extend(extra_postargs)
+
+            output_dir = os.path.dirname(os.path.abspath(output_filename))
+            self.mkpath(output_dir)
+            try:
+                log.debug('Executing "%s" %s', self.linker, ' '.join(ld_args))
+                self.spawn([self.linker] + ld_args)
+            except DistutilsExecError as msg:
+                raise LinkError(msg)
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+    def spawn(self, cmd):
+        env = dict(os.environ, PATH=self._paths)
+        return super().spawn(cmd, env=env)
+
+    # -- Miscellaneous methods -----------------------------------------
+    # These are all used by the 'gen_lib_options() function, in
+    # ccompiler.py.
+
+    def library_dir_option(self, dir):
+        return "/LIBPATH:" + dir
+
+    def runtime_library_dir_option(self, dir):
+        raise DistutilsPlatformError(
+              "don't know how to set runtime library search path for MSVC")
+
+    def library_option(self, lib):
+        return self.library_filename(lib)
+
+    def find_library_file(self, dirs, lib, debug=0):
+        # Prefer a debugging library if found (and requested), but deal
+        # with it if we don't have one.
+        if debug:
+            try_names = [lib + "_d", lib]
+        else:
+            try_names = [lib]
+        for dir in dirs:
+            for name in try_names:
+                libfile = os.path.join(dir, self.library_filename(name))
+                if os.path.isfile(libfile):
+                    return libfile
+        else:
+            # Oops, didn't find it in *any* of 'dirs'
+            return None
diff --git a/venv/Lib/site-packages/setuptools/_distutils/archive_util.py b/venv/Lib/site-packages/setuptools/_distutils/archive_util.py
new file mode 100644
index 0000000..565a311
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/archive_util.py
@@ -0,0 +1,256 @@
+"""distutils.archive_util
+
+Utility functions for creating archive files (tarballs, zip files,
+that sort of thing)."""
+
+import os
+from warnings import warn
+import sys
+
+try:
+    import zipfile
+except ImportError:
+    zipfile = None
+
+
+from distutils.errors import DistutilsExecError
+from distutils.spawn import spawn
+from distutils.dir_util import mkpath
+from distutils import log
+
+try:
+    from pwd import getpwnam
+except ImportError:
+    getpwnam = None
+
+try:
+    from grp import getgrnam
+except ImportError:
+    getgrnam = None
+
+def _get_gid(name):
+    """Returns a gid, given a group name."""
+    if getgrnam is None or name is None:
+        return None
+    try:
+        result = getgrnam(name)
+    except KeyError:
+        result = None
+    if result is not None:
+        return result[2]
+    return None
+
+def _get_uid(name):
+    """Returns an uid, given a user name."""
+    if getpwnam is None or name is None:
+        return None
+    try:
+        result = getpwnam(name)
+    except KeyError:
+        result = None
+    if result is not None:
+        return result[2]
+    return None
+
+def make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0,
+                 owner=None, group=None):
+    """Create a (possibly compressed) tar file from all the files under
+    'base_dir'.
+
+    'compress' must be "gzip" (the default), "bzip2", "xz", "compress", or
+    None.  ("compress" will be deprecated in Python 3.2)
+
+    'owner' and 'group' can be used to define an owner and a group for the
+    archive that is being built. If not provided, the current owner and group
+    will be used.
+
+    The output tar file will be named 'base_dir' +  ".tar", possibly plus
+    the appropriate compression extension (".gz", ".bz2", ".xz" or ".Z").
+
+    Returns the output filename.
+    """
+    tar_compression = {'gzip': 'gz', 'bzip2': 'bz2', 'xz': 'xz', None: '',
+                       'compress': ''}
+    compress_ext = {'gzip': '.gz', 'bzip2': '.bz2', 'xz': '.xz',
+                    'compress': '.Z'}
+
+    # flags for compression program, each element of list will be an argument
+    if compress is not None and compress not in compress_ext.keys():
+        raise ValueError(
+              "bad value for 'compress': must be None, 'gzip', 'bzip2', "
+              "'xz' or 'compress'")
+
+    archive_name = base_name + '.tar'
+    if compress != 'compress':
+        archive_name += compress_ext.get(compress, '')
+
+    mkpath(os.path.dirname(archive_name), dry_run=dry_run)
+
+    # creating the tarball
+    import tarfile  # late import so Python build itself doesn't break
+
+    log.info('Creating tar archive')
+
+    uid = _get_uid(owner)
+    gid = _get_gid(group)
+
+    def _set_uid_gid(tarinfo):
+        if gid is not None:
+            tarinfo.gid = gid
+            tarinfo.gname = group
+        if uid is not None:
+            tarinfo.uid = uid
+            tarinfo.uname = owner
+        return tarinfo
+
+    if not dry_run:
+        tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress])
+        try:
+            tar.add(base_dir, filter=_set_uid_gid)
+        finally:
+            tar.close()
+
+    # compression using `compress`
+    if compress == 'compress':
+        warn("'compress' will be deprecated.", PendingDeprecationWarning)
+        # the option varies depending on the platform
+        compressed_name = archive_name + compress_ext[compress]
+        if sys.platform == 'win32':
+            cmd = [compress, archive_name, compressed_name]
+        else:
+            cmd = [compress, '-f', archive_name]
+        spawn(cmd, dry_run=dry_run)
+        return compressed_name
+
+    return archive_name
+
+def make_zipfile(base_name, base_dir, verbose=0, dry_run=0):
+    """Create a zip file from all the files under 'base_dir'.
+
+    The output zip file will be named 'base_name' + ".zip".  Uses either the
+    "zipfile" Python module (if available) or the InfoZIP "zip" utility
+    (if installed and found on the default search path).  If neither tool is
+    available, raises DistutilsExecError.  Returns the name of the output zip
+    file.
+    """
+    zip_filename = base_name + ".zip"
+    mkpath(os.path.dirname(zip_filename), dry_run=dry_run)
+
+    # If zipfile module is not available, try spawning an external
+    # 'zip' command.
+    if zipfile is None:
+        if verbose:
+            zipoptions = "-r"
+        else:
+            zipoptions = "-rq"
+
+        try:
+            spawn(["zip", zipoptions, zip_filename, base_dir],
+                  dry_run=dry_run)
+        except DistutilsExecError:
+            # XXX really should distinguish between "couldn't find
+            # external 'zip' command" and "zip failed".
+            raise DistutilsExecError(("unable to create zip file '%s': "
+                   "could neither import the 'zipfile' module nor "
+                   "find a standalone zip utility") % zip_filename)
+
+    else:
+        log.info("creating '%s' and adding '%s' to it",
+                 zip_filename, base_dir)
+
+        if not dry_run:
+            try:
+                zip = zipfile.ZipFile(zip_filename, "w",
+                                      compression=zipfile.ZIP_DEFLATED)
+            except RuntimeError:
+                zip = zipfile.ZipFile(zip_filename, "w",
+                                      compression=zipfile.ZIP_STORED)
+
+            with zip:
+                if base_dir != os.curdir:
+                    path = os.path.normpath(os.path.join(base_dir, ''))
+                    zip.write(path, path)
+                    log.info("adding '%s'", path)
+                for dirpath, dirnames, filenames in os.walk(base_dir):
+                    for name in dirnames:
+                        path = os.path.normpath(os.path.join(dirpath, name, ''))
+                        zip.write(path, path)
+                        log.info("adding '%s'", path)
+                    for name in filenames:
+                        path = os.path.normpath(os.path.join(dirpath, name))
+                        if os.path.isfile(path):
+                            zip.write(path, path)
+                            log.info("adding '%s'", path)
+
+    return zip_filename
+
+ARCHIVE_FORMATS = {
+    'gztar': (make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"),
+    'bztar': (make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"),
+    'xztar': (make_tarball, [('compress', 'xz')], "xz'ed tar-file"),
+    'ztar':  (make_tarball, [('compress', 'compress')], "compressed tar file"),
+    'tar':   (make_tarball, [('compress', None)], "uncompressed tar file"),
+    'zip':   (make_zipfile, [],"ZIP file")
+    }
+
+def check_archive_formats(formats):
+    """Returns the first format from the 'format' list that is unknown.
+
+    If all formats are known, returns None
+    """
+    for format in formats:
+        if format not in ARCHIVE_FORMATS:
+            return format
+    return None
+
+def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,
+                 dry_run=0, owner=None, group=None):
+    """Create an archive file (eg. zip or tar).
+
+    'base_name' is the name of the file to create, minus any format-specific
+    extension; 'format' is the archive format: one of "zip", "tar", "gztar",
+    "bztar", "xztar", or "ztar".
+
+    'root_dir' is a directory that will be the root directory of the
+    archive; ie. we typically chdir into 'root_dir' before creating the
+    archive.  'base_dir' is the directory where we start archiving from;
+    ie. 'base_dir' will be the common prefix of all files and
+    directories in the archive.  'root_dir' and 'base_dir' both default
+    to the current directory.  Returns the name of the archive file.
+
+    'owner' and 'group' are used when creating a tar archive. By default,
+    uses the current owner and group.
+    """
+    save_cwd = os.getcwd()
+    if root_dir is not None:
+        log.debug("changing into '%s'", root_dir)
+        base_name = os.path.abspath(base_name)
+        if not dry_run:
+            os.chdir(root_dir)
+
+    if base_dir is None:
+        base_dir = os.curdir
+
+    kwargs = {'dry_run': dry_run}
+
+    try:
+        format_info = ARCHIVE_FORMATS[format]
+    except KeyError:
+        raise ValueError("unknown archive format '%s'" % format)
+
+    func = format_info[0]
+    for arg, val in format_info[1]:
+        kwargs[arg] = val
+
+    if format != 'zip':
+        kwargs['owner'] = owner
+        kwargs['group'] = group
+
+    try:
+        filename = func(base_name, base_dir, **kwargs)
+    finally:
+        if root_dir is not None:
+            log.debug("changing back to '%s'", save_cwd)
+            os.chdir(save_cwd)
+
+    return filename
diff --git a/venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py b/venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py
new file mode 100644
index 0000000..071fea5
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py
@@ -0,0 +1,393 @@
+"""distutils.bcppcompiler
+
+Contains BorlandCCompiler, an implementation of the abstract CCompiler class
+for the Borland C++ compiler.
+"""
+
+# This implementation by Lyle Johnson, based on the original msvccompiler.py
+# module and using the directions originally published by Gordon Williams.
+
+# XXX looks like there's a LOT of overlap between these two classes:
+# someone should sit down and factor out the common code as
+# WindowsCCompiler!  --GPW
+
+
+import os
+from distutils.errors import \
+     DistutilsExecError, \
+     CompileError, LibError, LinkError, UnknownFileError
+from distutils.ccompiler import \
+     CCompiler, gen_preprocess_options
+from distutils.file_util import write_file
+from distutils.dep_util import newer
+from distutils import log
+
+class BCPPCompiler(CCompiler) :
+    """Concrete class that implements an interface to the Borland C/C++
+    compiler, as defined by the CCompiler abstract class.
+    """
+
+    compiler_type = 'bcpp'
+
+    # Just set this so CCompiler's constructor doesn't barf.  We currently
+    # don't use the 'set_executables()' bureaucracy provided by CCompiler,
+    # as it really isn't necessary for this sort of single-compiler class.
+    # Would be nice to have a consistent interface with UnixCCompiler,
+    # though, so it's worth thinking about.
+    executables = {}
+
+    # Private class data (need to distinguish C from C++ source for compiler)
+    _c_extensions = ['.c']
+    _cpp_extensions = ['.cc', '.cpp', '.cxx']
+
+    # Needed for the filename generation methods provided by the
+    # base class, CCompiler.
+    src_extensions = _c_extensions + _cpp_extensions
+    obj_extension = '.obj'
+    static_lib_extension = '.lib'
+    shared_lib_extension = '.dll'
+    static_lib_format = shared_lib_format = '%s%s'
+    exe_extension = '.exe'
+
+
+    def __init__ (self,
+                  verbose=0,
+                  dry_run=0,
+                  force=0):
+
+        CCompiler.__init__ (self, verbose, dry_run, force)
+
+        # These executables are assumed to all be in the path.
+        # Borland doesn't seem to use any special registry settings to
+        # indicate their installation locations.
+
+        self.cc = "bcc32.exe"
+        self.linker = "ilink32.exe"
+        self.lib = "tlib.exe"
+
+        self.preprocess_options = None
+        self.compile_options = ['/tWM', '/O2', '/q', '/g0']
+        self.compile_options_debug = ['/tWM', '/Od', '/q', '/g0']
+
+        self.ldflags_shared = ['/Tpd', '/Gn', '/q', '/x']
+        self.ldflags_shared_debug = ['/Tpd', '/Gn', '/q', '/x']
+        self.ldflags_static = []
+        self.ldflags_exe = ['/Gn', '/q', '/x']
+        self.ldflags_exe_debug = ['/Gn', '/q', '/x','/r']
+
+
+    # -- Worker methods ------------------------------------------------
+
+    def compile(self, sources,
+                output_dir=None, macros=None, include_dirs=None, debug=0,
+                extra_preargs=None, extra_postargs=None, depends=None):
+
+        macros, objects, extra_postargs, pp_opts, build = \
+                self._setup_compile(output_dir, macros, include_dirs, sources,
+                                    depends, extra_postargs)
+        compile_opts = extra_preargs or []
+        compile_opts.append ('-c')
+        if debug:
+            compile_opts.extend (self.compile_options_debug)
+        else:
+            compile_opts.extend (self.compile_options)
+
+        for obj in objects:
+            try:
+                src, ext = build[obj]
+            except KeyError:
+                continue
+            # XXX why do the normpath here?
+            src = os.path.normpath(src)
+            obj = os.path.normpath(obj)
+            # XXX _setup_compile() did a mkpath() too but before the normpath.
+            # Is it possible to skip the normpath?
+            self.mkpath(os.path.dirname(obj))
+
+            if ext == '.res':
+                # This is already a binary file -- skip it.
+                continue # the 'for' loop
+            if ext == '.rc':
+                # This needs to be compiled to a .res file -- do it now.
+                try:
+                    self.spawn (["brcc32", "-fo", obj, src])
+                except DistutilsExecError as msg:
+                    raise CompileError(msg)
+                continue # the 'for' loop
+
+            # The next two are both for the real compiler.
+            if ext in self._c_extensions:
+                input_opt = ""
+            elif ext in self._cpp_extensions:
+                input_opt = "-P"
+            else:
+                # Unknown file type -- no extra options.  The compiler
+                # will probably fail, but let it just in case this is a
+                # file the compiler recognizes even if we don't.
+                input_opt = ""
+
+            output_opt = "-o" + obj
+
+            # Compiler command line syntax is: "bcc32 [options] file(s)".
+            # Note that the source file names must appear at the end of
+            # the command line.
+            try:
+                self.spawn ([self.cc] + compile_opts + pp_opts +
+                            [input_opt, output_opt] +
+                            extra_postargs + [src])
+            except DistutilsExecError as msg:
+                raise CompileError(msg)
+
+        return objects
+
+    # compile ()
+
+
+    def create_static_lib (self,
+                           objects,
+                           output_libname,
+                           output_dir=None,
+                           debug=0,
+                           target_lang=None):
+
+        (objects, output_dir) = self._fix_object_args (objects, output_dir)
+        output_filename = \
+            self.library_filename (output_libname, output_dir=output_dir)
+
+        if self._need_link (objects, output_filename):
+            lib_args = [output_filename, '/u'] + objects
+            if debug:
+                pass                    # XXX what goes here?
+            try:
+                self.spawn ([self.lib] + lib_args)
+            except DistutilsExecError as msg:
+                raise LibError(msg)
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+    # create_static_lib ()
+
+
+    def link (self,
+              target_desc,
+              objects,
+              output_filename,
+              output_dir=None,
+              libraries=None,
+              library_dirs=None,
+              runtime_library_dirs=None,
+              export_symbols=None,
+              debug=0,
+              extra_preargs=None,
+              extra_postargs=None,
+              build_temp=None,
+              target_lang=None):
+
+        # XXX this ignores 'build_temp'!  should follow the lead of
+        # msvccompiler.py
+
+        (objects, output_dir) = self._fix_object_args (objects, output_dir)
+        (libraries, library_dirs, runtime_library_dirs) = \
+            self._fix_lib_args (libraries, library_dirs, runtime_library_dirs)
+
+        if runtime_library_dirs:
+            log.warn("I don't know what to do with 'runtime_library_dirs': %s",
+                     str(runtime_library_dirs))
+
+        if output_dir is not None:
+            output_filename = os.path.join (output_dir, output_filename)
+
+        if self._need_link (objects, output_filename):
+
+            # Figure out linker args based on type of target.
+            if target_desc == CCompiler.EXECUTABLE:
+                startup_obj = 'c0w32'
+                if debug:
+                    ld_args = self.ldflags_exe_debug[:]
+                else:
+                    ld_args = self.ldflags_exe[:]
+            else:
+                startup_obj = 'c0d32'
+                if debug:
+                    ld_args = self.ldflags_shared_debug[:]
+                else:
+                    ld_args = self.ldflags_shared[:]
+
+
+            # Create a temporary exports file for use by the linker
+            if export_symbols is None:
+                def_file = ''
+            else:
+                head, tail = os.path.split (output_filename)
+                modname, ext = os.path.splitext (tail)
+                temp_dir = os.path.dirname(objects[0]) # preserve tree structure
+                def_file = os.path.join (temp_dir, '%s.def' % modname)
+                contents = ['EXPORTS']
+                for sym in (export_symbols or []):
+                    contents.append('  %s=_%s' % (sym, sym))
+                self.execute(write_file, (def_file, contents),
+                             "writing %s" % def_file)
+
+            # Borland C++ has problems with '/' in paths
+            objects2 = map(os.path.normpath, objects)
+            # split objects in .obj and .res files
+            # Borland C++ needs them at different positions in the command line
+            objects = [startup_obj]
+            resources = []
+            for file in objects2:
+                (base, ext) = os.path.splitext(os.path.normcase(file))
+                if ext == '.res':
+                    resources.append(file)
+                else:
+                    objects.append(file)
+
+
+            for l in library_dirs:
+                ld_args.append("/L%s" % os.path.normpath(l))
+            ld_args.append("/L.") # we sometimes use relative paths
+
+            # list of object files
+            ld_args.extend(objects)
+
+            # XXX the command-line syntax for Borland C++ is a bit wonky;
+            # certain filenames are jammed together in one big string, but
+            # comma-delimited.  This doesn't mesh too well with the
+            # Unix-centric attitude (with a DOS/Windows quoting hack) of
+            # 'spawn()', so constructing the argument list is a bit
+            # awkward.  Note that doing the obvious thing and jamming all
+            # the filenames and commas into one argument would be wrong,
+            # because 'spawn()' would quote any filenames with spaces in
+            # them.  Arghghh!.  Apparently it works fine as coded...
+
+            # name of dll/exe file
+            ld_args.extend([',',output_filename])
+            # no map file and start libraries
+            ld_args.append(',,')
+
+            for lib in libraries:
+                # see if we find it and if there is a bcpp specific lib
+                # (xxx_bcpp.lib)
+                libfile = self.find_library_file(library_dirs, lib, debug)
+                if libfile is None:
+                    ld_args.append(lib)
+                    # probably a BCPP internal library -- don't warn
+                else:
+                    # full name which prefers bcpp_xxx.lib over xxx.lib
+                    ld_args.append(libfile)
+
+            # some default libraries
+            ld_args.append ('import32')
+            ld_args.append ('cw32mt')
+
+            # def file for export symbols
+            ld_args.extend([',',def_file])
+            # add resource files
+            ld_args.append(',')
+            ld_args.extend(resources)
+
+
+            if extra_preargs:
+                ld_args[:0] = extra_preargs
+            if extra_postargs:
+                ld_args.extend(extra_postargs)
+
+            self.mkpath (os.path.dirname (output_filename))
+            try:
+                self.spawn ([self.linker] + ld_args)
+            except DistutilsExecError as msg:
+                raise LinkError(msg)
+
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+    # link ()
+
+    # -- Miscellaneous methods -----------------------------------------
+
+
+    def find_library_file (self, dirs, lib, debug=0):
+        # List of effective library names to try, in order of preference:
+        # xxx_bcpp.lib is better than xxx.lib
+        # and xxx_d.lib is better than xxx.lib if debug is set
+        #
+        # The "_bcpp" suffix is to handle a Python installation for people
+        # with multiple compilers (primarily Distutils hackers, I suspect
+        # ;-).  The idea is they'd have one static library for each
+        # compiler they care about, since (almost?) every Windows compiler
+        # seems to have a different format for static libraries.
+        if debug:
+            dlib = (lib + "_d")
+            try_names = (dlib + "_bcpp", lib + "_bcpp", dlib, lib)
+        else:
+            try_names = (lib + "_bcpp", lib)
+
+        for dir in dirs:
+            for name in try_names:
+                libfile = os.path.join(dir, self.library_filename(name))
+                if os.path.exists(libfile):
+                    return libfile
+        else:
+            # Oops, didn't find it in *any* of 'dirs'
+            return None
+
+    # overwrite the one from CCompiler to support rc and res-files
+    def object_filenames (self,
+                          source_filenames,
+                          strip_dir=0,
+                          output_dir=''):
+        if output_dir is None: output_dir = ''
+        obj_names = []
+        for src_name in source_filenames:
+            # use normcase to make sure '.rc' is really '.rc' and not '.RC'
+            (base, ext) = os.path.splitext (os.path.normcase(src_name))
+            if ext not in (self.src_extensions + ['.rc','.res']):
+                raise UnknownFileError("unknown file type '%s' (from '%s')" % \
+                      (ext, src_name))
+            if strip_dir:
+                base = os.path.basename (base)
+            if ext == '.res':
+                # these can go unchanged
+                obj_names.append (os.path.join (output_dir, base + ext))
+            elif ext == '.rc':
+                # these need to be compiled to .res-files
+                obj_names.append (os.path.join (output_dir, base + '.res'))
+            else:
+                obj_names.append (os.path.join (output_dir,
+                                            base + self.obj_extension))
+        return obj_names
+
+    # object_filenames ()
+
+    def preprocess (self,
+                    source,
+                    output_file=None,
+                    macros=None,
+                    include_dirs=None,
+                    extra_preargs=None,
+                    extra_postargs=None):
+
+        (_, macros, include_dirs) = \
+            self._fix_compile_args(None, macros, include_dirs)
+        pp_opts = gen_preprocess_options(macros, include_dirs)
+        pp_args = ['cpp32.exe'] + pp_opts
+        if output_file is not None:
+            pp_args.append('-o' + output_file)
+        if extra_preargs:
+            pp_args[:0] = extra_preargs
+        if extra_postargs:
+            pp_args.extend(extra_postargs)
+        pp_args.append(source)
+
+        # We need to preprocess: either we're being forced to, or the
+        # source file is newer than the target (or the target doesn't
+        # exist).
+        if self.force or output_file is None or newer(source, output_file):
+            if output_file:
+                self.mkpath(os.path.dirname(output_file))
+            try:
+                self.spawn(pp_args)
+            except DistutilsExecError as msg:
+                print(msg)
+                raise CompileError(msg)
+
+    # preprocess()
diff --git a/venv/Lib/site-packages/setuptools/_distutils/ccompiler.py b/venv/Lib/site-packages/setuptools/_distutils/ccompiler.py
new file mode 100644
index 0000000..57bb94e
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/ccompiler.py
@@ -0,0 +1,1116 @@
+"""distutils.ccompiler
+
+Contains CCompiler, an abstract base class that defines the interface
+for the Distutils compiler abstraction model."""
+
+import sys, os, re
+from distutils.errors import *
+from distutils.spawn import spawn
+from distutils.file_util import move_file
+from distutils.dir_util import mkpath
+from distutils.dep_util import newer_group
+from distutils.util import split_quoted, execute
+from distutils import log
+
+class CCompiler:
+    """Abstract base class to define the interface that must be implemented
+    by real compiler classes.  Also has some utility methods used by
+    several compiler classes.
+
+    The basic idea behind a compiler abstraction class is that each
+    instance can be used for all the compile/link steps in building a
+    single project.  Thus, attributes common to all of those compile and
+    link steps -- include directories, macros to define, libraries to link
+    against, etc. -- are attributes of the compiler instance.  To allow for
+    variability in how individual files are treated, most of those
+    attributes may be varied on a per-compilation or per-link basis.
+    """
+
+    # 'compiler_type' is a class attribute that identifies this class.  It
+    # keeps code that wants to know what kind of compiler it's dealing with
+    # from having to import all possible compiler classes just to do an
+    # 'isinstance'.  In concrete CCompiler subclasses, 'compiler_type'
+    # should really, really be one of the keys of the 'compiler_class'
+    # dictionary (see below -- used by the 'new_compiler()' factory
+    # function) -- authors of new compiler interface classes are
+    # responsible for updating 'compiler_class'!
+    compiler_type = None
+
+    # XXX things not handled by this compiler abstraction model:
+    #   * client can't provide additional options for a compiler,
+    #     e.g. warning, optimization, debugging flags.  Perhaps this
+    #     should be the domain of concrete compiler abstraction classes
+    #     (UnixCCompiler, MSVCCompiler, etc.) -- or perhaps the base
+    #     class should have methods for the common ones.
+    #   * can't completely override the include or library searchg
+    #     path, ie. no "cc -I -Idir1 -Idir2" or "cc -L -Ldir1 -Ldir2".
+    #     I'm not sure how widely supported this is even by Unix
+    #     compilers, much less on other platforms.  And I'm even less
+    #     sure how useful it is; maybe for cross-compiling, but
+    #     support for that is a ways off.  (And anyways, cross
+    #     compilers probably have a dedicated binary with the
+    #     right paths compiled in.  I hope.)
+    #   * can't do really freaky things with the library list/library
+    #     dirs, e.g. "-Ldir1 -lfoo -Ldir2 -lfoo" to link against
+    #     different versions of libfoo.a in different locations.  I
+    #     think this is useless without the ability to null out the
+    #     library search path anyways.
+
+
+    # Subclasses that rely on the standard filename generation methods
+    # implemented below should override these; see the comment near
+    # those methods ('object_filenames()' et. al.) for details:
+    src_extensions = None               # list of strings
+    obj_extension = None                # string
+    static_lib_extension = None
+    shared_lib_extension = None         # string
+    static_lib_format = None            # format string
+    shared_lib_format = None            # prob. same as static_lib_format
+    exe_extension = None                # string
+
+    # Default language settings. language_map is used to detect a source
+    # file or Extension target language, checking source filenames.
+    # language_order is used to detect the language precedence, when deciding
+    # what language to use when mixing source types. For example, if some
+    # extension has two files with ".c" extension, and one with ".cpp", it
+    # is still linked as c++.
+    language_map = {".c"   : "c",
+                    ".cc"  : "c++",
+                    ".cpp" : "c++",
+                    ".cxx" : "c++",
+                    ".m"   : "objc",
+                   }
+    language_order = ["c++", "objc", "c"]
+
+    def __init__(self, verbose=0, dry_run=0, force=0):
+        self.dry_run = dry_run
+        self.force = force
+        self.verbose = verbose
+
+        # 'output_dir': a common output directory for object, library,
+        # shared object, and shared library files
+        self.output_dir = None
+
+        # 'macros': a list of macro definitions (or undefinitions).  A
+        # macro definition is a 2-tuple (name, value), where the value is
+        # either a string or None (no explicit value).  A macro
+        # undefinition is a 1-tuple (name,).
+        self.macros = []
+
+        # 'include_dirs': a list of directories to search for include files
+        self.include_dirs = []
+
+        # 'libraries': a list of libraries to include in any link
+        # (library names, not filenames: eg. "foo" not "libfoo.a")
+        self.libraries = []
+
+        # 'library_dirs': a list of directories to search for libraries
+        self.library_dirs = []
+
+        # 'runtime_library_dirs': a list of directories to search for
+        # shared libraries/objects at runtime
+        self.runtime_library_dirs = []
+
+        # 'objects': a list of object files (or similar, such as explicitly
+        # named library files) to include on any link
+        self.objects = []
+
+        for key in self.executables.keys():
+            self.set_executable(key, self.executables[key])
+
+    def set_executables(self, **kwargs):
+        """Define the executables (and options for them) that will be run
+        to perform the various stages of compilation.  The exact set of
+        executables that may be specified here depends on the compiler
+        class (via the 'executables' class attribute), but most will have:
+          compiler      the C/C++ compiler
+          linker_so     linker used to create shared objects and libraries
+          linker_exe    linker used to create binary executables
+          archiver      static library creator
+
+        On platforms with a command-line (Unix, DOS/Windows), each of these
+        is a string that will be split into executable name and (optional)
+        list of arguments.  (Splitting the string is done similarly to how
+        Unix shells operate: words are delimited by spaces, but quotes and
+        backslashes can override this.  See
+        'distutils.util.split_quoted()'.)
+        """
+
+        # Note that some CCompiler implementation classes will define class
+        # attributes 'cpp', 'cc', etc. with hard-coded executable names;
+        # this is appropriate when a compiler class is for exactly one
+        # compiler/OS combination (eg. MSVCCompiler).  Other compiler
+        # classes (UnixCCompiler, in particular) are driven by information
+        # discovered at run-time, since there are many different ways to do
+        # basically the same things with Unix C compilers.
+
+        for key in kwargs:
+            if key not in self.executables:
+                raise ValueError("unknown executable '%s' for class %s" %
+                      (key, self.__class__.__name__))
+            self.set_executable(key, kwargs[key])
+
+    def set_executable(self, key, value):
+        if isinstance(value, str):
+            setattr(self, key, split_quoted(value))
+        else:
+            setattr(self, key, value)
+
+    def _find_macro(self, name):
+        i = 0
+        for defn in self.macros:
+            if defn[0] == name:
+                return i
+            i += 1
+        return None
+
+    def _check_macro_definitions(self, definitions):
+        """Ensures that every element of 'definitions' is a valid macro
+        definition, ie. either (name,value) 2-tuple or a (name,) tuple.  Do
+        nothing if all definitions are OK, raise TypeError otherwise.
+        """
+        for defn in definitions:
+            if not (isinstance(defn, tuple) and
+                    (len(defn) in (1, 2) and
+                      (isinstance (defn[1], str) or defn[1] is None)) and
+                    isinstance (defn[0], str)):
+                raise TypeError(("invalid macro definition '%s': " % defn) + \
+                      "must be tuple (string,), (string, string), or " + \
+                      "(string, None)")
+
+
+    # -- Bookkeeping methods -------------------------------------------
+
+    def define_macro(self, name, value=None):
+        """Define a preprocessor macro for all compilations driven by this
+        compiler object.  The optional parameter 'value' should be a
+        string; if it is not supplied, then the macro will be defined
+        without an explicit value and the exact outcome depends on the
+        compiler used (XXX true? does ANSI say anything about this?)
+        """
+        # Delete from the list of macro definitions/undefinitions if
+        # already there (so that this one will take precedence).
+        i = self._find_macro (name)
+        if i is not None:
+            del self.macros[i]
+
+        self.macros.append((name, value))
+
+    def undefine_macro(self, name):
+        """Undefine a preprocessor macro for all compilations driven by
+        this compiler object.  If the same macro is defined by
+        'define_macro()' and undefined by 'undefine_macro()' the last call
+        takes precedence (including multiple redefinitions or
+        undefinitions).  If the macro is redefined/undefined on a
+        per-compilation basis (ie. in the call to 'compile()'), then that
+        takes precedence.
+        """
+        # Delete from the list of macro definitions/undefinitions if
+        # already there (so that this one will take precedence).
+        i = self._find_macro (name)
+        if i is not None:
+            del self.macros[i]
+
+        undefn = (name,)
+        self.macros.append(undefn)
+
+    def add_include_dir(self, dir):
+        """Add 'dir' to the list of directories that will be searched for
+        header files.  The compiler is instructed to search directories in
+        the order in which they are supplied by successive calls to
+        'add_include_dir()'.
+        """
+        self.include_dirs.append(dir)
+
+    def set_include_dirs(self, dirs):
+        """Set the list of directories that will be searched to 'dirs' (a
+        list of strings).  Overrides any preceding calls to
+        'add_include_dir()'; subsequence calls to 'add_include_dir()' add
+        to the list passed to 'set_include_dirs()'.  This does not affect
+        any list of standard include directories that the compiler may
+        search by default.
+        """
+        self.include_dirs = dirs[:]
+
+    def add_library(self, libname):
+        """Add 'libname' to the list of libraries that will be included in
+        all links driven by this compiler object.  Note that 'libname'
+        should *not* be the name of a file containing a library, but the
+        name of the library itself: the actual filename will be inferred by
+        the linker, the compiler, or the compiler class (depending on the
+        platform).
+
+        The linker will be instructed to link against libraries in the
+        order they were supplied to 'add_library()' and/or
+        'set_libraries()'.  It is perfectly valid to duplicate library
+        names; the linker will be instructed to link against libraries as
+        many times as they are mentioned.
+        """
+        self.libraries.append(libname)
+
+    def set_libraries(self, libnames):
+        """Set the list of libraries to be included in all links driven by
+        this compiler object to 'libnames' (a list of strings).  This does
+        not affect any standard system libraries that the linker may
+        include by default.
+        """
+        self.libraries = libnames[:]
+
+    def add_library_dir(self, dir):
+        """Add 'dir' to the list of directories that will be searched for
+        libraries specified to 'add_library()' and 'set_libraries()'.  The
+        linker will be instructed to search for libraries in the order they
+        are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
+        """
+        self.library_dirs.append(dir)
+
+    def set_library_dirs(self, dirs):
+        """Set the list of library search directories to 'dirs' (a list of
+        strings).  This does not affect any standard library search path
+        that the linker may search by default.
+        """
+        self.library_dirs = dirs[:]
+
+    def add_runtime_library_dir(self, dir):
+        """Add 'dir' to the list of directories that will be searched for
+        shared libraries at runtime.
+        """
+        self.runtime_library_dirs.append(dir)
+
+    def set_runtime_library_dirs(self, dirs):
+        """Set the list of directories to search for shared libraries at
+        runtime to 'dirs' (a list of strings).  This does not affect any
+        standard search path that the runtime linker may search by
+        default.
+        """
+        self.runtime_library_dirs = dirs[:]
+
+    def add_link_object(self, object):
+        """Add 'object' to the list of object files (or analogues, such as
+        explicitly named library files or the output of "resource
+        compilers") to be included in every link driven by this compiler
+        object.
+        """
+        self.objects.append(object)
+
+    def set_link_objects(self, objects):
+        """Set the list of object files (or analogues) to be included in
+        every link to 'objects'.  This does not affect any standard object
+        files that the linker may include by default (such as system
+        libraries).
+        """
+        self.objects = objects[:]
+
+
+    # -- Private utility methods --------------------------------------
+    # (here for the convenience of subclasses)
+
+    # Helper method to prep compiler in subclass compile() methods
+
+    def _setup_compile(self, outdir, macros, incdirs, sources, depends,
+                       extra):
+        """Process arguments and decide which source files to compile."""
+        if outdir is None:
+            outdir = self.output_dir
+        elif not isinstance(outdir, str):
+            raise TypeError("'output_dir' must be a string or None")
+
+        if macros is None:
+            macros = self.macros
+        elif isinstance(macros, list):
+            macros = macros + (self.macros or [])
+        else:
+            raise TypeError("'macros' (if supplied) must be a list of tuples")
+
+        if incdirs is None:
+            incdirs = self.include_dirs
+        elif isinstance(incdirs, (list, tuple)):
+            incdirs = list(incdirs) + (self.include_dirs or [])
+        else:
+            raise TypeError(
+                  "'include_dirs' (if supplied) must be a list of strings")
+
+        if extra is None:
+            extra = []
+
+        # Get the list of expected output (object) files
+        objects = self.object_filenames(sources, strip_dir=0,
+                                        output_dir=outdir)
+        assert len(objects) == len(sources)
+
+        pp_opts = gen_preprocess_options(macros, incdirs)
+
+        build = {}
+        for i in range(len(sources)):
+            src = sources[i]
+            obj = objects[i]
+            ext = os.path.splitext(src)[1]
+            self.mkpath(os.path.dirname(obj))
+            build[obj] = (src, ext)
+
+        return macros, objects, extra, pp_opts, build
+
+    def _get_cc_args(self, pp_opts, debug, before):
+        # works for unixccompiler, cygwinccompiler
+        cc_args = pp_opts + ['-c']
+        if debug:
+            cc_args[:0] = ['-g']
+        if before:
+            cc_args[:0] = before
+        return cc_args
+
+    def _fix_compile_args(self, output_dir, macros, include_dirs):
+        """Typecheck and fix-up some of the arguments to the 'compile()'
+        method, and return fixed-up values.  Specifically: if 'output_dir'
+        is None, replaces it with 'self.output_dir'; ensures that 'macros'
+        is a list, and augments it with 'self.macros'; ensures that
+        'include_dirs' is a list, and augments it with 'self.include_dirs'.
+        Guarantees that the returned values are of the correct type,
+        i.e. for 'output_dir' either string or None, and for 'macros' and
+        'include_dirs' either list or None.
+        """
+        if output_dir is None:
+            output_dir = self.output_dir
+        elif not isinstance(output_dir, str):
+            raise TypeError("'output_dir' must be a string or None")
+
+        if macros is None:
+            macros = self.macros
+        elif isinstance(macros, list):
+            macros = macros + (self.macros or [])
+        else:
+            raise TypeError("'macros' (if supplied) must be a list of tuples")
+
+        if include_dirs is None:
+            include_dirs = self.include_dirs
+        elif isinstance(include_dirs, (list, tuple)):
+            include_dirs = list(include_dirs) + (self.include_dirs or [])
+        else:
+            raise TypeError(
+                  "'include_dirs' (if supplied) must be a list of strings")
+
+        return output_dir, macros, include_dirs
+
+    def _prep_compile(self, sources, output_dir, depends=None):
+        """Decide which souce files must be recompiled.
+
+        Determine the list of object files corresponding to 'sources',
+        and figure out which ones really need to be recompiled.
+        Return a list of all object files and a dictionary telling
+        which source files can be skipped.
+        """
+        # Get the list of expected output (object) files
+        objects = self.object_filenames(sources, output_dir=output_dir)
+        assert len(objects) == len(sources)
+
+        # Return an empty dict for the "which source files can be skipped"
+        # return value to preserve API compatibility.
+        return objects, {}
+
+    def _fix_object_args(self, objects, output_dir):
+        """Typecheck and fix up some arguments supplied to various methods.
+        Specifically: ensure that 'objects' is a list; if output_dir is
+        None, replace with self.output_dir.  Return fixed versions of
+        'objects' and 'output_dir'.
+        """
+        if not isinstance(objects, (list, tuple)):
+            raise TypeError("'objects' must be a list or tuple of strings")
+        objects = list(objects)
+
+        if output_dir is None:
+            output_dir = self.output_dir
+        elif not isinstance(output_dir, str):
+            raise TypeError("'output_dir' must be a string or None")
+
+        return (objects, output_dir)
+
+    def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
+        """Typecheck and fix up some of the arguments supplied to the
+        'link_*' methods.  Specifically: ensure that all arguments are
+        lists, and augment them with their permanent versions
+        (eg. 'self.libraries' augments 'libraries').  Return a tuple with
+        fixed versions of all arguments.
+        """
+        if libraries is None:
+            libraries = self.libraries
+        elif isinstance(libraries, (list, tuple)):
+            libraries = list (libraries) + (self.libraries or [])
+        else:
+            raise TypeError(
+                  "'libraries' (if supplied) must be a list of strings")
+
+        if library_dirs is None:
+            library_dirs = self.library_dirs
+        elif isinstance(library_dirs, (list, tuple)):
+            library_dirs = list (library_dirs) + (self.library_dirs or [])
+        else:
+            raise TypeError(
+                  "'library_dirs' (if supplied) must be a list of strings")
+
+        if runtime_library_dirs is None:
+            runtime_library_dirs = self.runtime_library_dirs
+        elif isinstance(runtime_library_dirs, (list, tuple)):
+            runtime_library_dirs = (list(runtime_library_dirs) +
+                                    (self.runtime_library_dirs or []))
+        else:
+            raise TypeError("'runtime_library_dirs' (if supplied) "
+                            "must be a list of strings")
+
+        return (libraries, library_dirs, runtime_library_dirs)
+
+    def _need_link(self, objects, output_file):
+        """Return true if we need to relink the files listed in 'objects'
+        to recreate 'output_file'.
+        """
+        if self.force:
+            return True
+        else:
+            if self.dry_run:
+                newer = newer_group (objects, output_file, missing='newer')
+            else:
+                newer = newer_group (objects, output_file)
+            return newer
+
+    def detect_language(self, sources):
+        """Detect the language of a given file, or list of files. Uses
+        language_map, and language_order to do the job.
+        """
+        if not isinstance(sources, list):
+            sources = [sources]
+        lang = None
+        index = len(self.language_order)
+        for source in sources:
+            base, ext = os.path.splitext(source)
+            extlang = self.language_map.get(ext)
+            try:
+                extindex = self.language_order.index(extlang)
+                if extindex < index:
+                    lang = extlang
+                    index = extindex
+            except ValueError:
+                pass
+        return lang
+
+
+    # -- Worker methods ------------------------------------------------
+    # (must be implemented by subclasses)
+
+    def preprocess(self, source, output_file=None, macros=None,
+                   include_dirs=None, extra_preargs=None, extra_postargs=None):
+        """Preprocess a single C/C++ source file, named in 'source'.
+        Output will be written to file named 'output_file', or stdout if
+        'output_file' not supplied.  'macros' is a list of macro
+        definitions as for 'compile()', which will augment the macros set
+        with 'define_macro()' and 'undefine_macro()'.  'include_dirs' is a
+        list of directory names that will be added to the default list.
+
+        Raises PreprocessError on failure.
+        """
+        pass
+
+    def compile(self, sources, output_dir=None, macros=None,
+                include_dirs=None, debug=0, extra_preargs=None,
+                extra_postargs=None, depends=None):
+        """Compile one or more source files.
+
+        'sources' must be a list of filenames, most likely C/C++
+        files, but in reality anything that can be handled by a
+        particular compiler and compiler class (eg. MSVCCompiler can
+        handle resource files in 'sources').  Return a list of object
+        filenames, one per source filename in 'sources'.  Depending on
+        the implementation, not all source files will necessarily be
+        compiled, but all corresponding object filenames will be
+        returned.
+
+        If 'output_dir' is given, object files will be put under it, while
+        retaining their original path component.  That is, "foo/bar.c"
+        normally compiles to "foo/bar.o" (for a Unix implementation); if
+        'output_dir' is "build", then it would compile to
+        "build/foo/bar.o".
+
+        'macros', if given, must be a list of macro definitions.  A macro
+        definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
+        The former defines a macro; if the value is None, the macro is
+        defined without an explicit value.  The 1-tuple case undefines a
+        macro.  Later definitions/redefinitions/ undefinitions take
+        precedence.
+
+        'include_dirs', if given, must be a list of strings, the
+        directories to add to the default include file search path for this
+        compilation only.
+
+        'debug' is a boolean; if true, the compiler will be instructed to
+        output debug symbols in (or alongside) the object file(s).
+
+        'extra_preargs' and 'extra_postargs' are implementation- dependent.
+        On platforms that have the notion of a command-line (e.g. Unix,
+        DOS/Windows), they are most likely lists of strings: extra
+        command-line arguments to prepend/append to the compiler command
+        line.  On other platforms, consult the implementation class
+        documentation.  In any event, they are intended as an escape hatch
+        for those occasions when the abstract compiler framework doesn't
+        cut the mustard.
+
+        'depends', if given, is a list of filenames that all targets
+        depend on.  If a source file is older than any file in
+        depends, then the source file will be recompiled.  This
+        supports dependency tracking, but only at a coarse
+        granularity.
+
+        Raises CompileError on failure.
+        """
+        # A concrete compiler class can either override this method
+        # entirely or implement _compile().
+        macros, objects, extra_postargs, pp_opts, build = \
+                self._setup_compile(output_dir, macros, include_dirs, sources,
+                                    depends, extra_postargs)
+        cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
+
+        for obj in objects:
+            try:
+                src, ext = build[obj]
+            except KeyError:
+                continue
+            self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
+
+        # Return *all* object filenames, not just the ones we just built.
+        return objects
+
+    def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
+        """Compile 'src' to product 'obj'."""
+        # A concrete compiler class that does not override compile()
+        # should implement _compile().
+        pass
+
+    def create_static_lib(self, objects, output_libname, output_dir=None,
+                          debug=0, target_lang=None):
+        """Link a bunch of stuff together to create a static library file.
+        The "bunch of stuff" consists of the list of object files supplied
+        as 'objects', the extra object files supplied to
+        'add_link_object()' and/or 'set_link_objects()', the libraries
+        supplied to 'add_library()' and/or 'set_libraries()', and the
+        libraries supplied as 'libraries' (if any).
+
+        'output_libname' should be a library name, not a filename; the
+        filename will be inferred from the library name.  'output_dir' is
+        the directory where the library file will be put.
+
+        'debug' is a boolean; if true, debugging information will be
+        included in the library (note that on most platforms, it is the
+        compile step where this matters: the 'debug' flag is included here
+        just for consistency).
+
+        'target_lang' is the target language for which the given objects
+        are being compiled. This allows specific linkage time treatment of
+        certain languages.
+
+        Raises LibError on failure.
+        """
+        pass
+
+
+    # values for target_desc parameter in link()
+    SHARED_OBJECT = "shared_object"
+    SHARED_LIBRARY = "shared_library"
+    EXECUTABLE = "executable"
+
+    def link(self,
+             target_desc,
+             objects,
+             output_filename,
+             output_dir=None,
+             libraries=None,
+             library_dirs=None,
+             runtime_library_dirs=None,
+             export_symbols=None,
+             debug=0,
+             extra_preargs=None,
+             extra_postargs=None,
+             build_temp=None,
+             target_lang=None):
+        """Link a bunch of stuff together to create an executable or
+        shared library file.
+
+        The "bunch of stuff" consists of the list of object files supplied
+        as 'objects'.  'output_filename' should be a filename.  If
+        'output_dir' is supplied, 'output_filename' is relative to it
+        (i.e. 'output_filename' can provide directory components if
+        needed).
+
+        'libraries' is a list of libraries to link against.  These are
+        library names, not filenames, since they're translated into
+        filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
+        on Unix and "foo.lib" on DOS/Windows).  However, they can include a
+        directory component, which means the linker will look in that
+        specific directory rather than searching all the normal locations.
+
+        'library_dirs', if supplied, should be a list of directories to
+        search for libraries that were specified as bare library names
+        (ie. no directory component).  These are on top of the system
+        default and those supplied to 'add_library_dir()' and/or
+        'set_library_dirs()'.  'runtime_library_dirs' is a list of
+        directories that will be embedded into the shared library and used
+        to search for other shared libraries that *it* depends on at
+        run-time.  (This may only be relevant on Unix.)
+
+        'export_symbols' is a list of symbols that the shared library will
+        export.  (This appears to be relevant only on Windows.)
+
+        'debug' is as for 'compile()' and 'create_static_lib()', with the
+        slight distinction that it actually matters on most platforms (as
+        opposed to 'create_static_lib()', which includes a 'debug' flag
+        mostly for form's sake).
+
+        'extra_preargs' and 'extra_postargs' are as for 'compile()' (except
+        of course that they supply command-line arguments for the
+        particular linker being used).
+
+        'target_lang' is the target language for which the given objects
+        are being compiled. This allows specific linkage time treatment of
+        certain languages.
+
+        Raises LinkError on failure.
+        """
+        raise NotImplementedError
+
+
+    # Old 'link_*()' methods, rewritten to use the new 'link()' method.
+
+    def link_shared_lib(self,
+                        objects,
+                        output_libname,
+                        output_dir=None,
+                        libraries=None,
+                        library_dirs=None,
+                        runtime_library_dirs=None,
+                        export_symbols=None,
+                        debug=0,
+                        extra_preargs=None,
+                        extra_postargs=None,
+                        build_temp=None,
+                        target_lang=None):
+        self.link(CCompiler.SHARED_LIBRARY, objects,
+                  self.library_filename(output_libname, lib_type='shared'),
+                  output_dir,
+                  libraries, library_dirs, runtime_library_dirs,
+                  export_symbols, debug,
+                  extra_preargs, extra_postargs, build_temp, target_lang)
+
+
+    def link_shared_object(self,
+                           objects,
+                           output_filename,
+                           output_dir=None,
+                           libraries=None,
+                           library_dirs=None,
+                           runtime_library_dirs=None,
+                           export_symbols=None,
+                           debug=0,
+                           extra_preargs=None,
+                           extra_postargs=None,
+                           build_temp=None,
+                           target_lang=None):
+        self.link(CCompiler.SHARED_OBJECT, objects,
+                  output_filename, output_dir,
+                  libraries, library_dirs, runtime_library_dirs,
+                  export_symbols, debug,
+                  extra_preargs, extra_postargs, build_temp, target_lang)
+
+
+    def link_executable(self,
+                        objects,
+                        output_progname,
+                        output_dir=None,
+                        libraries=None,
+                        library_dirs=None,
+                        runtime_library_dirs=None,
+                        debug=0,
+                        extra_preargs=None,
+                        extra_postargs=None,
+                        target_lang=None):
+        self.link(CCompiler.EXECUTABLE, objects,
+                  self.executable_filename(output_progname), output_dir,
+                  libraries, library_dirs, runtime_library_dirs, None,
+                  debug, extra_preargs, extra_postargs, None, target_lang)
+
+
+    # -- Miscellaneous methods -----------------------------------------
+    # These are all used by the 'gen_lib_options() function; there is
+    # no appropriate default implementation so subclasses should
+    # implement all of these.
+
+    def library_dir_option(self, dir):
+        """Return the compiler option to add 'dir' to the list of
+        directories searched for libraries.
+        """
+        raise NotImplementedError
+
+    def runtime_library_dir_option(self, dir):
+        """Return the compiler option to add 'dir' to the list of
+        directories searched for runtime libraries.
+        """
+        raise NotImplementedError
+
+    def library_option(self, lib):
+        """Return the compiler option to add 'lib' to the list of libraries
+        linked into the shared library or executable.
+        """
+        raise NotImplementedError
+
+    def has_function(self, funcname, includes=None, include_dirs=None,
+                     libraries=None, library_dirs=None):
+        """Return a boolean indicating whether funcname is supported on
+        the current platform.  The optional arguments can be used to
+        augment the compilation environment.
+        """
+        # this can't be included at module scope because it tries to
+        # import math which might not be available at that point - maybe
+        # the necessary logic should just be inlined?
+        import tempfile
+        if includes is None:
+            includes = []
+        if include_dirs is None:
+            include_dirs = []
+        if libraries is None:
+            libraries = []
+        if library_dirs is None:
+            library_dirs = []
+        fd, fname = tempfile.mkstemp(".c", funcname, text=True)
+        f = os.fdopen(fd, "w")
+        try:
+            for incl in includes:
+                f.write("""#include "%s"\n""" % incl)
+            f.write("""\
+int main (int argc, char **argv) {
+    %s();
+    return 0;
+}
+""" % funcname)
+        finally:
+            f.close()
+        try:
+            objects = self.compile([fname], include_dirs=include_dirs)
+        except CompileError:
+            return False
+
+        try:
+            self.link_executable(objects, "a.out",
+                                 libraries=libraries,
+                                 library_dirs=library_dirs)
+        except (LinkError, TypeError):
+            return False
+        return True
+
+    def find_library_file (self, dirs, lib, debug=0):
+        """Search the specified list of directories for a static or shared
+        library file 'lib' and return the full path to that file.  If
+        'debug' true, look for a debugging version (if that makes sense on
+        the current platform).  Return None if 'lib' wasn't found in any of
+        the specified directories.
+        """
+        raise NotImplementedError
+
+    # -- Filename generation methods -----------------------------------
+
+    # The default implementation of the filename generating methods are
+    # prejudiced towards the Unix/DOS/Windows view of the world:
+    #   * object files are named by replacing the source file extension
+    #     (eg. .c/.cpp -> .o/.obj)
+    #   * library files (shared or static) are named by plugging the
+    #     library name and extension into a format string, eg.
+    #     "lib%s.%s" % (lib_name, ".a") for Unix static libraries
+    #   * executables are named by appending an extension (possibly
+    #     empty) to the program name: eg. progname + ".exe" for
+    #     Windows
+    #
+    # To reduce redundant code, these methods expect to find
+    # several attributes in the current object (presumably defined
+    # as class attributes):
+    #   * src_extensions -
+    #     list of C/C++ source file extensions, eg. ['.c', '.cpp']
+    #   * obj_extension -
+    #     object file extension, eg. '.o' or '.obj'
+    #   * static_lib_extension -
+    #     extension for static library files, eg. '.a' or '.lib'
+    #   * shared_lib_extension -
+    #     extension for shared library/object files, eg. '.so', '.dll'
+    #   * static_lib_format -
+    #     format string for generating static library filenames,
+    #     eg. 'lib%s.%s' or '%s.%s'
+    #   * shared_lib_format
+    #     format string for generating shared library filenames
+    #     (probably same as static_lib_format, since the extension
+    #     is one of the intended parameters to the format string)
+    #   * exe_extension -
+    #     extension for executable files, eg. '' or '.exe'
+
+    def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
+        if output_dir is None:
+            output_dir = ''
+        obj_names = []
+        for src_name in source_filenames:
+            base, ext = os.path.splitext(src_name)
+            base = os.path.splitdrive(base)[1] # Chop off the drive
+            base = base[os.path.isabs(base):]  # If abs, chop off leading /
+            if ext not in self.src_extensions:
+                raise UnknownFileError(
+                      "unknown file type '%s' (from '%s')" % (ext, src_name))
+            if strip_dir:
+                base = os.path.basename(base)
+            obj_names.append(os.path.join(output_dir,
+                                          base + self.obj_extension))
+        return obj_names
+
+    def shared_object_filename(self, basename, strip_dir=0, output_dir=''):
+        assert output_dir is not None
+        if strip_dir:
+            basename = os.path.basename(basename)
+        return os.path.join(output_dir, basename + self.shared_lib_extension)
+
+    def executable_filename(self, basename, strip_dir=0, output_dir=''):
+        assert output_dir is not None
+        if strip_dir:
+            basename = os.path.basename(basename)
+        return os.path.join(output_dir, basename + (self.exe_extension or ''))
+
+    def library_filename(self, libname, lib_type='static',     # or 'shared'
+                         strip_dir=0, output_dir=''):
+        assert output_dir is not None
+        if lib_type not in ("static", "shared", "dylib", "xcode_stub"):
+            raise ValueError(
+                  "'lib_type' must be \"static\", \"shared\", \"dylib\", or \"xcode_stub\"")
+        fmt = getattr(self, lib_type + "_lib_format")
+        ext = getattr(self, lib_type + "_lib_extension")
+
+        dir, base = os.path.split(libname)
+        filename = fmt % (base, ext)
+        if strip_dir:
+            dir = ''
+
+        return os.path.join(output_dir, dir, filename)
+
+
+    # -- Utility methods -----------------------------------------------
+
+    def announce(self, msg, level=1):
+        log.debug(msg)
+
+    def debug_print(self, msg):
+        from distutils.debug import DEBUG
+        if DEBUG:
+            print(msg)
+
+    def warn(self, msg):
+        sys.stderr.write("warning: %s\n" % msg)
+
+    def execute(self, func, args, msg=None, level=1):
+        execute(func, args, msg, self.dry_run)
+
+    def spawn(self, cmd, **kwargs):
+        spawn(cmd, dry_run=self.dry_run, **kwargs)
+
+    def move_file(self, src, dst):
+        return move_file(src, dst, dry_run=self.dry_run)
+
+    def mkpath (self, name, mode=0o777):
+        mkpath(name, mode, dry_run=self.dry_run)
+
+
+# Map a sys.platform/os.name ('posix', 'nt') to the default compiler
+# type for that platform. Keys are interpreted as re match
+# patterns. Order is important; platform mappings are preferred over
+# OS names.
+_default_compilers = (
+
+    # Platform string mappings
+
+    # on a cygwin built python we can use gcc like an ordinary UNIXish
+    # compiler
+    ('cygwin.*', 'unix'),
+
+    # OS name mappings
+    ('posix', 'unix'),
+    ('nt', 'msvc'),
+
+    )
+
+def get_default_compiler(osname=None, platform=None):
+    """Determine the default compiler to use for the given platform.
+
+       osname should be one of the standard Python OS names (i.e. the
+       ones returned by os.name) and platform the common value
+       returned by sys.platform for the platform in question.
+
+       The default values are os.name and sys.platform in case the
+       parameters are not given.
+    """
+    if osname is None:
+        osname = os.name
+    if platform is None:
+        platform = sys.platform
+    for pattern, compiler in _default_compilers:
+        if re.match(pattern, platform) is not None or \
+           re.match(pattern, osname) is not None:
+            return compiler
+    # Default to Unix compiler
+    return 'unix'
+
+# Map compiler types to (module_name, class_name) pairs -- ie. where to
+# find the code that implements an interface to this compiler.  (The module
+# is assumed to be in the 'distutils' package.)
+compiler_class = { 'unix':    ('unixccompiler', 'UnixCCompiler',
+                               "standard UNIX-style compiler"),
+                   'msvc':    ('_msvccompiler', 'MSVCCompiler',
+                               "Microsoft Visual C++"),
+                   'cygwin':  ('cygwinccompiler', 'CygwinCCompiler',
+                               "Cygwin port of GNU C Compiler for Win32"),
+                   'mingw32': ('cygwinccompiler', 'Mingw32CCompiler',
+                               "Mingw32 port of GNU C Compiler for Win32"),
+                   'bcpp':    ('bcppcompiler', 'BCPPCompiler',
+                               "Borland C++ Compiler"),
+                 }
+
+def show_compilers():
+    """Print list of available compilers (used by the "--help-compiler"
+    options to "build", "build_ext", "build_clib").
+    """
+    # XXX this "knows" that the compiler option it's describing is
+    # "--compiler", which just happens to be the case for the three
+    # commands that use it.
+    from distutils.fancy_getopt import FancyGetopt
+    compilers = []
+    for compiler in compiler_class.keys():
+        compilers.append(("compiler="+compiler, None,
+                          compiler_class[compiler][2]))
+    compilers.sort()
+    pretty_printer = FancyGetopt(compilers)
+    pretty_printer.print_help("List of available compilers:")
+
+
+def new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0):
+    """Generate an instance of some CCompiler subclass for the supplied
+    platform/compiler combination.  'plat' defaults to 'os.name'
+    (eg. 'posix', 'nt'), and 'compiler' defaults to the default compiler
+    for that platform.  Currently only 'posix' and 'nt' are supported, and
+    the default compilers are "traditional Unix interface" (UnixCCompiler
+    class) and Visual C++ (MSVCCompiler class).  Note that it's perfectly
+    possible to ask for a Unix compiler object under Windows, and a
+    Microsoft compiler object under Unix -- if you supply a value for
+    'compiler', 'plat' is ignored.
+    """
+    if plat is None:
+        plat = os.name
+
+    try:
+        if compiler is None:
+            compiler = get_default_compiler(plat)
+
+        (module_name, class_name, long_description) = compiler_class[compiler]
+    except KeyError:
+        msg = "don't know how to compile C/C++ code on platform '%s'" % plat
+        if compiler is not None:
+            msg = msg + " with '%s' compiler" % compiler
+        raise DistutilsPlatformError(msg)
+
+    try:
+        module_name = "distutils." + module_name
+        __import__ (module_name)
+        module = sys.modules[module_name]
+        klass = vars(module)[class_name]
+    except ImportError:
+        raise DistutilsModuleError(
+              "can't compile C/C++ code: unable to load module '%s'" % \
+              module_name)
+    except KeyError:
+        raise DistutilsModuleError(
+               "can't compile C/C++ code: unable to find class '%s' "
+               "in module '%s'" % (class_name, module_name))
+
+    # XXX The None is necessary to preserve backwards compatibility
+    # with classes that expect verbose to be the first positional
+    # argument.
+    return klass(None, dry_run, force)
+
+
+def gen_preprocess_options(macros, include_dirs):
+    """Generate C pre-processor options (-D, -U, -I) as used by at least
+    two types of compilers: the typical Unix compiler and Visual C++.
+    'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
+    means undefine (-U) macro 'name', and (name,value) means define (-D)
+    macro 'name' to 'value'.  'include_dirs' is just a list of directory
+    names to be added to the header file search path (-I).  Returns a list
+    of command-line options suitable for either Unix compilers or Visual
+    C++.
+    """
+    # XXX it would be nice (mainly aesthetic, and so we don't generate
+    # stupid-looking command lines) to go over 'macros' and eliminate
+    # redundant definitions/undefinitions (ie. ensure that only the
+    # latest mention of a particular macro winds up on the command
+    # line).  I don't think it's essential, though, since most (all?)
+    # Unix C compilers only pay attention to the latest -D or -U
+    # mention of a macro on their command line.  Similar situation for
+    # 'include_dirs'.  I'm punting on both for now.  Anyways, weeding out
+    # redundancies like this should probably be the province of
+    # CCompiler, since the data structures used are inherited from it
+    # and therefore common to all CCompiler classes.
+    pp_opts = []
+    for macro in macros:
+        if not (isinstance(macro, tuple) and 1 <= len(macro) <= 2):
+            raise TypeError(
+                  "bad macro definition '%s': "
+                  "each element of 'macros' list must be a 1- or 2-tuple"
+                  % macro)
+
+        if len(macro) == 1:        # undefine this macro
+            pp_opts.append("-U%s" % macro[0])
+        elif len(macro) == 2:
+            if macro[1] is None:    # define with no explicit value
+                pp_opts.append("-D%s" % macro[0])
+            else:
+                # XXX *don't* need to be clever about quoting the
+                # macro value here, because we're going to avoid the
+                # shell at all costs when we spawn the command!
+                pp_opts.append("-D%s=%s" % macro)
+
+    for dir in include_dirs:
+        pp_opts.append("-I%s" % dir)
+    return pp_opts
+
+
+def gen_lib_options (compiler, library_dirs, runtime_library_dirs, libraries):
+    """Generate linker options for searching library directories and
+    linking with specific libraries.  'libraries' and 'library_dirs' are,
+    respectively, lists of library names (not filenames!) and search
+    directories.  Returns a list of command-line options suitable for use
+    with some compiler (depending on the two format strings passed in).
+    """
+    lib_opts = []
+
+    for dir in library_dirs:
+        lib_opts.append(compiler.library_dir_option(dir))
+
+    for dir in runtime_library_dirs:
+        opt = compiler.runtime_library_dir_option(dir)
+        if isinstance(opt, list):
+            lib_opts = lib_opts + opt
+        else:
+            lib_opts.append(opt)
+
+    # XXX it's important that we *not* remove redundant library mentions!
+    # sometimes you really do have to say "-lfoo -lbar -lfoo" in order to
+    # resolve all symbols.  I just hope we never have to say "-lfoo obj.o
+    # -lbar" to get things to work -- that's certainly a possibility, but a
+    # pretty nasty way to arrange your C code.
+
+    for lib in libraries:
+        (lib_dir, lib_name) = os.path.split(lib)
+        if lib_dir:
+            lib_file = compiler.find_library_file([lib_dir], lib_name)
+            if lib_file:
+                lib_opts.append(lib_file)
+            else:
+                compiler.warn("no library file corresponding to "
+                              "'%s' found (skipping)" % lib)
+        else:
+            lib_opts.append(compiler.library_option (lib))
+    return lib_opts
diff --git a/venv/Lib/site-packages/setuptools/_distutils/cmd.py b/venv/Lib/site-packages/setuptools/_distutils/cmd.py
new file mode 100644
index 0000000..dba3191
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/cmd.py
@@ -0,0 +1,403 @@
+"""distutils.cmd
+
+Provides the Command class, the base class for the command classes
+in the distutils.command package.
+"""
+
+import sys, os, re
+from distutils.errors import DistutilsOptionError
+from distutils import util, dir_util, file_util, archive_util, dep_util
+from distutils import log
+
+class Command:
+    """Abstract base class for defining command classes, the "worker bees"
+    of the Distutils.  A useful analogy for command classes is to think of
+    them as subroutines with local variables called "options".  The options
+    are "declared" in 'initialize_options()' and "defined" (given their
+    final values, aka "finalized") in 'finalize_options()', both of which
+    must be defined by every command class.  The distinction between the
+    two is necessary because option values might come from the outside
+    world (command line, config file, ...), and any options dependent on
+    other options must be computed *after* these outside influences have
+    been processed -- hence 'finalize_options()'.  The "body" of the
+    subroutine, where it does all its work based on the values of its
+    options, is the 'run()' method, which must also be implemented by every
+    command class.
+    """
+
+    # 'sub_commands' formalizes the notion of a "family" of commands,
+    # eg. "install" as the parent with sub-commands "install_lib",
+    # "install_headers", etc.  The parent of a family of commands
+    # defines 'sub_commands' as a class attribute; it's a list of
+    #    (command_name : string, predicate : unbound_method | string | None)
+    # tuples, where 'predicate' is a method of the parent command that
+    # determines whether the corresponding command is applicable in the
+    # current situation.  (Eg. we "install_headers" is only applicable if
+    # we have any C header files to install.)  If 'predicate' is None,
+    # that command is always applicable.
+    #
+    # 'sub_commands' is usually defined at the *end* of a class, because
+    # predicates can be unbound methods, so they must already have been
+    # defined.  The canonical example is the "install" command.
+    sub_commands = []
+
+
+    # -- Creation/initialization methods -------------------------------
+
+    def __init__(self, dist):
+        """Create and initialize a new Command object.  Most importantly,
+        invokes the 'initialize_options()' method, which is the real
+        initializer and depends on the actual command being
+        instantiated.
+        """
+        # late import because of mutual dependence between these classes
+        from distutils.dist import Distribution
+
+        if not isinstance(dist, Distribution):
+            raise TypeError("dist must be a Distribution instance")
+        if self.__class__ is Command:
+            raise RuntimeError("Command is an abstract class")
+
+        self.distribution = dist
+        self.initialize_options()
+
+        # Per-command versions of the global flags, so that the user can
+        # customize Distutils' behaviour command-by-command and let some
+        # commands fall back on the Distribution's behaviour.  None means
+        # "not defined, check self.distribution's copy", while 0 or 1 mean
+        # false and true (duh).  Note that this means figuring out the real
+        # value of each flag is a touch complicated -- hence "self._dry_run"
+        # will be handled by __getattr__, below.
+        # XXX This needs to be fixed.
+        self._dry_run = None
+
+        # verbose is largely ignored, but needs to be set for
+        # backwards compatibility (I think)?
+        self.verbose = dist.verbose
+
+        # Some commands define a 'self.force' option to ignore file
+        # timestamps, but methods defined *here* assume that
+        # 'self.force' exists for all commands.  So define it here
+        # just to be safe.
+        self.force = None
+
+        # The 'help' flag is just used for command-line parsing, so
+        # none of that complicated bureaucracy is needed.
+        self.help = 0
+
+        # 'finalized' records whether or not 'finalize_options()' has been
+        # called.  'finalize_options()' itself should not pay attention to
+        # this flag: it is the business of 'ensure_finalized()', which
+        # always calls 'finalize_options()', to respect/update it.
+        self.finalized = 0
+
+    # XXX A more explicit way to customize dry_run would be better.
+    def __getattr__(self, attr):
+        if attr == 'dry_run':
+            myval = getattr(self, "_" + attr)
+            if myval is None:
+                return getattr(self.distribution, attr)
+            else:
+                return myval
+        else:
+            raise AttributeError(attr)
+
+    def ensure_finalized(self):
+        if not self.finalized:
+            self.finalize_options()
+        self.finalized = 1
+
+    # Subclasses must define:
+    #   initialize_options()
+    #     provide default values for all options; may be customized by
+    #     setup script, by options from config file(s), or by command-line
+    #     options
+    #   finalize_options()
+    #     decide on the final values for all options; this is called
+    #     after all possible intervention from the outside world
+    #     (command-line, option file, etc.) has been processed
+    #   run()
+    #     run the command: do whatever it is we're here to do,
+    #     controlled by the command's various option values
+
+    def initialize_options(self):
+        """Set default values for all the options that this command
+        supports.  Note that these defaults may be overridden by other
+        commands, by the setup script, by config files, or by the
+        command-line.  Thus, this is not the place to code dependencies
+        between options; generally, 'initialize_options()' implementations
+        are just a bunch of "self.foo = None" assignments.
+
+        This method must be implemented by all command classes.
+        """
+        raise RuntimeError("abstract method -- subclass %s must override"
+                           % self.__class__)
+
+    def finalize_options(self):
+        """Set final values for all the options that this command supports.
+        This is always called as late as possible, ie.  after any option
+        assignments from the command-line or from other commands have been
+        done.  Thus, this is the place to code option dependencies: if
+        'foo' depends on 'bar', then it is safe to set 'foo' from 'bar' as
+        long as 'foo' still has the same value it was assigned in
+        'initialize_options()'.
+
+        This method must be implemented by all command classes.
+        """
+        raise RuntimeError("abstract method -- subclass %s must override"
+                           % self.__class__)
+
+
+    def dump_options(self, header=None, indent=""):
+        from distutils.fancy_getopt import longopt_xlate
+        if header is None:
+            header = "command options for '%s':" % self.get_command_name()
+        self.announce(indent + header, level=log.INFO)
+        indent = indent + "  "
+        for (option, _, _) in self.user_options:
+            option = option.translate(longopt_xlate)
+            if option[-1] == "=":
+                option = option[:-1]
+            value = getattr(self, option)
+            self.announce(indent + "%s = %s" % (option, value),
+                          level=log.INFO)
+
+    def run(self):
+        """A command's raison d'etre: carry out the action it exists to
+        perform, controlled by the options initialized in
+        'initialize_options()', customized by other commands, the setup
+        script, the command-line, and config files, and finalized in
+        'finalize_options()'.  All terminal output and filesystem
+        interaction should be done by 'run()'.
+
+        This method must be implemented by all command classes.
+        """
+        raise RuntimeError("abstract method -- subclass %s must override"
+                           % self.__class__)
+
+    def announce(self, msg, level=1):
+        """If the current verbosity level is of greater than or equal to
+        'level' print 'msg' to stdout.
+        """
+        log.log(level, msg)
+
+    def debug_print(self, msg):
+        """Print 'msg' to stdout if the global DEBUG (taken from the
+        DISTUTILS_DEBUG environment variable) flag is true.
+        """
+        from distutils.debug import DEBUG
+        if DEBUG:
+            print(msg)
+            sys.stdout.flush()
+
+
+    # -- Option validation methods -------------------------------------
+    # (these are very handy in writing the 'finalize_options()' method)
+    #
+    # NB. the general philosophy here is to ensure that a particular option
+    # value meets certain type and value constraints.  If not, we try to
+    # force it into conformance (eg. if we expect a list but have a string,
+    # split the string on comma and/or whitespace).  If we can't force the
+    # option into conformance, raise DistutilsOptionError.  Thus, command
+    # classes need do nothing more than (eg.)
+    #   self.ensure_string_list('foo')
+    # and they can be guaranteed that thereafter, self.foo will be
+    # a list of strings.
+
+    def _ensure_stringlike(self, option, what, default=None):
+        val = getattr(self, option)
+        if val is None:
+            setattr(self, option, default)
+            return default
+        elif not isinstance(val, str):
+            raise DistutilsOptionError("'%s' must be a %s (got `%s`)"
+                                       % (option, what, val))
+        return val
+
+    def ensure_string(self, option, default=None):
+        """Ensure that 'option' is a string; if not defined, set it to
+        'default'.
+        """
+        self._ensure_stringlike(option, "string", default)
+
+    def ensure_string_list(self, option):
+        r"""Ensure that 'option' is a list of strings.  If 'option' is
+        currently a string, we split it either on /,\s*/ or /\s+/, so
+        "foo bar baz", "foo,bar,baz", and "foo,   bar baz" all become
+        ["foo", "bar", "baz"].
+        """
+        val = getattr(self, option)
+        if val is None:
+            return
+        elif isinstance(val, str):
+            setattr(self, option, re.split(r',\s*|\s+', val))
+        else:
+            if isinstance(val, list):
+                ok = all(isinstance(v, str) for v in val)
+            else:
+                ok = False
+            if not ok:
+                raise DistutilsOptionError(
+                      "'%s' must be a list of strings (got %r)"
+                      % (option, val))
+
+    def _ensure_tested_string(self, option, tester, what, error_fmt,
+                              default=None):
+        val = self._ensure_stringlike(option, what, default)
+        if val is not None and not tester(val):
+            raise DistutilsOptionError(("error in '%s' option: " + error_fmt)
+                                       % (option, val))
+
+    def ensure_filename(self, option):
+        """Ensure that 'option' is the name of an existing file."""
+        self._ensure_tested_string(option, os.path.isfile,
+                                   "filename",
+                                   "'%s' does not exist or is not a file")
+
+    def ensure_dirname(self, option):
+        self._ensure_tested_string(option, os.path.isdir,
+                                   "directory name",
+                                   "'%s' does not exist or is not a directory")
+
+
+    # -- Convenience methods for commands ------------------------------
+
+    def get_command_name(self):
+        if hasattr(self, 'command_name'):
+            return self.command_name
+        else:
+            return self.__class__.__name__
+
+    def set_undefined_options(self, src_cmd, *option_pairs):
+        """Set the values of any "undefined" options from corresponding
+        option values in some other command object.  "Undefined" here means
+        "is None", which is the convention used to indicate that an option
+        has not been changed between 'initialize_options()' and
+        'finalize_options()'.  Usually called from 'finalize_options()' for
+        options that depend on some other command rather than another
+        option of the same command.  'src_cmd' is the other command from
+        which option values will be taken (a command object will be created
+        for it if necessary); the remaining arguments are
+        '(src_option,dst_option)' tuples which mean "take the value of
+        'src_option' in the 'src_cmd' command object, and copy it to
+        'dst_option' in the current command object".
+        """
+        # Option_pairs: list of (src_option, dst_option) tuples
+        src_cmd_obj = self.distribution.get_command_obj(src_cmd)
+        src_cmd_obj.ensure_finalized()
+        for (src_option, dst_option) in option_pairs:
+            if getattr(self, dst_option) is None:
+                setattr(self, dst_option, getattr(src_cmd_obj, src_option))
+
+    def get_finalized_command(self, command, create=1):
+        """Wrapper around Distribution's 'get_command_obj()' method: find
+        (create if necessary and 'create' is true) the command object for
+        'command', call its 'ensure_finalized()' method, and return the
+        finalized command object.
+        """
+        cmd_obj = self.distribution.get_command_obj(command, create)
+        cmd_obj.ensure_finalized()
+        return cmd_obj
+
+    # XXX rename to 'get_reinitialized_command()'? (should do the
+    # same in dist.py, if so)
+    def reinitialize_command(self, command, reinit_subcommands=0):
+        return self.distribution.reinitialize_command(command,
+                                                      reinit_subcommands)
+
+    def run_command(self, command):
+        """Run some other command: uses the 'run_command()' method of
+        Distribution, which creates and finalizes the command object if
+        necessary and then invokes its 'run()' method.
+        """
+        self.distribution.run_command(command)
+
+    def get_sub_commands(self):
+        """Determine the sub-commands that are relevant in the current
+        distribution (ie., that need to be run).  This is based on the
+        'sub_commands' class attribute: each tuple in that list may include
+        a method that we call to determine if the subcommand needs to be
+        run for the current distribution.  Return a list of command names.
+        """
+        commands = []
+        for (cmd_name, method) in self.sub_commands:
+            if method is None or method(self):
+                commands.append(cmd_name)
+        return commands
+
+
+    # -- External world manipulation -----------------------------------
+
+    def warn(self, msg):
+        log.warn("warning: %s: %s\n", self.get_command_name(), msg)
+
+    def execute(self, func, args, msg=None, level=1):
+        util.execute(func, args, msg, dry_run=self.dry_run)
+
+    def mkpath(self, name, mode=0o777):
+        dir_util.mkpath(name, mode, dry_run=self.dry_run)
+
+    def copy_file(self, infile, outfile, preserve_mode=1, preserve_times=1,
+                  link=None, level=1):
+        """Copy a file respecting verbose, dry-run and force flags.  (The
+        former two default to whatever is in the Distribution object, and
+        the latter defaults to false for commands that don't define it.)"""
+        return file_util.copy_file(infile, outfile, preserve_mode,
+                                   preserve_times, not self.force, link,
+                                   dry_run=self.dry_run)
+
+    def copy_tree(self, infile, outfile, preserve_mode=1, preserve_times=1,
+                   preserve_symlinks=0, level=1):
+        """Copy an entire directory tree respecting verbose, dry-run,
+        and force flags.
+        """
+        return dir_util.copy_tree(infile, outfile, preserve_mode,
+                                  preserve_times, preserve_symlinks,
+                                  not self.force, dry_run=self.dry_run)
+
+    def move_file (self, src, dst, level=1):
+        """Move a file respecting dry-run flag."""
+        return file_util.move_file(src, dst, dry_run=self.dry_run)
+
+    def spawn(self, cmd, search_path=1, level=1):
+        """Spawn an external command respecting dry-run flag."""
+        from distutils.spawn import spawn
+        spawn(cmd, search_path, dry_run=self.dry_run)
+
+    def make_archive(self, base_name, format, root_dir=None, base_dir=None,
+                     owner=None, group=None):
+        return archive_util.make_archive(base_name, format, root_dir, base_dir,
+                                         dry_run=self.dry_run,
+                                         owner=owner, group=group)
+
+    def make_file(self, infiles, outfile, func, args,
+                  exec_msg=None, skip_msg=None, level=1):
+        """Special case of 'execute()' for operations that process one or
+        more input files and generate one output file.  Works just like
+        'execute()', except the operation is skipped and a different
+        message printed if 'outfile' already exists and is newer than all
+        files listed in 'infiles'.  If the command defined 'self.force',
+        and it is true, then the command is unconditionally run -- does no
+        timestamp checks.
+        """
+        if skip_msg is None:
+            skip_msg = "skipping %s (inputs unchanged)" % outfile
+
+        # Allow 'infiles' to be a single string
+        if isinstance(infiles, str):
+            infiles = (infiles,)
+        elif not isinstance(infiles, (list, tuple)):
+            raise TypeError(
+                  "'infiles' must be a string, or a list or tuple of strings")
+
+        if exec_msg is None:
+            exec_msg = "generating %s from %s" % (outfile, ', '.join(infiles))
+
+        # If 'outfile' must be regenerated (either because it doesn't
+        # exist, is out-of-date, or the 'force' flag is true) then
+        # perform the action that presumably regenerates it
+        if self.force or dep_util.newer_group(infiles, outfile):
+            self.execute(func, args, exec_msg, level)
+        # Otherwise, print the "skip" message
+        else:
+            log.debug(skip_msg)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/__init__.py b/venv/Lib/site-packages/setuptools/_distutils/command/__init__.py
new file mode 100644
index 0000000..481eea9
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/__init__.py
@@ -0,0 +1,31 @@
+"""distutils.command
+
+Package containing implementation of all the standard Distutils
+commands."""
+
+__all__ = ['build',
+           'build_py',
+           'build_ext',
+           'build_clib',
+           'build_scripts',
+           'clean',
+           'install',
+           'install_lib',
+           'install_headers',
+           'install_scripts',
+           'install_data',
+           'sdist',
+           'register',
+           'bdist',
+           'bdist_dumb',
+           'bdist_rpm',
+           'bdist_wininst',
+           'check',
+           'upload',
+           # These two are reserved for future use:
+           #'bdist_sdux',
+           #'bdist_pkgtool',
+           # Note:
+           # bdist_packager is not included because it only provides
+           # an abstract base class
+          ]
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/bdist.py b/venv/Lib/site-packages/setuptools/_distutils/command/bdist.py
new file mode 100644
index 0000000..014871d
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/bdist.py
@@ -0,0 +1,143 @@
+"""distutils.command.bdist
+
+Implements the Distutils 'bdist' command (create a built [binary]
+distribution)."""
+
+import os
+from distutils.core import Command
+from distutils.errors import *
+from distutils.util import get_platform
+
+
+def show_formats():
+    """Print list of available formats (arguments to "--format" option).
+    """
+    from distutils.fancy_getopt import FancyGetopt
+    formats = []
+    for format in bdist.format_commands:
+        formats.append(("formats=" + format, None,
+                        bdist.format_command[format][1]))
+    pretty_printer = FancyGetopt(formats)
+    pretty_printer.print_help("List of available distribution formats:")
+
+
+class bdist(Command):
+
+    description = "create a built (binary) distribution"
+
+    user_options = [('bdist-base=', 'b',
+                     "temporary directory for creating built distributions"),
+                    ('plat-name=', 'p',
+                     "platform name to embed in generated filenames "
+                     "(default: %s)" % get_platform()),
+                    ('formats=', None,
+                     "formats for distribution (comma-separated list)"),
+                    ('dist-dir=', 'd',
+                     "directory to put final built distributions in "
+                     "[default: dist]"),
+                    ('skip-build', None,
+                     "skip rebuilding everything (for testing/debugging)"),
+                    ('owner=', 'u',
+                     "Owner name used when creating a tar file"
+                     " [default: current user]"),
+                    ('group=', 'g',
+                     "Group name used when creating a tar file"
+                     " [default: current group]"),
+                   ]
+
+    boolean_options = ['skip-build']
+
+    help_options = [
+        ('help-formats', None,
+         "lists available distribution formats", show_formats),
+        ]
+
+    # The following commands do not take a format option from bdist
+    no_format_option = ('bdist_rpm',)
+
+    # This won't do in reality: will need to distinguish RPM-ish Linux,
+    # Debian-ish Linux, Solaris, FreeBSD, ..., Windows, Mac OS.
+    default_format = {'posix': 'gztar',
+                      'nt': 'zip'}
+
+    # Establish the preferred order (for the --help-formats option).
+    format_commands = ['rpm', 'gztar', 'bztar', 'xztar', 'ztar', 'tar',
+                       'wininst', 'zip', 'msi']
+
+    # And the real information.
+    format_command = {'rpm':   ('bdist_rpm',  "RPM distribution"),
+                      'gztar': ('bdist_dumb', "gzip'ed tar file"),
+                      'bztar': ('bdist_dumb', "bzip2'ed tar file"),
+                      'xztar': ('bdist_dumb', "xz'ed tar file"),
+                      'ztar':  ('bdist_dumb', "compressed tar file"),
+                      'tar':   ('bdist_dumb', "tar file"),
+                      'wininst': ('bdist_wininst',
+                                  "Windows executable installer"),
+                      'zip':   ('bdist_dumb', "ZIP file"),
+                      'msi':   ('bdist_msi',  "Microsoft Installer")
+                      }
+
+
+    def initialize_options(self):
+        self.bdist_base = None
+        self.plat_name = None
+        self.formats = None
+        self.dist_dir = None
+        self.skip_build = 0
+        self.group = None
+        self.owner = None
+
+    def finalize_options(self):
+        # have to finalize 'plat_name' before 'bdist_base'
+        if self.plat_name is None:
+            if self.skip_build:
+                self.plat_name = get_platform()
+            else:
+                self.plat_name = self.get_finalized_command('build').plat_name
+
+        # 'bdist_base' -- parent of per-built-distribution-format
+        # temporary directories (eg. we'll probably have
+        # "build/bdist.<plat>/dumb", "build/bdist.<plat>/rpm", etc.)
+        if self.bdist_base is None:
+            build_base = self.get_finalized_command('build').build_base
+            self.bdist_base = os.path.join(build_base,
+                                           'bdist.' + self.plat_name)
+
+        self.ensure_string_list('formats')
+        if self.formats is None:
+            try:
+                self.formats = [self.default_format[os.name]]
+            except KeyError:
+                raise DistutilsPlatformError(
+                      "don't know how to create built distributions "
+                      "on platform %s" % os.name)
+
+        if self.dist_dir is None:
+            self.dist_dir = "dist"
+
+    def run(self):
+        # Figure out which sub-commands we need to run.
+        commands = []
+        for format in self.formats:
+            try:
+                commands.append(self.format_command[format][0])
+            except KeyError:
+                raise DistutilsOptionError("invalid format '%s'" % format)
+
+        # Reinitialize and run each command.
+        for i in range(len(self.formats)):
+            cmd_name = commands[i]
+            sub_cmd = self.reinitialize_command(cmd_name)
+            if cmd_name not in self.no_format_option:
+                sub_cmd.format = self.formats[i]
+
+            # passing the owner and group names for tar archiving
+            if cmd_name == 'bdist_dumb':
+                sub_cmd.owner = self.owner
+                sub_cmd.group = self.group
+
+            # If we're going to need to run this command again, tell it to
+            # keep its temporary files around so subsequent runs go faster.
+            if cmd_name in commands[i+1:]:
+                sub_cmd.keep_temp = 1
+            self.run_command(cmd_name)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py b/venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py
new file mode 100644
index 0000000..f0d6b5b
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py
@@ -0,0 +1,123 @@
+"""distutils.command.bdist_dumb
+
+Implements the Distutils 'bdist_dumb' command (create a "dumb" built
+distribution -- i.e., just an archive to be unpacked under $prefix or
+$exec_prefix)."""
+
+import os
+from distutils.core import Command
+from distutils.util import get_platform
+from distutils.dir_util import remove_tree, ensure_relative
+from distutils.errors import *
+from distutils.sysconfig import get_python_version
+from distutils import log
+
+class bdist_dumb(Command):
+
+    description = "create a \"dumb\" built distribution"
+
+    user_options = [('bdist-dir=', 'd',
+                     "temporary directory for creating the distribution"),
+                    ('plat-name=', 'p',
+                     "platform name to embed in generated filenames "
+                     "(default: %s)" % get_platform()),
+                    ('format=', 'f',
+                     "archive format to create (tar, gztar, bztar, xztar, "
+                     "ztar, zip)"),
+                    ('keep-temp', 'k',
+                     "keep the pseudo-installation tree around after " +
+                     "creating the distribution archive"),
+                    ('dist-dir=', 'd',
+                     "directory to put final built distributions in"),
+                    ('skip-build', None,
+                     "skip rebuilding everything (for testing/debugging)"),
+                    ('relative', None,
+                     "build the archive using relative paths "
+                     "(default: false)"),
+                    ('owner=', 'u',
+                     "Owner name used when creating a tar file"
+                     " [default: current user]"),
+                    ('group=', 'g',
+                     "Group name used when creating a tar file"
+                     " [default: current group]"),
+                   ]
+
+    boolean_options = ['keep-temp', 'skip-build', 'relative']
+
+    default_format = { 'posix': 'gztar',
+                       'nt': 'zip' }
+
+    def initialize_options(self):
+        self.bdist_dir = None
+        self.plat_name = None
+        self.format = None
+        self.keep_temp = 0
+        self.dist_dir = None
+        self.skip_build = None
+        self.relative = 0
+        self.owner = None
+        self.group = None
+
+    def finalize_options(self):
+        if self.bdist_dir is None:
+            bdist_base = self.get_finalized_command('bdist').bdist_base
+            self.bdist_dir = os.path.join(bdist_base, 'dumb')
+
+        if self.format is None:
+            try:
+                self.format = self.default_format[os.name]
+            except KeyError:
+                raise DistutilsPlatformError(
+                       "don't know how to create dumb built distributions "
+                       "on platform %s" % os.name)
+
+        self.set_undefined_options('bdist',
+                                   ('dist_dir', 'dist_dir'),
+                                   ('plat_name', 'plat_name'),
+                                   ('skip_build', 'skip_build'))
+
+    def run(self):
+        if not self.skip_build:
+            self.run_command('build')
+
+        install = self.reinitialize_command('install', reinit_subcommands=1)
+        install.root = self.bdist_dir
+        install.skip_build = self.skip_build
+        install.warn_dir = 0
+
+        log.info("installing to %s", self.bdist_dir)
+        self.run_command('install')
+
+        # And make an archive relative to the root of the
+        # pseudo-installation tree.
+        archive_basename = "%s.%s" % (self.distribution.get_fullname(),
+                                      self.plat_name)
+
+        pseudoinstall_root = os.path.join(self.dist_dir, archive_basename)
+        if not self.relative:
+            archive_root = self.bdist_dir
+        else:
+            if (self.distribution.has_ext_modules() and
+                (install.install_base != install.install_platbase)):
+                raise DistutilsPlatformError(
+                       "can't make a dumb built distribution where "
+                       "base and platbase are different (%s, %s)"
+                       % (repr(install.install_base),
+                          repr(install.install_platbase)))
+            else:
+                archive_root = os.path.join(self.bdist_dir,
+                                   ensure_relative(install.install_base))
+
+        # Make the archive
+        filename = self.make_archive(pseudoinstall_root,
+                                     self.format, root_dir=archive_root,
+                                     owner=self.owner, group=self.group)
+        if self.distribution.has_ext_modules():
+            pyversion = get_python_version()
+        else:
+            pyversion = 'any'
+        self.distribution.dist_files.append(('bdist_dumb', pyversion,
+                                             filename))
+
+        if not self.keep_temp:
+            remove_tree(self.bdist_dir, dry_run=self.dry_run)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py b/venv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py
new file mode 100644
index 0000000..0863a18
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py
@@ -0,0 +1,749 @@
+# Copyright (C) 2005, 2006 Martin von Löwis
+# Licensed to PSF under a Contributor Agreement.
+# The bdist_wininst command proper
+# based on bdist_wininst
+"""
+Implements the bdist_msi command.
+"""
+
+import os
+import sys
+import warnings
+from distutils.core import Command
+from distutils.dir_util import remove_tree
+from distutils.sysconfig import get_python_version
+from distutils.version import StrictVersion
+from distutils.errors import DistutilsOptionError
+from distutils.util import get_platform
+from distutils import log
+import msilib
+from msilib import schema, sequence, text
+from msilib import Directory, Feature, Dialog, add_data
+
+class PyDialog(Dialog):
+    """Dialog class with a fixed layout: controls at the top, then a ruler,
+    then a list of buttons: back, next, cancel. Optionally a bitmap at the
+    left."""
+    def __init__(self, *args, **kw):
+        """Dialog(database, name, x, y, w, h, attributes, title, first,
+        default, cancel, bitmap=true)"""
+        Dialog.__init__(self, *args)
+        ruler = self.h - 36
+        bmwidth = 152*ruler/328
+        #if kw.get("bitmap", True):
+        #    self.bitmap("Bitmap", 0, 0, bmwidth, ruler, "PythonWin")
+        self.line("BottomLine", 0, ruler, self.w, 0)
+
+    def title(self, title):
+        "Set the title text of the dialog at the top."
+        # name, x, y, w, h, flags=Visible|Enabled|Transparent|NoPrefix,
+        # text, in VerdanaBold10
+        self.text("Title", 15, 10, 320, 60, 0x30003,
+                  r"{\VerdanaBold10}%s" % title)
+
+    def back(self, title, next, name = "Back", active = 1):
+        """Add a back button with a given title, the tab-next button,
+        its name in the Control table, possibly initially disabled.
+
+        Return the button, so that events can be associated"""
+        if active:
+            flags = 3 # Visible|Enabled
+        else:
+            flags = 1 # Visible
+        return self.pushbutton(name, 180, self.h-27 , 56, 17, flags, title, next)
+
+    def cancel(self, title, next, name = "Cancel", active = 1):
+        """Add a cancel button with a given title, the tab-next button,
+        its name in the Control table, possibly initially disabled.
+
+        Return the button, so that events can be associated"""
+        if active:
+            flags = 3 # Visible|Enabled
+        else:
+            flags = 1 # Visible
+        return self.pushbutton(name, 304, self.h-27, 56, 17, flags, title, next)
+
+    def next(self, title, next, name = "Next", active = 1):
+        """Add a Next button with a given title, the tab-next button,
+        its name in the Control table, possibly initially disabled.
+
+        Return the button, so that events can be associated"""
+        if active:
+            flags = 3 # Visible|Enabled
+        else:
+            flags = 1 # Visible
+        return self.pushbutton(name, 236, self.h-27, 56, 17, flags, title, next)
+
+    def xbutton(self, name, title, next, xpos):
+        """Add a button with a given title, the tab-next button,
+        its name in the Control table, giving its x position; the
+        y-position is aligned with the other buttons.
+
+        Return the button, so that events can be associated"""
+        return self.pushbutton(name, int(self.w*xpos - 28), self.h-27, 56, 17, 3, title, next)
+
+class bdist_msi(Command):
+
+    description = "create a Microsoft Installer (.msi) binary distribution"
+
+    user_options = [('bdist-dir=', None,
+                     "temporary directory for creating the distribution"),
+                    ('plat-name=', 'p',
+                     "platform name to embed in generated filenames "
+                     "(default: %s)" % get_platform()),
+                    ('keep-temp', 'k',
+                     "keep the pseudo-installation tree around after " +
+                     "creating the distribution archive"),
+                    ('target-version=', None,
+                     "require a specific python version" +
+                     " on the target system"),
+                    ('no-target-compile', 'c',
+                     "do not compile .py to .pyc on the target system"),
+                    ('no-target-optimize', 'o',
+                     "do not compile .py to .pyo (optimized) "
+                     "on the target system"),
+                    ('dist-dir=', 'd',
+                     "directory to put final built distributions in"),
+                    ('skip-build', None,
+                     "skip rebuilding everything (for testing/debugging)"),
+                    ('install-script=', None,
+                     "basename of installation script to be run after "
+                     "installation or before deinstallation"),
+                    ('pre-install-script=', None,
+                     "Fully qualified filename of a script to be run before "
+                     "any files are installed.  This script need not be in the "
+                     "distribution"),
+                   ]
+
+    boolean_options = ['keep-temp', 'no-target-compile', 'no-target-optimize',
+                       'skip-build']
+
+    all_versions = ['2.0', '2.1', '2.2', '2.3', '2.4',
+                    '2.5', '2.6', '2.7', '2.8', '2.9',
+                    '3.0', '3.1', '3.2', '3.3', '3.4',
+                    '3.5', '3.6', '3.7', '3.8', '3.9']
+    other_version = 'X'
+
+    def __init__(self, *args, **kw):
+        super().__init__(*args, **kw)
+        warnings.warn("bdist_msi command is deprecated since Python 3.9, "
+                      "use bdist_wheel (wheel packages) instead",
+                      DeprecationWarning, 2)
+
+    def initialize_options(self):
+        self.bdist_dir = None
+        self.plat_name = None
+        self.keep_temp = 0
+        self.no_target_compile = 0
+        self.no_target_optimize = 0
+        self.target_version = None
+        self.dist_dir = None
+        self.skip_build = None
+        self.install_script = None
+        self.pre_install_script = None
+        self.versions = None
+
+    def finalize_options(self):
+        self.set_undefined_options('bdist', ('skip_build', 'skip_build'))
+
+        if self.bdist_dir is None:
+            bdist_base = self.get_finalized_command('bdist').bdist_base
+            self.bdist_dir = os.path.join(bdist_base, 'msi')
+
+        short_version = get_python_version()
+        if (not self.target_version) and self.distribution.has_ext_modules():
+            self.target_version = short_version
+
+        if self.target_version:
+            self.versions = [self.target_version]
+            if not self.skip_build and self.distribution.has_ext_modules()\
+               and self.target_version != short_version:
+                raise DistutilsOptionError(
+                      "target version can only be %s, or the '--skip-build'"
+                      " option must be specified" % (short_version,))
+        else:
+            self.versions = list(self.all_versions)
+
+        self.set_undefined_options('bdist',
+                                   ('dist_dir', 'dist_dir'),
+                                   ('plat_name', 'plat_name'),
+                                   )
+
+        if self.pre_install_script:
+            raise DistutilsOptionError(
+                  "the pre-install-script feature is not yet implemented")
+
+        if self.install_script:
+            for script in self.distribution.scripts:
+                if self.install_script == os.path.basename(script):
+                    break
+            else:
+                raise DistutilsOptionError(
+                      "install_script '%s' not found in scripts"
+                      % self.install_script)
+        self.install_script_key = None
+
+    def run(self):
+        if not self.skip_build:
+            self.run_command('build')
+
+        install = self.reinitialize_command('install', reinit_subcommands=1)
+        install.prefix = self.bdist_dir
+        install.skip_build = self.skip_build
+        install.warn_dir = 0
+
+        install_lib = self.reinitialize_command('install_lib')
+        # we do not want to include pyc or pyo files
+        install_lib.compile = 0
+        install_lib.optimize = 0
+
+        if self.distribution.has_ext_modules():
+            # If we are building an installer for a Python version other
+            # than the one we are currently running, then we need to ensure
+            # our build_lib reflects the other Python version rather than ours.
+            # Note that for target_version!=sys.version, we must have skipped the
+            # build step, so there is no issue with enforcing the build of this
+            # version.
+            target_version = self.target_version
+            if not target_version:
+                assert self.skip_build, "Should have already checked this"
+                target_version = '%d.%d' % sys.version_info[:2]
+            plat_specifier = ".%s-%s" % (self.plat_name, target_version)
+            build = self.get_finalized_command('build')
+            build.build_lib = os.path.join(build.build_base,
+                                           'lib' + plat_specifier)
+
+        log.info("installing to %s", self.bdist_dir)
+        install.ensure_finalized()
+
+        # avoid warning of 'install_lib' about installing
+        # into a directory not in sys.path
+        sys.path.insert(0, os.path.join(self.bdist_dir, 'PURELIB'))
+
+        install.run()
+
+        del sys.path[0]
+
+        self.mkpath(self.dist_dir)
+        fullname = self.distribution.get_fullname()
+        installer_name = self.get_installer_filename(fullname)
+        installer_name = os.path.abspath(installer_name)
+        if os.path.exists(installer_name): os.unlink(installer_name)
+
+        metadata = self.distribution.metadata
+        author = metadata.author
+        if not author:
+            author = metadata.maintainer
+        if not author:
+            author = "UNKNOWN"
+        version = metadata.get_version()
+        # ProductVersion must be strictly numeric
+        # XXX need to deal with prerelease versions
+        sversion = "%d.%d.%d" % StrictVersion(version).version
+        # Prefix ProductName with Python x.y, so that
+        # it sorts together with the other Python packages
+        # in Add-Remove-Programs (APR)
+        fullname = self.distribution.get_fullname()
+        if self.target_version:
+            product_name = "Python %s %s" % (self.target_version, fullname)
+        else:
+            product_name = "Python %s" % (fullname)
+        self.db = msilib.init_database(installer_name, schema,
+                product_name, msilib.gen_uuid(),
+                sversion, author)
+        msilib.add_tables(self.db, sequence)
+        props = [('DistVersion', version)]
+        email = metadata.author_email or metadata.maintainer_email
+        if email:
+            props.append(("ARPCONTACT", email))
+        if metadata.url:
+            props.append(("ARPURLINFOABOUT", metadata.url))
+        if props:
+            add_data(self.db, 'Property', props)
+
+        self.add_find_python()
+        self.add_files()
+        self.add_scripts()
+        self.add_ui()
+        self.db.Commit()
+
+        if hasattr(self.distribution, 'dist_files'):
+            tup = 'bdist_msi', self.target_version or 'any', fullname
+            self.distribution.dist_files.append(tup)
+
+        if not self.keep_temp:
+            remove_tree(self.bdist_dir, dry_run=self.dry_run)
+
+    def add_files(self):
+        db = self.db
+        cab = msilib.CAB("distfiles")
+        rootdir = os.path.abspath(self.bdist_dir)
+
+        root = Directory(db, cab, None, rootdir, "TARGETDIR", "SourceDir")
+        f = Feature(db, "Python", "Python", "Everything",
+                    0, 1, directory="TARGETDIR")
+
+        items = [(f, root, '')]
+        for version in self.versions + [self.other_version]:
+            target = "TARGETDIR" + version
+            name = default = "Python" + version
+            desc = "Everything"
+            if version is self.other_version:
+                title = "Python from another location"
+                level = 2
+            else:
+                title = "Python %s from registry" % version
+                level = 1
+            f = Feature(db, name, title, desc, 1, level, directory=target)
+            dir = Directory(db, cab, root, rootdir, target, default)
+            items.append((f, dir, version))
+        db.Commit()
+
+        seen = {}
+        for feature, dir, version in items:
+            todo = [dir]
+            while todo:
+                dir = todo.pop()
+                for file in os.listdir(dir.absolute):
+                    afile = os.path.join(dir.absolute, file)
+                    if os.path.isdir(afile):
+                        short = "%s|%s" % (dir.make_short(file), file)
+                        default = file + version
+                        newdir = Directory(db, cab, dir, file, default, short)
+                        todo.append(newdir)
+                    else:
+                        if not dir.component:
+                            dir.start_component(dir.logical, feature, 0)
+                        if afile not in seen:
+                            key = seen[afile] = dir.add_file(file)
+                            if file==self.install_script:
+                                if self.install_script_key:
+                                    raise DistutilsOptionError(
+                                          "Multiple files with name %s" % file)
+                                self.install_script_key = '[#%s]' % key
+                        else:
+                            key = seen[afile]
+                            add_data(self.db, "DuplicateFile",
+                                [(key + version, dir.component, key, None, dir.logical)])
+            db.Commit()
+        cab.commit(db)
+
+    def add_find_python(self):
+        """Adds code to the installer to compute the location of Python.
+
+        Properties PYTHON.MACHINE.X.Y and PYTHON.USER.X.Y will be set from the
+        registry for each version of Python.
+
+        Properties TARGETDIRX.Y will be set from PYTHON.USER.X.Y if defined,
+        else from PYTHON.MACHINE.X.Y.
+
+        Properties PYTHONX.Y will be set to TARGETDIRX.Y\\python.exe"""
+
+        start = 402
+        for ver in self.versions:
+            install_path = r"SOFTWARE\Python\PythonCore\%s\InstallPath" % ver
+            machine_reg = "python.machine." + ver
+            user_reg = "python.user." + ver
+            machine_prop = "PYTHON.MACHINE." + ver
+            user_prop = "PYTHON.USER." + ver
+            machine_action = "PythonFromMachine" + ver
+            user_action = "PythonFromUser" + ver
+            exe_action = "PythonExe" + ver
+            target_dir_prop = "TARGETDIR" + ver
+            exe_prop = "PYTHON" + ver
+            if msilib.Win64:
+                # type: msidbLocatorTypeRawValue + msidbLocatorType64bit
+                Type = 2+16
+            else:
+                Type = 2
+            add_data(self.db, "RegLocator",
+                    [(machine_reg, 2, install_path, None, Type),
+                     (user_reg, 1, install_path, None, Type)])
+            add_data(self.db, "AppSearch",
+                    [(machine_prop, machine_reg),
+                     (user_prop, user_reg)])
+            add_data(self.db, "CustomAction",
+                    [(machine_action, 51+256, target_dir_prop, "[" + machine_prop + "]"),
+                     (user_action, 51+256, target_dir_prop, "[" + user_prop + "]"),
+                     (exe_action, 51+256, exe_prop, "[" + target_dir_prop + "]\\python.exe"),
+                    ])
+            add_data(self.db, "InstallExecuteSequence",
+                    [(machine_action, machine_prop, start),
+                     (user_action, user_prop, start + 1),
+                     (exe_action, None, start + 2),
+                    ])
+            add_data(self.db, "InstallUISequence",
+                    [(machine_action, machine_prop, start),
+                     (user_action, user_prop, start + 1),
+                     (exe_action, None, start + 2),
+                    ])
+            add_data(self.db, "Condition",
+                    [("Python" + ver, 0, "NOT TARGETDIR" + ver)])
+            start += 4
+            assert start < 500
+
+    def add_scripts(self):
+        if self.install_script:
+            start = 6800
+            for ver in self.versions + [self.other_version]:
+                install_action = "install_script." + ver
+                exe_prop = "PYTHON" + ver
+                add_data(self.db, "CustomAction",
+                        [(install_action, 50, exe_prop, self.install_script_key)])
+                add_data(self.db, "InstallExecuteSequence",
+                        [(install_action, "&Python%s=3" % ver, start)])
+                start += 1
+        # XXX pre-install scripts are currently refused in finalize_options()
+        #     but if this feature is completed, it will also need to add
+        #     entries for each version as the above code does
+        if self.pre_install_script:
+            scriptfn = os.path.join(self.bdist_dir, "preinstall.bat")
+            with open(scriptfn, "w") as f:
+                # The batch file will be executed with [PYTHON], so that %1
+                # is the path to the Python interpreter; %0 will be the path
+                # of the batch file.
+                # rem ="""
+                # %1 %0
+                # exit
+                # """
+                # <actual script>
+                f.write('rem ="""\n%1 %0\nexit\n"""\n')
+                with open(self.pre_install_script) as fin:
+                    f.write(fin.read())
+            add_data(self.db, "Binary",
+                [("PreInstall", msilib.Binary(scriptfn))
+                ])
+            add_data(self.db, "CustomAction",
+                [("PreInstall", 2, "PreInstall", None)
+                ])
+            add_data(self.db, "InstallExecuteSequence",
+                    [("PreInstall", "NOT Installed", 450)])
+
+
+    def add_ui(self):
+        db = self.db
+        x = y = 50
+        w = 370
+        h = 300
+        title = "[ProductName] Setup"
+
+        # see "Dialog Style Bits"
+        modal = 3      # visible | modal
+        modeless = 1   # visible
+        track_disk_space = 32
+
+        # UI customization properties
+        add_data(db, "Property",
+                 # See "DefaultUIFont Property"
+                 [("DefaultUIFont", "DlgFont8"),
+                  # See "ErrorDialog Style Bit"
+                  ("ErrorDialog", "ErrorDlg"),
+                  ("Progress1", "Install"),   # modified in maintenance type dlg
+                  ("Progress2", "installs"),
+                  ("MaintenanceForm_Action", "Repair"),
+                  # possible values: ALL, JUSTME
+                  ("WhichUsers", "ALL")
+                 ])
+
+        # Fonts, see "TextStyle Table"
+        add_data(db, "TextStyle",
+                 [("DlgFont8", "Tahoma", 9, None, 0),
+                  ("DlgFontBold8", "Tahoma", 8, None, 1), #bold
+                  ("VerdanaBold10", "Verdana", 10, None, 1),
+                  ("VerdanaRed9", "Verdana", 9, 255, 0),
+                 ])
+
+        # UI Sequences, see "InstallUISequence Table", "Using a Sequence Table"
+        # Numbers indicate sequence; see sequence.py for how these action integrate
+        add_data(db, "InstallUISequence",
+                 [("PrepareDlg", "Not Privileged or Windows9x or Installed", 140),
+                  ("WhichUsersDlg", "Privileged and not Windows9x and not Installed", 141),
+                  # In the user interface, assume all-users installation if privileged.
+                  ("SelectFeaturesDlg", "Not Installed", 1230),
+                  # XXX no support for resume installations yet
+                  #("ResumeDlg", "Installed AND (RESUME OR Preselected)", 1240),
+                  ("MaintenanceTypeDlg", "Installed AND NOT RESUME AND NOT Preselected", 1250),
+                  ("ProgressDlg", None, 1280)])
+
+        add_data(db, 'ActionText', text.ActionText)
+        add_data(db, 'UIText', text.UIText)
+        #####################################################################
+        # Standard dialogs: FatalError, UserExit, ExitDialog
+        fatal=PyDialog(db, "FatalError", x, y, w, h, modal, title,
+                     "Finish", "Finish", "Finish")
+        fatal.title("[ProductName] Installer ended prematurely")
+        fatal.back("< Back", "Finish", active = 0)
+        fatal.cancel("Cancel", "Back", active = 0)
+        fatal.text("Description1", 15, 70, 320, 80, 0x30003,
+                   "[ProductName] setup ended prematurely because of an error.  Your system has not been modified.  To install this program at a later time, please run the installation again.")
+        fatal.text("Description2", 15, 155, 320, 20, 0x30003,
+                   "Click the Finish button to exit the Installer.")
+        c=fatal.next("Finish", "Cancel", name="Finish")
+        c.event("EndDialog", "Exit")
+
+        user_exit=PyDialog(db, "UserExit", x, y, w, h, modal, title,
+                     "Finish", "Finish", "Finish")
+        user_exit.title("[ProductName] Installer was interrupted")
+        user_exit.back("< Back", "Finish", active = 0)
+        user_exit.cancel("Cancel", "Back", active = 0)
+        user_exit.text("Description1", 15, 70, 320, 80, 0x30003,
+                   "[ProductName] setup was interrupted.  Your system has not been modified.  "
+                   "To install this program at a later time, please run the installation again.")
+        user_exit.text("Description2", 15, 155, 320, 20, 0x30003,
+                   "Click the Finish button to exit the Installer.")
+        c = user_exit.next("Finish", "Cancel", name="Finish")
+        c.event("EndDialog", "Exit")
+
+        exit_dialog = PyDialog(db, "ExitDialog", x, y, w, h, modal, title,
+                             "Finish", "Finish", "Finish")
+        exit_dialog.title("Completing the [ProductName] Installer")
+        exit_dialog.back("< Back", "Finish", active = 0)
+        exit_dialog.cancel("Cancel", "Back", active = 0)
+        exit_dialog.text("Description", 15, 235, 320, 20, 0x30003,
+                   "Click the Finish button to exit the Installer.")
+        c = exit_dialog.next("Finish", "Cancel", name="Finish")
+        c.event("EndDialog", "Return")
+
+        #####################################################################
+        # Required dialog: FilesInUse, ErrorDlg
+        inuse = PyDialog(db, "FilesInUse",
+                         x, y, w, h,
+                         19,                # KeepModeless|Modal|Visible
+                         title,
+                         "Retry", "Retry", "Retry", bitmap=False)
+        inuse.text("Title", 15, 6, 200, 15, 0x30003,
+                   r"{\DlgFontBold8}Files in Use")
+        inuse.text("Description", 20, 23, 280, 20, 0x30003,
+               "Some files that need to be updated are currently in use.")
+        inuse.text("Text", 20, 55, 330, 50, 3,
+                   "The following applications are using files that need to be updated by this setup. Close these applications and then click Retry to continue the installation or Cancel to exit it.")
+        inuse.control("List", "ListBox", 20, 107, 330, 130, 7, "FileInUseProcess",
+                      None, None, None)
+        c=inuse.back("Exit", "Ignore", name="Exit")
+        c.event("EndDialog", "Exit")
+        c=inuse.next("Ignore", "Retry", name="Ignore")
+        c.event("EndDialog", "Ignore")
+        c=inuse.cancel("Retry", "Exit", name="Retry")
+        c.event("EndDialog","Retry")
+
+        # See "Error Dialog". See "ICE20" for the required names of the controls.
+        error = Dialog(db, "ErrorDlg",
+                       50, 10, 330, 101,
+                       65543,       # Error|Minimize|Modal|Visible
+                       title,
+                       "ErrorText", None, None)
+        error.text("ErrorText", 50,9,280,48,3, "")
+        #error.control("ErrorIcon", "Icon", 15, 9, 24, 24, 5242881, None, "py.ico", None, None)
+        error.pushbutton("N",120,72,81,21,3,"No",None).event("EndDialog","ErrorNo")
+        error.pushbutton("Y",240,72,81,21,3,"Yes",None).event("EndDialog","ErrorYes")
+        error.pushbutton("A",0,72,81,21,3,"Abort",None).event("EndDialog","ErrorAbort")
+        error.pushbutton("C",42,72,81,21,3,"Cancel",None).event("EndDialog","ErrorCancel")
+        error.pushbutton("I",81,72,81,21,3,"Ignore",None).event("EndDialog","ErrorIgnore")
+        error.pushbutton("O",159,72,81,21,3,"Ok",None).event("EndDialog","ErrorOk")
+        error.pushbutton("R",198,72,81,21,3,"Retry",None).event("EndDialog","ErrorRetry")
+
+        #####################################################################
+        # Global "Query Cancel" dialog
+        cancel = Dialog(db, "CancelDlg", 50, 10, 260, 85, 3, title,
+                        "No", "No", "No")
+        cancel.text("Text", 48, 15, 194, 30, 3,
+                    "Are you sure you want to cancel [ProductName] installation?")
+        #cancel.control("Icon", "Icon", 15, 15, 24, 24, 5242881, None,
+        #               "py.ico", None, None)
+        c=cancel.pushbutton("Yes", 72, 57, 56, 17, 3, "Yes", "No")
+        c.event("EndDialog", "Exit")
+
+        c=cancel.pushbutton("No", 132, 57, 56, 17, 3, "No", "Yes")
+        c.event("EndDialog", "Return")
+
+        #####################################################################
+        # Global "Wait for costing" dialog
+        costing = Dialog(db, "WaitForCostingDlg", 50, 10, 260, 85, modal, title,
+                         "Return", "Return", "Return")
+        costing.text("Text", 48, 15, 194, 30, 3,
+                     "Please wait while the installer finishes determining your disk space requirements.")
+        c = costing.pushbutton("Return", 102, 57, 56, 17, 3, "Return", None)
+        c.event("EndDialog", "Exit")
+
+        #####################################################################
+        # Preparation dialog: no user input except cancellation
+        prep = PyDialog(db, "PrepareDlg", x, y, w, h, modeless, title,
+                        "Cancel", "Cancel", "Cancel")
+        prep.text("Description", 15, 70, 320, 40, 0x30003,
+                  "Please wait while the Installer prepares to guide you through the installation.")
+        prep.title("Welcome to the [ProductName] Installer")
+        c=prep.text("ActionText", 15, 110, 320, 20, 0x30003, "Pondering...")
+        c.mapping("ActionText", "Text")
+        c=prep.text("ActionData", 15, 135, 320, 30, 0x30003, None)
+        c.mapping("ActionData", "Text")
+        prep.back("Back", None, active=0)
+        prep.next("Next", None, active=0)
+        c=prep.cancel("Cancel", None)
+        c.event("SpawnDialog", "CancelDlg")
+
+        #####################################################################
+        # Feature (Python directory) selection
+        seldlg = PyDialog(db, "SelectFeaturesDlg", x, y, w, h, modal, title,
+                        "Next", "Next", "Cancel")
+        seldlg.title("Select Python Installations")
+
+        seldlg.text("Hint", 15, 30, 300, 20, 3,
+                    "Select the Python locations where %s should be installed."
+                    % self.distribution.get_fullname())
+
+        seldlg.back("< Back", None, active=0)
+        c = seldlg.next("Next >", "Cancel")
+        order = 1
+        c.event("[TARGETDIR]", "[SourceDir]", ordering=order)
+        for version in self.versions + [self.other_version]:
+            order += 1
+            c.event("[TARGETDIR]", "[TARGETDIR%s]" % version,
+                    "FEATURE_SELECTED AND &Python%s=3" % version,
+                    ordering=order)
+        c.event("SpawnWaitDialog", "WaitForCostingDlg", ordering=order + 1)
+        c.event("EndDialog", "Return", ordering=order + 2)
+        c = seldlg.cancel("Cancel", "Features")
+        c.event("SpawnDialog", "CancelDlg")
+
+        c = seldlg.control("Features", "SelectionTree", 15, 60, 300, 120, 3,
+                           "FEATURE", None, "PathEdit", None)
+        c.event("[FEATURE_SELECTED]", "1")
+        ver = self.other_version
+        install_other_cond = "FEATURE_SELECTED AND &Python%s=3" % ver
+        dont_install_other_cond = "FEATURE_SELECTED AND &Python%s<>3" % ver
+
+        c = seldlg.text("Other", 15, 200, 300, 15, 3,
+                        "Provide an alternate Python location")
+        c.condition("Enable", install_other_cond)
+        c.condition("Show", install_other_cond)
+        c.condition("Disable", dont_install_other_cond)
+        c.condition("Hide", dont_install_other_cond)
+
+        c = seldlg.control("PathEdit", "PathEdit", 15, 215, 300, 16, 1,
+                           "TARGETDIR" + ver, None, "Next", None)
+        c.condition("Enable", install_other_cond)
+        c.condition("Show", install_other_cond)
+        c.condition("Disable", dont_install_other_cond)
+        c.condition("Hide", dont_install_other_cond)
+
+        #####################################################################
+        # Disk cost
+        cost = PyDialog(db, "DiskCostDlg", x, y, w, h, modal, title,
+                        "OK", "OK", "OK", bitmap=False)
+        cost.text("Title", 15, 6, 200, 15, 0x30003,
+                 r"{\DlgFontBold8}Disk Space Requirements")
+        cost.text("Description", 20, 20, 280, 20, 0x30003,
+                  "The disk space required for the installation of the selected features.")
+        cost.text("Text", 20, 53, 330, 60, 3,
+                  "The highlighted volumes (if any) do not have enough disk space "
+              "available for the currently selected features.  You can either "
+              "remove some files from the highlighted volumes, or choose to "
+              "install less features onto local drive(s), or select different "
+              "destination drive(s).")
+        cost.control("VolumeList", "VolumeCostList", 20, 100, 330, 150, 393223,
+                     None, "{120}{70}{70}{70}{70}", None, None)
+        cost.xbutton("OK", "Ok", None, 0.5).event("EndDialog", "Return")
+
+        #####################################################################
+        # WhichUsers Dialog. Only available on NT, and for privileged users.
+        # This must be run before FindRelatedProducts, because that will
+        # take into account whether the previous installation was per-user
+        # or per-machine. We currently don't support going back to this
+        # dialog after "Next" was selected; to support this, we would need to
+        # find how to reset the ALLUSERS property, and how to re-run
+        # FindRelatedProducts.
+        # On Windows9x, the ALLUSERS property is ignored on the command line
+        # and in the Property table, but installer fails according to the documentation
+        # if a dialog attempts to set ALLUSERS.
+        whichusers = PyDialog(db, "WhichUsersDlg", x, y, w, h, modal, title,
+                            "AdminInstall", "Next", "Cancel")
+        whichusers.title("Select whether to install [ProductName] for all users of this computer.")
+        # A radio group with two options: allusers, justme
+        g = whichusers.radiogroup("AdminInstall", 15, 60, 260, 50, 3,
+                                  "WhichUsers", "", "Next")
+        g.add("ALL", 0, 5, 150, 20, "Install for all users")
+        g.add("JUSTME", 0, 25, 150, 20, "Install just for me")
+
+        whichusers.back("Back", None, active=0)
+
+        c = whichusers.next("Next >", "Cancel")
+        c.event("[ALLUSERS]", "1", 'WhichUsers="ALL"', 1)
+        c.event("EndDialog", "Return", ordering = 2)
+
+        c = whichusers.cancel("Cancel", "AdminInstall")
+        c.event("SpawnDialog", "CancelDlg")
+
+        #####################################################################
+        # Installation Progress dialog (modeless)
+        progress = PyDialog(db, "ProgressDlg", x, y, w, h, modeless, title,
+                            "Cancel", "Cancel", "Cancel", bitmap=False)
+        progress.text("Title", 20, 15, 200, 15, 0x30003,
+                     r"{\DlgFontBold8}[Progress1] [ProductName]")
+        progress.text("Text", 35, 65, 300, 30, 3,
+                      "Please wait while the Installer [Progress2] [ProductName]. "
+                      "This may take several minutes.")
+        progress.text("StatusLabel", 35, 100, 35, 20, 3, "Status:")
+
+        c=progress.text("ActionText", 70, 100, w-70, 20, 3, "Pondering...")
+        c.mapping("ActionText", "Text")
+
+        #c=progress.text("ActionData", 35, 140, 300, 20, 3, None)
+        #c.mapping("ActionData", "Text")
+
+        c=progress.control("ProgressBar", "ProgressBar", 35, 120, 300, 10, 65537,
+                           None, "Progress done", None, None)
+        c.mapping("SetProgress", "Progress")
+
+        progress.back("< Back", "Next", active=False)
+        progress.next("Next >", "Cancel", active=False)
+        progress.cancel("Cancel", "Back").event("SpawnDialog", "CancelDlg")
+
+        ###################################################################
+        # Maintenance type: repair/uninstall
+        maint = PyDialog(db, "MaintenanceTypeDlg", x, y, w, h, modal, title,
+                         "Next", "Next", "Cancel")
+        maint.title("Welcome to the [ProductName] Setup Wizard")
+        maint.text("BodyText", 15, 63, 330, 42, 3,
+                   "Select whether you want to repair or remove [ProductName].")
+        g=maint.radiogroup("RepairRadioGroup", 15, 108, 330, 60, 3,
+                            "MaintenanceForm_Action", "", "Next")
+        #g.add("Change", 0, 0, 200, 17, "&Change [ProductName]")
+        g.add("Repair", 0, 18, 200, 17, "&Repair [ProductName]")
+        g.add("Remove", 0, 36, 200, 17, "Re&move [ProductName]")
+
+        maint.back("< Back", None, active=False)
+        c=maint.next("Finish", "Cancel")
+        # Change installation: Change progress dialog to "Change", then ask
+        # for feature selection
+        #c.event("[Progress1]", "Change", 'MaintenanceForm_Action="Change"', 1)
+        #c.event("[Progress2]", "changes", 'MaintenanceForm_Action="Change"', 2)
+
+        # Reinstall: Change progress dialog to "Repair", then invoke reinstall
+        # Also set list of reinstalled features to "ALL"
+        c.event("[REINSTALL]", "ALL", 'MaintenanceForm_Action="Repair"', 5)
+        c.event("[Progress1]", "Repairing", 'MaintenanceForm_Action="Repair"', 6)
+        c.event("[Progress2]", "repairs", 'MaintenanceForm_Action="Repair"', 7)
+        c.event("Reinstall", "ALL", 'MaintenanceForm_Action="Repair"', 8)
+
+        # Uninstall: Change progress to "Remove", then invoke uninstall
+        # Also set list of removed features to "ALL"
+        c.event("[REMOVE]", "ALL", 'MaintenanceForm_Action="Remove"', 11)
+        c.event("[Progress1]", "Removing", 'MaintenanceForm_Action="Remove"', 12)
+        c.event("[Progress2]", "removes", 'MaintenanceForm_Action="Remove"', 13)
+        c.event("Remove", "ALL", 'MaintenanceForm_Action="Remove"', 14)
+
+        # Close dialog when maintenance action scheduled
+        c.event("EndDialog", "Return", 'MaintenanceForm_Action<>"Change"', 20)
+        #c.event("NewDialog", "SelectFeaturesDlg", 'MaintenanceForm_Action="Change"', 21)
+
+        maint.cancel("Cancel", "RepairRadioGroup").event("SpawnDialog", "CancelDlg")
+
+    def get_installer_filename(self, fullname):
+        # Factored out to allow overriding in subclasses
+        if self.target_version:
+            base_name = "%s.%s-py%s.msi" % (fullname, self.plat_name,
+                                            self.target_version)
+        else:
+            base_name = "%s.%s.msi" % (fullname, self.plat_name)
+        installer_name = os.path.join(self.dist_dir, base_name)
+        return installer_name
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py b/venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py
new file mode 100644
index 0000000..550cbfa
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py
@@ -0,0 +1,579 @@
+"""distutils.command.bdist_rpm
+
+Implements the Distutils 'bdist_rpm' command (create RPM source and binary
+distributions)."""
+
+import subprocess, sys, os
+from distutils.core import Command
+from distutils.debug import DEBUG
+from distutils.file_util import write_file
+from distutils.errors import *
+from distutils.sysconfig import get_python_version
+from distutils import log
+
+class bdist_rpm(Command):
+
+    description = "create an RPM distribution"
+
+    user_options = [
+        ('bdist-base=', None,
+         "base directory for creating built distributions"),
+        ('rpm-base=', None,
+         "base directory for creating RPMs (defaults to \"rpm\" under "
+         "--bdist-base; must be specified for RPM 2)"),
+        ('dist-dir=', 'd',
+         "directory to put final RPM files in "
+         "(and .spec files if --spec-only)"),
+        ('python=', None,
+         "path to Python interpreter to hard-code in the .spec file "
+         "(default: \"python\")"),
+        ('fix-python', None,
+         "hard-code the exact path to the current Python interpreter in "
+         "the .spec file"),
+        ('spec-only', None,
+         "only regenerate spec file"),
+        ('source-only', None,
+         "only generate source RPM"),
+        ('binary-only', None,
+         "only generate binary RPM"),
+        ('use-bzip2', None,
+         "use bzip2 instead of gzip to create source distribution"),
+
+        # More meta-data: too RPM-specific to put in the setup script,
+        # but needs to go in the .spec file -- so we make these options
+        # to "bdist_rpm".  The idea is that packagers would put this
+        # info in setup.cfg, although they are of course free to
+        # supply it on the command line.
+        ('distribution-name=', None,
+         "name of the (Linux) distribution to which this "
+         "RPM applies (*not* the name of the module distribution!)"),
+        ('group=', None,
+         "package classification [default: \"Development/Libraries\"]"),
+        ('release=', None,
+         "RPM release number"),
+        ('serial=', None,
+         "RPM serial number"),
+        ('vendor=', None,
+         "RPM \"vendor\" (eg. \"Joe Blow <joe@example.com>\") "
+         "[default: maintainer or author from setup script]"),
+        ('packager=', None,
+         "RPM packager (eg. \"Jane Doe <jane@example.net>\") "
+         "[default: vendor]"),
+        ('doc-files=', None,
+         "list of documentation files (space or comma-separated)"),
+        ('changelog=', None,
+         "RPM changelog"),
+        ('icon=', None,
+         "name of icon file"),
+        ('provides=', None,
+         "capabilities provided by this package"),
+        ('requires=', None,
+         "capabilities required by this package"),
+        ('conflicts=', None,
+         "capabilities which conflict with this package"),
+        ('build-requires=', None,
+         "capabilities required to build this package"),
+        ('obsoletes=', None,
+         "capabilities made obsolete by this package"),
+        ('no-autoreq', None,
+         "do not automatically calculate dependencies"),
+
+        # Actions to take when building RPM
+        ('keep-temp', 'k',
+         "don't clean up RPM build directory"),
+        ('no-keep-temp', None,
+         "clean up RPM build directory [default]"),
+        ('use-rpm-opt-flags', None,
+         "compile with RPM_OPT_FLAGS when building from source RPM"),
+        ('no-rpm-opt-flags', None,
+         "do not pass any RPM CFLAGS to compiler"),
+        ('rpm3-mode', None,
+         "RPM 3 compatibility mode (default)"),
+        ('rpm2-mode', None,
+         "RPM 2 compatibility mode"),
+
+        # Add the hooks necessary for specifying custom scripts
+        ('prep-script=', None,
+         "Specify a script for the PREP phase of RPM building"),
+        ('build-script=', None,
+         "Specify a script for the BUILD phase of RPM building"),
+
+        ('pre-install=', None,
+         "Specify a script for the pre-INSTALL phase of RPM building"),
+        ('install-script=', None,
+         "Specify a script for the INSTALL phase of RPM building"),
+        ('post-install=', None,
+         "Specify a script for the post-INSTALL phase of RPM building"),
+
+        ('pre-uninstall=', None,
+         "Specify a script for the pre-UNINSTALL phase of RPM building"),
+        ('post-uninstall=', None,
+         "Specify a script for the post-UNINSTALL phase of RPM building"),
+
+        ('clean-script=', None,
+         "Specify a script for the CLEAN phase of RPM building"),
+
+        ('verify-script=', None,
+         "Specify a script for the VERIFY phase of the RPM build"),
+
+        # Allow a packager to explicitly force an architecture
+        ('force-arch=', None,
+         "Force an architecture onto the RPM build process"),
+
+        ('quiet', 'q',
+         "Run the INSTALL phase of RPM building in quiet mode"),
+        ]
+
+    boolean_options = ['keep-temp', 'use-rpm-opt-flags', 'rpm3-mode',
+                       'no-autoreq', 'quiet']
+
+    negative_opt = {'no-keep-temp': 'keep-temp',
+                    'no-rpm-opt-flags': 'use-rpm-opt-flags',
+                    'rpm2-mode': 'rpm3-mode'}
+
+
+    def initialize_options(self):
+        self.bdist_base = None
+        self.rpm_base = None
+        self.dist_dir = None
+        self.python = None
+        self.fix_python = None
+        self.spec_only = None
+        self.binary_only = None
+        self.source_only = None
+        self.use_bzip2 = None
+
+        self.distribution_name = None
+        self.group = None
+        self.release = None
+        self.serial = None
+        self.vendor = None
+        self.packager = None
+        self.doc_files = None
+        self.changelog = None
+        self.icon = None
+
+        self.prep_script = None
+        self.build_script = None
+        self.install_script = None
+        self.clean_script = None
+        self.verify_script = None
+        self.pre_install = None
+        self.post_install = None
+        self.pre_uninstall = None
+        self.post_uninstall = None
+        self.prep = None
+        self.provides = None
+        self.requires = None
+        self.conflicts = None
+        self.build_requires = None
+        self.obsoletes = None
+
+        self.keep_temp = 0
+        self.use_rpm_opt_flags = 1
+        self.rpm3_mode = 1
+        self.no_autoreq = 0
+
+        self.force_arch = None
+        self.quiet = 0
+
+    def finalize_options(self):
+        self.set_undefined_options('bdist', ('bdist_base', 'bdist_base'))
+        if self.rpm_base is None:
+            if not self.rpm3_mode:
+                raise DistutilsOptionError(
+                      "you must specify --rpm-base in RPM 2 mode")
+            self.rpm_base = os.path.join(self.bdist_base, "rpm")
+
+        if self.python is None:
+            if self.fix_python:
+                self.python = sys.executable
+            else:
+                self.python = "python3"
+        elif self.fix_python:
+            raise DistutilsOptionError(
+                  "--python and --fix-python are mutually exclusive options")
+
+        if os.name != 'posix':
+            raise DistutilsPlatformError("don't know how to create RPM "
+                   "distributions on platform %s" % os.name)
+        if self.binary_only and self.source_only:
+            raise DistutilsOptionError(
+                  "cannot supply both '--source-only' and '--binary-only'")
+
+        # don't pass CFLAGS to pure python distributions
+        if not self.distribution.has_ext_modules():
+            self.use_rpm_opt_flags = 0
+
+        self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
+        self.finalize_package_data()
+
+    def finalize_package_data(self):
+        self.ensure_string('group', "Development/Libraries")
+        self.ensure_string('vendor',
+                           "%s <%s>" % (self.distribution.get_contact(),
+                                        self.distribution.get_contact_email()))
+        self.ensure_string('packager')
+        self.ensure_string_list('doc_files')
+        if isinstance(self.doc_files, list):
+            for readme in ('README', 'README.txt'):
+                if os.path.exists(readme) and readme not in self.doc_files:
+                    self.doc_files.append(readme)
+
+        self.ensure_string('release', "1")
+        self.ensure_string('serial')   # should it be an int?
+
+        self.ensure_string('distribution_name')
+
+        self.ensure_string('changelog')
+          # Format changelog correctly
+        self.changelog = self._format_changelog(self.changelog)
+
+        self.ensure_filename('icon')
+
+        self.ensure_filename('prep_script')
+        self.ensure_filename('build_script')
+        self.ensure_filename('install_script')
+        self.ensure_filename('clean_script')
+        self.ensure_filename('verify_script')
+        self.ensure_filename('pre_install')
+        self.ensure_filename('post_install')
+        self.ensure_filename('pre_uninstall')
+        self.ensure_filename('post_uninstall')
+
+        # XXX don't forget we punted on summaries and descriptions -- they
+        # should be handled here eventually!
+
+        # Now *this* is some meta-data that belongs in the setup script...
+        self.ensure_string_list('provides')
+        self.ensure_string_list('requires')
+        self.ensure_string_list('conflicts')
+        self.ensure_string_list('build_requires')
+        self.ensure_string_list('obsoletes')
+
+        self.ensure_string('force_arch')
+
+    def run(self):
+        if DEBUG:
+            print("before _get_package_data():")
+            print("vendor =", self.vendor)
+            print("packager =", self.packager)
+            print("doc_files =", self.doc_files)
+            print("changelog =", self.changelog)
+
+        # make directories
+        if self.spec_only:
+            spec_dir = self.dist_dir
+            self.mkpath(spec_dir)
+        else:
+            rpm_dir = {}
+            for d in ('SOURCES', 'SPECS', 'BUILD', 'RPMS', 'SRPMS'):
+                rpm_dir[d] = os.path.join(self.rpm_base, d)
+                self.mkpath(rpm_dir[d])
+            spec_dir = rpm_dir['SPECS']
+
+        # Spec file goes into 'dist_dir' if '--spec-only specified',
+        # build/rpm.<plat> otherwise.
+        spec_path = os.path.join(spec_dir,
+                                 "%s.spec" % self.distribution.get_name())
+        self.execute(write_file,
+                     (spec_path,
+                      self._make_spec_file()),
+                     "writing '%s'" % spec_path)
+
+        if self.spec_only: # stop if requested
+            return
+
+        # Make a source distribution and copy to SOURCES directory with
+        # optional icon.
+        saved_dist_files = self.distribution.dist_files[:]
+        sdist = self.reinitialize_command('sdist')
+        if self.use_bzip2:
+            sdist.formats = ['bztar']
+        else:
+            sdist.formats = ['gztar']
+        self.run_command('sdist')
+        self.distribution.dist_files = saved_dist_files
+
+        source = sdist.get_archive_files()[0]
+        source_dir = rpm_dir['SOURCES']
+        self.copy_file(source, source_dir)
+
+        if self.icon:
+            if os.path.exists(self.icon):
+                self.copy_file(self.icon, source_dir)
+            else:
+                raise DistutilsFileError(
+                      "icon file '%s' does not exist" % self.icon)
+
+        # build package
+        log.info("building RPMs")
+        rpm_cmd = ['rpmbuild']
+
+        if self.source_only: # what kind of RPMs?
+            rpm_cmd.append('-bs')
+        elif self.binary_only:
+            rpm_cmd.append('-bb')
+        else:
+            rpm_cmd.append('-ba')
+        rpm_cmd.extend(['--define', '__python %s' % self.python])
+        if self.rpm3_mode:
+            rpm_cmd.extend(['--define',
+                             '_topdir %s' % os.path.abspath(self.rpm_base)])
+        if not self.keep_temp:
+            rpm_cmd.append('--clean')
+
+        if self.quiet:
+            rpm_cmd.append('--quiet')
+
+        rpm_cmd.append(spec_path)
+        # Determine the binary rpm names that should be built out of this spec
+        # file
+        # Note that some of these may not be really built (if the file
+        # list is empty)
+        nvr_string = "%{name}-%{version}-%{release}"
+        src_rpm = nvr_string + ".src.rpm"
+        non_src_rpm = "%{arch}/" + nvr_string + ".%{arch}.rpm"
+        q_cmd = r"rpm -q --qf '%s %s\n' --specfile '%s'" % (
+            src_rpm, non_src_rpm, spec_path)
+
+        out = os.popen(q_cmd)
+        try:
+            binary_rpms = []
+            source_rpm = None
+            while True:
+                line = out.readline()
+                if not line:
+                    break
+                l = line.strip().split()
+                assert(len(l) == 2)
+                binary_rpms.append(l[1])
+                # The source rpm is named after the first entry in the spec file
+                if source_rpm is None:
+                    source_rpm = l[0]
+
+            status = out.close()
+            if status:
+                raise DistutilsExecError("Failed to execute: %s" % repr(q_cmd))
+
+        finally:
+            out.close()
+
+        self.spawn(rpm_cmd)
+
+        if not self.dry_run:
+            if self.distribution.has_ext_modules():
+                pyversion = get_python_version()
+            else:
+                pyversion = 'any'
+
+            if not self.binary_only:
+                srpm = os.path.join(rpm_dir['SRPMS'], source_rpm)
+                assert(os.path.exists(srpm))
+                self.move_file(srpm, self.dist_dir)
+                filename = os.path.join(self.dist_dir, source_rpm)
+                self.distribution.dist_files.append(
+                    ('bdist_rpm', pyversion, filename))
+
+            if not self.source_only:
+                for rpm in binary_rpms:
+                    rpm = os.path.join(rpm_dir['RPMS'], rpm)
+                    if os.path.exists(rpm):
+                        self.move_file(rpm, self.dist_dir)
+                        filename = os.path.join(self.dist_dir,
+                                                os.path.basename(rpm))
+                        self.distribution.dist_files.append(
+                            ('bdist_rpm', pyversion, filename))
+
+    def _dist_path(self, path):
+        return os.path.join(self.dist_dir, os.path.basename(path))
+
+    def _make_spec_file(self):
+        """Generate the text of an RPM spec file and return it as a
+        list of strings (one per line).
+        """
+        # definitions and headers
+        spec_file = [
+            '%define name ' + self.distribution.get_name(),
+            '%define version ' + self.distribution.get_version().replace('-','_'),
+            '%define unmangled_version ' + self.distribution.get_version(),
+            '%define release ' + self.release.replace('-','_'),
+            '',
+            'Summary: ' + self.distribution.get_description(),
+            ]
+
+        # Workaround for #14443 which affects some RPM based systems such as
+        # RHEL6 (and probably derivatives)
+        vendor_hook = subprocess.getoutput('rpm --eval %{__os_install_post}')
+        # Generate a potential replacement value for __os_install_post (whilst
+        # normalizing the whitespace to simplify the test for whether the
+        # invocation of brp-python-bytecompile passes in __python):
+        vendor_hook = '\n'.join(['  %s \\' % line.strip()
+                                 for line in vendor_hook.splitlines()])
+        problem = "brp-python-bytecompile \\\n"
+        fixed = "brp-python-bytecompile %{__python} \\\n"
+        fixed_hook = vendor_hook.replace(problem, fixed)
+        if fixed_hook != vendor_hook:
+            spec_file.append('# Workaround for http://bugs.python.org/issue14443')
+            spec_file.append('%define __os_install_post ' + fixed_hook + '\n')
+
+        # put locale summaries into spec file
+        # XXX not supported for now (hard to put a dictionary
+        # in a config file -- arg!)
+        #for locale in self.summaries.keys():
+        #    spec_file.append('Summary(%s): %s' % (locale,
+        #                                          self.summaries[locale]))
+
+        spec_file.extend([
+            'Name: %{name}',
+            'Version: %{version}',
+            'Release: %{release}',])
+
+        # XXX yuck! this filename is available from the "sdist" command,
+        # but only after it has run: and we create the spec file before
+        # running "sdist", in case of --spec-only.
+        if self.use_bzip2:
+            spec_file.append('Source0: %{name}-%{unmangled_version}.tar.bz2')
+        else:
+            spec_file.append('Source0: %{name}-%{unmangled_version}.tar.gz')
+
+        spec_file.extend([
+            'License: ' + self.distribution.get_license(),
+            'Group: ' + self.group,
+            'BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot',
+            'Prefix: %{_prefix}', ])
+
+        if not self.force_arch:
+            # noarch if no extension modules
+            if not self.distribution.has_ext_modules():
+                spec_file.append('BuildArch: noarch')
+        else:
+            spec_file.append( 'BuildArch: %s' % self.force_arch )
+
+        for field in ('Vendor',
+                      'Packager',
+                      'Provides',
+                      'Requires',
+                      'Conflicts',
+                      'Obsoletes',
+                      ):
+            val = getattr(self, field.lower())
+            if isinstance(val, list):
+                spec_file.append('%s: %s' % (field, ' '.join(val)))
+            elif val is not None:
+                spec_file.append('%s: %s' % (field, val))
+
+
+        if self.distribution.get_url() != 'UNKNOWN':
+            spec_file.append('Url: ' + self.distribution.get_url())
+
+        if self.distribution_name:
+            spec_file.append('Distribution: ' + self.distribution_name)
+
+        if self.build_requires:
+            spec_file.append('BuildRequires: ' +
+                             ' '.join(self.build_requires))
+
+        if self.icon:
+            spec_file.append('Icon: ' + os.path.basename(self.icon))
+
+        if self.no_autoreq:
+            spec_file.append('AutoReq: 0')
+
+        spec_file.extend([
+            '',
+            '%description',
+            self.distribution.get_long_description()
+            ])
+
+        # put locale descriptions into spec file
+        # XXX again, suppressed because config file syntax doesn't
+        # easily support this ;-(
+        #for locale in self.descriptions.keys():
+        #    spec_file.extend([
+        #        '',
+        #        '%description -l ' + locale,
+        #        self.descriptions[locale],
+        #        ])
+
+        # rpm scripts
+        # figure out default build script
+        def_setup_call = "%s %s" % (self.python,os.path.basename(sys.argv[0]))
+        def_build = "%s build" % def_setup_call
+        if self.use_rpm_opt_flags:
+            def_build = 'env CFLAGS="$RPM_OPT_FLAGS" ' + def_build
+
+        # insert contents of files
+
+        # XXX this is kind of misleading: user-supplied options are files
+        # that we open and interpolate into the spec file, but the defaults
+        # are just text that we drop in as-is.  Hmmm.
+
+        install_cmd = ('%s install -O1 --root=$RPM_BUILD_ROOT '
+                       '--record=INSTALLED_FILES') % def_setup_call
+
+        script_options = [
+            ('prep', 'prep_script', "%setup -n %{name}-%{unmangled_version}"),
+            ('build', 'build_script', def_build),
+            ('install', 'install_script', install_cmd),
+            ('clean', 'clean_script', "rm -rf $RPM_BUILD_ROOT"),
+            ('verifyscript', 'verify_script', None),
+            ('pre', 'pre_install', None),
+            ('post', 'post_install', None),
+            ('preun', 'pre_uninstall', None),
+            ('postun', 'post_uninstall', None),
+        ]
+
+        for (rpm_opt, attr, default) in script_options:
+            # Insert contents of file referred to, if no file is referred to
+            # use 'default' as contents of script
+            val = getattr(self, attr)
+            if val or default:
+                spec_file.extend([
+                    '',
+                    '%' + rpm_opt,])
+                if val:
+                    with open(val) as f:
+                        spec_file.extend(f.read().split('\n'))
+                else:
+                    spec_file.append(default)
+
+
+        # files section
+        spec_file.extend([
+            '',
+            '%files -f INSTALLED_FILES',
+            '%defattr(-,root,root)',
+            ])
+
+        if self.doc_files:
+            spec_file.append('%doc ' + ' '.join(self.doc_files))
+
+        if self.changelog:
+            spec_file.extend([
+                '',
+                '%changelog',])
+            spec_file.extend(self.changelog)
+
+        return spec_file
+
+    def _format_changelog(self, changelog):
+        """Format the changelog correctly and convert it to a list of strings
+        """
+        if not changelog:
+            return changelog
+        new_changelog = []
+        for line in changelog.strip().split('\n'):
+            line = line.strip()
+            if line[0] == '*':
+                new_changelog.extend(['', line])
+            elif line[0] == '-':
+                new_changelog.append(line)
+            else:
+                new_changelog.append('  ' + line)
+
+        # strip trailing newline inserted by first changelog entry
+        if not new_changelog[0]:
+            del new_changelog[0]
+
+        return new_changelog
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py b/venv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py
new file mode 100644
index 0000000..0e9ddaa
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py
@@ -0,0 +1,377 @@
+"""distutils.command.bdist_wininst
+
+Implements the Distutils 'bdist_wininst' command: create a windows installer
+exe-program."""
+
+import os
+import sys
+import warnings
+from distutils.core import Command
+from distutils.util import get_platform
+from distutils.dir_util import remove_tree
+from distutils.errors import *
+from distutils.sysconfig import get_python_version
+from distutils import log
+
+class bdist_wininst(Command):
+
+    description = "create an executable installer for MS Windows"
+
+    user_options = [('bdist-dir=', None,
+                     "temporary directory for creating the distribution"),
+                    ('plat-name=', 'p',
+                     "platform name to embed in generated filenames "
+                     "(default: %s)" % get_platform()),
+                    ('keep-temp', 'k',
+                     "keep the pseudo-installation tree around after " +
+                     "creating the distribution archive"),
+                    ('target-version=', None,
+                     "require a specific python version" +
+                     " on the target system"),
+                    ('no-target-compile', 'c',
+                     "do not compile .py to .pyc on the target system"),
+                    ('no-target-optimize', 'o',
+                     "do not compile .py to .pyo (optimized) "
+                     "on the target system"),
+                    ('dist-dir=', 'd',
+                     "directory to put final built distributions in"),
+                    ('bitmap=', 'b',
+                     "bitmap to use for the installer instead of python-powered logo"),
+                    ('title=', 't',
+                     "title to display on the installer background instead of default"),
+                    ('skip-build', None,
+                     "skip rebuilding everything (for testing/debugging)"),
+                    ('install-script=', None,
+                     "basename of installation script to be run after "
+                     "installation or before deinstallation"),
+                    ('pre-install-script=', None,
+                     "Fully qualified filename of a script to be run before "
+                     "any files are installed.  This script need not be in the "
+                     "distribution"),
+                    ('user-access-control=', None,
+                     "specify Vista's UAC handling - 'none'/default=no "
+                     "handling, 'auto'=use UAC if target Python installed for "
+                     "all users, 'force'=always use UAC"),
+                   ]
+
+    boolean_options = ['keep-temp', 'no-target-compile', 'no-target-optimize',
+                       'skip-build']
+
+    # bpo-10945: bdist_wininst requires mbcs encoding only available on Windows
+    _unsupported = (sys.platform != "win32")
+
+    def __init__(self, *args, **kw):
+        super().__init__(*args, **kw)
+        warnings.warn("bdist_wininst command is deprecated since Python 3.8, "
+                      "use bdist_wheel (wheel packages) instead",
+                      DeprecationWarning, 2)
+
+    def initialize_options(self):
+        self.bdist_dir = None
+        self.plat_name = None
+        self.keep_temp = 0
+        self.no_target_compile = 0
+        self.no_target_optimize = 0
+        self.target_version = None
+        self.dist_dir = None
+        self.bitmap = None
+        self.title = None
+        self.skip_build = None
+        self.install_script = None
+        self.pre_install_script = None
+        self.user_access_control = None
+
+
+    def finalize_options(self):
+        self.set_undefined_options('bdist', ('skip_build', 'skip_build'))
+
+        if self.bdist_dir is None:
+            if self.skip_build and self.plat_name:
+                # If build is skipped and plat_name is overridden, bdist will
+                # not see the correct 'plat_name' - so set that up manually.
+                bdist = self.distribution.get_command_obj('bdist')
+                bdist.plat_name = self.plat_name
+                # next the command will be initialized using that name
+            bdist_base = self.get_finalized_command('bdist').bdist_base
+            self.bdist_dir = os.path.join(bdist_base, 'wininst')
+
+        if not self.target_version:
+            self.target_version = ""
+
+        if not self.skip_build and self.distribution.has_ext_modules():
+            short_version = get_python_version()
+            if self.target_version and self.target_version != short_version:
+                raise DistutilsOptionError(
+                      "target version can only be %s, or the '--skip-build'" \
+                      " option must be specified" % (short_version,))
+            self.target_version = short_version
+
+        self.set_undefined_options('bdist',
+                                   ('dist_dir', 'dist_dir'),
+                                   ('plat_name', 'plat_name'),
+                                  )
+
+        if self.install_script:
+            for script in self.distribution.scripts:
+                if self.install_script == os.path.basename(script):
+                    break
+            else:
+                raise DistutilsOptionError(
+                      "install_script '%s' not found in scripts"
+                      % self.install_script)
+
+    def run(self):
+        if (sys.platform != "win32" and
+            (self.distribution.has_ext_modules() or
+             self.distribution.has_c_libraries())):
+            raise DistutilsPlatformError \
+                  ("distribution contains extensions and/or C libraries; "
+                   "must be compiled on a Windows 32 platform")
+
+        if not self.skip_build:
+            self.run_command('build')
+
+        install = self.reinitialize_command('install', reinit_subcommands=1)
+        install.root = self.bdist_dir
+        install.skip_build = self.skip_build
+        install.warn_dir = 0
+        install.plat_name = self.plat_name
+
+        install_lib = self.reinitialize_command('install_lib')
+        # we do not want to include pyc or pyo files
+        install_lib.compile = 0
+        install_lib.optimize = 0
+
+        if self.distribution.has_ext_modules():
+            # If we are building an installer for a Python version other
+            # than the one we are currently running, then we need to ensure
+            # our build_lib reflects the other Python version rather than ours.
+            # Note that for target_version!=sys.version, we must have skipped the
+            # build step, so there is no issue with enforcing the build of this
+            # version.
+            target_version = self.target_version
+            if not target_version:
+                assert self.skip_build, "Should have already checked this"
+                target_version = '%d.%d' % sys.version_info[:2]
+            plat_specifier = ".%s-%s" % (self.plat_name, target_version)
+            build = self.get_finalized_command('build')
+            build.build_lib = os.path.join(build.build_base,
+                                           'lib' + plat_specifier)
+
+        # Use a custom scheme for the zip-file, because we have to decide
+        # at installation time which scheme to use.
+        for key in ('purelib', 'platlib', 'headers', 'scripts', 'data'):
+            value = key.upper()
+            if key == 'headers':
+                value = value + '/Include/$dist_name'
+            setattr(install,
+                    'install_' + key,
+                    value)
+
+        log.info("installing to %s", self.bdist_dir)
+        install.ensure_finalized()
+
+        # avoid warning of 'install_lib' about installing
+        # into a directory not in sys.path
+        sys.path.insert(0, os.path.join(self.bdist_dir, 'PURELIB'))
+
+        install.run()
+
+        del sys.path[0]
+
+        # And make an archive relative to the root of the
+        # pseudo-installation tree.
+        from tempfile import mktemp
+        archive_basename = mktemp()
+        fullname = self.distribution.get_fullname()
+        arcname = self.make_archive(archive_basename, "zip",
+                                    root_dir=self.bdist_dir)
+        # create an exe containing the zip-file
+        self.create_exe(arcname, fullname, self.bitmap)
+        if self.distribution.has_ext_modules():
+            pyversion = get_python_version()
+        else:
+            pyversion = 'any'
+        self.distribution.dist_files.append(('bdist_wininst', pyversion,
+                                             self.get_installer_filename(fullname)))
+        # remove the zip-file again
+        log.debug("removing temporary file '%s'", arcname)
+        os.remove(arcname)
+
+        if not self.keep_temp:
+            remove_tree(self.bdist_dir, dry_run=self.dry_run)
+
+    def get_inidata(self):
+        # Return data describing the installation.
+        lines = []
+        metadata = self.distribution.metadata
+
+        # Write the [metadata] section.
+        lines.append("[metadata]")
+
+        # 'info' will be displayed in the installer's dialog box,
+        # describing the items to be installed.
+        info = (metadata.long_description or '') + '\n'
+
+        # Escape newline characters
+        def escape(s):
+            return s.replace("\n", "\\n")
+
+        for name in ["author", "author_email", "description", "maintainer",
+                     "maintainer_email", "name", "url", "version"]:
+            data = getattr(metadata, name, "")
+            if data:
+                info = info + ("\n    %s: %s" % \
+                               (name.capitalize(), escape(data)))
+                lines.append("%s=%s" % (name, escape(data)))
+
+        # The [setup] section contains entries controlling
+        # the installer runtime.
+        lines.append("\n[Setup]")
+        if self.install_script:
+            lines.append("install_script=%s" % self.install_script)
+        lines.append("info=%s" % escape(info))
+        lines.append("target_compile=%d" % (not self.no_target_compile))
+        lines.append("target_optimize=%d" % (not self.no_target_optimize))
+        if self.target_version:
+            lines.append("target_version=%s" % self.target_version)
+        if self.user_access_control:
+            lines.append("user_access_control=%s" % self.user_access_control)
+
+        title = self.title or self.distribution.get_fullname()
+        lines.append("title=%s" % escape(title))
+        import time
+        import distutils
+        build_info = "Built %s with distutils-%s" % \
+                     (time.ctime(time.time()), distutils.__version__)
+        lines.append("build_info=%s" % build_info)
+        return "\n".join(lines)
+
+    def create_exe(self, arcname, fullname, bitmap=None):
+        import struct
+
+        self.mkpath(self.dist_dir)
+
+        cfgdata = self.get_inidata()
+
+        installer_name = self.get_installer_filename(fullname)
+        self.announce("creating %s" % installer_name)
+
+        if bitmap:
+            with open(bitmap, "rb") as f:
+                bitmapdata = f.read()
+            bitmaplen = len(bitmapdata)
+        else:
+            bitmaplen = 0
+
+        with open(installer_name, "wb") as file:
+            file.write(self.get_exe_bytes())
+            if bitmap:
+                file.write(bitmapdata)
+
+            # Convert cfgdata from unicode to ascii, mbcs encoded
+            if isinstance(cfgdata, str):
+                cfgdata = cfgdata.encode("mbcs")
+
+            # Append the pre-install script
+            cfgdata = cfgdata + b"\0"
+            if self.pre_install_script:
+                # We need to normalize newlines, so we open in text mode and
+                # convert back to bytes. "latin-1" simply avoids any possible
+                # failures.
+                with open(self.pre_install_script, "r",
+                          encoding="latin-1") as script:
+                    script_data = script.read().encode("latin-1")
+                cfgdata = cfgdata + script_data + b"\n\0"
+            else:
+                # empty pre-install script
+                cfgdata = cfgdata + b"\0"
+            file.write(cfgdata)
+
+            # The 'magic number' 0x1234567B is used to make sure that the
+            # binary layout of 'cfgdata' is what the wininst.exe binary
+            # expects.  If the layout changes, increment that number, make
+            # the corresponding changes to the wininst.exe sources, and
+            # recompile them.
+            header = struct.pack("<iii",
+                                0x1234567B,       # tag
+                                len(cfgdata),     # length
+                                bitmaplen,        # number of bytes in bitmap
+                                )
+            file.write(header)
+            with open(arcname, "rb") as f:
+                file.write(f.read())
+
+    def get_installer_filename(self, fullname):
+        # Factored out to allow overriding in subclasses
+        if self.target_version:
+            # if we create an installer for a specific python version,
+            # it's better to include this in the name
+            installer_name = os.path.join(self.dist_dir,
+                                          "%s.%s-py%s.exe" %
+                                           (fullname, self.plat_name, self.target_version))
+        else:
+            installer_name = os.path.join(self.dist_dir,
+                                          "%s.%s.exe" % (fullname, self.plat_name))
+        return installer_name
+
+    def get_exe_bytes(self):
+        # If a target-version other than the current version has been
+        # specified, then using the MSVC version from *this* build is no good.
+        # Without actually finding and executing the target version and parsing
+        # its sys.version, we just hard-code our knowledge of old versions.
+        # NOTE: Possible alternative is to allow "--target-version" to
+        # specify a Python executable rather than a simple version string.
+        # We can then execute this program to obtain any info we need, such
+        # as the real sys.version string for the build.
+        cur_version = get_python_version()
+
+        # If the target version is *later* than us, then we assume they
+        # use what we use
+        # string compares seem wrong, but are what sysconfig.py itself uses
+        if self.target_version and self.target_version < cur_version:
+            if self.target_version < "2.4":
+                bv = '6.0'
+            elif self.target_version == "2.4":
+                bv = '7.1'
+            elif self.target_version == "2.5":
+                bv = '8.0'
+            elif self.target_version <= "3.2":
+                bv = '9.0'
+            elif self.target_version <= "3.4":
+                bv = '10.0'
+            else:
+                bv = '14.0'
+        else:
+            # for current version - use authoritative check.
+            try:
+                from msvcrt import CRT_ASSEMBLY_VERSION
+            except ImportError:
+                # cross-building, so assume the latest version
+                bv = '14.0'
+            else:
+                # as far as we know, CRT is binary compatible based on
+                # the first field, so assume 'x.0' until proven otherwise
+                major = CRT_ASSEMBLY_VERSION.partition('.')[0]
+                bv = major + '.0'
+
+
+        # wininst-x.y.exe is in the same directory as this file
+        directory = os.path.dirname(__file__)
+        # we must use a wininst-x.y.exe built with the same C compiler
+        # used for python.  XXX What about mingw, borland, and so on?
+
+        # if plat_name starts with "win" but is not "win32"
+        # we want to strip "win" and leave the rest (e.g. -amd64)
+        # for all other cases, we don't want any suffix
+        if self.plat_name != 'win32' and self.plat_name[:3] == 'win':
+            sfix = self.plat_name[3:]
+        else:
+            sfix = ''
+
+        filename = os.path.join(directory, "wininst-%s%s.exe" % (bv, sfix))
+        f = open(filename, "rb")
+        try:
+            return f.read()
+        finally:
+            f.close()
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/build.py b/venv/Lib/site-packages/setuptools/_distutils/command/build.py
new file mode 100644
index 0000000..a86df0b
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/build.py
@@ -0,0 +1,157 @@
+"""distutils.command.build
+
+Implements the Distutils 'build' command."""
+
+import sys, os
+from distutils.core import Command
+from distutils.errors import DistutilsOptionError
+from distutils.util import get_platform
+
+
+def show_compilers():
+    from distutils.ccompiler import show_compilers
+    show_compilers()
+
+
+class build(Command):
+
+    description = "build everything needed to install"
+
+    user_options = [
+        ('build-base=', 'b',
+         "base directory for build library"),
+        ('build-purelib=', None,
+         "build directory for platform-neutral distributions"),
+        ('build-platlib=', None,
+         "build directory for platform-specific distributions"),
+        ('build-lib=', None,
+         "build directory for all distribution (defaults to either " +
+         "build-purelib or build-platlib"),
+        ('build-scripts=', None,
+         "build directory for scripts"),
+        ('build-temp=', 't',
+         "temporary build directory"),
+        ('plat-name=', 'p',
+         "platform name to build for, if supported "
+         "(default: %s)" % get_platform()),
+        ('compiler=', 'c',
+         "specify the compiler type"),
+        ('parallel=', 'j',
+         "number of parallel build jobs"),
+        ('debug', 'g',
+         "compile extensions and libraries with debugging information"),
+        ('force', 'f',
+         "forcibly build everything (ignore file timestamps)"),
+        ('executable=', 'e',
+         "specify final destination interpreter path (build.py)"),
+        ]
+
+    boolean_options = ['debug', 'force']
+
+    help_options = [
+        ('help-compiler', None,
+         "list available compilers", show_compilers),
+        ]
+
+    def initialize_options(self):
+        self.build_base = 'build'
+        # these are decided only after 'build_base' has its final value
+        # (unless overridden by the user or client)
+        self.build_purelib = None
+        self.build_platlib = None
+        self.build_lib = None
+        self.build_temp = None
+        self.build_scripts = None
+        self.compiler = None
+        self.plat_name = None
+        self.debug = None
+        self.force = 0
+        self.executable = None
+        self.parallel = None
+
+    def finalize_options(self):
+        if self.plat_name is None:
+            self.plat_name = get_platform()
+        else:
+            # plat-name only supported for windows (other platforms are
+            # supported via ./configure flags, if at all).  Avoid misleading
+            # other platforms.
+            if os.name != 'nt':
+                raise DistutilsOptionError(
+                            "--plat-name only supported on Windows (try "
+                            "using './configure --help' on your platform)")
+
+        plat_specifier = ".%s-%d.%d" % (self.plat_name, *sys.version_info[:2])
+
+        # Make it so Python 2.x and Python 2.x with --with-pydebug don't
+        # share the same build directories. Doing so confuses the build
+        # process for C modules
+        if hasattr(sys, 'gettotalrefcount'):
+            plat_specifier += '-pydebug'
+
+        # 'build_purelib' and 'build_platlib' just default to 'lib' and
+        # 'lib.<plat>' under the base build directory.  We only use one of
+        # them for a given distribution, though --
+        if self.build_purelib is None:
+            self.build_purelib = os.path.join(self.build_base, 'lib')
+        if self.build_platlib is None:
+            self.build_platlib = os.path.join(self.build_base,
+                                              'lib' + plat_specifier)
+
+        # 'build_lib' is the actual directory that we will use for this
+        # particular module distribution -- if user didn't supply it, pick
+        # one of 'build_purelib' or 'build_platlib'.
+        if self.build_lib is None:
+            if self.distribution.ext_modules:
+                self.build_lib = self.build_platlib
+            else:
+                self.build_lib = self.build_purelib
+
+        # 'build_temp' -- temporary directory for compiler turds,
+        # "build/temp.<plat>"
+        if self.build_temp is None:
+            self.build_temp = os.path.join(self.build_base,
+                                           'temp' + plat_specifier)
+        if self.build_scripts is None:
+            self.build_scripts = os.path.join(self.build_base,
+                                              'scripts-%d.%d' % sys.version_info[:2])
+
+        if self.executable is None and sys.executable:
+            self.executable = os.path.normpath(sys.executable)
+
+        if isinstance(self.parallel, str):
+            try:
+                self.parallel = int(self.parallel)
+            except ValueError:
+                raise DistutilsOptionError("parallel should be an integer")
+
+    def run(self):
+        # Run all relevant sub-commands.  This will be some subset of:
+        #  - build_py      - pure Python modules
+        #  - build_clib    - standalone C libraries
+        #  - build_ext     - Python extensions
+        #  - build_scripts - (Python) scripts
+        for cmd_name in self.get_sub_commands():
+            self.run_command(cmd_name)
+
+
+    # -- Predicates for the sub-command list ---------------------------
+
+    def has_pure_modules(self):
+        return self.distribution.has_pure_modules()
+
+    def has_c_libraries(self):
+        return self.distribution.has_c_libraries()
+
+    def has_ext_modules(self):
+        return self.distribution.has_ext_modules()
+
+    def has_scripts(self):
+        return self.distribution.has_scripts()
+
+
+    sub_commands = [('build_py',      has_pure_modules),
+                    ('build_clib',    has_c_libraries),
+                    ('build_ext',     has_ext_modules),
+                    ('build_scripts', has_scripts),
+                   ]
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py b/venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py
new file mode 100644
index 0000000..3e20ef2
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py
@@ -0,0 +1,209 @@
+"""distutils.command.build_clib
+
+Implements the Distutils 'build_clib' command, to build a C/C++ library
+that is included in the module distribution and needed by an extension
+module."""
+
+
+# XXX this module has *lots* of code ripped-off quite transparently from
+# build_ext.py -- not surprisingly really, as the work required to build
+# a static library from a collection of C source files is not really all
+# that different from what's required to build a shared object file from
+# a collection of C source files.  Nevertheless, I haven't done the
+# necessary refactoring to account for the overlap in code between the
+# two modules, mainly because a number of subtle details changed in the
+# cut 'n paste.  Sigh.
+
+import os
+from distutils.core import Command
+from distutils.errors import *
+from distutils.sysconfig import customize_compiler
+from distutils import log
+
+def show_compilers():
+    from distutils.ccompiler import show_compilers
+    show_compilers()
+
+
+class build_clib(Command):
+
+    description = "build C/C++ libraries used by Python extensions"
+
+    user_options = [
+        ('build-clib=', 'b',
+         "directory to build C/C++ libraries to"),
+        ('build-temp=', 't',
+         "directory to put temporary build by-products"),
+        ('debug', 'g',
+         "compile with debugging information"),
+        ('force', 'f',
+         "forcibly build everything (ignore file timestamps)"),
+        ('compiler=', 'c',
+         "specify the compiler type"),
+        ]
+
+    boolean_options = ['debug', 'force']
+
+    help_options = [
+        ('help-compiler', None,
+         "list available compilers", show_compilers),
+        ]
+
+    def initialize_options(self):
+        self.build_clib = None
+        self.build_temp = None
+
+        # List of libraries to build
+        self.libraries = None
+
+        # Compilation options for all libraries
+        self.include_dirs = None
+        self.define = None
+        self.undef = None
+        self.debug = None
+        self.force = 0
+        self.compiler = None
+
+
+    def finalize_options(self):
+        # This might be confusing: both build-clib and build-temp default
+        # to build-temp as defined by the "build" command.  This is because
+        # I think that C libraries are really just temporary build
+        # by-products, at least from the point of view of building Python
+        # extensions -- but I want to keep my options open.
+        self.set_undefined_options('build',
+                                   ('build_temp', 'build_clib'),
+                                   ('build_temp', 'build_temp'),
+                                   ('compiler', 'compiler'),
+                                   ('debug', 'debug'),
+                                   ('force', 'force'))
+
+        self.libraries = self.distribution.libraries
+        if self.libraries:
+            self.check_library_list(self.libraries)
+
+        if self.include_dirs is None:
+            self.include_dirs = self.distribution.include_dirs or []
+        if isinstance(self.include_dirs, str):
+            self.include_dirs = self.include_dirs.split(os.pathsep)
+
+        # XXX same as for build_ext -- what about 'self.define' and
+        # 'self.undef' ?
+
+
+    def run(self):
+        if not self.libraries:
+            return
+
+        # Yech -- this is cut 'n pasted from build_ext.py!
+        from distutils.ccompiler import new_compiler
+        self.compiler = new_compiler(compiler=self.compiler,
+                                     dry_run=self.dry_run,
+                                     force=self.force)
+        customize_compiler(self.compiler)
+
+        if self.include_dirs is not None:
+            self.compiler.set_include_dirs(self.include_dirs)
+        if self.define is not None:
+            # 'define' option is a list of (name,value) tuples
+            for (name,value) in self.define:
+                self.compiler.define_macro(name, value)
+        if self.undef is not None:
+            for macro in self.undef:
+                self.compiler.undefine_macro(macro)
+
+        self.build_libraries(self.libraries)
+
+
+    def check_library_list(self, libraries):
+        """Ensure that the list of libraries is valid.
+
+        `library` is presumably provided as a command option 'libraries'.
+        This method checks that it is a list of 2-tuples, where the tuples
+        are (library_name, build_info_dict).
+
+        Raise DistutilsSetupError if the structure is invalid anywhere;
+        just returns otherwise.
+        """
+        if not isinstance(libraries, list):
+            raise DistutilsSetupError(
+                  "'libraries' option must be a list of tuples")
+
+        for lib in libraries:
+            if not isinstance(lib, tuple) and len(lib) != 2:
+                raise DistutilsSetupError(
+                      "each element of 'libraries' must a 2-tuple")
+
+            name, build_info = lib
+
+            if not isinstance(name, str):
+                raise DistutilsSetupError(
+                      "first element of each tuple in 'libraries' "
+                      "must be a string (the library name)")
+
+            if '/' in name or (os.sep != '/' and os.sep in name):
+                raise DistutilsSetupError("bad library name '%s': "
+                       "may not contain directory separators" % lib[0])
+
+            if not isinstance(build_info, dict):
+                raise DistutilsSetupError(
+                      "second element of each tuple in 'libraries' "
+                      "must be a dictionary (build info)")
+
+
+    def get_library_names(self):
+        # Assume the library list is valid -- 'check_library_list()' is
+        # called from 'finalize_options()', so it should be!
+        if not self.libraries:
+            return None
+
+        lib_names = []
+        for (lib_name, build_info) in self.libraries:
+            lib_names.append(lib_name)
+        return lib_names
+
+
+    def get_source_files(self):
+        self.check_library_list(self.libraries)
+        filenames = []
+        for (lib_name, build_info) in self.libraries:
+            sources = build_info.get('sources')
+            if sources is None or not isinstance(sources, (list, tuple)):
+                raise DistutilsSetupError(
+                       "in 'libraries' option (library '%s'), "
+                       "'sources' must be present and must be "
+                       "a list of source filenames" % lib_name)
+
+            filenames.extend(sources)
+        return filenames
+
+
+    def build_libraries(self, libraries):
+        for (lib_name, build_info) in libraries:
+            sources = build_info.get('sources')
+            if sources is None or not isinstance(sources, (list, tuple)):
+                raise DistutilsSetupError(
+                       "in 'libraries' option (library '%s'), "
+                       "'sources' must be present and must be "
+                       "a list of source filenames" % lib_name)
+            sources = list(sources)
+
+            log.info("building '%s' library", lib_name)
+
+            # First, compile the source code to object files in the library
+            # directory.  (This should probably change to putting object
+            # files in a temporary build directory.)
+            macros = build_info.get('macros')
+            include_dirs = build_info.get('include_dirs')
+            objects = self.compiler.compile(sources,
+                                            output_dir=self.build_temp,
+                                            macros=macros,
+                                            include_dirs=include_dirs,
+                                            debug=self.debug)
+
+            # Now "link" the object files together into a static library.
+            # (On Unix at least, this isn't really linking -- it just
+            # builds an archive.  Whatever.)
+            self.compiler.create_static_lib(objects, lib_name,
+                                            output_dir=self.build_clib,
+                                            debug=self.debug)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py b/venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py
new file mode 100644
index 0000000..1a9bd12
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py
@@ -0,0 +1,754 @@
+"""distutils.command.build_ext
+
+Implements the Distutils 'build_ext' command, for building extension
+modules (currently limited to C extensions, should accommodate C++
+extensions ASAP)."""
+
+import contextlib
+import os
+import re
+import sys
+from distutils.core import Command
+from distutils.errors import *
+from distutils.sysconfig import customize_compiler, get_python_version
+from distutils.sysconfig import get_config_h_filename
+from distutils.dep_util import newer_group
+from distutils.extension import Extension
+from distutils.util import get_platform
+from distutils import log
+
+from site import USER_BASE
+
+# An extension name is just a dot-separated list of Python NAMEs (ie.
+# the same as a fully-qualified module name).
+extension_name_re = re.compile \
+    (r'^[a-zA-Z_][a-zA-Z_0-9]*(\.[a-zA-Z_][a-zA-Z_0-9]*)*$')
+
+
+def show_compilers ():
+    from distutils.ccompiler import show_compilers
+    show_compilers()
+
+
+class build_ext(Command):
+
+    description = "build C/C++ extensions (compile/link to build directory)"
+
+    # XXX thoughts on how to deal with complex command-line options like
+    # these, i.e. how to make it so fancy_getopt can suck them off the
+    # command line and make it look like setup.py defined the appropriate
+    # lists of tuples of what-have-you.
+    #   - each command needs a callback to process its command-line options
+    #   - Command.__init__() needs access to its share of the whole
+    #     command line (must ultimately come from
+    #     Distribution.parse_command_line())
+    #   - it then calls the current command class' option-parsing
+    #     callback to deal with weird options like -D, which have to
+    #     parse the option text and churn out some custom data
+    #     structure
+    #   - that data structure (in this case, a list of 2-tuples)
+    #     will then be present in the command object by the time
+    #     we get to finalize_options() (i.e. the constructor
+    #     takes care of both command-line and client options
+    #     in between initialize_options() and finalize_options())
+
+    sep_by = " (separated by '%s')" % os.pathsep
+    user_options = [
+        ('build-lib=', 'b',
+         "directory for compiled extension modules"),
+        ('build-temp=', 't',
+         "directory for temporary files (build by-products)"),
+        ('plat-name=', 'p',
+         "platform name to cross-compile for, if supported "
+         "(default: %s)" % get_platform()),
+        ('inplace', 'i',
+         "ignore build-lib and put compiled extensions into the source " +
+         "directory alongside your pure Python modules"),
+        ('include-dirs=', 'I',
+         "list of directories to search for header files" + sep_by),
+        ('define=', 'D',
+         "C preprocessor macros to define"),
+        ('undef=', 'U',
+         "C preprocessor macros to undefine"),
+        ('libraries=', 'l',
+         "external C libraries to link with"),
+        ('library-dirs=', 'L',
+         "directories to search for external C libraries" + sep_by),
+        ('rpath=', 'R',
+         "directories to search for shared C libraries at runtime"),
+        ('link-objects=', 'O',
+         "extra explicit link objects to include in the link"),
+        ('debug', 'g',
+         "compile/link with debugging information"),
+        ('force', 'f',
+         "forcibly build everything (ignore file timestamps)"),
+        ('compiler=', 'c',
+         "specify the compiler type"),
+        ('parallel=', 'j',
+         "number of parallel build jobs"),
+        ('swig-cpp', None,
+         "make SWIG create C++ files (default is C)"),
+        ('swig-opts=', None,
+         "list of SWIG command line options"),
+        ('swig=', None,
+         "path to the SWIG executable"),
+        ('user', None,
+         "add user include, library and rpath")
+        ]
+
+    boolean_options = ['inplace', 'debug', 'force', 'swig-cpp', 'user']
+
+    help_options = [
+        ('help-compiler', None,
+         "list available compilers", show_compilers),
+        ]
+
+    def initialize_options(self):
+        self.extensions = None
+        self.build_lib = None
+        self.plat_name = None
+        self.build_temp = None
+        self.inplace = 0
+        self.package = None
+
+        self.include_dirs = None
+        self.define = None
+        self.undef = None
+        self.libraries = None
+        self.library_dirs = None
+        self.rpath = None
+        self.link_objects = None
+        self.debug = None
+        self.force = None
+        self.compiler = None
+        self.swig = None
+        self.swig_cpp = None
+        self.swig_opts = None
+        self.user = None
+        self.parallel = None
+
+    def finalize_options(self):
+        from distutils import sysconfig
+
+        self.set_undefined_options('build',
+                                   ('build_lib', 'build_lib'),
+                                   ('build_temp', 'build_temp'),
+                                   ('compiler', 'compiler'),
+                                   ('debug', 'debug'),
+                                   ('force', 'force'),
+                                   ('parallel', 'parallel'),
+                                   ('plat_name', 'plat_name'),
+                                   )
+
+        if self.package is None:
+            self.package = self.distribution.ext_package
+
+        self.extensions = self.distribution.ext_modules
+
+        # Make sure Python's include directories (for Python.h, pyconfig.h,
+        # etc.) are in the include search path.
+        py_include = sysconfig.get_python_inc()
+        plat_py_include = sysconfig.get_python_inc(plat_specific=1)
+        if self.include_dirs is None:
+            self.include_dirs = self.distribution.include_dirs or []
+        if isinstance(self.include_dirs, str):
+            self.include_dirs = self.include_dirs.split(os.pathsep)
+
+        # If in a virtualenv, add its include directory
+        # Issue 16116
+        if sys.exec_prefix != sys.base_exec_prefix:
+            self.include_dirs.append(os.path.join(sys.exec_prefix, 'include'))
+
+        # Put the Python "system" include dir at the end, so that
+        # any local include dirs take precedence.
+        self.include_dirs.extend(py_include.split(os.path.pathsep))
+        if plat_py_include != py_include:
+            self.include_dirs.extend(
+                plat_py_include.split(os.path.pathsep))
+
+        self.ensure_string_list('libraries')
+        self.ensure_string_list('link_objects')
+
+        # Life is easier if we're not forever checking for None, so
+        # simplify these options to empty lists if unset
+        if self.libraries is None:
+            self.libraries = []
+        if self.library_dirs is None:
+            self.library_dirs = []
+        elif isinstance(self.library_dirs, str):
+            self.library_dirs = self.library_dirs.split(os.pathsep)
+
+        if self.rpath is None:
+            self.rpath = []
+        elif isinstance(self.rpath, str):
+            self.rpath = self.rpath.split(os.pathsep)
+
+        # for extensions under windows use different directories
+        # for Release and Debug builds.
+        # also Python's library directory must be appended to library_dirs
+        if os.name == 'nt':
+            # the 'libs' directory is for binary installs - we assume that
+            # must be the *native* platform.  But we don't really support
+            # cross-compiling via a binary install anyway, so we let it go.
+            self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs'))
+            if sys.base_exec_prefix != sys.prefix:  # Issue 16116
+                self.library_dirs.append(os.path.join(sys.base_exec_prefix, 'libs'))
+            if self.debug:
+                self.build_temp = os.path.join(self.build_temp, "Debug")
+            else:
+                self.build_temp = os.path.join(self.build_temp, "Release")
+
+            # Append the source distribution include and library directories,
+            # this allows distutils on windows to work in the source tree
+            self.include_dirs.append(os.path.dirname(get_config_h_filename()))
+            _sys_home = getattr(sys, '_home', None)
+            if _sys_home:
+                self.library_dirs.append(_sys_home)
+
+            # Use the .lib files for the correct architecture
+            if self.plat_name == 'win32':
+                suffix = 'win32'
+            else:
+                # win-amd64
+                suffix = self.plat_name[4:]
+            new_lib = os.path.join(sys.exec_prefix, 'PCbuild')
+            if suffix:
+                new_lib = os.path.join(new_lib, suffix)
+            self.library_dirs.append(new_lib)
+
+        # For extensions under Cygwin, Python's library directory must be
+        # appended to library_dirs
+        if sys.platform[:6] == 'cygwin':
+            if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")):
+                # building third party extensions
+                self.library_dirs.append(os.path.join(sys.prefix, "lib",
+                                                      "python" + get_python_version(),
+                                                      "config"))
+            else:
+                # building python standard extensions
+                self.library_dirs.append('.')
+
+        # For building extensions with a shared Python library,
+        # Python's library directory must be appended to library_dirs
+        # See Issues: #1600860, #4366
+        if (sysconfig.get_config_var('Py_ENABLE_SHARED')):
+            if not sysconfig.python_build:
+                # building third party extensions
+                self.library_dirs.append(sysconfig.get_config_var('LIBDIR'))
+            else:
+                # building python standard extensions
+                self.library_dirs.append('.')
+
+        # The argument parsing will result in self.define being a string, but
+        # it has to be a list of 2-tuples.  All the preprocessor symbols
+        # specified by the 'define' option will be set to '1'.  Multiple
+        # symbols can be separated with commas.
+
+        if self.define:
+            defines = self.define.split(',')
+            self.define = [(symbol, '1') for symbol in defines]
+
+        # The option for macros to undefine is also a string from the
+        # option parsing, but has to be a list.  Multiple symbols can also
+        # be separated with commas here.
+        if self.undef:
+            self.undef = self.undef.split(',')
+
+        if self.swig_opts is None:
+            self.swig_opts = []
+        else:
+            self.swig_opts = self.swig_opts.split(' ')
+
+        # Finally add the user include and library directories if requested
+        if self.user:
+            user_include = os.path.join(USER_BASE, "include")
+            user_lib = os.path.join(USER_BASE, "lib")
+            if os.path.isdir(user_include):
+                self.include_dirs.append(user_include)
+            if os.path.isdir(user_lib):
+                self.library_dirs.append(user_lib)
+                self.rpath.append(user_lib)
+
+        if isinstance(self.parallel, str):
+            try:
+                self.parallel = int(self.parallel)
+            except ValueError:
+                raise DistutilsOptionError("parallel should be an integer")
+
+    def run(self):
+        from distutils.ccompiler import new_compiler
+
+        # 'self.extensions', as supplied by setup.py, is a list of
+        # Extension instances.  See the documentation for Extension (in
+        # distutils.extension) for details.
+        #
+        # For backwards compatibility with Distutils 0.8.2 and earlier, we
+        # also allow the 'extensions' list to be a list of tuples:
+        #    (ext_name, build_info)
+        # where build_info is a dictionary containing everything that
+        # Extension instances do except the name, with a few things being
+        # differently named.  We convert these 2-tuples to Extension
+        # instances as needed.
+
+        if not self.extensions:
+            return
+
+        # If we were asked to build any C/C++ libraries, make sure that the
+        # directory where we put them is in the library search path for
+        # linking extensions.
+        if self.distribution.has_c_libraries():
+            build_clib = self.get_finalized_command('build_clib')
+            self.libraries.extend(build_clib.get_library_names() or [])
+            self.library_dirs.append(build_clib.build_clib)
+
+        # Setup the CCompiler object that we'll use to do all the
+        # compiling and linking
+        self.compiler = new_compiler(compiler=self.compiler,
+                                     verbose=self.verbose,
+                                     dry_run=self.dry_run,
+                                     force=self.force)
+        customize_compiler(self.compiler)
+        # If we are cross-compiling, init the compiler now (if we are not
+        # cross-compiling, init would not hurt, but people may rely on
+        # late initialization of compiler even if they shouldn't...)
+        if os.name == 'nt' and self.plat_name != get_platform():
+            self.compiler.initialize(self.plat_name)
+
+        # And make sure that any compile/link-related options (which might
+        # come from the command-line or from the setup script) are set in
+        # that CCompiler object -- that way, they automatically apply to
+        # all compiling and linking done here.
+        if self.include_dirs is not None:
+            self.compiler.set_include_dirs(self.include_dirs)
+        if self.define is not None:
+            # 'define' option is a list of (name,value) tuples
+            for (name, value) in self.define:
+                self.compiler.define_macro(name, value)
+        if self.undef is not None:
+            for macro in self.undef:
+                self.compiler.undefine_macro(macro)
+        if self.libraries is not None:
+            self.compiler.set_libraries(self.libraries)
+        if self.library_dirs is not None:
+            self.compiler.set_library_dirs(self.library_dirs)
+        if self.rpath is not None:
+            self.compiler.set_runtime_library_dirs(self.rpath)
+        if self.link_objects is not None:
+            self.compiler.set_link_objects(self.link_objects)
+
+        # Now actually compile and link everything.
+        self.build_extensions()
+
+    def check_extensions_list(self, extensions):
+        """Ensure that the list of extensions (presumably provided as a
+        command option 'extensions') is valid, i.e. it is a list of
+        Extension objects.  We also support the old-style list of 2-tuples,
+        where the tuples are (ext_name, build_info), which are converted to
+        Extension instances here.
+
+        Raise DistutilsSetupError if the structure is invalid anywhere;
+        just returns otherwise.
+        """
+        if not isinstance(extensions, list):
+            raise DistutilsSetupError(
+                  "'ext_modules' option must be a list of Extension instances")
+
+        for i, ext in enumerate(extensions):
+            if isinstance(ext, Extension):
+                continue                # OK! (assume type-checking done
+                                        # by Extension constructor)
+
+            if not isinstance(ext, tuple) or len(ext) != 2:
+                raise DistutilsSetupError(
+                       "each element of 'ext_modules' option must be an "
+                       "Extension instance or 2-tuple")
+
+            ext_name, build_info = ext
+
+            log.warn("old-style (ext_name, build_info) tuple found in "
+                     "ext_modules for extension '%s' "
+                     "-- please convert to Extension instance", ext_name)
+
+            if not (isinstance(ext_name, str) and
+                    extension_name_re.match(ext_name)):
+                raise DistutilsSetupError(
+                       "first element of each tuple in 'ext_modules' "
+                       "must be the extension name (a string)")
+
+            if not isinstance(build_info, dict):
+                raise DistutilsSetupError(
+                       "second element of each tuple in 'ext_modules' "
+                       "must be a dictionary (build info)")
+
+            # OK, the (ext_name, build_info) dict is type-safe: convert it
+            # to an Extension instance.
+            ext = Extension(ext_name, build_info['sources'])
+
+            # Easy stuff: one-to-one mapping from dict elements to
+            # instance attributes.
+            for key in ('include_dirs', 'library_dirs', 'libraries',
+                        'extra_objects', 'extra_compile_args',
+                        'extra_link_args'):
+                val = build_info.get(key)
+                if val is not None:
+                    setattr(ext, key, val)
+
+            # Medium-easy stuff: same syntax/semantics, different names.
+            ext.runtime_library_dirs = build_info.get('rpath')
+            if 'def_file' in build_info:
+                log.warn("'def_file' element of build info dict "
+                         "no longer supported")
+
+            # Non-trivial stuff: 'macros' split into 'define_macros'
+            # and 'undef_macros'.
+            macros = build_info.get('macros')
+            if macros:
+                ext.define_macros = []
+                ext.undef_macros = []
+                for macro in macros:
+                    if not (isinstance(macro, tuple) and len(macro) in (1, 2)):
+                        raise DistutilsSetupError(
+                              "'macros' element of build info dict "
+                              "must be 1- or 2-tuple")
+                    if len(macro) == 1:
+                        ext.undef_macros.append(macro[0])
+                    elif len(macro) == 2:
+                        ext.define_macros.append(macro)
+
+            extensions[i] = ext
+
+    def get_source_files(self):
+        self.check_extensions_list(self.extensions)
+        filenames = []
+
+        # Wouldn't it be neat if we knew the names of header files too...
+        for ext in self.extensions:
+            filenames.extend(ext.sources)
+        return filenames
+
+    def get_outputs(self):
+        # Sanity check the 'extensions' list -- can't assume this is being
+        # done in the same run as a 'build_extensions()' call (in fact, we
+        # can probably assume that it *isn't*!).
+        self.check_extensions_list(self.extensions)
+
+        # And build the list of output (built) filenames.  Note that this
+        # ignores the 'inplace' flag, and assumes everything goes in the
+        # "build" tree.
+        outputs = []
+        for ext in self.extensions:
+            outputs.append(self.get_ext_fullpath(ext.name))
+        return outputs
+
+    def build_extensions(self):
+        # First, sanity-check the 'extensions' list
+        self.check_extensions_list(self.extensions)
+        if self.parallel:
+            self._build_extensions_parallel()
+        else:
+            self._build_extensions_serial()
+
+    def _build_extensions_parallel(self):
+        workers = self.parallel
+        if self.parallel is True:
+            workers = os.cpu_count()  # may return None
+        try:
+            from concurrent.futures import ThreadPoolExecutor
+        except ImportError:
+            workers = None
+
+        if workers is None:
+            self._build_extensions_serial()
+            return
+
+        with ThreadPoolExecutor(max_workers=workers) as executor:
+            futures = [executor.submit(self.build_extension, ext)
+                       for ext in self.extensions]
+            for ext, fut in zip(self.extensions, futures):
+                with self._filter_build_errors(ext):
+                    fut.result()
+
+    def _build_extensions_serial(self):
+        for ext in self.extensions:
+            with self._filter_build_errors(ext):
+                self.build_extension(ext)
+
+    @contextlib.contextmanager
+    def _filter_build_errors(self, ext):
+        try:
+            yield
+        except (CCompilerError, DistutilsError, CompileError) as e:
+            if not ext.optional:
+                raise
+            self.warn('building extension "%s" failed: %s' %
+                      (ext.name, e))
+
+    def build_extension(self, ext):
+        sources = ext.sources
+        if sources is None or not isinstance(sources, (list, tuple)):
+            raise DistutilsSetupError(
+                  "in 'ext_modules' option (extension '%s'), "
+                  "'sources' must be present and must be "
+                  "a list of source filenames" % ext.name)
+        # sort to make the resulting .so file build reproducible
+        sources = sorted(sources)
+
+        ext_path = self.get_ext_fullpath(ext.name)
+        depends = sources + ext.depends
+        if not (self.force or newer_group(depends, ext_path, 'newer')):
+            log.debug("skipping '%s' extension (up-to-date)", ext.name)
+            return
+        else:
+            log.info("building '%s' extension", ext.name)
+
+        # First, scan the sources for SWIG definition files (.i), run
+        # SWIG on 'em to create .c files, and modify the sources list
+        # accordingly.
+        sources = self.swig_sources(sources, ext)
+
+        # Next, compile the source code to object files.
+
+        # XXX not honouring 'define_macros' or 'undef_macros' -- the
+        # CCompiler API needs to change to accommodate this, and I
+        # want to do one thing at a time!
+
+        # Two possible sources for extra compiler arguments:
+        #   - 'extra_compile_args' in Extension object
+        #   - CFLAGS environment variable (not particularly
+        #     elegant, but people seem to expect it and I
+        #     guess it's useful)
+        # The environment variable should take precedence, and
+        # any sensible compiler will give precedence to later
+        # command line args.  Hence we combine them in order:
+        extra_args = ext.extra_compile_args or []
+
+        macros = ext.define_macros[:]
+        for undef in ext.undef_macros:
+            macros.append((undef,))
+
+        objects = self.compiler.compile(sources,
+                                         output_dir=self.build_temp,
+                                         macros=macros,
+                                         include_dirs=ext.include_dirs,
+                                         debug=self.debug,
+                                         extra_postargs=extra_args,
+                                         depends=ext.depends)
+
+        # XXX outdated variable, kept here in case third-part code
+        # needs it.
+        self._built_objects = objects[:]
+
+        # Now link the object files together into a "shared object" --
+        # of course, first we have to figure out all the other things
+        # that go into the mix.
+        if ext.extra_objects:
+            objects.extend(ext.extra_objects)
+        extra_args = ext.extra_link_args or []
+
+        # Detect target language, if not provided
+        language = ext.language or self.compiler.detect_language(sources)
+
+        self.compiler.link_shared_object(
+            objects, ext_path,
+            libraries=self.get_libraries(ext),
+            library_dirs=ext.library_dirs,
+            runtime_library_dirs=ext.runtime_library_dirs,
+            extra_postargs=extra_args,
+            export_symbols=self.get_export_symbols(ext),
+            debug=self.debug,
+            build_temp=self.build_temp,
+            target_lang=language)
+
+    def swig_sources(self, sources, extension):
+        """Walk the list of source files in 'sources', looking for SWIG
+        interface (.i) files.  Run SWIG on all that are found, and
+        return a modified 'sources' list with SWIG source files replaced
+        by the generated C (or C++) files.
+        """
+        new_sources = []
+        swig_sources = []
+        swig_targets = {}
+
+        # XXX this drops generated C/C++ files into the source tree, which
+        # is fine for developers who want to distribute the generated
+        # source -- but there should be an option to put SWIG output in
+        # the temp dir.
+
+        if self.swig_cpp:
+            log.warn("--swig-cpp is deprecated - use --swig-opts=-c++")
+
+        if self.swig_cpp or ('-c++' in self.swig_opts) or \
+           ('-c++' in extension.swig_opts):
+            target_ext = '.cpp'
+        else:
+            target_ext = '.c'
+
+        for source in sources:
+            (base, ext) = os.path.splitext(source)
+            if ext == ".i":             # SWIG interface file
+                new_sources.append(base + '_wrap' + target_ext)
+                swig_sources.append(source)
+                swig_targets[source] = new_sources[-1]
+            else:
+                new_sources.append(source)
+
+        if not swig_sources:
+            return new_sources
+
+        swig = self.swig or self.find_swig()
+        swig_cmd = [swig, "-python"]
+        swig_cmd.extend(self.swig_opts)
+        if self.swig_cpp:
+            swig_cmd.append("-c++")
+
+        # Do not override commandline arguments
+        if not self.swig_opts:
+            for o in extension.swig_opts:
+                swig_cmd.append(o)
+
+        for source in swig_sources:
+            target = swig_targets[source]
+            log.info("swigging %s to %s", source, target)
+            self.spawn(swig_cmd + ["-o", target, source])
+
+        return new_sources
+
+    def find_swig(self):
+        """Return the name of the SWIG executable.  On Unix, this is
+        just "swig" -- it should be in the PATH.  Tries a bit harder on
+        Windows.
+        """
+        if os.name == "posix":
+            return "swig"
+        elif os.name == "nt":
+            # Look for SWIG in its standard installation directory on
+            # Windows (or so I presume!).  If we find it there, great;
+            # if not, act like Unix and assume it's in the PATH.
+            for vers in ("1.3", "1.2", "1.1"):
+                fn = os.path.join("c:\\swig%s" % vers, "swig.exe")
+                if os.path.isfile(fn):
+                    return fn
+            else:
+                return "swig.exe"
+        else:
+            raise DistutilsPlatformError(
+                  "I don't know how to find (much less run) SWIG "
+                  "on platform '%s'" % os.name)
+
+    # -- Name generators -----------------------------------------------
+    # (extension names, filenames, whatever)
+    def get_ext_fullpath(self, ext_name):
+        """Returns the path of the filename for a given extension.
+
+        The file is located in `build_lib` or directly in the package
+        (inplace option).
+        """
+        fullname = self.get_ext_fullname(ext_name)
+        modpath = fullname.split('.')
+        filename = self.get_ext_filename(modpath[-1])
+
+        if not self.inplace:
+            # no further work needed
+            # returning :
+            #   build_dir/package/path/filename
+            filename = os.path.join(*modpath[:-1]+[filename])
+            return os.path.join(self.build_lib, filename)
+
+        # the inplace option requires to find the package directory
+        # using the build_py command for that
+        package = '.'.join(modpath[0:-1])
+        build_py = self.get_finalized_command('build_py')
+        package_dir = os.path.abspath(build_py.get_package_dir(package))
+
+        # returning
+        #   package_dir/filename
+        return os.path.join(package_dir, filename)
+
+    def get_ext_fullname(self, ext_name):
+        """Returns the fullname of a given extension name.
+
+        Adds the `package.` prefix"""
+        if self.package is None:
+            return ext_name
+        else:
+            return self.package + '.' + ext_name
+
+    def get_ext_filename(self, ext_name):
+        r"""Convert the name of an extension (eg. "foo.bar") into the name
+        of the file from which it will be loaded (eg. "foo/bar.so", or
+        "foo\bar.pyd").
+        """
+        from distutils.sysconfig import get_config_var
+        ext_path = ext_name.split('.')
+        ext_suffix = get_config_var('EXT_SUFFIX')
+        return os.path.join(*ext_path) + ext_suffix
+
+    def get_export_symbols(self, ext):
+        """Return the list of symbols that a shared extension has to
+        export.  This either uses 'ext.export_symbols' or, if it's not
+        provided, "PyInit_" + module_name.  Only relevant on Windows, where
+        the .pyd file (DLL) must export the module "PyInit_" function.
+        """
+        suffix = '_' + ext.name.split('.')[-1]
+        try:
+            # Unicode module name support as defined in PEP-489
+            # https://www.python.org/dev/peps/pep-0489/#export-hook-name
+            suffix.encode('ascii')
+        except UnicodeEncodeError:
+            suffix = 'U' + suffix.encode('punycode').replace(b'-', b'_').decode('ascii')
+
+        initfunc_name = "PyInit" + suffix
+        if initfunc_name not in ext.export_symbols:
+            ext.export_symbols.append(initfunc_name)
+        return ext.export_symbols
+
+    def get_libraries(self, ext):
+        """Return the list of libraries to link against when building a
+        shared extension.  On most platforms, this is just 'ext.libraries';
+        on Windows, we add the Python library (eg. python20.dll).
+        """
+        # The python library is always needed on Windows.  For MSVC, this
+        # is redundant, since the library is mentioned in a pragma in
+        # pyconfig.h that MSVC groks.  The other Windows compilers all seem
+        # to need it mentioned explicitly, though, so that's what we do.
+        # Append '_d' to the python import library on debug builds.
+        if sys.platform == "win32":
+            from distutils._msvccompiler import MSVCCompiler
+            if not isinstance(self.compiler, MSVCCompiler):
+                template = "python%d%d"
+                if self.debug:
+                    template = template + '_d'
+                pythonlib = (template %
+                       (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
+                # don't extend ext.libraries, it may be shared with other
+                # extensions, it is a reference to the original list
+                return ext.libraries + [pythonlib]
+        else:
+            # On Android only the main executable and LD_PRELOADs are considered
+            # to be RTLD_GLOBAL, all the dependencies of the main executable
+            # remain RTLD_LOCAL and so the shared libraries must be linked with
+            # libpython when python is built with a shared python library (issue
+            # bpo-21536).
+            # On Cygwin (and if required, other POSIX-like platforms based on
+            # Windows like MinGW) it is simply necessary that all symbols in
+            # shared libraries are resolved at link time.
+            from distutils.sysconfig import get_config_var
+            link_libpython = False
+            if get_config_var('Py_ENABLE_SHARED'):
+                # A native build on an Android device or on Cygwin
+                if hasattr(sys, 'getandroidapilevel'):
+                    link_libpython = True
+                elif sys.platform == 'cygwin':
+                    link_libpython = True
+                elif '_PYTHON_HOST_PLATFORM' in os.environ:
+                    # We are cross-compiling for one of the relevant platforms
+                    if get_config_var('ANDROID_API_LEVEL') != 0:
+                        link_libpython = True
+                    elif get_config_var('MACHDEP') == 'cygwin':
+                        link_libpython = True
+
+            if link_libpython:
+                ldversion = get_config_var('LDVERSION')
+                return ext.libraries + ['python' + ldversion]
+
+        return ext.libraries
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/build_py.py b/venv/Lib/site-packages/setuptools/_distutils/command/build_py.py
new file mode 100644
index 0000000..edc2171
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/build_py.py
@@ -0,0 +1,416 @@
+"""distutils.command.build_py
+
+Implements the Distutils 'build_py' command."""
+
+import os
+import importlib.util
+import sys
+import glob
+
+from distutils.core import Command
+from distutils.errors import *
+from distutils.util import convert_path, Mixin2to3
+from distutils import log
+
+class build_py (Command):
+
+    description = "\"build\" pure Python modules (copy to build directory)"
+
+    user_options = [
+        ('build-lib=', 'd', "directory to \"build\" (copy) to"),
+        ('compile', 'c', "compile .py to .pyc"),
+        ('no-compile', None, "don't compile .py files [default]"),
+        ('optimize=', 'O',
+         "also compile with optimization: -O1 for \"python -O\", "
+         "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"),
+        ('force', 'f', "forcibly build everything (ignore file timestamps)"),
+        ]
+
+    boolean_options = ['compile', 'force']
+    negative_opt = {'no-compile' : 'compile'}
+
+    def initialize_options(self):
+        self.build_lib = None
+        self.py_modules = None
+        self.package = None
+        self.package_data = None
+        self.package_dir = None
+        self.compile = 0
+        self.optimize = 0
+        self.force = None
+
+    def finalize_options(self):
+        self.set_undefined_options('build',
+                                   ('build_lib', 'build_lib'),
+                                   ('force', 'force'))
+
+        # Get the distribution options that are aliases for build_py
+        # options -- list of packages and list of modules.
+        self.packages = self.distribution.packages
+        self.py_modules = self.distribution.py_modules
+        self.package_data = self.distribution.package_data
+        self.package_dir = {}
+        if self.distribution.package_dir:
+            for name, path in self.distribution.package_dir.items():
+                self.package_dir[name] = convert_path(path)
+        self.data_files = self.get_data_files()
+
+        # Ick, copied straight from install_lib.py (fancy_getopt needs a
+        # type system!  Hell, *everything* needs a type system!!!)
+        if not isinstance(self.optimize, int):
+            try:
+                self.optimize = int(self.optimize)
+                assert 0 <= self.optimize <= 2
+            except (ValueError, AssertionError):
+                raise DistutilsOptionError("optimize must be 0, 1, or 2")
+
+    def run(self):
+        # XXX copy_file by default preserves atime and mtime.  IMHO this is
+        # the right thing to do, but perhaps it should be an option -- in
+        # particular, a site administrator might want installed files to
+        # reflect the time of installation rather than the last
+        # modification time before the installed release.
+
+        # XXX copy_file by default preserves mode, which appears to be the
+        # wrong thing to do: if a file is read-only in the working
+        # directory, we want it to be installed read/write so that the next
+        # installation of the same module distribution can overwrite it
+        # without problems.  (This might be a Unix-specific issue.)  Thus
+        # we turn off 'preserve_mode' when copying to the build directory,
+        # since the build directory is supposed to be exactly what the
+        # installation will look like (ie. we preserve mode when
+        # installing).
+
+        # Two options control which modules will be installed: 'packages'
+        # and 'py_modules'.  The former lets us work with whole packages, not
+        # specifying individual modules at all; the latter is for
+        # specifying modules one-at-a-time.
+
+        if self.py_modules:
+            self.build_modules()
+        if self.packages:
+            self.build_packages()
+            self.build_package_data()
+
+        self.byte_compile(self.get_outputs(include_bytecode=0))
+
+    def get_data_files(self):
+        """Generate list of '(package,src_dir,build_dir,filenames)' tuples"""
+        data = []
+        if not self.packages:
+            return data
+        for package in self.packages:
+            # Locate package source directory
+            src_dir = self.get_package_dir(package)
+
+            # Compute package build directory
+            build_dir = os.path.join(*([self.build_lib] + package.split('.')))
+
+            # Length of path to strip from found files
+            plen = 0
+            if src_dir:
+                plen = len(src_dir)+1
+
+            # Strip directory from globbed filenames
+            filenames = [
+                file[plen:] for file in self.find_data_files(package, src_dir)
+                ]
+            data.append((package, src_dir, build_dir, filenames))
+        return data
+
+    def find_data_files(self, package, src_dir):
+        """Return filenames for package's data files in 'src_dir'"""
+        globs = (self.package_data.get('', [])
+                 + self.package_data.get(package, []))
+        files = []
+        for pattern in globs:
+            # Each pattern has to be converted to a platform-specific path
+            filelist = glob.glob(os.path.join(glob.escape(src_dir), convert_path(pattern)))
+            # Files that match more than one pattern are only added once
+            files.extend([fn for fn in filelist if fn not in files
+                and os.path.isfile(fn)])
+        return files
+
+    def build_package_data(self):
+        """Copy data files into build directory"""
+        lastdir = None
+        for package, src_dir, build_dir, filenames in self.data_files:
+            for filename in filenames:
+                target = os.path.join(build_dir, filename)
+                self.mkpath(os.path.dirname(target))
+                self.copy_file(os.path.join(src_dir, filename), target,
+                               preserve_mode=False)
+
+    def get_package_dir(self, package):
+        """Return the directory, relative to the top of the source
+           distribution, where package 'package' should be found
+           (at least according to the 'package_dir' option, if any)."""
+        path = package.split('.')
+
+        if not self.package_dir:
+            if path:
+                return os.path.join(*path)
+            else:
+                return ''
+        else:
+            tail = []
+            while path:
+                try:
+                    pdir = self.package_dir['.'.join(path)]
+                except KeyError:
+                    tail.insert(0, path[-1])
+                    del path[-1]
+                else:
+                    tail.insert(0, pdir)
+                    return os.path.join(*tail)
+            else:
+                # Oops, got all the way through 'path' without finding a
+                # match in package_dir.  If package_dir defines a directory
+                # for the root (nameless) package, then fallback on it;
+                # otherwise, we might as well have not consulted
+                # package_dir at all, as we just use the directory implied
+                # by 'tail' (which should be the same as the original value
+                # of 'path' at this point).
+                pdir = self.package_dir.get('')
+                if pdir is not None:
+                    tail.insert(0, pdir)
+
+                if tail:
+                    return os.path.join(*tail)
+                else:
+                    return ''
+
+    def check_package(self, package, package_dir):
+        # Empty dir name means current directory, which we can probably
+        # assume exists.  Also, os.path.exists and isdir don't know about
+        # my "empty string means current dir" convention, so we have to
+        # circumvent them.
+        if package_dir != "":
+            if not os.path.exists(package_dir):
+                raise DistutilsFileError(
+                      "package directory '%s' does not exist" % package_dir)
+            if not os.path.isdir(package_dir):
+                raise DistutilsFileError(
+                       "supposed package directory '%s' exists, "
+                       "but is not a directory" % package_dir)
+
+        # Require __init__.py for all but the "root package"
+        if package:
+            init_py = os.path.join(package_dir, "__init__.py")
+            if os.path.isfile(init_py):
+                return init_py
+            else:
+                log.warn(("package init file '%s' not found " +
+                          "(or not a regular file)"), init_py)
+
+        # Either not in a package at all (__init__.py not expected), or
+        # __init__.py doesn't exist -- so don't return the filename.
+        return None
+
+    def check_module(self, module, module_file):
+        if not os.path.isfile(module_file):
+            log.warn("file %s (for module %s) not found", module_file, module)
+            return False
+        else:
+            return True
+
+    def find_package_modules(self, package, package_dir):
+        self.check_package(package, package_dir)
+        module_files = glob.glob(os.path.join(glob.escape(package_dir), "*.py"))
+        modules = []
+        setup_script = os.path.abspath(self.distribution.script_name)
+
+        for f in module_files:
+            abs_f = os.path.abspath(f)
+            if abs_f != setup_script:
+                module = os.path.splitext(os.path.basename(f))[0]
+                modules.append((package, module, f))
+            else:
+                self.debug_print("excluding %s" % setup_script)
+        return modules
+
+    def find_modules(self):
+        """Finds individually-specified Python modules, ie. those listed by
+        module name in 'self.py_modules'.  Returns a list of tuples (package,
+        module_base, filename): 'package' is a tuple of the path through
+        package-space to the module; 'module_base' is the bare (no
+        packages, no dots) module name, and 'filename' is the path to the
+        ".py" file (relative to the distribution root) that implements the
+        module.
+        """
+        # Map package names to tuples of useful info about the package:
+        #    (package_dir, checked)
+        # package_dir - the directory where we'll find source files for
+        #   this package
+        # checked - true if we have checked that the package directory
+        #   is valid (exists, contains __init__.py, ... ?)
+        packages = {}
+
+        # List of (package, module, filename) tuples to return
+        modules = []
+
+        # We treat modules-in-packages almost the same as toplevel modules,
+        # just the "package" for a toplevel is empty (either an empty
+        # string or empty list, depending on context).  Differences:
+        #   - don't check for __init__.py in directory for empty package
+        for module in self.py_modules:
+            path = module.split('.')
+            package = '.'.join(path[0:-1])
+            module_base = path[-1]
+
+            try:
+                (package_dir, checked) = packages[package]
+            except KeyError:
+                package_dir = self.get_package_dir(package)
+                checked = 0
+
+            if not checked:
+                init_py = self.check_package(package, package_dir)
+                packages[package] = (package_dir, 1)
+                if init_py:
+                    modules.append((package, "__init__", init_py))
+
+            # XXX perhaps we should also check for just .pyc files
+            # (so greedy closed-source bastards can distribute Python
+            # modules too)
+            module_file = os.path.join(package_dir, module_base + ".py")
+            if not self.check_module(module, module_file):
+                continue
+
+            modules.append((package, module_base, module_file))
+
+        return modules
+
+    def find_all_modules(self):
+        """Compute the list of all modules that will be built, whether
+        they are specified one-module-at-a-time ('self.py_modules') or
+        by whole packages ('self.packages').  Return a list of tuples
+        (package, module, module_file), just like 'find_modules()' and
+        'find_package_modules()' do."""
+        modules = []
+        if self.py_modules:
+            modules.extend(self.find_modules())
+        if self.packages:
+            for package in self.packages:
+                package_dir = self.get_package_dir(package)
+                m = self.find_package_modules(package, package_dir)
+                modules.extend(m)
+        return modules
+
+    def get_source_files(self):
+        return [module[-1] for module in self.find_all_modules()]
+
+    def get_module_outfile(self, build_dir, package, module):
+        outfile_path = [build_dir] + list(package) + [module + ".py"]
+        return os.path.join(*outfile_path)
+
+    def get_outputs(self, include_bytecode=1):
+        modules = self.find_all_modules()
+        outputs = []
+        for (package, module, module_file) in modules:
+            package = package.split('.')
+            filename = self.get_module_outfile(self.build_lib, package, module)
+            outputs.append(filename)
+            if include_bytecode:
+                if self.compile:
+                    outputs.append(importlib.util.cache_from_source(
+                        filename, optimization=''))
+                if self.optimize > 0:
+                    outputs.append(importlib.util.cache_from_source(
+                        filename, optimization=self.optimize))
+
+        outputs += [
+            os.path.join(build_dir, filename)
+            for package, src_dir, build_dir, filenames in self.data_files
+            for filename in filenames
+            ]
+
+        return outputs
+
+    def build_module(self, module, module_file, package):
+        if isinstance(package, str):
+            package = package.split('.')
+        elif not isinstance(package, (list, tuple)):
+            raise TypeError(
+                  "'package' must be a string (dot-separated), list, or tuple")
+
+        # Now put the module source file into the "build" area -- this is
+        # easy, we just copy it somewhere under self.build_lib (the build
+        # directory for Python source).
+        outfile = self.get_module_outfile(self.build_lib, package, module)
+        dir = os.path.dirname(outfile)
+        self.mkpath(dir)
+        return self.copy_file(module_file, outfile, preserve_mode=0)
+
+    def build_modules(self):
+        modules = self.find_modules()
+        for (package, module, module_file) in modules:
+            # Now "build" the module -- ie. copy the source file to
+            # self.build_lib (the build directory for Python source).
+            # (Actually, it gets copied to the directory for this package
+            # under self.build_lib.)
+            self.build_module(module, module_file, package)
+
+    def build_packages(self):
+        for package in self.packages:
+            # Get list of (package, module, module_file) tuples based on
+            # scanning the package directory.  'package' is only included
+            # in the tuple so that 'find_modules()' and
+            # 'find_package_tuples()' have a consistent interface; it's
+            # ignored here (apart from a sanity check).  Also, 'module' is
+            # the *unqualified* module name (ie. no dots, no package -- we
+            # already know its package!), and 'module_file' is the path to
+            # the .py file, relative to the current directory
+            # (ie. including 'package_dir').
+            package_dir = self.get_package_dir(package)
+            modules = self.find_package_modules(package, package_dir)
+
+            # Now loop over the modules we found, "building" each one (just
+            # copy it to self.build_lib).
+            for (package_, module, module_file) in modules:
+                assert package == package_
+                self.build_module(module, module_file, package)
+
+    def byte_compile(self, files):
+        if sys.dont_write_bytecode:
+            self.warn('byte-compiling is disabled, skipping.')
+            return
+
+        from distutils.util import byte_compile
+        prefix = self.build_lib
+        if prefix[-1] != os.sep:
+            prefix = prefix + os.sep
+
+        # XXX this code is essentially the same as the 'byte_compile()
+        # method of the "install_lib" command, except for the determination
+        # of the 'prefix' string.  Hmmm.
+        if self.compile:
+            byte_compile(files, optimize=0,
+                         force=self.force, prefix=prefix, dry_run=self.dry_run)
+        if self.optimize > 0:
+            byte_compile(files, optimize=self.optimize,
+                         force=self.force, prefix=prefix, dry_run=self.dry_run)
+
+class build_py_2to3(build_py, Mixin2to3):
+    def run(self):
+        self.updated_files = []
+
+        # Base class code
+        if self.py_modules:
+            self.build_modules()
+        if self.packages:
+            self.build_packages()
+            self.build_package_data()
+
+        # 2to3
+        self.run_2to3(self.updated_files)
+
+        # Remaining base class code
+        self.byte_compile(self.get_outputs(include_bytecode=0))
+
+    def build_module(self, module, module_file, package):
+        res = build_py.build_module(self, module, module_file, package)
+        if res[1]:
+            # file was copied
+            self.updated_files.append(res[0])
+        return res
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py b/venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py
new file mode 100644
index 0000000..ccc70e6
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py
@@ -0,0 +1,160 @@
+"""distutils.command.build_scripts
+
+Implements the Distutils 'build_scripts' command."""
+
+import os, re
+from stat import ST_MODE
+from distutils import sysconfig
+from distutils.core import Command
+from distutils.dep_util import newer
+from distutils.util import convert_path, Mixin2to3
+from distutils import log
+import tokenize
+
+# check if Python is called on the first line with this expression
+first_line_re = re.compile(b'^#!.*python[0-9.]*([ \t].*)?$')
+
+class build_scripts(Command):
+
+    description = "\"build\" scripts (copy and fixup #! line)"
+
+    user_options = [
+        ('build-dir=', 'd', "directory to \"build\" (copy) to"),
+        ('force', 'f', "forcibly build everything (ignore file timestamps"),
+        ('executable=', 'e', "specify final destination interpreter path"),
+        ]
+
+    boolean_options = ['force']
+
+
+    def initialize_options(self):
+        self.build_dir = None
+        self.scripts = None
+        self.force = None
+        self.executable = None
+        self.outfiles = None
+
+    def finalize_options(self):
+        self.set_undefined_options('build',
+                                   ('build_scripts', 'build_dir'),
+                                   ('force', 'force'),
+                                   ('executable', 'executable'))
+        self.scripts = self.distribution.scripts
+
+    def get_source_files(self):
+        return self.scripts
+
+    def run(self):
+        if not self.scripts:
+            return
+        self.copy_scripts()
+
+
+    def copy_scripts(self):
+        r"""Copy each script listed in 'self.scripts'; if it's marked as a
+        Python script in the Unix way (first line matches 'first_line_re',
+        ie. starts with "\#!" and contains "python"), then adjust the first
+        line to refer to the current Python interpreter as we copy.
+        """
+        self.mkpath(self.build_dir)
+        outfiles = []
+        updated_files = []
+        for script in self.scripts:
+            adjust = False
+            script = convert_path(script)
+            outfile = os.path.join(self.build_dir, os.path.basename(script))
+            outfiles.append(outfile)
+
+            if not self.force and not newer(script, outfile):
+                log.debug("not copying %s (up-to-date)", script)
+                continue
+
+            # Always open the file, but ignore failures in dry-run mode --
+            # that way, we'll get accurate feedback if we can read the
+            # script.
+            try:
+                f = open(script, "rb")
+            except OSError:
+                if not self.dry_run:
+                    raise
+                f = None
+            else:
+                encoding, lines = tokenize.detect_encoding(f.readline)
+                f.seek(0)
+                first_line = f.readline()
+                if not first_line:
+                    self.warn("%s is an empty file (skipping)" % script)
+                    continue
+
+                match = first_line_re.match(first_line)
+                if match:
+                    adjust = True
+                    post_interp = match.group(1) or b''
+
+            if adjust:
+                log.info("copying and adjusting %s -> %s", script,
+                         self.build_dir)
+                updated_files.append(outfile)
+                if not self.dry_run:
+                    if not sysconfig.python_build:
+                        executable = self.executable
+                    else:
+                        executable = os.path.join(
+                            sysconfig.get_config_var("BINDIR"),
+                           "python%s%s" % (sysconfig.get_config_var("VERSION"),
+                                           sysconfig.get_config_var("EXE")))
+                    executable = os.fsencode(executable)
+                    shebang = b"#!" + executable + post_interp + b"\n"
+                    # Python parser starts to read a script using UTF-8 until
+                    # it gets a #coding:xxx cookie. The shebang has to be the
+                    # first line of a file, the #coding:xxx cookie cannot be
+                    # written before. So the shebang has to be decodable from
+                    # UTF-8.
+                    try:
+                        shebang.decode('utf-8')
+                    except UnicodeDecodeError:
+                        raise ValueError(
+                            "The shebang ({!r}) is not decodable "
+                            "from utf-8".format(shebang))
+                    # If the script is encoded to a custom encoding (use a
+                    # #coding:xxx cookie), the shebang has to be decodable from
+                    # the script encoding too.
+                    try:
+                        shebang.decode(encoding)
+                    except UnicodeDecodeError:
+                        raise ValueError(
+                            "The shebang ({!r}) is not decodable "
+                            "from the script encoding ({})"
+                            .format(shebang, encoding))
+                    with open(outfile, "wb") as outf:
+                        outf.write(shebang)
+                        outf.writelines(f.readlines())
+                if f:
+                    f.close()
+            else:
+                if f:
+                    f.close()
+                updated_files.append(outfile)
+                self.copy_file(script, outfile)
+
+        if os.name == 'posix':
+            for file in outfiles:
+                if self.dry_run:
+                    log.info("changing mode of %s", file)
+                else:
+                    oldmode = os.stat(file)[ST_MODE] & 0o7777
+                    newmode = (oldmode | 0o555) & 0o7777
+                    if newmode != oldmode:
+                        log.info("changing mode of %s from %o to %o",
+                                 file, oldmode, newmode)
+                        os.chmod(file, newmode)
+        # XXX should we modify self.outfiles?
+        return outfiles, updated_files
+
+class build_scripts_2to3(build_scripts, Mixin2to3):
+
+    def copy_scripts(self):
+        outfiles, updated_files = build_scripts.copy_scripts(self)
+        if not self.dry_run:
+            self.run_2to3(updated_files)
+        return outfiles, updated_files
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/check.py b/venv/Lib/site-packages/setuptools/_distutils/command/check.py
new file mode 100644
index 0000000..ada2500
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/check.py
@@ -0,0 +1,148 @@
+"""distutils.command.check
+
+Implements the Distutils 'check' command.
+"""
+from distutils.core import Command
+from distutils.errors import DistutilsSetupError
+
+try:
+    # docutils is installed
+    from docutils.utils import Reporter
+    from docutils.parsers.rst import Parser
+    from docutils import frontend
+    from docutils import nodes
+
+    class SilentReporter(Reporter):
+
+        def __init__(self, source, report_level, halt_level, stream=None,
+                     debug=0, encoding='ascii', error_handler='replace'):
+            self.messages = []
+            Reporter.__init__(self, source, report_level, halt_level, stream,
+                              debug, encoding, error_handler)
+
+        def system_message(self, level, message, *children, **kwargs):
+            self.messages.append((level, message, children, kwargs))
+            return nodes.system_message(message, level=level,
+                                        type=self.levels[level],
+                                        *children, **kwargs)
+
+    HAS_DOCUTILS = True
+except Exception:
+    # Catch all exceptions because exceptions besides ImportError probably
+    # indicate that docutils is not ported to Py3k.
+    HAS_DOCUTILS = False
+
+class check(Command):
+    """This command checks the meta-data of the package.
+    """
+    description = ("perform some checks on the package")
+    user_options = [('metadata', 'm', 'Verify meta-data'),
+                    ('restructuredtext', 'r',
+                     ('Checks if long string meta-data syntax '
+                      'are reStructuredText-compliant')),
+                    ('strict', 's',
+                     'Will exit with an error if a check fails')]
+
+    boolean_options = ['metadata', 'restructuredtext', 'strict']
+
+    def initialize_options(self):
+        """Sets default values for options."""
+        self.restructuredtext = 0
+        self.metadata = 1
+        self.strict = 0
+        self._warnings = 0
+
+    def finalize_options(self):
+        pass
+
+    def warn(self, msg):
+        """Counts the number of warnings that occurs."""
+        self._warnings += 1
+        return Command.warn(self, msg)
+
+    def run(self):
+        """Runs the command."""
+        # perform the various tests
+        if self.metadata:
+            self.check_metadata()
+        if self.restructuredtext:
+            if HAS_DOCUTILS:
+                self.check_restructuredtext()
+            elif self.strict:
+                raise DistutilsSetupError('The docutils package is needed.')
+
+        # let's raise an error in strict mode, if we have at least
+        # one warning
+        if self.strict and self._warnings > 0:
+            raise DistutilsSetupError('Please correct your package.')
+
+    def check_metadata(self):
+        """Ensures that all required elements of meta-data are supplied.
+
+        Required fields:
+            name, version, URL
+
+        Recommended fields:
+            (author and author_email) or (maintainer and maintainer_email))
+
+        Warns if any are missing.
+        """
+        metadata = self.distribution.metadata
+
+        missing = []
+        for attr in ('name', 'version', 'url'):
+            if not (hasattr(metadata, attr) and getattr(metadata, attr)):
+                missing.append(attr)
+
+        if missing:
+            self.warn("missing required meta-data: %s"  % ', '.join(missing))
+        if metadata.author:
+            if not metadata.author_email:
+                self.warn("missing meta-data: if 'author' supplied, " +
+                          "'author_email' should be supplied too")
+        elif metadata.maintainer:
+            if not metadata.maintainer_email:
+                self.warn("missing meta-data: if 'maintainer' supplied, " +
+                          "'maintainer_email' should be supplied too")
+        else:
+            self.warn("missing meta-data: either (author and author_email) " +
+                      "or (maintainer and maintainer_email) " +
+                      "should be supplied")
+
+    def check_restructuredtext(self):
+        """Checks if the long string fields are reST-compliant."""
+        data = self.distribution.get_long_description()
+        for warning in self._check_rst_data(data):
+            line = warning[-1].get('line')
+            if line is None:
+                warning = warning[1]
+            else:
+                warning = '%s (line %s)' % (warning[1], line)
+            self.warn(warning)
+
+    def _check_rst_data(self, data):
+        """Returns warnings when the provided data doesn't compile."""
+        # the include and csv_table directives need this to be a path
+        source_path = self.distribution.script_name or 'setup.py'
+        parser = Parser()
+        settings = frontend.OptionParser(components=(Parser,)).get_default_values()
+        settings.tab_width = 4
+        settings.pep_references = None
+        settings.rfc_references = None
+        reporter = SilentReporter(source_path,
+                          settings.report_level,
+                          settings.halt_level,
+                          stream=settings.warning_stream,
+                          debug=settings.debug,
+                          encoding=settings.error_encoding,
+                          error_handler=settings.error_encoding_error_handler)
+
+        document = nodes.document(settings, reporter, source=source_path)
+        document.note_source(source_path, -1)
+        try:
+            parser.parse(data, document)
+        except AttributeError as e:
+            reporter.messages.append(
+                (-1, 'Could not finish the parsing: %s.' % e, '', {}))
+
+        return reporter.messages
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/clean.py b/venv/Lib/site-packages/setuptools/_distutils/command/clean.py
new file mode 100644
index 0000000..0cb2701
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/clean.py
@@ -0,0 +1,76 @@
+"""distutils.command.clean
+
+Implements the Distutils 'clean' command."""
+
+# contributed by Bastian Kleineidam <calvin@cs.uni-sb.de>, added 2000-03-18
+
+import os
+from distutils.core import Command
+from distutils.dir_util import remove_tree
+from distutils import log
+
+class clean(Command):
+
+    description = "clean up temporary files from 'build' command"
+    user_options = [
+        ('build-base=', 'b',
+         "base build directory (default: 'build.build-base')"),
+        ('build-lib=', None,
+         "build directory for all modules (default: 'build.build-lib')"),
+        ('build-temp=', 't',
+         "temporary build directory (default: 'build.build-temp')"),
+        ('build-scripts=', None,
+         "build directory for scripts (default: 'build.build-scripts')"),
+        ('bdist-base=', None,
+         "temporary directory for built distributions"),
+        ('all', 'a',
+         "remove all build output, not just temporary by-products")
+    ]
+
+    boolean_options = ['all']
+
+    def initialize_options(self):
+        self.build_base = None
+        self.build_lib = None
+        self.build_temp = None
+        self.build_scripts = None
+        self.bdist_base = None
+        self.all = None
+
+    def finalize_options(self):
+        self.set_undefined_options('build',
+                                   ('build_base', 'build_base'),
+                                   ('build_lib', 'build_lib'),
+                                   ('build_scripts', 'build_scripts'),
+                                   ('build_temp', 'build_temp'))
+        self.set_undefined_options('bdist',
+                                   ('bdist_base', 'bdist_base'))
+
+    def run(self):
+        # remove the build/temp.<plat> directory (unless it's already
+        # gone)
+        if os.path.exists(self.build_temp):
+            remove_tree(self.build_temp, dry_run=self.dry_run)
+        else:
+            log.debug("'%s' does not exist -- can't clean it",
+                      self.build_temp)
+
+        if self.all:
+            # remove build directories
+            for directory in (self.build_lib,
+                              self.bdist_base,
+                              self.build_scripts):
+                if os.path.exists(directory):
+                    remove_tree(directory, dry_run=self.dry_run)
+                else:
+                    log.warn("'%s' does not exist -- can't clean it",
+                             directory)
+
+        # just for the heck of it, try to remove the base build directory:
+        # we might have emptied it right now, but if not we don't care
+        if not self.dry_run:
+            try:
+                os.rmdir(self.build_base)
+                log.info("removing '%s'", self.build_base)
+            except OSError:
+                pass
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/config.py b/venv/Lib/site-packages/setuptools/_distutils/command/config.py
new file mode 100644
index 0000000..aeda408
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/config.py
@@ -0,0 +1,344 @@
+"""distutils.command.config
+
+Implements the Distutils 'config' command, a (mostly) empty command class
+that exists mainly to be sub-classed by specific module distributions and
+applications.  The idea is that while every "config" command is different,
+at least they're all named the same, and users always see "config" in the
+list of standard commands.  Also, this is a good place to put common
+configure-like tasks: "try to compile this C code", or "figure out where
+this header file lives".
+"""
+
+import os, re
+
+from distutils.core import Command
+from distutils.errors import DistutilsExecError
+from distutils.sysconfig import customize_compiler
+from distutils import log
+
+LANG_EXT = {"c": ".c", "c++": ".cxx"}
+
+class config(Command):
+
+    description = "prepare to build"
+
+    user_options = [
+        ('compiler=', None,
+         "specify the compiler type"),
+        ('cc=', None,
+         "specify the compiler executable"),
+        ('include-dirs=', 'I',
+         "list of directories to search for header files"),
+        ('define=', 'D',
+         "C preprocessor macros to define"),
+        ('undef=', 'U',
+         "C preprocessor macros to undefine"),
+        ('libraries=', 'l',
+         "external C libraries to link with"),
+        ('library-dirs=', 'L',
+         "directories to search for external C libraries"),
+
+        ('noisy', None,
+         "show every action (compile, link, run, ...) taken"),
+        ('dump-source', None,
+         "dump generated source files before attempting to compile them"),
+        ]
+
+
+    # The three standard command methods: since the "config" command
+    # does nothing by default, these are empty.
+
+    def initialize_options(self):
+        self.compiler = None
+        self.cc = None
+        self.include_dirs = None
+        self.libraries = None
+        self.library_dirs = None
+
+        # maximal output for now
+        self.noisy = 1
+        self.dump_source = 1
+
+        # list of temporary files generated along-the-way that we have
+        # to clean at some point
+        self.temp_files = []
+
+    def finalize_options(self):
+        if self.include_dirs is None:
+            self.include_dirs = self.distribution.include_dirs or []
+        elif isinstance(self.include_dirs, str):
+            self.include_dirs = self.include_dirs.split(os.pathsep)
+
+        if self.libraries is None:
+            self.libraries = []
+        elif isinstance(self.libraries, str):
+            self.libraries = [self.libraries]
+
+        if self.library_dirs is None:
+            self.library_dirs = []
+        elif isinstance(self.library_dirs, str):
+            self.library_dirs = self.library_dirs.split(os.pathsep)
+
+    def run(self):
+        pass
+
+    # Utility methods for actual "config" commands.  The interfaces are
+    # loosely based on Autoconf macros of similar names.  Sub-classes
+    # may use these freely.
+
+    def _check_compiler(self):
+        """Check that 'self.compiler' really is a CCompiler object;
+        if not, make it one.
+        """
+        # We do this late, and only on-demand, because this is an expensive
+        # import.
+        from distutils.ccompiler import CCompiler, new_compiler
+        if not isinstance(self.compiler, CCompiler):
+            self.compiler = new_compiler(compiler=self.compiler,
+                                         dry_run=self.dry_run, force=1)
+            customize_compiler(self.compiler)
+            if self.include_dirs:
+                self.compiler.set_include_dirs(self.include_dirs)
+            if self.libraries:
+                self.compiler.set_libraries(self.libraries)
+            if self.library_dirs:
+                self.compiler.set_library_dirs(self.library_dirs)
+
+    def _gen_temp_sourcefile(self, body, headers, lang):
+        filename = "_configtest" + LANG_EXT[lang]
+        with open(filename, "w") as file:
+            if headers:
+                for header in headers:
+                    file.write("#include <%s>\n" % header)
+                file.write("\n")
+            file.write(body)
+            if body[-1] != "\n":
+                file.write("\n")
+        return filename
+
+    def _preprocess(self, body, headers, include_dirs, lang):
+        src = self._gen_temp_sourcefile(body, headers, lang)
+        out = "_configtest.i"
+        self.temp_files.extend([src, out])
+        self.compiler.preprocess(src, out, include_dirs=include_dirs)
+        return (src, out)
+
+    def _compile(self, body, headers, include_dirs, lang):
+        src = self._gen_temp_sourcefile(body, headers, lang)
+        if self.dump_source:
+            dump_file(src, "compiling '%s':" % src)
+        (obj,) = self.compiler.object_filenames([src])
+        self.temp_files.extend([src, obj])
+        self.compiler.compile([src], include_dirs=include_dirs)
+        return (src, obj)
+
+    def _link(self, body, headers, include_dirs, libraries, library_dirs,
+              lang):
+        (src, obj) = self._compile(body, headers, include_dirs, lang)
+        prog = os.path.splitext(os.path.basename(src))[0]
+        self.compiler.link_executable([obj], prog,
+                                      libraries=libraries,
+                                      library_dirs=library_dirs,
+                                      target_lang=lang)
+
+        if self.compiler.exe_extension is not None:
+            prog = prog + self.compiler.exe_extension
+        self.temp_files.append(prog)
+
+        return (src, obj, prog)
+
+    def _clean(self, *filenames):
+        if not filenames:
+            filenames = self.temp_files
+            self.temp_files = []
+        log.info("removing: %s", ' '.join(filenames))
+        for filename in filenames:
+            try:
+                os.remove(filename)
+            except OSError:
+                pass
+
+
+    # XXX these ignore the dry-run flag: what to do, what to do? even if
+    # you want a dry-run build, you still need some sort of configuration
+    # info.  My inclination is to make it up to the real config command to
+    # consult 'dry_run', and assume a default (minimal) configuration if
+    # true.  The problem with trying to do it here is that you'd have to
+    # return either true or false from all the 'try' methods, neither of
+    # which is correct.
+
+    # XXX need access to the header search path and maybe default macros.
+
+    def try_cpp(self, body=None, headers=None, include_dirs=None, lang="c"):
+        """Construct a source file from 'body' (a string containing lines
+        of C/C++ code) and 'headers' (a list of header files to include)
+        and run it through the preprocessor.  Return true if the
+        preprocessor succeeded, false if there were any errors.
+        ('body' probably isn't of much use, but what the heck.)
+        """
+        from distutils.ccompiler import CompileError
+        self._check_compiler()
+        ok = True
+        try:
+            self._preprocess(body, headers, include_dirs, lang)
+        except CompileError:
+            ok = False
+
+        self._clean()
+        return ok
+
+    def search_cpp(self, pattern, body=None, headers=None, include_dirs=None,
+                   lang="c"):
+        """Construct a source file (just like 'try_cpp()'), run it through
+        the preprocessor, and return true if any line of the output matches
+        'pattern'.  'pattern' should either be a compiled regex object or a
+        string containing a regex.  If both 'body' and 'headers' are None,
+        preprocesses an empty file -- which can be useful to determine the
+        symbols the preprocessor and compiler set by default.
+        """
+        self._check_compiler()
+        src, out = self._preprocess(body, headers, include_dirs, lang)
+
+        if isinstance(pattern, str):
+            pattern = re.compile(pattern)
+
+        with open(out) as file:
+            match = False
+            while True:
+                line = file.readline()
+                if line == '':
+                    break
+                if pattern.search(line):
+                    match = True
+                    break
+
+        self._clean()
+        return match
+
+    def try_compile(self, body, headers=None, include_dirs=None, lang="c"):
+        """Try to compile a source file built from 'body' and 'headers'.
+        Return true on success, false otherwise.
+        """
+        from distutils.ccompiler import CompileError
+        self._check_compiler()
+        try:
+            self._compile(body, headers, include_dirs, lang)
+            ok = True
+        except CompileError:
+            ok = False
+
+        log.info(ok and "success!" or "failure.")
+        self._clean()
+        return ok
+
+    def try_link(self, body, headers=None, include_dirs=None, libraries=None,
+                 library_dirs=None, lang="c"):
+        """Try to compile and link a source file, built from 'body' and
+        'headers', to executable form.  Return true on success, false
+        otherwise.
+        """
+        from distutils.ccompiler import CompileError, LinkError
+        self._check_compiler()
+        try:
+            self._link(body, headers, include_dirs,
+                       libraries, library_dirs, lang)
+            ok = True
+        except (CompileError, LinkError):
+            ok = False
+
+        log.info(ok and "success!" or "failure.")
+        self._clean()
+        return ok
+
+    def try_run(self, body, headers=None, include_dirs=None, libraries=None,
+                library_dirs=None, lang="c"):
+        """Try to compile, link to an executable, and run a program
+        built from 'body' and 'headers'.  Return true on success, false
+        otherwise.
+        """
+        from distutils.ccompiler import CompileError, LinkError
+        self._check_compiler()
+        try:
+            src, obj, exe = self._link(body, headers, include_dirs,
+                                       libraries, library_dirs, lang)
+            self.spawn([exe])
+            ok = True
+        except (CompileError, LinkError, DistutilsExecError):
+            ok = False
+
+        log.info(ok and "success!" or "failure.")
+        self._clean()
+        return ok
+
+
+    # -- High-level methods --------------------------------------------
+    # (these are the ones that are actually likely to be useful
+    # when implementing a real-world config command!)
+
+    def check_func(self, func, headers=None, include_dirs=None,
+                   libraries=None, library_dirs=None, decl=0, call=0):
+        """Determine if function 'func' is available by constructing a
+        source file that refers to 'func', and compiles and links it.
+        If everything succeeds, returns true; otherwise returns false.
+
+        The constructed source file starts out by including the header
+        files listed in 'headers'.  If 'decl' is true, it then declares
+        'func' (as "int func()"); you probably shouldn't supply 'headers'
+        and set 'decl' true in the same call, or you might get errors about
+        a conflicting declarations for 'func'.  Finally, the constructed
+        'main()' function either references 'func' or (if 'call' is true)
+        calls it.  'libraries' and 'library_dirs' are used when
+        linking.
+        """
+        self._check_compiler()
+        body = []
+        if decl:
+            body.append("int %s ();" % func)
+        body.append("int main () {")
+        if call:
+            body.append("  %s();" % func)
+        else:
+            body.append("  %s;" % func)
+        body.append("}")
+        body = "\n".join(body) + "\n"
+
+        return self.try_link(body, headers, include_dirs,
+                             libraries, library_dirs)
+
+    def check_lib(self, library, library_dirs=None, headers=None,
+                  include_dirs=None, other_libraries=[]):
+        """Determine if 'library' is available to be linked against,
+        without actually checking that any particular symbols are provided
+        by it.  'headers' will be used in constructing the source file to
+        be compiled, but the only effect of this is to check if all the
+        header files listed are available.  Any libraries listed in
+        'other_libraries' will be included in the link, in case 'library'
+        has symbols that depend on other libraries.
+        """
+        self._check_compiler()
+        return self.try_link("int main (void) { }", headers, include_dirs,
+                             [library] + other_libraries, library_dirs)
+
+    def check_header(self, header, include_dirs=None, library_dirs=None,
+                     lang="c"):
+        """Determine if the system header file named by 'header_file'
+        exists and can be found by the preprocessor; return true if so,
+        false otherwise.
+        """
+        return self.try_cpp(body="/* No body */", headers=[header],
+                            include_dirs=include_dirs)
+
+def dump_file(filename, head=None):
+    """Dumps a file content into log.info.
+
+    If head is not None, will be dumped before the file content.
+    """
+    if head is None:
+        log.info('%s', filename)
+    else:
+        log.info(head)
+    file = open(filename)
+    try:
+        log.info(file.read())
+    finally:
+        file.close()
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/install.py b/venv/Lib/site-packages/setuptools/_distutils/command/install.py
new file mode 100644
index 0000000..13feeb8
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/install.py
@@ -0,0 +1,677 @@
+"""distutils.command.install
+
+Implements the Distutils 'install' command."""
+
+import sys
+import os
+
+from distutils import log
+from distutils.core import Command
+from distutils.debug import DEBUG
+from distutils.sysconfig import get_config_vars
+from distutils.errors import DistutilsPlatformError
+from distutils.file_util import write_file
+from distutils.util import convert_path, subst_vars, change_root
+from distutils.util import get_platform
+from distutils.errors import DistutilsOptionError
+
+from site import USER_BASE
+from site import USER_SITE
+HAS_USER_SITE = True
+
+WINDOWS_SCHEME = {
+    'purelib': '$base/Lib/site-packages',
+    'platlib': '$base/Lib/site-packages',
+    'headers': '$base/Include/$dist_name',
+    'scripts': '$base/Scripts',
+    'data'   : '$base',
+}
+
+INSTALL_SCHEMES = {
+    'unix_prefix': {
+        'purelib': '$base/lib/python$py_version_short/site-packages',
+        'platlib': '$platbase/$platlibdir/python$py_version_short/site-packages',
+        'headers': '$base/include/python$py_version_short$abiflags/$dist_name',
+        'scripts': '$base/bin',
+        'data'   : '$base',
+        },
+    'unix_home': {
+        'purelib': '$base/lib/python',
+        'platlib': '$base/$platlibdir/python',
+        'headers': '$base/include/python/$dist_name',
+        'scripts': '$base/bin',
+        'data'   : '$base',
+        },
+    'nt': WINDOWS_SCHEME,
+    'pypy': {
+        'purelib': '$base/site-packages',
+        'platlib': '$base/site-packages',
+        'headers': '$base/include/$dist_name',
+        'scripts': '$base/bin',
+        'data'   : '$base',
+        },
+    'pypy_nt': {
+        'purelib': '$base/site-packages',
+        'platlib': '$base/site-packages',
+        'headers': '$base/include/$dist_name',
+        'scripts': '$base/Scripts',
+        'data'   : '$base',
+        },
+    }
+
+# user site schemes
+if HAS_USER_SITE:
+    INSTALL_SCHEMES['nt_user'] = {
+        'purelib': '$usersite',
+        'platlib': '$usersite',
+        'headers': '$userbase/Python$py_version_nodot/Include/$dist_name',
+        'scripts': '$userbase/Python$py_version_nodot/Scripts',
+        'data'   : '$userbase',
+        }
+
+    INSTALL_SCHEMES['unix_user'] = {
+        'purelib': '$usersite',
+        'platlib': '$usersite',
+        'headers':
+            '$userbase/include/python$py_version_short$abiflags/$dist_name',
+        'scripts': '$userbase/bin',
+        'data'   : '$userbase',
+        }
+
+# The keys to an installation scheme; if any new types of files are to be
+# installed, be sure to add an entry to every installation scheme above,
+# and to SCHEME_KEYS here.
+SCHEME_KEYS = ('purelib', 'platlib', 'headers', 'scripts', 'data')
+
+
+class install(Command):
+
+    description = "install everything from build directory"
+
+    user_options = [
+        # Select installation scheme and set base director(y|ies)
+        ('prefix=', None,
+         "installation prefix"),
+        ('exec-prefix=', None,
+         "(Unix only) prefix for platform-specific files"),
+        ('home=', None,
+         "(Unix only) home directory to install under"),
+
+        # Or, just set the base director(y|ies)
+        ('install-base=', None,
+         "base installation directory (instead of --prefix or --home)"),
+        ('install-platbase=', None,
+         "base installation directory for platform-specific files " +
+         "(instead of --exec-prefix or --home)"),
+        ('root=', None,
+         "install everything relative to this alternate root directory"),
+
+        # Or, explicitly set the installation scheme
+        ('install-purelib=', None,
+         "installation directory for pure Python module distributions"),
+        ('install-platlib=', None,
+         "installation directory for non-pure module distributions"),
+        ('install-lib=', None,
+         "installation directory for all module distributions " +
+         "(overrides --install-purelib and --install-platlib)"),
+
+        ('install-headers=', None,
+         "installation directory for C/C++ headers"),
+        ('install-scripts=', None,
+         "installation directory for Python scripts"),
+        ('install-data=', None,
+         "installation directory for data files"),
+
+        # Byte-compilation options -- see install_lib.py for details, as
+        # these are duplicated from there (but only install_lib does
+        # anything with them).
+        ('compile', 'c', "compile .py to .pyc [default]"),
+        ('no-compile', None, "don't compile .py files"),
+        ('optimize=', 'O',
+         "also compile with optimization: -O1 for \"python -O\", "
+         "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"),
+
+        # Miscellaneous control options
+        ('force', 'f',
+         "force installation (overwrite any existing files)"),
+        ('skip-build', None,
+         "skip rebuilding everything (for testing/debugging)"),
+
+        # Where to install documentation (eventually!)
+        #('doc-format=', None, "format of documentation to generate"),
+        #('install-man=', None, "directory for Unix man pages"),
+        #('install-html=', None, "directory for HTML documentation"),
+        #('install-info=', None, "directory for GNU info files"),
+
+        ('record=', None,
+         "filename in which to record list of installed files"),
+        ]
+
+    boolean_options = ['compile', 'force', 'skip-build']
+
+    if HAS_USER_SITE:
+        user_options.append(('user', None,
+                             "install in user site-package '%s'" % USER_SITE))
+        boolean_options.append('user')
+
+    negative_opt = {'no-compile' : 'compile'}
+
+
+    def initialize_options(self):
+        """Initializes options."""
+        # High-level options: these select both an installation base
+        # and scheme.
+        self.prefix = None
+        self.exec_prefix = None
+        self.home = None
+        self.user = 0
+
+        # These select only the installation base; it's up to the user to
+        # specify the installation scheme (currently, that means supplying
+        # the --install-{platlib,purelib,scripts,data} options).
+        self.install_base = None
+        self.install_platbase = None
+        self.root = None
+
+        # These options are the actual installation directories; if not
+        # supplied by the user, they are filled in using the installation
+        # scheme implied by prefix/exec-prefix/home and the contents of
+        # that installation scheme.
+        self.install_purelib = None     # for pure module distributions
+        self.install_platlib = None     # non-pure (dists w/ extensions)
+        self.install_headers = None     # for C/C++ headers
+        self.install_lib = None         # set to either purelib or platlib
+        self.install_scripts = None
+        self.install_data = None
+        self.install_userbase = USER_BASE
+        self.install_usersite = USER_SITE
+
+        self.compile = None
+        self.optimize = None
+
+        # Deprecated
+        # These two are for putting non-packagized distributions into their
+        # own directory and creating a .pth file if it makes sense.
+        # 'extra_path' comes from the setup file; 'install_path_file' can
+        # be turned off if it makes no sense to install a .pth file.  (But
+        # better to install it uselessly than to guess wrong and not
+        # install it when it's necessary and would be used!)  Currently,
+        # 'install_path_file' is always true unless some outsider meddles
+        # with it.
+        self.extra_path = None
+        self.install_path_file = 1
+
+        # 'force' forces installation, even if target files are not
+        # out-of-date.  'skip_build' skips running the "build" command,
+        # handy if you know it's not necessary.  'warn_dir' (which is *not*
+        # a user option, it's just there so the bdist_* commands can turn
+        # it off) determines whether we warn about installing to a
+        # directory not in sys.path.
+        self.force = 0
+        self.skip_build = 0
+        self.warn_dir = 1
+
+        # These are only here as a conduit from the 'build' command to the
+        # 'install_*' commands that do the real work.  ('build_base' isn't
+        # actually used anywhere, but it might be useful in future.)  They
+        # are not user options, because if the user told the install
+        # command where the build directory is, that wouldn't affect the
+        # build command.
+        self.build_base = None
+        self.build_lib = None
+
+        # Not defined yet because we don't know anything about
+        # documentation yet.
+        #self.install_man = None
+        #self.install_html = None
+        #self.install_info = None
+
+        self.record = None
+
+
+    # -- Option finalizing methods -------------------------------------
+    # (This is rather more involved than for most commands,
+    # because this is where the policy for installing third-
+    # party Python modules on various platforms given a wide
+    # array of user input is decided.  Yes, it's quite complex!)
+
+    def finalize_options(self):
+        """Finalizes options."""
+        # This method (and its helpers, like 'finalize_unix()',
+        # 'finalize_other()', and 'select_scheme()') is where the default
+        # installation directories for modules, extension modules, and
+        # anything else we care to install from a Python module
+        # distribution.  Thus, this code makes a pretty important policy
+        # statement about how third-party stuff is added to a Python
+        # installation!  Note that the actual work of installation is done
+        # by the relatively simple 'install_*' commands; they just take
+        # their orders from the installation directory options determined
+        # here.
+
+        # Check for errors/inconsistencies in the options; first, stuff
+        # that's wrong on any platform.
+
+        if ((self.prefix or self.exec_prefix or self.home) and
+            (self.install_base or self.install_platbase)):
+            raise DistutilsOptionError(
+                   "must supply either prefix/exec-prefix/home or " +
+                   "install-base/install-platbase -- not both")
+
+        if self.home and (self.prefix or self.exec_prefix):
+            raise DistutilsOptionError(
+                  "must supply either home or prefix/exec-prefix -- not both")
+
+        if self.user and (self.prefix or self.exec_prefix or self.home or
+                self.install_base or self.install_platbase):
+            raise DistutilsOptionError("can't combine user with prefix, "
+                                       "exec_prefix/home, or install_(plat)base")
+
+        # Next, stuff that's wrong (or dubious) only on certain platforms.
+        if os.name != "posix":
+            if self.exec_prefix:
+                self.warn("exec-prefix option ignored on this platform")
+                self.exec_prefix = None
+
+        # Now the interesting logic -- so interesting that we farm it out
+        # to other methods.  The goal of these methods is to set the final
+        # values for the install_{lib,scripts,data,...}  options, using as
+        # input a heady brew of prefix, exec_prefix, home, install_base,
+        # install_platbase, user-supplied versions of
+        # install_{purelib,platlib,lib,scripts,data,...}, and the
+        # INSTALL_SCHEME dictionary above.  Phew!
+
+        self.dump_dirs("pre-finalize_{unix,other}")
+
+        if os.name == 'posix':
+            self.finalize_unix()
+        else:
+            self.finalize_other()
+
+        self.dump_dirs("post-finalize_{unix,other}()")
+
+        # Expand configuration variables, tilde, etc. in self.install_base
+        # and self.install_platbase -- that way, we can use $base or
+        # $platbase in the other installation directories and not worry
+        # about needing recursive variable expansion (shudder).
+
+        py_version = sys.version.split()[0]
+        (prefix, exec_prefix) = get_config_vars('prefix', 'exec_prefix')
+        try:
+            abiflags = sys.abiflags
+        except AttributeError:
+            # sys.abiflags may not be defined on all platforms.
+            abiflags = ''
+        self.config_vars = {'dist_name': self.distribution.get_name(),
+                            'dist_version': self.distribution.get_version(),
+                            'dist_fullname': self.distribution.get_fullname(),
+                            'py_version': py_version,
+                            'py_version_short': '%d.%d' % sys.version_info[:2],
+                            'py_version_nodot': '%d%d' % sys.version_info[:2],
+                            'sys_prefix': prefix,
+                            'prefix': prefix,
+                            'sys_exec_prefix': exec_prefix,
+                            'exec_prefix': exec_prefix,
+                            'abiflags': abiflags,
+                            'platlibdir': getattr(sys, 'platlibdir', 'lib'),
+                           }
+
+        if HAS_USER_SITE:
+            self.config_vars['userbase'] = self.install_userbase
+            self.config_vars['usersite'] = self.install_usersite
+
+        self.expand_basedirs()
+
+        self.dump_dirs("post-expand_basedirs()")
+
+        # Now define config vars for the base directories so we can expand
+        # everything else.
+        self.config_vars['base'] = self.install_base
+        self.config_vars['platbase'] = self.install_platbase
+
+        if DEBUG:
+            from pprint import pprint
+            print("config vars:")
+            pprint(self.config_vars)
+
+        # Expand "~" and configuration variables in the installation
+        # directories.
+        self.expand_dirs()
+
+        self.dump_dirs("post-expand_dirs()")
+
+        # Create directories in the home dir:
+        if self.user:
+            self.create_home_path()
+
+        # Pick the actual directory to install all modules to: either
+        # install_purelib or install_platlib, depending on whether this
+        # module distribution is pure or not.  Of course, if the user
+        # already specified install_lib, use their selection.
+        if self.install_lib is None:
+            if self.distribution.ext_modules: # has extensions: non-pure
+                self.install_lib = self.install_platlib
+            else:
+                self.install_lib = self.install_purelib
+
+
+        # Convert directories from Unix /-separated syntax to the local
+        # convention.
+        self.convert_paths('lib', 'purelib', 'platlib',
+                           'scripts', 'data', 'headers',
+                           'userbase', 'usersite')
+
+        # Deprecated
+        # Well, we're not actually fully completely finalized yet: we still
+        # have to deal with 'extra_path', which is the hack for allowing
+        # non-packagized module distributions (hello, Numerical Python!) to
+        # get their own directories.
+        self.handle_extra_path()
+        self.install_libbase = self.install_lib # needed for .pth file
+        self.install_lib = os.path.join(self.install_lib, self.extra_dirs)
+
+        # If a new root directory was supplied, make all the installation
+        # dirs relative to it.
+        if self.root is not None:
+            self.change_roots('libbase', 'lib', 'purelib', 'platlib',
+                              'scripts', 'data', 'headers')
+
+        self.dump_dirs("after prepending root")
+
+        # Find out the build directories, ie. where to install from.
+        self.set_undefined_options('build',
+                                   ('build_base', 'build_base'),
+                                   ('build_lib', 'build_lib'))
+
+        # Punt on doc directories for now -- after all, we're punting on
+        # documentation completely!
+
+    def dump_dirs(self, msg):
+        """Dumps the list of user options."""
+        if not DEBUG:
+            return
+        from distutils.fancy_getopt import longopt_xlate
+        log.debug(msg + ":")
+        for opt in self.user_options:
+            opt_name = opt[0]
+            if opt_name[-1] == "=":
+                opt_name = opt_name[0:-1]
+            if opt_name in self.negative_opt:
+                opt_name = self.negative_opt[opt_name]
+                opt_name = opt_name.translate(longopt_xlate)
+                val = not getattr(self, opt_name)
+            else:
+                opt_name = opt_name.translate(longopt_xlate)
+                val = getattr(self, opt_name)
+            log.debug("  %s: %s", opt_name, val)
+
+    def finalize_unix(self):
+        """Finalizes options for posix platforms."""
+        if self.install_base is not None or self.install_platbase is not None:
+            if ((self.install_lib is None and
+                 self.install_purelib is None and
+                 self.install_platlib is None) or
+                self.install_headers is None or
+                self.install_scripts is None or
+                self.install_data is None):
+                raise DistutilsOptionError(
+                      "install-base or install-platbase supplied, but "
+                      "installation scheme is incomplete")
+            return
+
+        if self.user:
+            if self.install_userbase is None:
+                raise DistutilsPlatformError(
+                    "User base directory is not specified")
+            self.install_base = self.install_platbase = self.install_userbase
+            self.select_scheme("unix_user")
+        elif self.home is not None:
+            self.install_base = self.install_platbase = self.home
+            self.select_scheme("unix_home")
+        else:
+            if self.prefix is None:
+                if self.exec_prefix is not None:
+                    raise DistutilsOptionError(
+                          "must not supply exec-prefix without prefix")
+
+                self.prefix = os.path.normpath(sys.prefix)
+                self.exec_prefix = os.path.normpath(sys.exec_prefix)
+
+            else:
+                if self.exec_prefix is None:
+                    self.exec_prefix = self.prefix
+
+            self.install_base = self.prefix
+            self.install_platbase = self.exec_prefix
+            self.select_scheme("unix_prefix")
+
+    def finalize_other(self):
+        """Finalizes options for non-posix platforms"""
+        if self.user:
+            if self.install_userbase is None:
+                raise DistutilsPlatformError(
+                    "User base directory is not specified")
+            self.install_base = self.install_platbase = self.install_userbase
+            self.select_scheme(os.name + "_user")
+        elif self.home is not None:
+            self.install_base = self.install_platbase = self.home
+            self.select_scheme("unix_home")
+        else:
+            if self.prefix is None:
+                self.prefix = os.path.normpath(sys.prefix)
+
+            self.install_base = self.install_platbase = self.prefix
+            try:
+                self.select_scheme(os.name)
+            except KeyError:
+                raise DistutilsPlatformError(
+                      "I don't know how to install stuff on '%s'" % os.name)
+
+    def select_scheme(self, name):
+        """Sets the install directories by applying the install schemes."""
+        # it's the caller's problem if they supply a bad name!
+        if (hasattr(sys, 'pypy_version_info') and
+                not name.endswith(('_user', '_home'))):
+            if os.name == 'nt':
+                name = 'pypy_nt'
+            else:
+                name = 'pypy'
+        scheme = INSTALL_SCHEMES[name]
+        for key in SCHEME_KEYS:
+            attrname = 'install_' + key
+            if getattr(self, attrname) is None:
+                setattr(self, attrname, scheme[key])
+
+    def _expand_attrs(self, attrs):
+        for attr in attrs:
+            val = getattr(self, attr)
+            if val is not None:
+                if os.name == 'posix' or os.name == 'nt':
+                    val = os.path.expanduser(val)
+                val = subst_vars(val, self.config_vars)
+                setattr(self, attr, val)
+
+    def expand_basedirs(self):
+        """Calls `os.path.expanduser` on install_base, install_platbase and
+        root."""
+        self._expand_attrs(['install_base', 'install_platbase', 'root'])
+
+    def expand_dirs(self):
+        """Calls `os.path.expanduser` on install dirs."""
+        self._expand_attrs(['install_purelib', 'install_platlib',
+                            'install_lib', 'install_headers',
+                            'install_scripts', 'install_data',])
+
+    def convert_paths(self, *names):
+        """Call `convert_path` over `names`."""
+        for name in names:
+            attr = "install_" + name
+            setattr(self, attr, convert_path(getattr(self, attr)))
+
+    def handle_extra_path(self):
+        """Set `path_file` and `extra_dirs` using `extra_path`."""
+        if self.extra_path is None:
+            self.extra_path = self.distribution.extra_path
+
+        if self.extra_path is not None:
+            log.warn(
+                "Distribution option extra_path is deprecated. "
+                "See issue27919 for details."
+            )
+            if isinstance(self.extra_path, str):
+                self.extra_path = self.extra_path.split(',')
+
+            if len(self.extra_path) == 1:
+                path_file = extra_dirs = self.extra_path[0]
+            elif len(self.extra_path) == 2:
+                path_file, extra_dirs = self.extra_path
+            else:
+                raise DistutilsOptionError(
+                      "'extra_path' option must be a list, tuple, or "
+                      "comma-separated string with 1 or 2 elements")
+
+            # convert to local form in case Unix notation used (as it
+            # should be in setup scripts)
+            extra_dirs = convert_path(extra_dirs)
+        else:
+            path_file = None
+            extra_dirs = ''
+
+        # XXX should we warn if path_file and not extra_dirs? (in which
+        # case the path file would be harmless but pointless)
+        self.path_file = path_file
+        self.extra_dirs = extra_dirs
+
+    def change_roots(self, *names):
+        """Change the install directories pointed by name using root."""
+        for name in names:
+            attr = "install_" + name
+            setattr(self, attr, change_root(self.root, getattr(self, attr)))
+
+    def create_home_path(self):
+        """Create directories under ~."""
+        if not self.user:
+            return
+        home = convert_path(os.path.expanduser("~"))
+        for name, path in self.config_vars.items():
+            if path.startswith(home) and not os.path.isdir(path):
+                self.debug_print("os.makedirs('%s', 0o700)" % path)
+                os.makedirs(path, 0o700)
+
+    # -- Command execution methods -------------------------------------
+
+    def run(self):
+        """Runs the command."""
+        # Obviously have to build before we can install
+        if not self.skip_build:
+            self.run_command('build')
+            # If we built for any other platform, we can't install.
+            build_plat = self.distribution.get_command_obj('build').plat_name
+            # check warn_dir - it is a clue that the 'install' is happening
+            # internally, and not to sys.path, so we don't check the platform
+            # matches what we are running.
+            if self.warn_dir and build_plat != get_platform():
+                raise DistutilsPlatformError("Can't install when "
+                                             "cross-compiling")
+
+        # Run all sub-commands (at least those that need to be run)
+        for cmd_name in self.get_sub_commands():
+            self.run_command(cmd_name)
+
+        if self.path_file:
+            self.create_path_file()
+
+        # write list of installed files, if requested.
+        if self.record:
+            outputs = self.get_outputs()
+            if self.root:               # strip any package prefix
+                root_len = len(self.root)
+                for counter in range(len(outputs)):
+                    outputs[counter] = outputs[counter][root_len:]
+            self.execute(write_file,
+                         (self.record, outputs),
+                         "writing list of installed files to '%s'" %
+                         self.record)
+
+        sys_path = map(os.path.normpath, sys.path)
+        sys_path = map(os.path.normcase, sys_path)
+        install_lib = os.path.normcase(os.path.normpath(self.install_lib))
+        if (self.warn_dir and
+            not (self.path_file and self.install_path_file) and
+            install_lib not in sys_path):
+            log.debug(("modules installed to '%s', which is not in "
+                       "Python's module search path (sys.path) -- "
+                       "you'll have to change the search path yourself"),
+                       self.install_lib)
+
+    def create_path_file(self):
+        """Creates the .pth file"""
+        filename = os.path.join(self.install_libbase,
+                                self.path_file + ".pth")
+        if self.install_path_file:
+            self.execute(write_file,
+                         (filename, [self.extra_dirs]),
+                         "creating %s" % filename)
+        else:
+            self.warn("path file '%s' not created" % filename)
+
+
+    # -- Reporting methods ---------------------------------------------
+
+    def get_outputs(self):
+        """Assembles the outputs of all the sub-commands."""
+        outputs = []
+        for cmd_name in self.get_sub_commands():
+            cmd = self.get_finalized_command(cmd_name)
+            # Add the contents of cmd.get_outputs(), ensuring
+            # that outputs doesn't contain duplicate entries
+            for filename in cmd.get_outputs():
+                if filename not in outputs:
+                    outputs.append(filename)
+
+        if self.path_file and self.install_path_file:
+            outputs.append(os.path.join(self.install_libbase,
+                                        self.path_file + ".pth"))
+
+        return outputs
+
+    def get_inputs(self):
+        """Returns the inputs of all the sub-commands"""
+        # XXX gee, this looks familiar ;-(
+        inputs = []
+        for cmd_name in self.get_sub_commands():
+            cmd = self.get_finalized_command(cmd_name)
+            inputs.extend(cmd.get_inputs())
+
+        return inputs
+
+    # -- Predicates for sub-command list -------------------------------
+
+    def has_lib(self):
+        """Returns true if the current distribution has any Python
+        modules to install."""
+        return (self.distribution.has_pure_modules() or
+                self.distribution.has_ext_modules())
+
+    def has_headers(self):
+        """Returns true if the current distribution has any headers to
+        install."""
+        return self.distribution.has_headers()
+
+    def has_scripts(self):
+        """Returns true if the current distribution has any scripts to.
+        install."""
+        return self.distribution.has_scripts()
+
+    def has_data(self):
+        """Returns true if the current distribution has any data to.
+        install."""
+        return self.distribution.has_data_files()
+
+    # 'sub_commands': a list of commands this command might have to run to
+    # get its work done.  See cmd.py for more info.
+    sub_commands = [('install_lib',     has_lib),
+                    ('install_headers', has_headers),
+                    ('install_scripts', has_scripts),
+                    ('install_data',    has_data),
+                    ('install_egg_info', lambda self:True),
+                   ]
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/install_data.py b/venv/Lib/site-packages/setuptools/_distutils/command/install_data.py
new file mode 100644
index 0000000..947cd76
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/install_data.py
@@ -0,0 +1,79 @@
+"""distutils.command.install_data
+
+Implements the Distutils 'install_data' command, for installing
+platform-independent data files."""
+
+# contributed by Bastian Kleineidam
+
+import os
+from distutils.core import Command
+from distutils.util import change_root, convert_path
+
+class install_data(Command):
+
+    description = "install data files"
+
+    user_options = [
+        ('install-dir=', 'd',
+         "base directory for installing data files "
+         "(default: installation base dir)"),
+        ('root=', None,
+         "install everything relative to this alternate root directory"),
+        ('force', 'f', "force installation (overwrite existing files)"),
+        ]
+
+    boolean_options = ['force']
+
+    def initialize_options(self):
+        self.install_dir = None
+        self.outfiles = []
+        self.root = None
+        self.force = 0
+        self.data_files = self.distribution.data_files
+        self.warn_dir = 1
+
+    def finalize_options(self):
+        self.set_undefined_options('install',
+                                   ('install_data', 'install_dir'),
+                                   ('root', 'root'),
+                                   ('force', 'force'),
+                                  )
+
+    def run(self):
+        self.mkpath(self.install_dir)
+        for f in self.data_files:
+            if isinstance(f, str):
+                # it's a simple file, so copy it
+                f = convert_path(f)
+                if self.warn_dir:
+                    self.warn("setup script did not provide a directory for "
+                              "'%s' -- installing right in '%s'" %
+                              (f, self.install_dir))
+                (out, _) = self.copy_file(f, self.install_dir)
+                self.outfiles.append(out)
+            else:
+                # it's a tuple with path to install to and a list of files
+                dir = convert_path(f[0])
+                if not os.path.isabs(dir):
+                    dir = os.path.join(self.install_dir, dir)
+                elif self.root:
+                    dir = change_root(self.root, dir)
+                self.mkpath(dir)
+
+                if f[1] == []:
+                    # If there are no files listed, the user must be
+                    # trying to create an empty directory, so add the
+                    # directory to the list of output files.
+                    self.outfiles.append(dir)
+                else:
+                    # Copy files, adding them to the list of output files.
+                    for data in f[1]:
+                        data = convert_path(data)
+                        (out, _) = self.copy_file(data, dir)
+                        self.outfiles.append(out)
+
+    def get_inputs(self):
+        return self.data_files or []
+
+    def get_outputs(self):
+        return self.outfiles
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py b/venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py
new file mode 100644
index 0000000..0ddc736
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py
@@ -0,0 +1,77 @@
+"""distutils.command.install_egg_info
+
+Implements the Distutils 'install_egg_info' command, for installing
+a package's PKG-INFO metadata."""
+
+
+from distutils.cmd import Command
+from distutils import log, dir_util
+import os, sys, re
+
+class install_egg_info(Command):
+    """Install an .egg-info file for the package"""
+
+    description = "Install package's PKG-INFO metadata as an .egg-info file"
+    user_options = [
+        ('install-dir=', 'd', "directory to install to"),
+    ]
+
+    def initialize_options(self):
+        self.install_dir = None
+
+    def finalize_options(self):
+        self.set_undefined_options('install_lib',('install_dir','install_dir'))
+        basename = "%s-%s-py%d.%d.egg-info" % (
+            to_filename(safe_name(self.distribution.get_name())),
+            to_filename(safe_version(self.distribution.get_version())),
+            *sys.version_info[:2]
+        )
+        self.target = os.path.join(self.install_dir, basename)
+        self.outputs = [self.target]
+
+    def run(self):
+        target = self.target
+        if os.path.isdir(target) and not os.path.islink(target):
+            dir_util.remove_tree(target, dry_run=self.dry_run)
+        elif os.path.exists(target):
+            self.execute(os.unlink,(self.target,),"Removing "+target)
+        elif not os.path.isdir(self.install_dir):
+            self.execute(os.makedirs, (self.install_dir,),
+                         "Creating "+self.install_dir)
+        log.info("Writing %s", target)
+        if not self.dry_run:
+            with open(target, 'w', encoding='UTF-8') as f:
+                self.distribution.metadata.write_pkg_file(f)
+
+    def get_outputs(self):
+        return self.outputs
+
+
+# The following routines are taken from setuptools' pkg_resources module and
+# can be replaced by importing them from pkg_resources once it is included
+# in the stdlib.
+
+def safe_name(name):
+    """Convert an arbitrary string to a standard distribution name
+
+    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
+    """
+    return re.sub('[^A-Za-z0-9.]+', '-', name)
+
+
+def safe_version(version):
+    """Convert an arbitrary string to a standard version string
+
+    Spaces become dots, and all other non-alphanumeric characters become
+    dashes, with runs of multiple dashes condensed to a single dash.
+    """
+    version = version.replace(' ','.')
+    return re.sub('[^A-Za-z0-9.]+', '-', version)
+
+
+def to_filename(name):
+    """Convert a project or version name to its filename-escaped form
+
+    Any '-' characters are currently replaced with '_'.
+    """
+    return name.replace('-','_')
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py b/venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py
new file mode 100644
index 0000000..9bb0b18
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py
@@ -0,0 +1,47 @@
+"""distutils.command.install_headers
+
+Implements the Distutils 'install_headers' command, to install C/C++ header
+files to the Python include directory."""
+
+from distutils.core import Command
+
+
+# XXX force is never used
+class install_headers(Command):
+
+    description = "install C/C++ header files"
+
+    user_options = [('install-dir=', 'd',
+                     "directory to install header files to"),
+                    ('force', 'f',
+                     "force installation (overwrite existing files)"),
+                   ]
+
+    boolean_options = ['force']
+
+    def initialize_options(self):
+        self.install_dir = None
+        self.force = 0
+        self.outfiles = []
+
+    def finalize_options(self):
+        self.set_undefined_options('install',
+                                   ('install_headers', 'install_dir'),
+                                   ('force', 'force'))
+
+
+    def run(self):
+        headers = self.distribution.headers
+        if not headers:
+            return
+
+        self.mkpath(self.install_dir)
+        for header in headers:
+            (out, _) = self.copy_file(header, self.install_dir)
+            self.outfiles.append(out)
+
+    def get_inputs(self):
+        return self.distribution.headers or []
+
+    def get_outputs(self):
+        return self.outfiles
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py b/venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py
new file mode 100644
index 0000000..6154cf0
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py
@@ -0,0 +1,217 @@
+"""distutils.command.install_lib
+
+Implements the Distutils 'install_lib' command
+(install all Python modules)."""
+
+import os
+import importlib.util
+import sys
+
+from distutils.core import Command
+from distutils.errors import DistutilsOptionError
+
+
+# Extension for Python source files.
+PYTHON_SOURCE_EXTENSION = ".py"
+
+class install_lib(Command):
+
+    description = "install all Python modules (extensions and pure Python)"
+
+    # The byte-compilation options are a tad confusing.  Here are the
+    # possible scenarios:
+    #   1) no compilation at all (--no-compile --no-optimize)
+    #   2) compile .pyc only (--compile --no-optimize; default)
+    #   3) compile .pyc and "opt-1" .pyc (--compile --optimize)
+    #   4) compile "opt-1" .pyc only (--no-compile --optimize)
+    #   5) compile .pyc and "opt-2" .pyc (--compile --optimize-more)
+    #   6) compile "opt-2" .pyc only (--no-compile --optimize-more)
+    #
+    # The UI for this is two options, 'compile' and 'optimize'.
+    # 'compile' is strictly boolean, and only decides whether to
+    # generate .pyc files.  'optimize' is three-way (0, 1, or 2), and
+    # decides both whether to generate .pyc files and what level of
+    # optimization to use.
+
+    user_options = [
+        ('install-dir=', 'd', "directory to install to"),
+        ('build-dir=','b', "build directory (where to install from)"),
+        ('force', 'f', "force installation (overwrite existing files)"),
+        ('compile', 'c', "compile .py to .pyc [default]"),
+        ('no-compile', None, "don't compile .py files"),
+        ('optimize=', 'O',
+         "also compile with optimization: -O1 for \"python -O\", "
+         "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"),
+        ('skip-build', None, "skip the build steps"),
+        ]
+
+    boolean_options = ['force', 'compile', 'skip-build']
+    negative_opt = {'no-compile' : 'compile'}
+
+    def initialize_options(self):
+        # let the 'install' command dictate our installation directory
+        self.install_dir = None
+        self.build_dir = None
+        self.force = 0
+        self.compile = None
+        self.optimize = None
+        self.skip_build = None
+
+    def finalize_options(self):
+        # Get all the information we need to install pure Python modules
+        # from the umbrella 'install' command -- build (source) directory,
+        # install (target) directory, and whether to compile .py files.
+        self.set_undefined_options('install',
+                                   ('build_lib', 'build_dir'),
+                                   ('install_lib', 'install_dir'),
+                                   ('force', 'force'),
+                                   ('compile', 'compile'),
+                                   ('optimize', 'optimize'),
+                                   ('skip_build', 'skip_build'),
+                                  )
+
+        if self.compile is None:
+            self.compile = True
+        if self.optimize is None:
+            self.optimize = False
+
+        if not isinstance(self.optimize, int):
+            try:
+                self.optimize = int(self.optimize)
+                if self.optimize not in (0, 1, 2):
+                    raise AssertionError
+            except (ValueError, AssertionError):
+                raise DistutilsOptionError("optimize must be 0, 1, or 2")
+
+    def run(self):
+        # Make sure we have built everything we need first
+        self.build()
+
+        # Install everything: simply dump the entire contents of the build
+        # directory to the installation directory (that's the beauty of
+        # having a build directory!)
+        outfiles = self.install()
+
+        # (Optionally) compile .py to .pyc
+        if outfiles is not None and self.distribution.has_pure_modules():
+            self.byte_compile(outfiles)
+
+    # -- Top-level worker functions ------------------------------------
+    # (called from 'run()')
+
+    def build(self):
+        if not self.skip_build:
+            if self.distribution.has_pure_modules():
+                self.run_command('build_py')
+            if self.distribution.has_ext_modules():
+                self.run_command('build_ext')
+
+    def install(self):
+        if os.path.isdir(self.build_dir):
+            outfiles = self.copy_tree(self.build_dir, self.install_dir)
+        else:
+            self.warn("'%s' does not exist -- no Python modules to install" %
+                      self.build_dir)
+            return
+        return outfiles
+
+    def byte_compile(self, files):
+        if sys.dont_write_bytecode:
+            self.warn('byte-compiling is disabled, skipping.')
+            return
+
+        from distutils.util import byte_compile
+
+        # Get the "--root" directory supplied to the "install" command,
+        # and use it as a prefix to strip off the purported filename
+        # encoded in bytecode files.  This is far from complete, but it
+        # should at least generate usable bytecode in RPM distributions.
+        install_root = self.get_finalized_command('install').root
+
+        if self.compile:
+            byte_compile(files, optimize=0,
+                         force=self.force, prefix=install_root,
+                         dry_run=self.dry_run)
+        if self.optimize > 0:
+            byte_compile(files, optimize=self.optimize,
+                         force=self.force, prefix=install_root,
+                         verbose=self.verbose, dry_run=self.dry_run)
+
+
+    # -- Utility methods -----------------------------------------------
+
+    def _mutate_outputs(self, has_any, build_cmd, cmd_option, output_dir):
+        if not has_any:
+            return []
+
+        build_cmd = self.get_finalized_command(build_cmd)
+        build_files = build_cmd.get_outputs()
+        build_dir = getattr(build_cmd, cmd_option)
+
+        prefix_len = len(build_dir) + len(os.sep)
+        outputs = []
+        for file in build_files:
+            outputs.append(os.path.join(output_dir, file[prefix_len:]))
+
+        return outputs
+
+    def _bytecode_filenames(self, py_filenames):
+        bytecode_files = []
+        for py_file in py_filenames:
+            # Since build_py handles package data installation, the
+            # list of outputs can contain more than just .py files.
+            # Make sure we only report bytecode for the .py files.
+            ext = os.path.splitext(os.path.normcase(py_file))[1]
+            if ext != PYTHON_SOURCE_EXTENSION:
+                continue
+            if self.compile:
+                bytecode_files.append(importlib.util.cache_from_source(
+                    py_file, optimization=''))
+            if self.optimize > 0:
+                bytecode_files.append(importlib.util.cache_from_source(
+                    py_file, optimization=self.optimize))
+
+        return bytecode_files
+
+
+    # -- External interface --------------------------------------------
+    # (called by outsiders)
+
+    def get_outputs(self):
+        """Return the list of files that would be installed if this command
+        were actually run.  Not affected by the "dry-run" flag or whether
+        modules have actually been built yet.
+        """
+        pure_outputs = \
+            self._mutate_outputs(self.distribution.has_pure_modules(),
+                                 'build_py', 'build_lib',
+                                 self.install_dir)
+        if self.compile:
+            bytecode_outputs = self._bytecode_filenames(pure_outputs)
+        else:
+            bytecode_outputs = []
+
+        ext_outputs = \
+            self._mutate_outputs(self.distribution.has_ext_modules(),
+                                 'build_ext', 'build_lib',
+                                 self.install_dir)
+
+        return pure_outputs + bytecode_outputs + ext_outputs
+
+    def get_inputs(self):
+        """Get the list of files that are input to this command, ie. the
+        files that get installed as they are named in the build tree.
+        The files in this list correspond one-to-one to the output
+        filenames returned by 'get_outputs()'.
+        """
+        inputs = []
+
+        if self.distribution.has_pure_modules():
+            build_py = self.get_finalized_command('build_py')
+            inputs.extend(build_py.get_outputs())
+
+        if self.distribution.has_ext_modules():
+            build_ext = self.get_finalized_command('build_ext')
+            inputs.extend(build_ext.get_outputs())
+
+        return inputs
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py b/venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py
new file mode 100644
index 0000000..31a1130
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py
@@ -0,0 +1,60 @@
+"""distutils.command.install_scripts
+
+Implements the Distutils 'install_scripts' command, for installing
+Python scripts."""
+
+# contributed by Bastian Kleineidam
+
+import os
+from distutils.core import Command
+from distutils import log
+from stat import ST_MODE
+
+
+class install_scripts(Command):
+
+    description = "install scripts (Python or otherwise)"
+
+    user_options = [
+        ('install-dir=', 'd', "directory to install scripts to"),
+        ('build-dir=','b', "build directory (where to install from)"),
+        ('force', 'f', "force installation (overwrite existing files)"),
+        ('skip-build', None, "skip the build steps"),
+    ]
+
+    boolean_options = ['force', 'skip-build']
+
+    def initialize_options(self):
+        self.install_dir = None
+        self.force = 0
+        self.build_dir = None
+        self.skip_build = None
+
+    def finalize_options(self):
+        self.set_undefined_options('build', ('build_scripts', 'build_dir'))
+        self.set_undefined_options('install',
+                                   ('install_scripts', 'install_dir'),
+                                   ('force', 'force'),
+                                   ('skip_build', 'skip_build'),
+                                  )
+
+    def run(self):
+        if not self.skip_build:
+            self.run_command('build_scripts')
+        self.outfiles = self.copy_tree(self.build_dir, self.install_dir)
+        if os.name == 'posix':
+            # Set the executable bits (owner, group, and world) on
+            # all the scripts we just installed.
+            for file in self.get_outputs():
+                if self.dry_run:
+                    log.info("changing mode of %s", file)
+                else:
+                    mode = ((os.stat(file)[ST_MODE]) | 0o555) & 0o7777
+                    log.info("changing mode of %s to %o", file, mode)
+                    os.chmod(file, mode)
+
+    def get_inputs(self):
+        return self.distribution.scripts or []
+
+    def get_outputs(self):
+        return self.outfiles or []
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/register.py b/venv/Lib/site-packages/setuptools/_distutils/command/register.py
new file mode 100644
index 0000000..0fac94e
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/register.py
@@ -0,0 +1,304 @@
+"""distutils.command.register
+
+Implements the Distutils 'register' command (register with the repository).
+"""
+
+# created 2002/10/21, Richard Jones
+
+import getpass
+import io
+import urllib.parse, urllib.request
+from warnings import warn
+
+from distutils.core import PyPIRCCommand
+from distutils.errors import *
+from distutils import log
+
+class register(PyPIRCCommand):
+
+    description = ("register the distribution with the Python package index")
+    user_options = PyPIRCCommand.user_options + [
+        ('list-classifiers', None,
+         'list the valid Trove classifiers'),
+        ('strict', None ,
+         'Will stop the registering if the meta-data are not fully compliant')
+        ]
+    boolean_options = PyPIRCCommand.boolean_options + [
+        'verify', 'list-classifiers', 'strict']
+
+    sub_commands = [('check', lambda self: True)]
+
+    def initialize_options(self):
+        PyPIRCCommand.initialize_options(self)
+        self.list_classifiers = 0
+        self.strict = 0
+
+    def finalize_options(self):
+        PyPIRCCommand.finalize_options(self)
+        # setting options for the `check` subcommand
+        check_options = {'strict': ('register', self.strict),
+                         'restructuredtext': ('register', 1)}
+        self.distribution.command_options['check'] = check_options
+
+    def run(self):
+        self.finalize_options()
+        self._set_config()
+
+        # Run sub commands
+        for cmd_name in self.get_sub_commands():
+            self.run_command(cmd_name)
+
+        if self.dry_run:
+            self.verify_metadata()
+        elif self.list_classifiers:
+            self.classifiers()
+        else:
+            self.send_metadata()
+
+    def check_metadata(self):
+        """Deprecated API."""
+        warn("distutils.command.register.check_metadata is deprecated, \
+              use the check command instead", PendingDeprecationWarning)
+        check = self.distribution.get_command_obj('check')
+        check.ensure_finalized()
+        check.strict = self.strict
+        check.restructuredtext = 1
+        check.run()
+
+    def _set_config(self):
+        ''' Reads the configuration file and set attributes.
+        '''
+        config = self._read_pypirc()
+        if config != {}:
+            self.username = config['username']
+            self.password = config['password']
+            self.repository = config['repository']
+            self.realm = config['realm']
+            self.has_config = True
+        else:
+            if self.repository not in ('pypi', self.DEFAULT_REPOSITORY):
+                raise ValueError('%s not found in .pypirc' % self.repository)
+            if self.repository == 'pypi':
+                self.repository = self.DEFAULT_REPOSITORY
+            self.has_config = False
+
+    def classifiers(self):
+        ''' Fetch the list of classifiers from the server.
+        '''
+        url = self.repository+'?:action=list_classifiers'
+        response = urllib.request.urlopen(url)
+        log.info(self._read_pypi_response(response))
+
+    def verify_metadata(self):
+        ''' Send the metadata to the package index server to be checked.
+        '''
+        # send the info to the server and report the result
+        (code, result) = self.post_to_server(self.build_post_data('verify'))
+        log.info('Server response (%s): %s', code, result)
+
+    def send_metadata(self):
+        ''' Send the metadata to the package index server.
+
+            Well, do the following:
+            1. figure who the user is, and then
+            2. send the data as a Basic auth'ed POST.
+
+            First we try to read the username/password from $HOME/.pypirc,
+            which is a ConfigParser-formatted file with a section
+            [distutils] containing username and password entries (both
+            in clear text). Eg:
+
+                [distutils]
+                index-servers =
+                    pypi
+
+                [pypi]
+                username: fred
+                password: sekrit
+
+            Otherwise, to figure who the user is, we offer the user three
+            choices:
+
+             1. use existing login,
+             2. register as a new user, or
+             3. set the password to a random string and email the user.
+
+        '''
+        # see if we can short-cut and get the username/password from the
+        # config
+        if self.has_config:
+            choice = '1'
+            username = self.username
+            password = self.password
+        else:
+            choice = 'x'
+            username = password = ''
+
+        # get the user's login info
+        choices = '1 2 3 4'.split()
+        while choice not in choices:
+            self.announce('''\
+We need to know who you are, so please choose either:
+ 1. use your existing login,
+ 2. register as a new user,
+ 3. have the server generate a new password for you (and email it to you), or
+ 4. quit
+Your selection [default 1]: ''', log.INFO)
+            choice = input()
+            if not choice:
+                choice = '1'
+            elif choice not in choices:
+                print('Please choose one of the four options!')
+
+        if choice == '1':
+            # get the username and password
+            while not username:
+                username = input('Username: ')
+            while not password:
+                password = getpass.getpass('Password: ')
+
+            # set up the authentication
+            auth = urllib.request.HTTPPasswordMgr()
+            host = urllib.parse.urlparse(self.repository)[1]
+            auth.add_password(self.realm, host, username, password)
+            # send the info to the server and report the result
+            code, result = self.post_to_server(self.build_post_data('submit'),
+                auth)
+            self.announce('Server response (%s): %s' % (code, result),
+                          log.INFO)
+
+            # possibly save the login
+            if code == 200:
+                if self.has_config:
+                    # sharing the password in the distribution instance
+                    # so the upload command can reuse it
+                    self.distribution.password = password
+                else:
+                    self.announce(('I can store your PyPI login so future '
+                                   'submissions will be faster.'), log.INFO)
+                    self.announce('(the login will be stored in %s)' % \
+                                  self._get_rc_file(), log.INFO)
+                    choice = 'X'
+                    while choice.lower() not in 'yn':
+                        choice = input('Save your login (y/N)?')
+                        if not choice:
+                            choice = 'n'
+                    if choice.lower() == 'y':
+                        self._store_pypirc(username, password)
+
+        elif choice == '2':
+            data = {':action': 'user'}
+            data['name'] = data['password'] = data['email'] = ''
+            data['confirm'] = None
+            while not data['name']:
+                data['name'] = input('Username: ')
+            while data['password'] != data['confirm']:
+                while not data['password']:
+                    data['password'] = getpass.getpass('Password: ')
+                while not data['confirm']:
+                    data['confirm'] = getpass.getpass(' Confirm: ')
+                if data['password'] != data['confirm']:
+                    data['password'] = ''
+                    data['confirm'] = None
+                    print("Password and confirm don't match!")
+            while not data['email']:
+                data['email'] = input('   EMail: ')
+            code, result = self.post_to_server(data)
+            if code != 200:
+                log.info('Server response (%s): %s', code, result)
+            else:
+                log.info('You will receive an email shortly.')
+                log.info(('Follow the instructions in it to '
+                          'complete registration.'))
+        elif choice == '3':
+            data = {':action': 'password_reset'}
+            data['email'] = ''
+            while not data['email']:
+                data['email'] = input('Your email address: ')
+            code, result = self.post_to_server(data)
+            log.info('Server response (%s): %s', code, result)
+
+    def build_post_data(self, action):
+        # figure the data to send - the metadata plus some additional
+        # information used by the package server
+        meta = self.distribution.metadata
+        data = {
+            ':action': action,
+            'metadata_version' : '1.0',
+            'name': meta.get_name(),
+            'version': meta.get_version(),
+            'summary': meta.get_description(),
+            'home_page': meta.get_url(),
+            'author': meta.get_contact(),
+            'author_email': meta.get_contact_email(),
+            'license': meta.get_licence(),
+            'description': meta.get_long_description(),
+            'keywords': meta.get_keywords(),
+            'platform': meta.get_platforms(),
+            'classifiers': meta.get_classifiers(),
+            'download_url': meta.get_download_url(),
+            # PEP 314
+            'provides': meta.get_provides(),
+            'requires': meta.get_requires(),
+            'obsoletes': meta.get_obsoletes(),
+        }
+        if data['provides'] or data['requires'] or data['obsoletes']:
+            data['metadata_version'] = '1.1'
+        return data
+
+    def post_to_server(self, data, auth=None):
+        ''' Post a query to the server, and return a string response.
+        '''
+        if 'name' in data:
+            self.announce('Registering %s to %s' % (data['name'],
+                                                    self.repository),
+                                                    log.INFO)
+        # Build up the MIME payload for the urllib2 POST data
+        boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
+        sep_boundary = '\n--' + boundary
+        end_boundary = sep_boundary + '--'
+        body = io.StringIO()
+        for key, value in data.items():
+            # handle multiple entries for the same name
+            if type(value) not in (type([]), type( () )):
+                value = [value]
+            for value in value:
+                value = str(value)
+                body.write(sep_boundary)
+                body.write('\nContent-Disposition: form-data; name="%s"'%key)
+                body.write("\n\n")
+                body.write(value)
+                if value and value[-1] == '\r':
+                    body.write('\n')  # write an extra newline (lurve Macs)
+        body.write(end_boundary)
+        body.write("\n")
+        body = body.getvalue().encode("utf-8")
+
+        # build the Request
+        headers = {
+            'Content-type': 'multipart/form-data; boundary=%s; charset=utf-8'%boundary,
+            'Content-length': str(len(body))
+        }
+        req = urllib.request.Request(self.repository, body, headers)
+
+        # handle HTTP and include the Basic Auth handler
+        opener = urllib.request.build_opener(
+            urllib.request.HTTPBasicAuthHandler(password_mgr=auth)
+        )
+        data = ''
+        try:
+            result = opener.open(req)
+        except urllib.error.HTTPError as e:
+            if self.show_response:
+                data = e.fp.read()
+            result = e.code, e.msg
+        except urllib.error.URLError as e:
+            result = 500, str(e)
+        else:
+            if self.show_response:
+                data = self._read_pypi_response(result)
+            result = 200, 'OK'
+        if self.show_response:
+            msg = '\n'.join(('-' * 75, data, '-' * 75))
+            self.announce(msg, log.INFO)
+        return result
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/sdist.py b/venv/Lib/site-packages/setuptools/_distutils/command/sdist.py
new file mode 100644
index 0000000..b4996fc
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/sdist.py
@@ -0,0 +1,494 @@
+"""distutils.command.sdist
+
+Implements the Distutils 'sdist' command (create a source distribution)."""
+
+import os
+import sys
+from glob import glob
+from warnings import warn
+
+from distutils.core import Command
+from distutils import dir_util
+from distutils import file_util
+from distutils import archive_util
+from distutils.text_file import TextFile
+from distutils.filelist import FileList
+from distutils import log
+from distutils.util import convert_path
+from distutils.errors import DistutilsTemplateError, DistutilsOptionError
+
+
+def show_formats():
+    """Print all possible values for the 'formats' option (used by
+    the "--help-formats" command-line option).
+    """
+    from distutils.fancy_getopt import FancyGetopt
+    from distutils.archive_util import ARCHIVE_FORMATS
+    formats = []
+    for format in ARCHIVE_FORMATS.keys():
+        formats.append(("formats=" + format, None,
+                        ARCHIVE_FORMATS[format][2]))
+    formats.sort()
+    FancyGetopt(formats).print_help(
+        "List of available source distribution formats:")
+
+
+class sdist(Command):
+
+    description = "create a source distribution (tarball, zip file, etc.)"
+
+    def checking_metadata(self):
+        """Callable used for the check sub-command.
+
+        Placed here so user_options can view it"""
+        return self.metadata_check
+
+    user_options = [
+        ('template=', 't',
+         "name of manifest template file [default: MANIFEST.in]"),
+        ('manifest=', 'm',
+         "name of manifest file [default: MANIFEST]"),
+        ('use-defaults', None,
+         "include the default file set in the manifest "
+         "[default; disable with --no-defaults]"),
+        ('no-defaults', None,
+         "don't include the default file set"),
+        ('prune', None,
+         "specifically exclude files/directories that should not be "
+         "distributed (build tree, RCS/CVS dirs, etc.) "
+         "[default; disable with --no-prune]"),
+        ('no-prune', None,
+         "don't automatically exclude anything"),
+        ('manifest-only', 'o',
+         "just regenerate the manifest and then stop "
+         "(implies --force-manifest)"),
+        ('force-manifest', 'f',
+         "forcibly regenerate the manifest and carry on as usual. "
+         "Deprecated: now the manifest is always regenerated."),
+        ('formats=', None,
+         "formats for source distribution (comma-separated list)"),
+        ('keep-temp', 'k',
+         "keep the distribution tree around after creating " +
+         "archive file(s)"),
+        ('dist-dir=', 'd',
+         "directory to put the source distribution archive(s) in "
+         "[default: dist]"),
+        ('metadata-check', None,
+         "Ensure that all required elements of meta-data "
+         "are supplied. Warn if any missing. [default]"),
+        ('owner=', 'u',
+         "Owner name used when creating a tar file [default: current user]"),
+        ('group=', 'g',
+         "Group name used when creating a tar file [default: current group]"),
+        ]
+
+    boolean_options = ['use-defaults', 'prune',
+                       'manifest-only', 'force-manifest',
+                       'keep-temp', 'metadata-check']
+
+    help_options = [
+        ('help-formats', None,
+         "list available distribution formats", show_formats),
+        ]
+
+    negative_opt = {'no-defaults': 'use-defaults',
+                    'no-prune': 'prune' }
+
+    sub_commands = [('check', checking_metadata)]
+
+    READMES = ('README', 'README.txt', 'README.rst')
+
+    def initialize_options(self):
+        # 'template' and 'manifest' are, respectively, the names of
+        # the manifest template and manifest file.
+        self.template = None
+        self.manifest = None
+
+        # 'use_defaults': if true, we will include the default file set
+        # in the manifest
+        self.use_defaults = 1
+        self.prune = 1
+
+        self.manifest_only = 0
+        self.force_manifest = 0
+
+        self.formats = ['gztar']
+        self.keep_temp = 0
+        self.dist_dir = None
+
+        self.archive_files = None
+        self.metadata_check = 1
+        self.owner = None
+        self.group = None
+
+    def finalize_options(self):
+        if self.manifest is None:
+            self.manifest = "MANIFEST"
+        if self.template is None:
+            self.template = "MANIFEST.in"
+
+        self.ensure_string_list('formats')
+
+        bad_format = archive_util.check_archive_formats(self.formats)
+        if bad_format:
+            raise DistutilsOptionError(
+                  "unknown archive format '%s'" % bad_format)
+
+        if self.dist_dir is None:
+            self.dist_dir = "dist"
+
+    def run(self):
+        # 'filelist' contains the list of files that will make up the
+        # manifest
+        self.filelist = FileList()
+
+        # Run sub commands
+        for cmd_name in self.get_sub_commands():
+            self.run_command(cmd_name)
+
+        # Do whatever it takes to get the list of files to process
+        # (process the manifest template, read an existing manifest,
+        # whatever).  File list is accumulated in 'self.filelist'.
+        self.get_file_list()
+
+        # If user just wanted us to regenerate the manifest, stop now.
+        if self.manifest_only:
+            return
+
+        # Otherwise, go ahead and create the source distribution tarball,
+        # or zipfile, or whatever.
+        self.make_distribution()
+
+    def check_metadata(self):
+        """Deprecated API."""
+        warn("distutils.command.sdist.check_metadata is deprecated, \
+              use the check command instead", PendingDeprecationWarning)
+        check = self.distribution.get_command_obj('check')
+        check.ensure_finalized()
+        check.run()
+
+    def get_file_list(self):
+        """Figure out the list of files to include in the source
+        distribution, and put it in 'self.filelist'.  This might involve
+        reading the manifest template (and writing the manifest), or just
+        reading the manifest, or just using the default file set -- it all
+        depends on the user's options.
+        """
+        # new behavior when using a template:
+        # the file list is recalculated every time because
+        # even if MANIFEST.in or setup.py are not changed
+        # the user might have added some files in the tree that
+        # need to be included.
+        #
+        #  This makes --force the default and only behavior with templates.
+        template_exists = os.path.isfile(self.template)
+        if not template_exists and self._manifest_is_not_generated():
+            self.read_manifest()
+            self.filelist.sort()
+            self.filelist.remove_duplicates()
+            return
+
+        if not template_exists:
+            self.warn(("manifest template '%s' does not exist " +
+                        "(using default file list)") %
+                        self.template)
+        self.filelist.findall()
+
+        if self.use_defaults:
+            self.add_defaults()
+
+        if template_exists:
+            self.read_template()
+
+        if self.prune:
+            self.prune_file_list()
+
+        self.filelist.sort()
+        self.filelist.remove_duplicates()
+        self.write_manifest()
+
+    def add_defaults(self):
+        """Add all the default files to self.filelist:
+          - README or README.txt
+          - setup.py
+          - test/test*.py
+          - all pure Python modules mentioned in setup script
+          - all files pointed by package_data (build_py)
+          - all files defined in data_files.
+          - all files defined as scripts.
+          - all C sources listed as part of extensions or C libraries
+            in the setup script (doesn't catch C headers!)
+        Warns if (README or README.txt) or setup.py are missing; everything
+        else is optional.
+        """
+        self._add_defaults_standards()
+        self._add_defaults_optional()
+        self._add_defaults_python()
+        self._add_defaults_data_files()
+        self._add_defaults_ext()
+        self._add_defaults_c_libs()
+        self._add_defaults_scripts()
+
+    @staticmethod
+    def _cs_path_exists(fspath):
+        """
+        Case-sensitive path existence check
+
+        >>> sdist._cs_path_exists(__file__)
+        True
+        >>> sdist._cs_path_exists(__file__.upper())
+        False
+        """
+        if not os.path.exists(fspath):
+            return False
+        # make absolute so we always have a directory
+        abspath = os.path.abspath(fspath)
+        directory, filename = os.path.split(abspath)
+        return filename in os.listdir(directory)
+
+    def _add_defaults_standards(self):
+        standards = [self.READMES, self.distribution.script_name]
+        for fn in standards:
+            if isinstance(fn, tuple):
+                alts = fn
+                got_it = False
+                for fn in alts:
+                    if self._cs_path_exists(fn):
+                        got_it = True
+                        self.filelist.append(fn)
+                        break
+
+                if not got_it:
+                    self.warn("standard file not found: should have one of " +
+                              ', '.join(alts))
+            else:
+                if self._cs_path_exists(fn):
+                    self.filelist.append(fn)
+                else:
+                    self.warn("standard file '%s' not found" % fn)
+
+    def _add_defaults_optional(self):
+        optional = ['test/test*.py', 'setup.cfg']
+        for pattern in optional:
+            files = filter(os.path.isfile, glob(pattern))
+            self.filelist.extend(files)
+
+    def _add_defaults_python(self):
+        # build_py is used to get:
+        #  - python modules
+        #  - files defined in package_data
+        build_py = self.get_finalized_command('build_py')
+
+        # getting python files
+        if self.distribution.has_pure_modules():
+            self.filelist.extend(build_py.get_source_files())
+
+        # getting package_data files
+        # (computed in build_py.data_files by build_py.finalize_options)
+        for pkg, src_dir, build_dir, filenames in build_py.data_files:
+            for filename in filenames:
+                self.filelist.append(os.path.join(src_dir, filename))
+
+    def _add_defaults_data_files(self):
+        # getting distribution.data_files
+        if self.distribution.has_data_files():
+            for item in self.distribution.data_files:
+                if isinstance(item, str):
+                    # plain file
+                    item = convert_path(item)
+                    if os.path.isfile(item):
+                        self.filelist.append(item)
+                else:
+                    # a (dirname, filenames) tuple
+                    dirname, filenames = item
+                    for f in filenames:
+                        f = convert_path(f)
+                        if os.path.isfile(f):
+                            self.filelist.append(f)
+
+    def _add_defaults_ext(self):
+        if self.distribution.has_ext_modules():
+            build_ext = self.get_finalized_command('build_ext')
+            self.filelist.extend(build_ext.get_source_files())
+
+    def _add_defaults_c_libs(self):
+        if self.distribution.has_c_libraries():
+            build_clib = self.get_finalized_command('build_clib')
+            self.filelist.extend(build_clib.get_source_files())
+
+    def _add_defaults_scripts(self):
+        if self.distribution.has_scripts():
+            build_scripts = self.get_finalized_command('build_scripts')
+            self.filelist.extend(build_scripts.get_source_files())
+
+    def read_template(self):
+        """Read and parse manifest template file named by self.template.
+
+        (usually "MANIFEST.in") The parsing and processing is done by
+        'self.filelist', which updates itself accordingly.
+        """
+        log.info("reading manifest template '%s'", self.template)
+        template = TextFile(self.template, strip_comments=1, skip_blanks=1,
+                            join_lines=1, lstrip_ws=1, rstrip_ws=1,
+                            collapse_join=1)
+
+        try:
+            while True:
+                line = template.readline()
+                if line is None:            # end of file
+                    break
+
+                try:
+                    self.filelist.process_template_line(line)
+                # the call above can raise a DistutilsTemplateError for
+                # malformed lines, or a ValueError from the lower-level
+                # convert_path function
+                except (DistutilsTemplateError, ValueError) as msg:
+                    self.warn("%s, line %d: %s" % (template.filename,
+                                                   template.current_line,
+                                                   msg))
+        finally:
+            template.close()
+
+    def prune_file_list(self):
+        """Prune off branches that might slip into the file list as created
+        by 'read_template()', but really don't belong there:
+          * the build tree (typically "build")
+          * the release tree itself (only an issue if we ran "sdist"
+            previously with --keep-temp, or it aborted)
+          * any RCS, CVS, .svn, .hg, .git, .bzr, _darcs directories
+        """
+        build = self.get_finalized_command('build')
+        base_dir = self.distribution.get_fullname()
+
+        self.filelist.exclude_pattern(None, prefix=build.build_base)
+        self.filelist.exclude_pattern(None, prefix=base_dir)
+
+        if sys.platform == 'win32':
+            seps = r'/|\\'
+        else:
+            seps = '/'
+
+        vcs_dirs = ['RCS', 'CVS', r'\.svn', r'\.hg', r'\.git', r'\.bzr',
+                    '_darcs']
+        vcs_ptrn = r'(^|%s)(%s)(%s).*' % (seps, '|'.join(vcs_dirs), seps)
+        self.filelist.exclude_pattern(vcs_ptrn, is_regex=1)
+
+    def write_manifest(self):
+        """Write the file list in 'self.filelist' (presumably as filled in
+        by 'add_defaults()' and 'read_template()') to the manifest file
+        named by 'self.manifest'.
+        """
+        if self._manifest_is_not_generated():
+            log.info("not writing to manually maintained "
+                     "manifest file '%s'" % self.manifest)
+            return
+
+        content = self.filelist.files[:]
+        content.insert(0, '# file GENERATED by distutils, do NOT edit')
+        self.execute(file_util.write_file, (self.manifest, content),
+                     "writing manifest file '%s'" % self.manifest)
+
+    def _manifest_is_not_generated(self):
+        # check for special comment used in 3.1.3 and higher
+        if not os.path.isfile(self.manifest):
+            return False
+
+        fp = open(self.manifest)
+        try:
+            first_line = fp.readline()
+        finally:
+            fp.close()
+        return first_line != '# file GENERATED by distutils, do NOT edit\n'
+
+    def read_manifest(self):
+        """Read the manifest file (named by 'self.manifest') and use it to
+        fill in 'self.filelist', the list of files to include in the source
+        distribution.
+        """
+        log.info("reading manifest file '%s'", self.manifest)
+        with open(self.manifest) as manifest:
+            for line in manifest:
+                # ignore comments and blank lines
+                line = line.strip()
+                if line.startswith('#') or not line:
+                    continue
+                self.filelist.append(line)
+
+    def make_release_tree(self, base_dir, files):
+        """Create the directory tree that will become the source
+        distribution archive.  All directories implied by the filenames in
+        'files' are created under 'base_dir', and then we hard link or copy
+        (if hard linking is unavailable) those files into place.
+        Essentially, this duplicates the developer's source tree, but in a
+        directory named after the distribution, containing only the files
+        to be distributed.
+        """
+        # Create all the directories under 'base_dir' necessary to
+        # put 'files' there; the 'mkpath()' is just so we don't die
+        # if the manifest happens to be empty.
+        self.mkpath(base_dir)
+        dir_util.create_tree(base_dir, files, dry_run=self.dry_run)
+
+        # And walk over the list of files, either making a hard link (if
+        # os.link exists) to each one that doesn't already exist in its
+        # corresponding location under 'base_dir', or copying each file
+        # that's out-of-date in 'base_dir'.  (Usually, all files will be
+        # out-of-date, because by default we blow away 'base_dir' when
+        # we're done making the distribution archives.)
+
+        if hasattr(os, 'link'):        # can make hard links on this system
+            link = 'hard'
+            msg = "making hard links in %s..." % base_dir
+        else:                           # nope, have to copy
+            link = None
+            msg = "copying files to %s..." % base_dir
+
+        if not files:
+            log.warn("no files to distribute -- empty manifest?")
+        else:
+            log.info(msg)
+        for file in files:
+            if not os.path.isfile(file):
+                log.warn("'%s' not a regular file -- skipping", file)
+            else:
+                dest = os.path.join(base_dir, file)
+                self.copy_file(file, dest, link=link)
+
+        self.distribution.metadata.write_pkg_info(base_dir)
+
+    def make_distribution(self):
+        """Create the source distribution(s).  First, we create the release
+        tree with 'make_release_tree()'; then, we create all required
+        archive files (according to 'self.formats') from the release tree.
+        Finally, we clean up by blowing away the release tree (unless
+        'self.keep_temp' is true).  The list of archive files created is
+        stored so it can be retrieved later by 'get_archive_files()'.
+        """
+        # Don't warn about missing meta-data here -- should be (and is!)
+        # done elsewhere.
+        base_dir = self.distribution.get_fullname()
+        base_name = os.path.join(self.dist_dir, base_dir)
+
+        self.make_release_tree(base_dir, self.filelist.files)
+        archive_files = []              # remember names of files we create
+        # tar archive must be created last to avoid overwrite and remove
+        if 'tar' in self.formats:
+            self.formats.append(self.formats.pop(self.formats.index('tar')))
+
+        for fmt in self.formats:
+            file = self.make_archive(base_name, fmt, base_dir=base_dir,
+                                     owner=self.owner, group=self.group)
+            archive_files.append(file)
+            self.distribution.dist_files.append(('sdist', '', file))
+
+        self.archive_files = archive_files
+
+        if not self.keep_temp:
+            dir_util.remove_tree(base_dir, dry_run=self.dry_run)
+
+    def get_archive_files(self):
+        """Return the list of archive files created when the command
+        was run, or None if the command hasn't run yet.
+        """
+        return self.archive_files
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/upload.py b/venv/Lib/site-packages/setuptools/_distutils/command/upload.py
new file mode 100644
index 0000000..95e9fda
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/upload.py
@@ -0,0 +1,214 @@
+"""
+distutils.command.upload
+
+Implements the Distutils 'upload' subcommand (upload package to a package
+index).
+"""
+
+import os
+import io
+import hashlib
+from base64 import standard_b64encode
+from urllib.request import urlopen, Request, HTTPError
+from urllib.parse import urlparse
+from distutils.errors import DistutilsError, DistutilsOptionError
+from distutils.core import PyPIRCCommand
+from distutils.spawn import spawn
+from distutils import log
+
+
+# PyPI Warehouse supports MD5, SHA256, and Blake2 (blake2-256)
+# https://bugs.python.org/issue40698
+_FILE_CONTENT_DIGESTS = {
+    "md5_digest": getattr(hashlib, "md5", None),
+    "sha256_digest": getattr(hashlib, "sha256", None),
+    "blake2_256_digest": getattr(hashlib, "blake2b", None),
+}
+
+
+class upload(PyPIRCCommand):
+
+    description = "upload binary package to PyPI"
+
+    user_options = PyPIRCCommand.user_options + [
+        ('sign', 's',
+         'sign files to upload using gpg'),
+        ('identity=', 'i', 'GPG identity used to sign files'),
+        ]
+
+    boolean_options = PyPIRCCommand.boolean_options + ['sign']
+
+    def initialize_options(self):
+        PyPIRCCommand.initialize_options(self)
+        self.username = ''
+        self.password = ''
+        self.show_response = 0
+        self.sign = False
+        self.identity = None
+
+    def finalize_options(self):
+        PyPIRCCommand.finalize_options(self)
+        if self.identity and not self.sign:
+            raise DistutilsOptionError(
+                "Must use --sign for --identity to have meaning"
+            )
+        config = self._read_pypirc()
+        if config != {}:
+            self.username = config['username']
+            self.password = config['password']
+            self.repository = config['repository']
+            self.realm = config['realm']
+
+        # getting the password from the distribution
+        # if previously set by the register command
+        if not self.password and self.distribution.password:
+            self.password = self.distribution.password
+
+    def run(self):
+        if not self.distribution.dist_files:
+            msg = ("Must create and upload files in one command "
+                   "(e.g. setup.py sdist upload)")
+            raise DistutilsOptionError(msg)
+        for command, pyversion, filename in self.distribution.dist_files:
+            self.upload_file(command, pyversion, filename)
+
+    def upload_file(self, command, pyversion, filename):
+        # Makes sure the repository URL is compliant
+        schema, netloc, url, params, query, fragments = \
+            urlparse(self.repository)
+        if params or query or fragments:
+            raise AssertionError("Incompatible url %s" % self.repository)
+
+        if schema not in ('http', 'https'):
+            raise AssertionError("unsupported schema " + schema)
+
+        # Sign if requested
+        if self.sign:
+            gpg_args = ["gpg", "--detach-sign", "-a", filename]
+            if self.identity:
+                gpg_args[2:2] = ["--local-user", self.identity]
+            spawn(gpg_args,
+                  dry_run=self.dry_run)
+
+        # Fill in the data - send all the meta-data in case we need to
+        # register a new release
+        f = open(filename,'rb')
+        try:
+            content = f.read()
+        finally:
+            f.close()
+
+        meta = self.distribution.metadata
+        data = {
+            # action
+            ':action': 'file_upload',
+            'protocol_version': '1',
+
+            # identify release
+            'name': meta.get_name(),
+            'version': meta.get_version(),
+
+            # file content
+            'content': (os.path.basename(filename),content),
+            'filetype': command,
+            'pyversion': pyversion,
+
+            # additional meta-data
+            'metadata_version': '1.0',
+            'summary': meta.get_description(),
+            'home_page': meta.get_url(),
+            'author': meta.get_contact(),
+            'author_email': meta.get_contact_email(),
+            'license': meta.get_licence(),
+            'description': meta.get_long_description(),
+            'keywords': meta.get_keywords(),
+            'platform': meta.get_platforms(),
+            'classifiers': meta.get_classifiers(),
+            'download_url': meta.get_download_url(),
+            # PEP 314
+            'provides': meta.get_provides(),
+            'requires': meta.get_requires(),
+            'obsoletes': meta.get_obsoletes(),
+            }
+
+        data['comment'] = ''
+
+        # file content digests
+        for digest_name, digest_cons in _FILE_CONTENT_DIGESTS.items():
+            if digest_cons is None:
+                continue
+            try:
+                data[digest_name] = digest_cons(content).hexdigest()
+            except ValueError:
+                # hash digest not available or blocked by security policy
+                pass
+
+        if self.sign:
+            with open(filename + ".asc", "rb") as f:
+                data['gpg_signature'] = (os.path.basename(filename) + ".asc",
+                                         f.read())
+
+        # set up the authentication
+        user_pass = (self.username + ":" + self.password).encode('ascii')
+        # The exact encoding of the authentication string is debated.
+        # Anyway PyPI only accepts ascii for both username or password.
+        auth = "Basic " + standard_b64encode(user_pass).decode('ascii')
+
+        # Build up the MIME payload for the POST data
+        boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
+        sep_boundary = b'\r\n--' + boundary.encode('ascii')
+        end_boundary = sep_boundary + b'--\r\n'
+        body = io.BytesIO()
+        for key, value in data.items():
+            title = '\r\nContent-Disposition: form-data; name="%s"' % key
+            # handle multiple entries for the same name
+            if not isinstance(value, list):
+                value = [value]
+            for value in value:
+                if type(value) is tuple:
+                    title += '; filename="%s"' % value[0]
+                    value = value[1]
+                else:
+                    value = str(value).encode('utf-8')
+                body.write(sep_boundary)
+                body.write(title.encode('utf-8'))
+                body.write(b"\r\n\r\n")
+                body.write(value)
+        body.write(end_boundary)
+        body = body.getvalue()
+
+        msg = "Submitting %s to %s" % (filename, self.repository)
+        self.announce(msg, log.INFO)
+
+        # build the Request
+        headers = {
+            'Content-type': 'multipart/form-data; boundary=%s' % boundary,
+            'Content-length': str(len(body)),
+            'Authorization': auth,
+        }
+
+        request = Request(self.repository, data=body,
+                          headers=headers)
+        # send the data
+        try:
+            result = urlopen(request)
+            status = result.getcode()
+            reason = result.msg
+        except HTTPError as e:
+            status = e.code
+            reason = e.msg
+        except OSError as e:
+            self.announce(str(e), log.ERROR)
+            raise
+
+        if status == 200:
+            self.announce('Server response (%s): %s' % (status, reason),
+                          log.INFO)
+            if self.show_response:
+                text = self._read_pypi_response(result)
+                msg = '\n'.join(('-' * 75, text, '-' * 75))
+                self.announce(msg, log.INFO)
+        else:
+            msg = 'Upload failed (%s): %s' % (status, reason)
+            self.announce(msg, log.ERROR)
+            raise DistutilsError(msg)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/config.py b/venv/Lib/site-packages/setuptools/_distutils/config.py
new file mode 100644
index 0000000..2171abd
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/config.py
@@ -0,0 +1,130 @@
+"""distutils.pypirc
+
+Provides the PyPIRCCommand class, the base class for the command classes
+that uses .pypirc in the distutils.command package.
+"""
+import os
+from configparser import RawConfigParser
+
+from distutils.cmd import Command
+
+DEFAULT_PYPIRC = """\
+[distutils]
+index-servers =
+    pypi
+
+[pypi]
+username:%s
+password:%s
+"""
+
+class PyPIRCCommand(Command):
+    """Base command that knows how to handle the .pypirc file
+    """
+    DEFAULT_REPOSITORY = 'https://upload.pypi.org/legacy/'
+    DEFAULT_REALM = 'pypi'
+    repository = None
+    realm = None
+
+    user_options = [
+        ('repository=', 'r',
+         "url of repository [default: %s]" % \
+            DEFAULT_REPOSITORY),
+        ('show-response', None,
+         'display full response text from server')]
+
+    boolean_options = ['show-response']
+
+    def _get_rc_file(self):
+        """Returns rc file path."""
+        return os.path.join(os.path.expanduser('~'), '.pypirc')
+
+    def _store_pypirc(self, username, password):
+        """Creates a default .pypirc file."""
+        rc = self._get_rc_file()
+        with os.fdopen(os.open(rc, os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f:
+            f.write(DEFAULT_PYPIRC % (username, password))
+
+    def _read_pypirc(self):
+        """Reads the .pypirc file."""
+        rc = self._get_rc_file()
+        if os.path.exists(rc):
+            self.announce('Using PyPI login from %s' % rc)
+            repository = self.repository or self.DEFAULT_REPOSITORY
+
+            config = RawConfigParser()
+            config.read(rc)
+            sections = config.sections()
+            if 'distutils' in sections:
+                # let's get the list of servers
+                index_servers = config.get('distutils', 'index-servers')
+                _servers = [server.strip() for server in
+                            index_servers.split('\n')
+                            if server.strip() != '']
+                if _servers == []:
+                    # nothing set, let's try to get the default pypi
+                    if 'pypi' in sections:
+                        _servers = ['pypi']
+                    else:
+                        # the file is not properly defined, returning
+                        # an empty dict
+                        return {}
+                for server in _servers:
+                    current = {'server': server}
+                    current['username'] = config.get(server, 'username')
+
+                    # optional params
+                    for key, default in (('repository',
+                                          self.DEFAULT_REPOSITORY),
+                                         ('realm', self.DEFAULT_REALM),
+                                         ('password', None)):
+                        if config.has_option(server, key):
+                            current[key] = config.get(server, key)
+                        else:
+                            current[key] = default
+
+                    # work around people having "repository" for the "pypi"
+                    # section of their config set to the HTTP (rather than
+                    # HTTPS) URL
+                    if (server == 'pypi' and
+                        repository in (self.DEFAULT_REPOSITORY, 'pypi')):
+                        current['repository'] = self.DEFAULT_REPOSITORY
+                        return current
+
+                    if (current['server'] == repository or
+                        current['repository'] == repository):
+                        return current
+            elif 'server-login' in sections:
+                # old format
+                server = 'server-login'
+                if config.has_option(server, 'repository'):
+                    repository = config.get(server, 'repository')
+                else:
+                    repository = self.DEFAULT_REPOSITORY
+                return {'username': config.get(server, 'username'),
+                        'password': config.get(server, 'password'),
+                        'repository': repository,
+                        'server': server,
+                        'realm': self.DEFAULT_REALM}
+
+        return {}
+
+    def _read_pypi_response(self, response):
+        """Read and decode a PyPI HTTP response."""
+        import cgi
+        content_type = response.getheader('content-type', 'text/plain')
+        encoding = cgi.parse_header(content_type)[1].get('charset', 'ascii')
+        return response.read().decode(encoding)
+
+    def initialize_options(self):
+        """Initialize options."""
+        self.repository = None
+        self.realm = None
+        self.show_response = 0
+
+    def finalize_options(self):
+        """Finalizes options."""
+        if self.repository is None:
+            self.repository = self.DEFAULT_REPOSITORY
+        if self.realm is None:
+            self.realm = self.DEFAULT_REALM
diff --git a/venv/Lib/site-packages/setuptools/_distutils/core.py b/venv/Lib/site-packages/setuptools/_distutils/core.py
new file mode 100644
index 0000000..d603d4a
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/core.py
@@ -0,0 +1,234 @@
+"""distutils.core
+
+The only module that needs to be imported to use the Distutils; provides
+the 'setup' function (which is to be called from the setup script).  Also
+indirectly provides the Distribution and Command classes, although they are
+really defined in distutils.dist and distutils.cmd.
+"""
+
+import os
+import sys
+
+from distutils.debug import DEBUG
+from distutils.errors import *
+
+# Mainly import these so setup scripts can "from distutils.core import" them.
+from distutils.dist import Distribution
+from distutils.cmd import Command
+from distutils.config import PyPIRCCommand
+from distutils.extension import Extension
+
+# This is a barebones help message generated displayed when the user
+# runs the setup script with no arguments at all.  More useful help
+# is generated with various --help options: global help, list commands,
+# and per-command help.
+USAGE = """\
+usage: %(script)s [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
+   or: %(script)s --help [cmd1 cmd2 ...]
+   or: %(script)s --help-commands
+   or: %(script)s cmd --help
+"""
+
+def gen_usage (script_name):
+    script = os.path.basename(script_name)
+    return USAGE % vars()
+
+
+# Some mild magic to control the behaviour of 'setup()' from 'run_setup()'.
+_setup_stop_after = None
+_setup_distribution = None
+
+# Legal keyword arguments for the setup() function
+setup_keywords = ('distclass', 'script_name', 'script_args', 'options',
+                  'name', 'version', 'author', 'author_email',
+                  'maintainer', 'maintainer_email', 'url', 'license',
+                  'description', 'long_description', 'keywords',
+                  'platforms', 'classifiers', 'download_url',
+                  'requires', 'provides', 'obsoletes',
+                  )
+
+# Legal keyword arguments for the Extension constructor
+extension_keywords = ('name', 'sources', 'include_dirs',
+                      'define_macros', 'undef_macros',
+                      'library_dirs', 'libraries', 'runtime_library_dirs',
+                      'extra_objects', 'extra_compile_args', 'extra_link_args',
+                      'swig_opts', 'export_symbols', 'depends', 'language')
+
+def setup (**attrs):
+    """The gateway to the Distutils: do everything your setup script needs
+    to do, in a highly flexible and user-driven way.  Briefly: create a
+    Distribution instance; find and parse config files; parse the command
+    line; run each Distutils command found there, customized by the options
+    supplied to 'setup()' (as keyword arguments), in config files, and on
+    the command line.
+
+    The Distribution instance might be an instance of a class supplied via
+    the 'distclass' keyword argument to 'setup'; if no such class is
+    supplied, then the Distribution class (in dist.py) is instantiated.
+    All other arguments to 'setup' (except for 'cmdclass') are used to set
+    attributes of the Distribution instance.
+
+    The 'cmdclass' argument, if supplied, is a dictionary mapping command
+    names to command classes.  Each command encountered on the command line
+    will be turned into a command class, which is in turn instantiated; any
+    class found in 'cmdclass' is used in place of the default, which is
+    (for command 'foo_bar') class 'foo_bar' in module
+    'distutils.command.foo_bar'.  The command class must provide a
+    'user_options' attribute which is a list of option specifiers for
+    'distutils.fancy_getopt'.  Any command-line options between the current
+    and the next command are used to set attributes of the current command
+    object.
+
+    When the entire command-line has been successfully parsed, calls the
+    'run()' method on each command object in turn.  This method will be
+    driven entirely by the Distribution object (which each command object
+    has a reference to, thanks to its constructor), and the
+    command-specific options that became attributes of each command
+    object.
+    """
+
+    global _setup_stop_after, _setup_distribution
+
+    # Determine the distribution class -- either caller-supplied or
+    # our Distribution (see below).
+    klass = attrs.get('distclass')
+    if klass:
+        del attrs['distclass']
+    else:
+        klass = Distribution
+
+    if 'script_name' not in attrs:
+        attrs['script_name'] = os.path.basename(sys.argv[0])
+    if 'script_args'  not in attrs:
+        attrs['script_args'] = sys.argv[1:]
+
+    # Create the Distribution instance, using the remaining arguments
+    # (ie. everything except distclass) to initialize it
+    try:
+        _setup_distribution = dist = klass(attrs)
+    except DistutilsSetupError as msg:
+        if 'name' not in attrs:
+            raise SystemExit("error in setup command: %s" % msg)
+        else:
+            raise SystemExit("error in %s setup command: %s" % \
+                  (attrs['name'], msg))
+
+    if _setup_stop_after == "init":
+        return dist
+
+    # Find and parse the config file(s): they will override options from
+    # the setup script, but be overridden by the command line.
+    dist.parse_config_files()
+
+    if DEBUG:
+        print("options (after parsing config files):")
+        dist.dump_option_dicts()
+
+    if _setup_stop_after == "config":
+        return dist
+
+    # Parse the command line and override config files; any
+    # command-line errors are the end user's fault, so turn them into
+    # SystemExit to suppress tracebacks.
+    try:
+        ok = dist.parse_command_line()
+    except DistutilsArgError as msg:
+        raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
+
+    if DEBUG:
+        print("options (after parsing command line):")
+        dist.dump_option_dicts()
+
+    if _setup_stop_after == "commandline":
+        return dist
+
+    # And finally, run all the commands found on the command line.
+    if ok:
+        try:
+            dist.run_commands()
+        except KeyboardInterrupt:
+            raise SystemExit("interrupted")
+        except OSError as exc:
+            if DEBUG:
+                sys.stderr.write("error: %s\n" % (exc,))
+                raise
+            else:
+                raise SystemExit("error: %s" % (exc,))
+
+        except (DistutilsError,
+                CCompilerError) as msg:
+            if DEBUG:
+                raise
+            else:
+                raise SystemExit("error: " + str(msg))
+
+    return dist
+
+# setup ()
+
+
+def run_setup (script_name, script_args=None, stop_after="run"):
+    """Run a setup script in a somewhat controlled environment, and
+    return the Distribution instance that drives things.  This is useful
+    if you need to find out the distribution meta-data (passed as
+    keyword args from 'script' to 'setup()', or the contents of the
+    config files or command-line.
+
+    'script_name' is a file that will be read and run with 'exec()';
+    'sys.argv[0]' will be replaced with 'script' for the duration of the
+    call.  'script_args' is a list of strings; if supplied,
+    'sys.argv[1:]' will be replaced by 'script_args' for the duration of
+    the call.
+
+    'stop_after' tells 'setup()' when to stop processing; possible
+    values:
+      init
+        stop after the Distribution instance has been created and
+        populated with the keyword arguments to 'setup()'
+      config
+        stop after config files have been parsed (and their data
+        stored in the Distribution instance)
+      commandline
+        stop after the command-line ('sys.argv[1:]' or 'script_args')
+        have been parsed (and the data stored in the Distribution)
+      run [default]
+        stop after all commands have been run (the same as if 'setup()'
+        had been called in the usual way
+
+    Returns the Distribution instance, which provides all information
+    used to drive the Distutils.
+    """
+    if stop_after not in ('init', 'config', 'commandline', 'run'):
+        raise ValueError("invalid value for 'stop_after': %r" % (stop_after,))
+
+    global _setup_stop_after, _setup_distribution
+    _setup_stop_after = stop_after
+
+    save_argv = sys.argv.copy()
+    g = {'__file__': script_name}
+    try:
+        try:
+            sys.argv[0] = script_name
+            if script_args is not None:
+                sys.argv[1:] = script_args
+            with open(script_name, 'rb') as f:
+                exec(f.read(), g)
+        finally:
+            sys.argv = save_argv
+            _setup_stop_after = None
+    except SystemExit:
+        # Hmm, should we do something if exiting with a non-zero code
+        # (ie. error)?
+        pass
+
+    if _setup_distribution is None:
+        raise RuntimeError(("'distutils.core.setup()' was never called -- "
+               "perhaps '%s' is not a Distutils setup script?") % \
+              script_name)
+
+    # I wonder if the setup script's namespace -- g and l -- would be of
+    # any interest to callers?
+    #print "_setup_distribution:", _setup_distribution
+    return _setup_distribution
+
+# run_setup ()
diff --git a/venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py b/venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py
new file mode 100644
index 0000000..66c12dd
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py
@@ -0,0 +1,403 @@
+"""distutils.cygwinccompiler
+
+Provides the CygwinCCompiler class, a subclass of UnixCCompiler that
+handles the Cygwin port of the GNU C compiler to Windows.  It also contains
+the Mingw32CCompiler class which handles the mingw32 port of GCC (same as
+cygwin in no-cygwin mode).
+"""
+
+# problems:
+#
+# * if you use a msvc compiled python version (1.5.2)
+#   1. you have to insert a __GNUC__ section in its config.h
+#   2. you have to generate an import library for its dll
+#      - create a def-file for python??.dll
+#      - create an import library using
+#             dlltool --dllname python15.dll --def python15.def \
+#                       --output-lib libpython15.a
+#
+#   see also http://starship.python.net/crew/kernr/mingw32/Notes.html
+#
+# * We put export_symbols in a def-file, and don't use
+#   --export-all-symbols because it doesn't worked reliable in some
+#   tested configurations. And because other windows compilers also
+#   need their symbols specified this no serious problem.
+#
+# tested configurations:
+#
+# * cygwin gcc 2.91.57/ld 2.9.4/dllwrap 0.2.4 works
+#   (after patching python's config.h and for C++ some other include files)
+#   see also http://starship.python.net/crew/kernr/mingw32/Notes.html
+# * mingw32 gcc 2.95.2/ld 2.9.4/dllwrap 0.2.4 works
+#   (ld doesn't support -shared, so we use dllwrap)
+# * cygwin gcc 2.95.2/ld 2.10.90/dllwrap 2.10.90 works now
+#   - its dllwrap doesn't work, there is a bug in binutils 2.10.90
+#     see also http://sources.redhat.com/ml/cygwin/2000-06/msg01274.html
+#   - using gcc -mdll instead dllwrap doesn't work without -static because
+#     it tries to link against dlls instead their import libraries. (If
+#     it finds the dll first.)
+#     By specifying -static we force ld to link against the import libraries,
+#     this is windows standard and there are normally not the necessary symbols
+#     in the dlls.
+#   *** only the version of June 2000 shows these problems
+# * cygwin gcc 3.2/ld 2.13.90 works
+#   (ld supports -shared)
+# * mingw gcc 3.2/ld 2.13 works
+#   (ld supports -shared)
+
+import os
+import sys
+import copy
+from subprocess import Popen, PIPE, check_output
+import re
+
+from distutils.unixccompiler import UnixCCompiler
+from distutils.file_util import write_file
+from distutils.errors import (DistutilsExecError, CCompilerError,
+        CompileError, UnknownFileError)
+from distutils.version import LooseVersion
+from distutils.spawn import find_executable
+
+def get_msvcr():
+    """Include the appropriate MSVC runtime library if Python was built
+    with MSVC 7.0 or later.
+    """
+    msc_pos = sys.version.find('MSC v.')
+    if msc_pos != -1:
+        msc_ver = sys.version[msc_pos+6:msc_pos+10]
+        if msc_ver == '1300':
+            # MSVC 7.0
+            return ['msvcr70']
+        elif msc_ver == '1310':
+            # MSVC 7.1
+            return ['msvcr71']
+        elif msc_ver == '1400':
+            # VS2005 / MSVC 8.0
+            return ['msvcr80']
+        elif msc_ver == '1500':
+            # VS2008 / MSVC 9.0
+            return ['msvcr90']
+        elif msc_ver == '1600':
+            # VS2010 / MSVC 10.0
+            return ['msvcr100']
+        else:
+            raise ValueError("Unknown MS Compiler version %s " % msc_ver)
+
+
+class CygwinCCompiler(UnixCCompiler):
+    """ Handles the Cygwin port of the GNU C compiler to Windows.
+    """
+    compiler_type = 'cygwin'
+    obj_extension = ".o"
+    static_lib_extension = ".a"
+    shared_lib_extension = ".dll"
+    static_lib_format = "lib%s%s"
+    shared_lib_format = "%s%s"
+    exe_extension = ".exe"
+
+    def __init__(self, verbose=0, dry_run=0, force=0):
+
+        UnixCCompiler.__init__(self, verbose, dry_run, force)
+
+        status, details = check_config_h()
+        self.debug_print("Python's GCC status: %s (details: %s)" %
+                         (status, details))
+        if status is not CONFIG_H_OK:
+            self.warn(
+                "Python's pyconfig.h doesn't seem to support your compiler. "
+                "Reason: %s. "
+                "Compiling may fail because of undefined preprocessor macros."
+                % details)
+
+        self.gcc_version, self.ld_version, self.dllwrap_version = \
+            get_versions()
+        self.debug_print(self.compiler_type + ": gcc %s, ld %s, dllwrap %s\n" %
+                         (self.gcc_version,
+                          self.ld_version,
+                          self.dllwrap_version) )
+
+        # ld_version >= "2.10.90" and < "2.13" should also be able to use
+        # gcc -mdll instead of dllwrap
+        # Older dllwraps had own version numbers, newer ones use the
+        # same as the rest of binutils ( also ld )
+        # dllwrap 2.10.90 is buggy
+        if self.ld_version >= "2.10.90":
+            self.linker_dll = "gcc"
+        else:
+            self.linker_dll = "dllwrap"
+
+        # ld_version >= "2.13" support -shared so use it instead of
+        # -mdll -static
+        if self.ld_version >= "2.13":
+            shared_option = "-shared"
+        else:
+            shared_option = "-mdll -static"
+
+        # Hard-code GCC because that's what this is all about.
+        # XXX optimization, warnings etc. should be customizable.
+        self.set_executables(compiler='gcc -mcygwin -O -Wall',
+                             compiler_so='gcc -mcygwin -mdll -O -Wall',
+                             compiler_cxx='g++ -mcygwin -O -Wall',
+                             linker_exe='gcc -mcygwin',
+                             linker_so=('%s -mcygwin %s' %
+                                        (self.linker_dll, shared_option)))
+
+        # cygwin and mingw32 need different sets of libraries
+        if self.gcc_version == "2.91.57":
+            # cygwin shouldn't need msvcrt, but without the dlls will crash
+            # (gcc version 2.91.57) -- perhaps something about initialization
+            self.dll_libraries=["msvcrt"]
+            self.warn(
+                "Consider upgrading to a newer version of gcc")
+        else:
+            # Include the appropriate MSVC runtime library if Python was built
+            # with MSVC 7.0 or later.
+            self.dll_libraries = get_msvcr()
+
+    def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
+        """Compiles the source by spawning GCC and windres if needed."""
+        if ext == '.rc' or ext == '.res':
+            # gcc needs '.res' and '.rc' compiled to object files !!!
+            try:
+                self.spawn(["windres", "-i", src, "-o", obj])
+            except DistutilsExecError as msg:
+                raise CompileError(msg)
+        else: # for other files use the C-compiler
+            try:
+                self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
+                           extra_postargs)
+            except DistutilsExecError as msg:
+                raise CompileError(msg)
+
+    def link(self, target_desc, objects, output_filename, output_dir=None,
+             libraries=None, library_dirs=None, runtime_library_dirs=None,
+             export_symbols=None, debug=0, extra_preargs=None,
+             extra_postargs=None, build_temp=None, target_lang=None):
+        """Link the objects."""
+        # use separate copies, so we can modify the lists
+        extra_preargs = copy.copy(extra_preargs or [])
+        libraries = copy.copy(libraries or [])
+        objects = copy.copy(objects or [])
+
+        # Additional libraries
+        libraries.extend(self.dll_libraries)
+
+        # handle export symbols by creating a def-file
+        # with executables this only works with gcc/ld as linker
+        if ((export_symbols is not None) and
+            (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
+            # (The linker doesn't do anything if output is up-to-date.
+            # So it would probably better to check if we really need this,
+            # but for this we had to insert some unchanged parts of
+            # UnixCCompiler, and this is not what we want.)
+
+            # we want to put some files in the same directory as the
+            # object files are, build_temp doesn't help much
+            # where are the object files
+            temp_dir = os.path.dirname(objects[0])
+            # name of dll to give the helper files the same base name
+            (dll_name, dll_extension) = os.path.splitext(
+                os.path.basename(output_filename))
+
+            # generate the filenames for these files
+            def_file = os.path.join(temp_dir, dll_name + ".def")
+            lib_file = os.path.join(temp_dir, 'lib' + dll_name + ".a")
+
+            # Generate .def file
+            contents = [
+                "LIBRARY %s" % os.path.basename(output_filename),
+                "EXPORTS"]
+            for sym in export_symbols:
+                contents.append(sym)
+            self.execute(write_file, (def_file, contents),
+                         "writing %s" % def_file)
+
+            # next add options for def-file and to creating import libraries
+
+            # dllwrap uses different options than gcc/ld
+            if self.linker_dll == "dllwrap":
+                extra_preargs.extend(["--output-lib", lib_file])
+                # for dllwrap we have to use a special option
+                extra_preargs.extend(["--def", def_file])
+            # we use gcc/ld here and can be sure ld is >= 2.9.10
+            else:
+                # doesn't work: bfd_close build\...\libfoo.a: Invalid operation
+                #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file])
+                # for gcc/ld the def-file is specified as any object files
+                objects.append(def_file)
+
+        #end: if ((export_symbols is not None) and
+        #        (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
+
+        # who wants symbols and a many times larger output file
+        # should explicitly switch the debug mode on
+        # otherwise we let dllwrap/ld strip the output file
+        # (On my machine: 10KiB < stripped_file < ??100KiB
+        #   unstripped_file = stripped_file + XXX KiB
+        #  ( XXX=254 for a typical python extension))
+        if not debug:
+            extra_preargs.append("-s")
+
+        UnixCCompiler.link(self, target_desc, objects, output_filename,
+                           output_dir, libraries, library_dirs,
+                           runtime_library_dirs,
+                           None, # export_symbols, we do this in our def-file
+                           debug, extra_preargs, extra_postargs, build_temp,
+                           target_lang)
+
+    # -- Miscellaneous methods -----------------------------------------
+
+    def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
+        """Adds supports for rc and res files."""
+        if output_dir is None:
+            output_dir = ''
+        obj_names = []
+        for src_name in source_filenames:
+            # use normcase to make sure '.rc' is really '.rc' and not '.RC'
+            base, ext = os.path.splitext(os.path.normcase(src_name))
+            if ext not in (self.src_extensions + ['.rc','.res']):
+                raise UnknownFileError("unknown file type '%s' (from '%s')" % \
+                      (ext, src_name))
+            if strip_dir:
+                base = os.path.basename (base)
+            if ext in ('.res', '.rc'):
+                # these need to be compiled to object files
+                obj_names.append (os.path.join(output_dir,
+                                              base + ext + self.obj_extension))
+            else:
+                obj_names.append (os.path.join(output_dir,
+                                               base + self.obj_extension))
+        return obj_names
+
+# the same as cygwin plus some additional parameters
+class Mingw32CCompiler(CygwinCCompiler):
+    """ Handles the Mingw32 port of the GNU C compiler to Windows.
+    """
+    compiler_type = 'mingw32'
+
+    def __init__(self, verbose=0, dry_run=0, force=0):
+
+        CygwinCCompiler.__init__ (self, verbose, dry_run, force)
+
+        # ld_version >= "2.13" support -shared so use it instead of
+        # -mdll -static
+        if self.ld_version >= "2.13":
+            shared_option = "-shared"
+        else:
+            shared_option = "-mdll -static"
+
+        # A real mingw32 doesn't need to specify a different entry point,
+        # but cygwin 2.91.57 in no-cygwin-mode needs it.
+        if self.gcc_version <= "2.91.57":
+            entry_point = '--entry _DllMain@12'
+        else:
+            entry_point = ''
+
+        if is_cygwingcc():
+            raise CCompilerError(
+                'Cygwin gcc cannot be used with --compiler=mingw32')
+
+        self.set_executables(compiler='gcc -O -Wall',
+                             compiler_so='gcc -mdll -O -Wall',
+                             compiler_cxx='g++ -O -Wall',
+                             linker_exe='gcc',
+                             linker_so='%s %s %s'
+                                        % (self.linker_dll, shared_option,
+                                           entry_point))
+        # Maybe we should also append -mthreads, but then the finished
+        # dlls need another dll (mingwm10.dll see Mingw32 docs)
+        # (-mthreads: Support thread-safe exception handling on `Mingw32')
+
+        # no additional libraries needed
+        self.dll_libraries=[]
+
+        # Include the appropriate MSVC runtime library if Python was built
+        # with MSVC 7.0 or later.
+        self.dll_libraries = get_msvcr()
+
+# Because these compilers aren't configured in Python's pyconfig.h file by
+# default, we should at least warn the user if he is using an unmodified
+# version.
+
+CONFIG_H_OK = "ok"
+CONFIG_H_NOTOK = "not ok"
+CONFIG_H_UNCERTAIN = "uncertain"
+
+def check_config_h():
+    """Check if the current Python installation appears amenable to building
+    extensions with GCC.
+
+    Returns a tuple (status, details), where 'status' is one of the following
+    constants:
+
+    - CONFIG_H_OK: all is well, go ahead and compile
+    - CONFIG_H_NOTOK: doesn't look good
+    - CONFIG_H_UNCERTAIN: not sure -- unable to read pyconfig.h
+
+    'details' is a human-readable string explaining the situation.
+
+    Note there are two ways to conclude "OK": either 'sys.version' contains
+    the string "GCC" (implying that this Python was built with GCC), or the
+    installed "pyconfig.h" contains the string "__GNUC__".
+    """
+
+    # XXX since this function also checks sys.version, it's not strictly a
+    # "pyconfig.h" check -- should probably be renamed...
+
+    from distutils import sysconfig
+
+    # if sys.version contains GCC then python was compiled with GCC, and the
+    # pyconfig.h file should be OK
+    if "GCC" in sys.version:
+        return CONFIG_H_OK, "sys.version mentions 'GCC'"
+
+    # let's see if __GNUC__ is mentioned in python.h
+    fn = sysconfig.get_config_h_filename()
+    try:
+        config_h = open(fn)
+        try:
+            if "__GNUC__" in config_h.read():
+                return CONFIG_H_OK, "'%s' mentions '__GNUC__'" % fn
+            else:
+                return CONFIG_H_NOTOK, "'%s' does not mention '__GNUC__'" % fn
+        finally:
+            config_h.close()
+    except OSError as exc:
+        return (CONFIG_H_UNCERTAIN,
+                "couldn't read '%s': %s" % (fn, exc.strerror))
+
+RE_VERSION = re.compile(br'(\d+\.\d+(\.\d+)*)')
+
+def _find_exe_version(cmd):
+    """Find the version of an executable by running `cmd` in the shell.
+
+    If the command is not found, or the output does not match
+    `RE_VERSION`, returns None.
+    """
+    executable = cmd.split()[0]
+    if find_executable(executable) is None:
+        return None
+    out = Popen(cmd, shell=True, stdout=PIPE).stdout
+    try:
+        out_string = out.read()
+    finally:
+        out.close()
+    result = RE_VERSION.search(out_string)
+    if result is None:
+        return None
+    # LooseVersion works with strings
+    # so we need to decode our bytes
+    return LooseVersion(result.group(1).decode())
+
+def get_versions():
+    """ Try to find out the versions of gcc, ld and dllwrap.
+
+    If not possible it returns None for it.
+    """
+    commands = ['gcc -dumpversion', 'ld -v', 'dllwrap --version']
+    return tuple([_find_exe_version(cmd) for cmd in commands])
+
+def is_cygwingcc():
+    '''Try to determine if the gcc that would be used is from cygwin.'''
+    out_string = check_output(['gcc', '-dumpmachine'])
+    return out_string.strip().endswith(b'cygwin')
diff --git a/venv/Lib/site-packages/setuptools/_distutils/debug.py b/venv/Lib/site-packages/setuptools/_distutils/debug.py
new file mode 100644
index 0000000..daf1660
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/debug.py
@@ -0,0 +1,5 @@
+import os
+
+# If DISTUTILS_DEBUG is anything other than the empty string, we run in
+# debug mode.
+DEBUG = os.environ.get('DISTUTILS_DEBUG')
diff --git a/venv/Lib/site-packages/setuptools/_distutils/dep_util.py b/venv/Lib/site-packages/setuptools/_distutils/dep_util.py
new file mode 100644
index 0000000..d74f5e4
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/dep_util.py
@@ -0,0 +1,92 @@
+"""distutils.dep_util
+
+Utility functions for simple, timestamp-based dependency of files
+and groups of files; also, function based entirely on such
+timestamp dependency analysis."""
+
+import os
+from distutils.errors import DistutilsFileError
+
+
+def newer (source, target):
+    """Return true if 'source' exists and is more recently modified than
+    'target', or if 'source' exists and 'target' doesn't.  Return false if
+    both exist and 'target' is the same age or younger than 'source'.
+    Raise DistutilsFileError if 'source' does not exist.
+    """
+    if not os.path.exists(source):
+        raise DistutilsFileError("file '%s' does not exist" %
+                                 os.path.abspath(source))
+    if not os.path.exists(target):
+        return 1
+
+    from stat import ST_MTIME
+    mtime1 = os.stat(source)[ST_MTIME]
+    mtime2 = os.stat(target)[ST_MTIME]
+
+    return mtime1 > mtime2
+
+# newer ()
+
+
+def newer_pairwise (sources, targets):
+    """Walk two filename lists in parallel, testing if each source is newer
+    than its corresponding target.  Return a pair of lists (sources,
+    targets) where source is newer than target, according to the semantics
+    of 'newer()'.
+    """
+    if len(sources) != len(targets):
+        raise ValueError("'sources' and 'targets' must be same length")
+
+    # build a pair of lists (sources, targets) where  source is newer
+    n_sources = []
+    n_targets = []
+    for i in range(len(sources)):
+        if newer(sources[i], targets[i]):
+            n_sources.append(sources[i])
+            n_targets.append(targets[i])
+
+    return (n_sources, n_targets)
+
+# newer_pairwise ()
+
+
+def newer_group (sources, target, missing='error'):
+    """Return true if 'target' is out-of-date with respect to any file
+    listed in 'sources'.  In other words, if 'target' exists and is newer
+    than every file in 'sources', return false; otherwise return true.
+    'missing' controls what we do when a source file is missing; the
+    default ("error") is to blow up with an OSError from inside 'stat()';
+    if it is "ignore", we silently drop any missing source files; if it is
+    "newer", any missing source files make us assume that 'target' is
+    out-of-date (this is handy in "dry-run" mode: it'll make you pretend to
+    carry out commands that wouldn't work because inputs are missing, but
+    that doesn't matter because you're not actually going to run the
+    commands).
+    """
+    # If the target doesn't even exist, then it's definitely out-of-date.
+    if not os.path.exists(target):
+        return 1
+
+    # Otherwise we have to find out the hard way: if *any* source file
+    # is more recent than 'target', then 'target' is out-of-date and
+    # we can immediately return true.  If we fall through to the end
+    # of the loop, then 'target' is up-to-date and we return false.
+    from stat import ST_MTIME
+    target_mtime = os.stat(target)[ST_MTIME]
+    for source in sources:
+        if not os.path.exists(source):
+            if missing == 'error':      # blow up when we stat() the file
+                pass
+            elif missing == 'ignore':   # missing source dropped from
+                continue                #  target's dependency list
+            elif missing == 'newer':    # missing source means target is
+                return 1                #  out-of-date
+
+        source_mtime = os.stat(source)[ST_MTIME]
+        if source_mtime > target_mtime:
+            return 1
+    else:
+        return 0
+
+# newer_group ()
diff --git a/venv/Lib/site-packages/setuptools/_distutils/dir_util.py b/venv/Lib/site-packages/setuptools/_distutils/dir_util.py
new file mode 100644
index 0000000..d5cd8e3
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/dir_util.py
@@ -0,0 +1,210 @@
+"""distutils.dir_util
+
+Utility functions for manipulating directories and directory trees."""
+
+import os
+import errno
+from distutils.errors import DistutilsFileError, DistutilsInternalError
+from distutils import log
+
+# cache for by mkpath() -- in addition to cheapening redundant calls,
+# eliminates redundant "creating /foo/bar/baz" messages in dry-run mode
+_path_created = {}
+
+# I don't use os.makedirs because a) it's new to Python 1.5.2, and
+# b) it blows up if the directory already exists (I want to silently
+# succeed in that case).
+def mkpath(name, mode=0o777, verbose=1, dry_run=0):
+    """Create a directory and any missing ancestor directories.
+
+    If the directory already exists (or if 'name' is the empty string, which
+    means the current directory, which of course exists), then do nothing.
+    Raise DistutilsFileError if unable to create some directory along the way
+    (eg. some sub-path exists, but is a file rather than a directory).
+    If 'verbose' is true, print a one-line summary of each mkdir to stdout.
+    Return the list of directories actually created.
+    """
+
+    global _path_created
+
+    # Detect a common bug -- name is None
+    if not isinstance(name, str):
+        raise DistutilsInternalError(
+              "mkpath: 'name' must be a string (got %r)" % (name,))
+
+    # XXX what's the better way to handle verbosity? print as we create
+    # each directory in the path (the current behaviour), or only announce
+    # the creation of the whole path? (quite easy to do the latter since
+    # we're not using a recursive algorithm)
+
+    name = os.path.normpath(name)
+    created_dirs = []
+    if os.path.isdir(name) or name == '':
+        return created_dirs
+    if _path_created.get(os.path.abspath(name)):
+        return created_dirs
+
+    (head, tail) = os.path.split(name)
+    tails = [tail]                      # stack of lone dirs to create
+
+    while head and tail and not os.path.isdir(head):
+        (head, tail) = os.path.split(head)
+        tails.insert(0, tail)          # push next higher dir onto stack
+
+    # now 'head' contains the deepest directory that already exists
+    # (that is, the child of 'head' in 'name' is the highest directory
+    # that does *not* exist)
+    for d in tails:
+        #print "head = %s, d = %s: " % (head, d),
+        head = os.path.join(head, d)
+        abs_head = os.path.abspath(head)
+
+        if _path_created.get(abs_head):
+            continue
+
+        if verbose >= 1:
+            log.info("creating %s", head)
+
+        if not dry_run:
+            try:
+                os.mkdir(head, mode)
+            except OSError as exc:
+                if not (exc.errno == errno.EEXIST and os.path.isdir(head)):
+                    raise DistutilsFileError(
+                          "could not create '%s': %s" % (head, exc.args[-1]))
+            created_dirs.append(head)
+
+        _path_created[abs_head] = 1
+    return created_dirs
+
+def create_tree(base_dir, files, mode=0o777, verbose=1, dry_run=0):
+    """Create all the empty directories under 'base_dir' needed to put 'files'
+    there.
+
+    'base_dir' is just the name of a directory which doesn't necessarily
+    exist yet; 'files' is a list of filenames to be interpreted relative to
+    'base_dir'.  'base_dir' + the directory portion of every file in 'files'
+    will be created if it doesn't already exist.  'mode', 'verbose' and
+    'dry_run' flags are as for 'mkpath()'.
+    """
+    # First get the list of directories to create
+    need_dir = set()
+    for file in files:
+        need_dir.add(os.path.join(base_dir, os.path.dirname(file)))
+
+    # Now create them
+    for dir in sorted(need_dir):
+        mkpath(dir, mode, verbose=verbose, dry_run=dry_run)
+
+def copy_tree(src, dst, preserve_mode=1, preserve_times=1,
+              preserve_symlinks=0, update=0, verbose=1, dry_run=0):
+    """Copy an entire directory tree 'src' to a new location 'dst'.
+
+    Both 'src' and 'dst' must be directory names.  If 'src' is not a
+    directory, raise DistutilsFileError.  If 'dst' does not exist, it is
+    created with 'mkpath()'.  The end result of the copy is that every
+    file in 'src' is copied to 'dst', and directories under 'src' are
+    recursively copied to 'dst'.  Return the list of files that were
+    copied or might have been copied, using their output name.  The
+    return value is unaffected by 'update' or 'dry_run': it is simply
+    the list of all files under 'src', with the names changed to be
+    under 'dst'.
+
+    'preserve_mode' and 'preserve_times' are the same as for
+    'copy_file'; note that they only apply to regular files, not to
+    directories.  If 'preserve_symlinks' is true, symlinks will be
+    copied as symlinks (on platforms that support them!); otherwise
+    (the default), the destination of the symlink will be copied.
+    'update' and 'verbose' are the same as for 'copy_file'.
+    """
+    from distutils.file_util import copy_file
+
+    if not dry_run and not os.path.isdir(src):
+        raise DistutilsFileError(
+              "cannot copy tree '%s': not a directory" % src)
+    try:
+        names = os.listdir(src)
+    except OSError as e:
+        if dry_run:
+            names = []
+        else:
+            raise DistutilsFileError(
+                  "error listing files in '%s': %s" % (src, e.strerror))
+
+    if not dry_run:
+        mkpath(dst, verbose=verbose)
+
+    outputs = []
+
+    for n in names:
+        src_name = os.path.join(src, n)
+        dst_name = os.path.join(dst, n)
+
+        if n.startswith('.nfs'):
+            # skip NFS rename files
+            continue
+
+        if preserve_symlinks and os.path.islink(src_name):
+            link_dest = os.readlink(src_name)
+            if verbose >= 1:
+                log.info("linking %s -> %s", dst_name, link_dest)
+            if not dry_run:
+                os.symlink(link_dest, dst_name)
+            outputs.append(dst_name)
+
+        elif os.path.isdir(src_name):
+            outputs.extend(
+                copy_tree(src_name, dst_name, preserve_mode,
+                          preserve_times, preserve_symlinks, update,
+                          verbose=verbose, dry_run=dry_run))
+        else:
+            copy_file(src_name, dst_name, preserve_mode,
+                      preserve_times, update, verbose=verbose,
+                      dry_run=dry_run)
+            outputs.append(dst_name)
+
+    return outputs
+
+def _build_cmdtuple(path, cmdtuples):
+    """Helper for remove_tree()."""
+    for f in os.listdir(path):
+        real_f = os.path.join(path,f)
+        if os.path.isdir(real_f) and not os.path.islink(real_f):
+            _build_cmdtuple(real_f, cmdtuples)
+        else:
+            cmdtuples.append((os.remove, real_f))
+    cmdtuples.append((os.rmdir, path))
+
+def remove_tree(directory, verbose=1, dry_run=0):
+    """Recursively remove an entire directory tree.
+
+    Any errors are ignored (apart from being reported to stdout if 'verbose'
+    is true).
+    """
+    global _path_created
+
+    if verbose >= 1:
+        log.info("removing '%s' (and everything under it)", directory)
+    if dry_run:
+        return
+    cmdtuples = []
+    _build_cmdtuple(directory, cmdtuples)
+    for cmd in cmdtuples:
+        try:
+            cmd[0](cmd[1])
+            # remove dir from cache if it's already there
+            abspath = os.path.abspath(cmd[1])
+            if abspath in _path_created:
+                del _path_created[abspath]
+        except OSError as exc:
+            log.warn("error removing %s: %s", directory, exc)
+
+def ensure_relative(path):
+    """Take the full path 'path', and make it a relative path.
+
+    This is useful to make 'path' the second argument to os.path.join().
+    """
+    drive, path = os.path.splitdrive(path)
+    if path[0:1] == os.sep:
+        path = drive + path[1:]
+    return path
diff --git a/venv/Lib/site-packages/setuptools/_distutils/dist.py b/venv/Lib/site-packages/setuptools/_distutils/dist.py
new file mode 100644
index 0000000..37db4d6
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/dist.py
@@ -0,0 +1,1257 @@
+"""distutils.dist
+
+Provides the Distribution class, which represents the module distribution
+being built/installed/distributed.
+"""
+
+import sys
+import os
+import re
+from email import message_from_file
+
+try:
+    import warnings
+except ImportError:
+    warnings = None
+
+from distutils.errors import *
+from distutils.fancy_getopt import FancyGetopt, translate_longopt
+from distutils.util import check_environ, strtobool, rfc822_escape
+from distutils import log
+from distutils.debug import DEBUG
+
+# Regex to define acceptable Distutils command names.  This is not *quite*
+# the same as a Python NAME -- I don't allow leading underscores.  The fact
+# that they're very similar is no coincidence; the default naming scheme is
+# to look for a Python module named after the command.
+command_re = re.compile(r'^[a-zA-Z]([a-zA-Z0-9_]*)$')
+
+
+def _ensure_list(value, fieldname):
+    if isinstance(value, str):
+        # a string containing comma separated values is okay.  It will
+        # be converted to a list by Distribution.finalize_options().
+        pass
+    elif not isinstance(value, list):
+        # passing a tuple or an iterator perhaps, warn and convert
+        typename = type(value).__name__
+        msg = "Warning: '{fieldname}' should be a list, got type '{typename}'"
+        msg = msg.format(**locals())
+        log.log(log.WARN, msg)
+        value = list(value)
+    return value
+
+
+class Distribution:
+    """The core of the Distutils.  Most of the work hiding behind 'setup'
+    is really done within a Distribution instance, which farms the work out
+    to the Distutils commands specified on the command line.
+
+    Setup scripts will almost never instantiate Distribution directly,
+    unless the 'setup()' function is totally inadequate to their needs.
+    However, it is conceivable that a setup script might wish to subclass
+    Distribution for some specialized purpose, and then pass the subclass
+    to 'setup()' as the 'distclass' keyword argument.  If so, it is
+    necessary to respect the expectations that 'setup' has of Distribution.
+    See the code for 'setup()', in core.py, for details.
+    """
+
+    # 'global_options' describes the command-line options that may be
+    # supplied to the setup script prior to any actual commands.
+    # Eg. "./setup.py -n" or "./setup.py --quiet" both take advantage of
+    # these global options.  This list should be kept to a bare minimum,
+    # since every global option is also valid as a command option -- and we
+    # don't want to pollute the commands with too many options that they
+    # have minimal control over.
+    # The fourth entry for verbose means that it can be repeated.
+    global_options = [
+        ('verbose', 'v', "run verbosely (default)", 1),
+        ('quiet', 'q', "run quietly (turns verbosity off)"),
+        ('dry-run', 'n', "don't actually do anything"),
+        ('help', 'h', "show detailed help message"),
+        ('no-user-cfg', None,
+            'ignore pydistutils.cfg in your home directory'),
+    ]
+
+    # 'common_usage' is a short (2-3 line) string describing the common
+    # usage of the setup script.
+    common_usage = """\
+Common commands: (see '--help-commands' for more)
+
+  setup.py build      will build the package underneath 'build/'
+  setup.py install    will install the package
+"""
+
+    # options that are not propagated to the commands
+    display_options = [
+        ('help-commands', None,
+         "list all available commands"),
+        ('name', None,
+         "print package name"),
+        ('version', 'V',
+         "print package version"),
+        ('fullname', None,
+         "print <package name>-<version>"),
+        ('author', None,
+         "print the author's name"),
+        ('author-email', None,
+         "print the author's email address"),
+        ('maintainer', None,
+         "print the maintainer's name"),
+        ('maintainer-email', None,
+         "print the maintainer's email address"),
+        ('contact', None,
+         "print the maintainer's name if known, else the author's"),
+        ('contact-email', None,
+         "print the maintainer's email address if known, else the author's"),
+        ('url', None,
+         "print the URL for this package"),
+        ('license', None,
+         "print the license of the package"),
+        ('licence', None,
+         "alias for --license"),
+        ('description', None,
+         "print the package description"),
+        ('long-description', None,
+         "print the long package description"),
+        ('platforms', None,
+         "print the list of platforms"),
+        ('classifiers', None,
+         "print the list of classifiers"),
+        ('keywords', None,
+         "print the list of keywords"),
+        ('provides', None,
+         "print the list of packages/modules provided"),
+        ('requires', None,
+         "print the list of packages/modules required"),
+        ('obsoletes', None,
+         "print the list of packages/modules made obsolete")
+        ]
+    display_option_names = [translate_longopt(x[0]) for x in display_options]
+
+    # negative options are options that exclude other options
+    negative_opt = {'quiet': 'verbose'}
+
+    # -- Creation/initialization methods -------------------------------
+
+    def __init__(self, attrs=None):
+        """Construct a new Distribution instance: initialize all the
+        attributes of a Distribution, and then use 'attrs' (a dictionary
+        mapping attribute names to values) to assign some of those
+        attributes their "real" values.  (Any attributes not mentioned in
+        'attrs' will be assigned to some null value: 0, None, an empty list
+        or dictionary, etc.)  Most importantly, initialize the
+        'command_obj' attribute to the empty dictionary; this will be
+        filled in with real command objects by 'parse_command_line()'.
+        """
+
+        # Default values for our command-line options
+        self.verbose = 1
+        self.dry_run = 0
+        self.help = 0
+        for attr in self.display_option_names:
+            setattr(self, attr, 0)
+
+        # Store the distribution meta-data (name, version, author, and so
+        # forth) in a separate object -- we're getting to have enough
+        # information here (and enough command-line options) that it's
+        # worth it.  Also delegate 'get_XXX()' methods to the 'metadata'
+        # object in a sneaky and underhanded (but efficient!) way.
+        self.metadata = DistributionMetadata()
+        for basename in self.metadata._METHOD_BASENAMES:
+            method_name = "get_" + basename
+            setattr(self, method_name, getattr(self.metadata, method_name))
+
+        # 'cmdclass' maps command names to class objects, so we
+        # can 1) quickly figure out which class to instantiate when
+        # we need to create a new command object, and 2) have a way
+        # for the setup script to override command classes
+        self.cmdclass = {}
+
+        # 'command_packages' is a list of packages in which commands
+        # are searched for.  The factory for command 'foo' is expected
+        # to be named 'foo' in the module 'foo' in one of the packages
+        # named here.  This list is searched from the left; an error
+        # is raised if no named package provides the command being
+        # searched for.  (Always access using get_command_packages().)
+        self.command_packages = None
+
+        # 'script_name' and 'script_args' are usually set to sys.argv[0]
+        # and sys.argv[1:], but they can be overridden when the caller is
+        # not necessarily a setup script run from the command-line.
+        self.script_name = None
+        self.script_args = None
+
+        # 'command_options' is where we store command options between
+        # parsing them (from config files, the command-line, etc.) and when
+        # they are actually needed -- ie. when the command in question is
+        # instantiated.  It is a dictionary of dictionaries of 2-tuples:
+        #   command_options = { command_name : { option : (source, value) } }
+        self.command_options = {}
+
+        # 'dist_files' is the list of (command, pyversion, file) that
+        # have been created by any dist commands run so far. This is
+        # filled regardless of whether the run is dry or not. pyversion
+        # gives sysconfig.get_python_version() if the dist file is
+        # specific to a Python version, 'any' if it is good for all
+        # Python versions on the target platform, and '' for a source
+        # file. pyversion should not be used to specify minimum or
+        # maximum required Python versions; use the metainfo for that
+        # instead.
+        self.dist_files = []
+
+        # These options are really the business of various commands, rather
+        # than of the Distribution itself.  We provide aliases for them in
+        # Distribution as a convenience to the developer.
+        self.packages = None
+        self.package_data = {}
+        self.package_dir = None
+        self.py_modules = None
+        self.libraries = None
+        self.headers = None
+        self.ext_modules = None
+        self.ext_package = None
+        self.include_dirs = None
+        self.extra_path = None
+        self.scripts = None
+        self.data_files = None
+        self.password = ''
+
+        # And now initialize bookkeeping stuff that can't be supplied by
+        # the caller at all.  'command_obj' maps command names to
+        # Command instances -- that's how we enforce that every command
+        # class is a singleton.
+        self.command_obj = {}
+
+        # 'have_run' maps command names to boolean values; it keeps track
+        # of whether we have actually run a particular command, to make it
+        # cheap to "run" a command whenever we think we might need to -- if
+        # it's already been done, no need for expensive filesystem
+        # operations, we just check the 'have_run' dictionary and carry on.
+        # It's only safe to query 'have_run' for a command class that has
+        # been instantiated -- a false value will be inserted when the
+        # command object is created, and replaced with a true value when
+        # the command is successfully run.  Thus it's probably best to use
+        # '.get()' rather than a straight lookup.
+        self.have_run = {}
+
+        # Now we'll use the attrs dictionary (ultimately, keyword args from
+        # the setup script) to possibly override any or all of these
+        # distribution options.
+
+        if attrs:
+            # Pull out the set of command options and work on them
+            # specifically.  Note that this order guarantees that aliased
+            # command options will override any supplied redundantly
+            # through the general options dictionary.
+            options = attrs.get('options')
+            if options is not None:
+                del attrs['options']
+                for (command, cmd_options) in options.items():
+                    opt_dict = self.get_option_dict(command)
+                    for (opt, val) in cmd_options.items():
+                        opt_dict[opt] = ("setup script", val)
+
+            if 'licence' in attrs:
+                attrs['license'] = attrs['licence']
+                del attrs['licence']
+                msg = "'licence' distribution option is deprecated; use 'license'"
+                if warnings is not None:
+                    warnings.warn(msg)
+                else:
+                    sys.stderr.write(msg + "\n")
+
+            # Now work on the rest of the attributes.  Any attribute that's
+            # not already defined is invalid!
+            for (key, val) in attrs.items():
+                if hasattr(self.metadata, "set_" + key):
+                    getattr(self.metadata, "set_" + key)(val)
+                elif hasattr(self.metadata, key):
+                    setattr(self.metadata, key, val)
+                elif hasattr(self, key):
+                    setattr(self, key, val)
+                else:
+                    msg = "Unknown distribution option: %s" % repr(key)
+                    warnings.warn(msg)
+
+        # no-user-cfg is handled before other command line args
+        # because other args override the config files, and this
+        # one is needed before we can load the config files.
+        # If attrs['script_args'] wasn't passed, assume false.
+        #
+        # This also make sure we just look at the global options
+        self.want_user_cfg = True
+
+        if self.script_args is not None:
+            for arg in self.script_args:
+                if not arg.startswith('-'):
+                    break
+                if arg == '--no-user-cfg':
+                    self.want_user_cfg = False
+                    break
+
+        self.finalize_options()
+
+    def get_option_dict(self, command):
+        """Get the option dictionary for a given command.  If that
+        command's option dictionary hasn't been created yet, then create it
+        and return the new dictionary; otherwise, return the existing
+        option dictionary.
+        """
+        dict = self.command_options.get(command)
+        if dict is None:
+            dict = self.command_options[command] = {}
+        return dict
+
+    def dump_option_dicts(self, header=None, commands=None, indent=""):
+        from pprint import pformat
+
+        if commands is None:             # dump all command option dicts
+            commands = sorted(self.command_options.keys())
+
+        if header is not None:
+            self.announce(indent + header)
+            indent = indent + "  "
+
+        if not commands:
+            self.announce(indent + "no commands known yet")
+            return
+
+        for cmd_name in commands:
+            opt_dict = self.command_options.get(cmd_name)
+            if opt_dict is None:
+                self.announce(indent +
+                              "no option dict for '%s' command" % cmd_name)
+            else:
+                self.announce(indent +
+                              "option dict for '%s' command:" % cmd_name)
+                out = pformat(opt_dict)
+                for line in out.split('\n'):
+                    self.announce(indent + "  " + line)
+
+    # -- Config file finding/parsing methods ---------------------------
+
+    def find_config_files(self):
+        """Find as many configuration files as should be processed for this
+        platform, and return a list of filenames in the order in which they
+        should be parsed.  The filenames returned are guaranteed to exist
+        (modulo nasty race conditions).
+
+        There are three possible config files: distutils.cfg in the
+        Distutils installation directory (ie. where the top-level
+        Distutils __inst__.py file lives), a file in the user's home
+        directory named .pydistutils.cfg on Unix and pydistutils.cfg
+        on Windows/Mac; and setup.cfg in the current directory.
+
+        The file in the user's home directory can be disabled with the
+        --no-user-cfg option.
+        """
+        files = []
+        check_environ()
+
+        # Where to look for the system-wide Distutils config file
+        sys_dir = os.path.dirname(sys.modules['distutils'].__file__)
+
+        # Look for the system config file
+        sys_file = os.path.join(sys_dir, "distutils.cfg")
+        if os.path.isfile(sys_file):
+            files.append(sys_file)
+
+        # What to call the per-user config file
+        if os.name == 'posix':
+            user_filename = ".pydistutils.cfg"
+        else:
+            user_filename = "pydistutils.cfg"
+
+        # And look for the user config file
+        if self.want_user_cfg:
+            user_file = os.path.join(os.path.expanduser('~'), user_filename)
+            if os.path.isfile(user_file):
+                files.append(user_file)
+
+        # All platforms support local setup.cfg
+        local_file = "setup.cfg"
+        if os.path.isfile(local_file):
+            files.append(local_file)
+
+        if DEBUG:
+            self.announce("using config files: %s" % ', '.join(files))
+
+        return files
+
+    def parse_config_files(self, filenames=None):
+        from configparser import ConfigParser
+
+        # Ignore install directory options if we have a venv
+        if sys.prefix != sys.base_prefix:
+            ignore_options = [
+                'install-base', 'install-platbase', 'install-lib',
+                'install-platlib', 'install-purelib', 'install-headers',
+                'install-scripts', 'install-data', 'prefix', 'exec-prefix',
+                'home', 'user', 'root']
+        else:
+            ignore_options = []
+
+        ignore_options = frozenset(ignore_options)
+
+        if filenames is None:
+            filenames = self.find_config_files()
+
+        if DEBUG:
+            self.announce("Distribution.parse_config_files():")
+
+        parser = ConfigParser()
+        for filename in filenames:
+            if DEBUG:
+                self.announce("  reading %s" % filename)
+            parser.read(filename)
+            for section in parser.sections():
+                options = parser.options(section)
+                opt_dict = self.get_option_dict(section)
+
+                for opt in options:
+                    if opt != '__name__' and opt not in ignore_options:
+                        val = parser.get(section,opt)
+                        opt = opt.replace('-', '_')
+                        opt_dict[opt] = (filename, val)
+
+            # Make the ConfigParser forget everything (so we retain
+            # the original filenames that options come from)
+            parser.__init__()
+
+        # If there was a "global" section in the config file, use it
+        # to set Distribution options.
+
+        if 'global' in self.command_options:
+            for (opt, (src, val)) in self.command_options['global'].items():
+                alias = self.negative_opt.get(opt)
+                try:
+                    if alias:
+                        setattr(self, alias, not strtobool(val))
+                    elif opt in ('verbose', 'dry_run'): # ugh!
+                        setattr(self, opt, strtobool(val))
+                    else:
+                        setattr(self, opt, val)
+                except ValueError as msg:
+                    raise DistutilsOptionError(msg)
+
+    # -- Command-line parsing methods ----------------------------------
+
+    def parse_command_line(self):
+        """Parse the setup script's command line, taken from the
+        'script_args' instance attribute (which defaults to 'sys.argv[1:]'
+        -- see 'setup()' in core.py).  This list is first processed for
+        "global options" -- options that set attributes of the Distribution
+        instance.  Then, it is alternately scanned for Distutils commands
+        and options for that command.  Each new command terminates the
+        options for the previous command.  The allowed options for a
+        command are determined by the 'user_options' attribute of the
+        command class -- thus, we have to be able to load command classes
+        in order to parse the command line.  Any error in that 'options'
+        attribute raises DistutilsGetoptError; any error on the
+        command-line raises DistutilsArgError.  If no Distutils commands
+        were found on the command line, raises DistutilsArgError.  Return
+        true if command-line was successfully parsed and we should carry
+        on with executing commands; false if no errors but we shouldn't
+        execute commands (currently, this only happens if user asks for
+        help).
+        """
+        #
+        # We now have enough information to show the Macintosh dialog
+        # that allows the user to interactively specify the "command line".
+        #
+        toplevel_options = self._get_toplevel_options()
+
+        # We have to parse the command line a bit at a time -- global
+        # options, then the first command, then its options, and so on --
+        # because each command will be handled by a different class, and
+        # the options that are valid for a particular class aren't known
+        # until we have loaded the command class, which doesn't happen
+        # until we know what the command is.
+
+        self.commands = []
+        parser = FancyGetopt(toplevel_options + self.display_options)
+        parser.set_negative_aliases(self.negative_opt)
+        parser.set_aliases({'licence': 'license'})
+        args = parser.getopt(args=self.script_args, object=self)
+        option_order = parser.get_option_order()
+        log.set_verbosity(self.verbose)
+
+        # for display options we return immediately
+        if self.handle_display_options(option_order):
+            return
+        while args:
+            args = self._parse_command_opts(parser, args)
+            if args is None:            # user asked for help (and got it)
+                return
+
+        # Handle the cases of --help as a "global" option, ie.
+        # "setup.py --help" and "setup.py --help command ...".  For the
+        # former, we show global options (--verbose, --dry-run, etc.)
+        # and display-only options (--name, --version, etc.); for the
+        # latter, we omit the display-only options and show help for
+        # each command listed on the command line.
+        if self.help:
+            self._show_help(parser,
+                            display_options=len(self.commands) == 0,
+                            commands=self.commands)
+            return
+
+        # Oops, no commands found -- an end-user error
+        if not self.commands:
+            raise DistutilsArgError("no commands supplied")
+
+        # All is well: return true
+        return True
+
+    def _get_toplevel_options(self):
+        """Return the non-display options recognized at the top level.
+
+        This includes options that are recognized *only* at the top
+        level as well as options recognized for commands.
+        """
+        return self.global_options + [
+            ("command-packages=", None,
+             "list of packages that provide distutils commands"),
+            ]
+
+    def _parse_command_opts(self, parser, args):
+        """Parse the command-line options for a single command.
+        'parser' must be a FancyGetopt instance; 'args' must be the list
+        of arguments, starting with the current command (whose options
+        we are about to parse).  Returns a new version of 'args' with
+        the next command at the front of the list; will be the empty
+        list if there are no more commands on the command line.  Returns
+        None if the user asked for help on this command.
+        """
+        # late import because of mutual dependence between these modules
+        from distutils.cmd import Command
+
+        # Pull the current command from the head of the command line
+        command = args[0]
+        if not command_re.match(command):
+            raise SystemExit("invalid command name '%s'" % command)
+        self.commands.append(command)
+
+        # Dig up the command class that implements this command, so we
+        # 1) know that it's a valid command, and 2) know which options
+        # it takes.
+        try:
+            cmd_class = self.get_command_class(command)
+        except DistutilsModuleError as msg:
+            raise DistutilsArgError(msg)
+
+        # Require that the command class be derived from Command -- want
+        # to be sure that the basic "command" interface is implemented.
+        if not issubclass(cmd_class, Command):
+            raise DistutilsClassError(
+                "command class %s must subclass Command" % cmd_class)
+
+        # Also make sure that the command object provides a list of its
+        # known options.
+        if not (hasattr(cmd_class, 'user_options') and
+                isinstance(cmd_class.user_options, list)):
+            msg = ("command class %s must provide "
+                "'user_options' attribute (a list of tuples)")
+            raise DistutilsClassError(msg % cmd_class)
+
+        # If the command class has a list of negative alias options,
+        # merge it in with the global negative aliases.
+        negative_opt = self.negative_opt
+        if hasattr(cmd_class, 'negative_opt'):
+            negative_opt = negative_opt.copy()
+            negative_opt.update(cmd_class.negative_opt)
+
+        # Check for help_options in command class.  They have a different
+        # format (tuple of four) so we need to preprocess them here.
+        if (hasattr(cmd_class, 'help_options') and
+                isinstance(cmd_class.help_options, list)):
+            help_options = fix_help_options(cmd_class.help_options)
+        else:
+            help_options = []
+
+        # All commands support the global options too, just by adding
+        # in 'global_options'.
+        parser.set_option_table(self.global_options +
+                                cmd_class.user_options +
+                                help_options)
+        parser.set_negative_aliases(negative_opt)
+        (args, opts) = parser.getopt(args[1:])
+        if hasattr(opts, 'help') and opts.help:
+            self._show_help(parser, display_options=0, commands=[cmd_class])
+            return
+
+        if (hasattr(cmd_class, 'help_options') and
+                isinstance(cmd_class.help_options, list)):
+            help_option_found=0
+            for (help_option, short, desc, func) in cmd_class.help_options:
+                if hasattr(opts, parser.get_attr_name(help_option)):
+                    help_option_found=1
+                    if callable(func):
+                        func()
+                    else:
+                        raise DistutilsClassError(
+                            "invalid help function %r for help option '%s': "
+                            "must be a callable object (function, etc.)"
+                            % (func, help_option))
+
+            if help_option_found:
+                return
+
+        # Put the options from the command-line into their official
+        # holding pen, the 'command_options' dictionary.
+        opt_dict = self.get_option_dict(command)
+        for (name, value) in vars(opts).items():
+            opt_dict[name] = ("command line", value)
+
+        return args
+
+    def finalize_options(self):
+        """Set final values for all the options on the Distribution
+        instance, analogous to the .finalize_options() method of Command
+        objects.
+        """
+        for attr in ('keywords', 'platforms'):
+            value = getattr(self.metadata, attr)
+            if value is None:
+                continue
+            if isinstance(value, str):
+                value = [elm.strip() for elm in value.split(',')]
+                setattr(self.metadata, attr, value)
+
+    def _show_help(self, parser, global_options=1, display_options=1,
+                   commands=[]):
+        """Show help for the setup script command-line in the form of
+        several lists of command-line options.  'parser' should be a
+        FancyGetopt instance; do not expect it to be returned in the
+        same state, as its option table will be reset to make it
+        generate the correct help text.
+
+        If 'global_options' is true, lists the global options:
+        --verbose, --dry-run, etc.  If 'display_options' is true, lists
+        the "display-only" options: --name, --version, etc.  Finally,
+        lists per-command help for every command name or command class
+        in 'commands'.
+        """
+        # late import because of mutual dependence between these modules
+        from distutils.core import gen_usage
+        from distutils.cmd import Command
+
+        if global_options:
+            if display_options:
+                options = self._get_toplevel_options()
+            else:
+                options = self.global_options
+            parser.set_option_table(options)
+            parser.print_help(self.common_usage + "\nGlobal options:")
+            print('')
+
+        if display_options:
+            parser.set_option_table(self.display_options)
+            parser.print_help(
+                "Information display options (just display " +
+                "information, ignore any commands)")
+            print('')
+
+        for command in self.commands:
+            if isinstance(command, type) and issubclass(command, Command):
+                klass = command
+            else:
+                klass = self.get_command_class(command)
+            if (hasattr(klass, 'help_options') and
+                    isinstance(klass.help_options, list)):
+                parser.set_option_table(klass.user_options +
+                                        fix_help_options(klass.help_options))
+            else:
+                parser.set_option_table(klass.user_options)
+            parser.print_help("Options for '%s' command:" % klass.__name__)
+            print('')
+
+        print(gen_usage(self.script_name))
+
+    def handle_display_options(self, option_order):
+        """If there were any non-global "display-only" options
+        (--help-commands or the metadata display options) on the command
+        line, display the requested info and return true; else return
+        false.
+        """
+        from distutils.core import gen_usage
+
+        # User just wants a list of commands -- we'll print it out and stop
+        # processing now (ie. if they ran "setup --help-commands foo bar",
+        # we ignore "foo bar").
+        if self.help_commands:
+            self.print_commands()
+            print('')
+            print(gen_usage(self.script_name))
+            return 1
+
+        # If user supplied any of the "display metadata" options, then
+        # display that metadata in the order in which the user supplied the
+        # metadata options.
+        any_display_options = 0
+        is_display_option = {}
+        for option in self.display_options:
+            is_display_option[option[0]] = 1
+
+        for (opt, val) in option_order:
+            if val and is_display_option.get(opt):
+                opt = translate_longopt(opt)
+                value = getattr(self.metadata, "get_"+opt)()
+                if opt in ['keywords', 'platforms']:
+                    print(','.join(value))
+                elif opt in ('classifiers', 'provides', 'requires',
+                             'obsoletes'):
+                    print('\n'.join(value))
+                else:
+                    print(value)
+                any_display_options = 1
+
+        return any_display_options
+
+    def print_command_list(self, commands, header, max_length):
+        """Print a subset of the list of all commands -- used by
+        'print_commands()'.
+        """
+        print(header + ":")
+
+        for cmd in commands:
+            klass = self.cmdclass.get(cmd)
+            if not klass:
+                klass = self.get_command_class(cmd)
+            try:
+                description = klass.description
+            except AttributeError:
+                description = "(no description available)"
+
+            print("  %-*s  %s" % (max_length, cmd, description))
+
+    def print_commands(self):
+        """Print out a help message listing all available commands with a
+        description of each.  The list is divided into "standard commands"
+        (listed in distutils.command.__all__) and "extra commands"
+        (mentioned in self.cmdclass, but not a standard command).  The
+        descriptions come from the command class attribute
+        'description'.
+        """
+        import distutils.command
+        std_commands = distutils.command.__all__
+        is_std = {}
+        for cmd in std_commands:
+            is_std[cmd] = 1
+
+        extra_commands = []
+        for cmd in self.cmdclass.keys():
+            if not is_std.get(cmd):
+                extra_commands.append(cmd)
+
+        max_length = 0
+        for cmd in (std_commands + extra_commands):
+            if len(cmd) > max_length:
+                max_length = len(cmd)
+
+        self.print_command_list(std_commands,
+                                "Standard commands",
+                                max_length)
+        if extra_commands:
+            print()
+            self.print_command_list(extra_commands,
+                                    "Extra commands",
+                                    max_length)
+
+    def get_command_list(self):
+        """Get a list of (command, description) tuples.
+        The list is divided into "standard commands" (listed in
+        distutils.command.__all__) and "extra commands" (mentioned in
+        self.cmdclass, but not a standard command).  The descriptions come
+        from the command class attribute 'description'.
+        """
+        # Currently this is only used on Mac OS, for the Mac-only GUI
+        # Distutils interface (by Jack Jansen)
+        import distutils.command
+        std_commands = distutils.command.__all__
+        is_std = {}
+        for cmd in std_commands:
+            is_std[cmd] = 1
+
+        extra_commands = []
+        for cmd in self.cmdclass.keys():
+            if not is_std.get(cmd):
+                extra_commands.append(cmd)
+
+        rv = []
+        for cmd in (std_commands + extra_commands):
+            klass = self.cmdclass.get(cmd)
+            if not klass:
+                klass = self.get_command_class(cmd)
+            try:
+                description = klass.description
+            except AttributeError:
+                description = "(no description available)"
+            rv.append((cmd, description))
+        return rv
+
+    # -- Command class/object methods ----------------------------------
+
+    def get_command_packages(self):
+        """Return a list of packages from which commands are loaded."""
+        pkgs = self.command_packages
+        if not isinstance(pkgs, list):
+            if pkgs is None:
+                pkgs = ''
+            pkgs = [pkg.strip() for pkg in pkgs.split(',') if pkg != '']
+            if "distutils.command" not in pkgs:
+                pkgs.insert(0, "distutils.command")
+            self.command_packages = pkgs
+        return pkgs
+
+    def get_command_class(self, command):
+        """Return the class that implements the Distutils command named by
+        'command'.  First we check the 'cmdclass' dictionary; if the
+        command is mentioned there, we fetch the class object from the
+        dictionary and return it.  Otherwise we load the command module
+        ("distutils.command." + command) and fetch the command class from
+        the module.  The loaded class is also stored in 'cmdclass'
+        to speed future calls to 'get_command_class()'.
+
+        Raises DistutilsModuleError if the expected module could not be
+        found, or if that module does not define the expected class.
+        """
+        klass = self.cmdclass.get(command)
+        if klass:
+            return klass
+
+        for pkgname in self.get_command_packages():
+            module_name = "%s.%s" % (pkgname, command)
+            klass_name = command
+
+            try:
+                __import__(module_name)
+                module = sys.modules[module_name]
+            except ImportError:
+                continue
+
+            try:
+                klass = getattr(module, klass_name)
+            except AttributeError:
+                raise DistutilsModuleError(
+                    "invalid command '%s' (no class '%s' in module '%s')"
+                    % (command, klass_name, module_name))
+
+            self.cmdclass[command] = klass
+            return klass
+
+        raise DistutilsModuleError("invalid command '%s'" % command)
+
+    def get_command_obj(self, command, create=1):
+        """Return the command object for 'command'.  Normally this object
+        is cached on a previous call to 'get_command_obj()'; if no command
+        object for 'command' is in the cache, then we either create and
+        return it (if 'create' is true) or return None.
+        """
+        cmd_obj = self.command_obj.get(command)
+        if not cmd_obj and create:
+            if DEBUG:
+                self.announce("Distribution.get_command_obj(): "
+                              "creating '%s' command object" % command)
+
+            klass = self.get_command_class(command)
+            cmd_obj = self.command_obj[command] = klass(self)
+            self.have_run[command] = 0
+
+            # Set any options that were supplied in config files
+            # or on the command line.  (NB. support for error
+            # reporting is lame here: any errors aren't reported
+            # until 'finalize_options()' is called, which means
+            # we won't report the source of the error.)
+            options = self.command_options.get(command)
+            if options:
+                self._set_command_options(cmd_obj, options)
+
+        return cmd_obj
+
+    def _set_command_options(self, command_obj, option_dict=None):
+        """Set the options for 'command_obj' from 'option_dict'.  Basically
+        this means copying elements of a dictionary ('option_dict') to
+        attributes of an instance ('command').
+
+        'command_obj' must be a Command instance.  If 'option_dict' is not
+        supplied, uses the standard option dictionary for this command
+        (from 'self.command_options').
+        """
+        command_name = command_obj.get_command_name()
+        if option_dict is None:
+            option_dict = self.get_option_dict(command_name)
+
+        if DEBUG:
+            self.announce("  setting options for '%s' command:" % command_name)
+        for (option, (source, value)) in option_dict.items():
+            if DEBUG:
+                self.announce("    %s = %s (from %s)" % (option, value,
+                                                         source))
+            try:
+                bool_opts = [translate_longopt(o)
+                             for o in command_obj.boolean_options]
+            except AttributeError:
+                bool_opts = []
+            try:
+                neg_opt = command_obj.negative_opt
+            except AttributeError:
+                neg_opt = {}
+
+            try:
+                is_string = isinstance(value, str)
+                if option in neg_opt and is_string:
+                    setattr(command_obj, neg_opt[option], not strtobool(value))
+                elif option in bool_opts and is_string:
+                    setattr(command_obj, option, strtobool(value))
+                elif hasattr(command_obj, option):
+                    setattr(command_obj, option, value)
+                else:
+                    raise DistutilsOptionError(
+                        "error in %s: command '%s' has no such option '%s'"
+                        % (source, command_name, option))
+            except ValueError as msg:
+                raise DistutilsOptionError(msg)
+
+    def reinitialize_command(self, command, reinit_subcommands=0):
+        """Reinitializes a command to the state it was in when first
+        returned by 'get_command_obj()': ie., initialized but not yet
+        finalized.  This provides the opportunity to sneak option
+        values in programmatically, overriding or supplementing
+        user-supplied values from the config files and command line.
+        You'll have to re-finalize the command object (by calling
+        'finalize_options()' or 'ensure_finalized()') before using it for
+        real.
+
+        'command' should be a command name (string) or command object.  If
+        'reinit_subcommands' is true, also reinitializes the command's
+        sub-commands, as declared by the 'sub_commands' class attribute (if
+        it has one).  See the "install" command for an example.  Only
+        reinitializes the sub-commands that actually matter, ie. those
+        whose test predicates return true.
+
+        Returns the reinitialized command object.
+        """
+        from distutils.cmd import Command
+        if not isinstance(command, Command):
+            command_name = command
+            command = self.get_command_obj(command_name)
+        else:
+            command_name = command.get_command_name()
+
+        if not command.finalized:
+            return command
+        command.initialize_options()
+        command.finalized = 0
+        self.have_run[command_name] = 0
+        self._set_command_options(command)
+
+        if reinit_subcommands:
+            for sub in command.get_sub_commands():
+                self.reinitialize_command(sub, reinit_subcommands)
+
+        return command
+
+    # -- Methods that operate on the Distribution ----------------------
+
+    def announce(self, msg, level=log.INFO):
+        log.log(level, msg)
+
+    def run_commands(self):
+        """Run each command that was seen on the setup script command line.
+        Uses the list of commands found and cache of command objects
+        created by 'get_command_obj()'.
+        """
+        for cmd in self.commands:
+            self.run_command(cmd)
+
+    # -- Methods that operate on its Commands --------------------------
+
+    def run_command(self, command):
+        """Do whatever it takes to run a command (including nothing at all,
+        if the command has already been run).  Specifically: if we have
+        already created and run the command named by 'command', return
+        silently without doing anything.  If the command named by 'command'
+        doesn't even have a command object yet, create one.  Then invoke
+        'run()' on that command object (or an existing one).
+        """
+        # Already been here, done that? then return silently.
+        if self.have_run.get(command):
+            return
+
+        log.info("running %s", command)
+        cmd_obj = self.get_command_obj(command)
+        cmd_obj.ensure_finalized()
+        cmd_obj.run()
+        self.have_run[command] = 1
+
+    # -- Distribution query methods ------------------------------------
+
+    def has_pure_modules(self):
+        return len(self.packages or self.py_modules or []) > 0
+
+    def has_ext_modules(self):
+        return self.ext_modules and len(self.ext_modules) > 0
+
+    def has_c_libraries(self):
+        return self.libraries and len(self.libraries) > 0
+
+    def has_modules(self):
+        return self.has_pure_modules() or self.has_ext_modules()
+
+    def has_headers(self):
+        return self.headers and len(self.headers) > 0
+
+    def has_scripts(self):
+        return self.scripts and len(self.scripts) > 0
+
+    def has_data_files(self):
+        return self.data_files and len(self.data_files) > 0
+
+    def is_pure(self):
+        return (self.has_pure_modules() and
+                not self.has_ext_modules() and
+                not self.has_c_libraries())
+
+    # -- Metadata query methods ----------------------------------------
+
+    # If you're looking for 'get_name()', 'get_version()', and so forth,
+    # they are defined in a sneaky way: the constructor binds self.get_XXX
+    # to self.metadata.get_XXX.  The actual code is in the
+    # DistributionMetadata class, below.
+
+class DistributionMetadata:
+    """Dummy class to hold the distribution meta-data: name, version,
+    author, and so forth.
+    """
+
+    _METHOD_BASENAMES = ("name", "version", "author", "author_email",
+                         "maintainer", "maintainer_email", "url",
+                         "license", "description", "long_description",
+                         "keywords", "platforms", "fullname", "contact",
+                         "contact_email", "classifiers", "download_url",
+                         # PEP 314
+                         "provides", "requires", "obsoletes",
+                         )
+
+    def __init__(self, path=None):
+        if path is not None:
+            self.read_pkg_file(open(path))
+        else:
+            self.name = None
+            self.version = None
+            self.author = None
+            self.author_email = None
+            self.maintainer = None
+            self.maintainer_email = None
+            self.url = None
+            self.license = None
+            self.description = None
+            self.long_description = None
+            self.keywords = None
+            self.platforms = None
+            self.classifiers = None
+            self.download_url = None
+            # PEP 314
+            self.provides = None
+            self.requires = None
+            self.obsoletes = None
+
+    def read_pkg_file(self, file):
+        """Reads the metadata values from a file object."""
+        msg = message_from_file(file)
+
+        def _read_field(name):
+            value = msg[name]
+            if value == 'UNKNOWN':
+                return None
+            return value
+
+        def _read_list(name):
+            values = msg.get_all(name, None)
+            if values == []:
+                return None
+            return values
+
+        metadata_version = msg['metadata-version']
+        self.name = _read_field('name')
+        self.version = _read_field('version')
+        self.description = _read_field('summary')
+        # we are filling author only.
+        self.author = _read_field('author')
+        self.maintainer = None
+        self.author_email = _read_field('author-email')
+        self.maintainer_email = None
+        self.url = _read_field('home-page')
+        self.license = _read_field('license')
+
+        if 'download-url' in msg:
+            self.download_url = _read_field('download-url')
+        else:
+            self.download_url = None
+
+        self.long_description = _read_field('description')
+        self.description = _read_field('summary')
+
+        if 'keywords' in msg:
+            self.keywords = _read_field('keywords').split(',')
+
+        self.platforms = _read_list('platform')
+        self.classifiers = _read_list('classifier')
+
+        # PEP 314 - these fields only exist in 1.1
+        if metadata_version == '1.1':
+            self.requires = _read_list('requires')
+            self.provides = _read_list('provides')
+            self.obsoletes = _read_list('obsoletes')
+        else:
+            self.requires = None
+            self.provides = None
+            self.obsoletes = None
+
+    def write_pkg_info(self, base_dir):
+        """Write the PKG-INFO file into the release tree.
+        """
+        with open(os.path.join(base_dir, 'PKG-INFO'), 'w',
+                  encoding='UTF-8') as pkg_info:
+            self.write_pkg_file(pkg_info)
+
+    def write_pkg_file(self, file):
+        """Write the PKG-INFO format data to a file object.
+        """
+        version = '1.0'
+        if (self.provides or self.requires or self.obsoletes or
+                self.classifiers or self.download_url):
+            version = '1.1'
+
+        file.write('Metadata-Version: %s\n' % version)
+        file.write('Name: %s\n' % self.get_name())
+        file.write('Version: %s\n' % self.get_version())
+        file.write('Summary: %s\n' % self.get_description())
+        file.write('Home-page: %s\n' % self.get_url())
+        file.write('Author: %s\n' % self.get_contact())
+        file.write('Author-email: %s\n' % self.get_contact_email())
+        file.write('License: %s\n' % self.get_license())
+        if self.download_url:
+            file.write('Download-URL: %s\n' % self.download_url)
+
+        long_desc = rfc822_escape(self.get_long_description())
+        file.write('Description: %s\n' % long_desc)
+
+        keywords = ','.join(self.get_keywords())
+        if keywords:
+            file.write('Keywords: %s\n' % keywords)
+
+        self._write_list(file, 'Platform', self.get_platforms())
+        self._write_list(file, 'Classifier', self.get_classifiers())
+
+        # PEP 314
+        self._write_list(file, 'Requires', self.get_requires())
+        self._write_list(file, 'Provides', self.get_provides())
+        self._write_list(file, 'Obsoletes', self.get_obsoletes())
+
+    def _write_list(self, file, name, values):
+        for value in values:
+            file.write('%s: %s\n' % (name, value))
+
+    # -- Metadata query methods ----------------------------------------
+
+    def get_name(self):
+        return self.name or "UNKNOWN"
+
+    def get_version(self):
+        return self.version or "0.0.0"
+
+    def get_fullname(self):
+        return "%s-%s" % (self.get_name(), self.get_version())
+
+    def get_author(self):
+        return self.author or "UNKNOWN"
+
+    def get_author_email(self):
+        return self.author_email or "UNKNOWN"
+
+    def get_maintainer(self):
+        return self.maintainer or "UNKNOWN"
+
+    def get_maintainer_email(self):
+        return self.maintainer_email or "UNKNOWN"
+
+    def get_contact(self):
+        return self.maintainer or self.author or "UNKNOWN"
+
+    def get_contact_email(self):
+        return self.maintainer_email or self.author_email or "UNKNOWN"
+
+    def get_url(self):
+        return self.url or "UNKNOWN"
+
+    def get_license(self):
+        return self.license or "UNKNOWN"
+    get_licence = get_license
+
+    def get_description(self):
+        return self.description or "UNKNOWN"
+
+    def get_long_description(self):
+        return self.long_description or "UNKNOWN"
+
+    def get_keywords(self):
+        return self.keywords or []
+
+    def set_keywords(self, value):
+        self.keywords = _ensure_list(value, 'keywords')
+
+    def get_platforms(self):
+        return self.platforms or ["UNKNOWN"]
+
+    def set_platforms(self, value):
+        self.platforms = _ensure_list(value, 'platforms')
+
+    def get_classifiers(self):
+        return self.classifiers or []
+
+    def set_classifiers(self, value):
+        self.classifiers = _ensure_list(value, 'classifiers')
+
+    def get_download_url(self):
+        return self.download_url or "UNKNOWN"
+
+    # PEP 314
+    def get_requires(self):
+        return self.requires or []
+
+    def set_requires(self, value):
+        import distutils.versionpredicate
+        for v in value:
+            distutils.versionpredicate.VersionPredicate(v)
+        self.requires = list(value)
+
+    def get_provides(self):
+        return self.provides or []
+
+    def set_provides(self, value):
+        value = [v.strip() for v in value]
+        for v in value:
+            import distutils.versionpredicate
+            distutils.versionpredicate.split_provision(v)
+        self.provides = value
+
+    def get_obsoletes(self):
+        return self.obsoletes or []
+
+    def set_obsoletes(self, value):
+        import distutils.versionpredicate
+        for v in value:
+            distutils.versionpredicate.VersionPredicate(v)
+        self.obsoletes = list(value)
+
+def fix_help_options(options):
+    """Convert a 4-tuple 'help_options' list as found in various command
+    classes to the 3-tuple form required by FancyGetopt.
+    """
+    new_options = []
+    for help_tuple in options:
+        new_options.append(help_tuple[0:3])
+    return new_options
diff --git a/venv/Lib/site-packages/setuptools/_distutils/errors.py b/venv/Lib/site-packages/setuptools/_distutils/errors.py
new file mode 100644
index 0000000..8b93059
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/errors.py
@@ -0,0 +1,97 @@
+"""distutils.errors
+
+Provides exceptions used by the Distutils modules.  Note that Distutils
+modules may raise standard exceptions; in particular, SystemExit is
+usually raised for errors that are obviously the end-user's fault
+(eg. bad command-line arguments).
+
+This module is safe to use in "from ... import *" mode; it only exports
+symbols whose names start with "Distutils" and end with "Error"."""
+
+class DistutilsError (Exception):
+    """The root of all Distutils evil."""
+    pass
+
+class DistutilsModuleError (DistutilsError):
+    """Unable to load an expected module, or to find an expected class
+    within some module (in particular, command modules and classes)."""
+    pass
+
+class DistutilsClassError (DistutilsError):
+    """Some command class (or possibly distribution class, if anyone
+    feels a need to subclass Distribution) is found not to be holding
+    up its end of the bargain, ie. implementing some part of the
+    "command "interface."""
+    pass
+
+class DistutilsGetoptError (DistutilsError):
+    """The option table provided to 'fancy_getopt()' is bogus."""
+    pass
+
+class DistutilsArgError (DistutilsError):
+    """Raised by fancy_getopt in response to getopt.error -- ie. an
+    error in the command line usage."""
+    pass
+
+class DistutilsFileError (DistutilsError):
+    """Any problems in the filesystem: expected file not found, etc.
+    Typically this is for problems that we detect before OSError
+    could be raised."""
+    pass
+
+class DistutilsOptionError (DistutilsError):
+    """Syntactic/semantic errors in command options, such as use of
+    mutually conflicting options, or inconsistent options,
+    badly-spelled values, etc.  No distinction is made between option
+    values originating in the setup script, the command line, config
+    files, or what-have-you -- but if we *know* something originated in
+    the setup script, we'll raise DistutilsSetupError instead."""
+    pass
+
+class DistutilsSetupError (DistutilsError):
+    """For errors that can be definitely blamed on the setup script,
+    such as invalid keyword arguments to 'setup()'."""
+    pass
+
+class DistutilsPlatformError (DistutilsError):
+    """We don't know how to do something on the current platform (but
+    we do know how to do it on some platform) -- eg. trying to compile
+    C files on a platform not supported by a CCompiler subclass."""
+    pass
+
+class DistutilsExecError (DistutilsError):
+    """Any problems executing an external program (such as the C
+    compiler, when compiling C files)."""
+    pass
+
+class DistutilsInternalError (DistutilsError):
+    """Internal inconsistencies or impossibilities (obviously, this
+    should never be seen if the code is working!)."""
+    pass
+
+class DistutilsTemplateError (DistutilsError):
+    """Syntax error in a file list template."""
+
+class DistutilsByteCompileError(DistutilsError):
+    """Byte compile error."""
+
+# Exception classes used by the CCompiler implementation classes
+class CCompilerError (Exception):
+    """Some compile/link operation failed."""
+
+class PreprocessError (CCompilerError):
+    """Failure to preprocess one or more C/C++ files."""
+
+class CompileError (CCompilerError):
+    """Failure to compile one or more C/C++ source files."""
+
+class LibError (CCompilerError):
+    """Failure to create a static library from one or more C/C++ object
+    files."""
+
+class LinkError (CCompilerError):
+    """Failure to link one or more C/C++ object files into an executable
+    or shared library file."""
+
+class UnknownFileError (CCompilerError):
+    """Attempt to process an unknown file type."""
diff --git a/venv/Lib/site-packages/setuptools/_distutils/extension.py b/venv/Lib/site-packages/setuptools/_distutils/extension.py
new file mode 100644
index 0000000..c507da3
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/extension.py
@@ -0,0 +1,240 @@
+"""distutils.extension
+
+Provides the Extension class, used to describe C/C++ extension
+modules in setup scripts."""
+
+import os
+import warnings
+
+# This class is really only used by the "build_ext" command, so it might
+# make sense to put it in distutils.command.build_ext.  However, that
+# module is already big enough, and I want to make this class a bit more
+# complex to simplify some common cases ("foo" module in "foo.c") and do
+# better error-checking ("foo.c" actually exists).
+#
+# Also, putting this in build_ext.py means every setup script would have to
+# import that large-ish module (indirectly, through distutils.core) in
+# order to do anything.
+
+class Extension:
+    """Just a collection of attributes that describes an extension
+    module and everything needed to build it (hopefully in a portable
+    way, but there are hooks that let you be as unportable as you need).
+
+    Instance attributes:
+      name : string
+        the full name of the extension, including any packages -- ie.
+        *not* a filename or pathname, but Python dotted name
+      sources : [string]
+        list of source filenames, relative to the distribution root
+        (where the setup script lives), in Unix form (slash-separated)
+        for portability.  Source files may be C, C++, SWIG (.i),
+        platform-specific resource files, or whatever else is recognized
+        by the "build_ext" command as source for a Python extension.
+      include_dirs : [string]
+        list of directories to search for C/C++ header files (in Unix
+        form for portability)
+      define_macros : [(name : string, value : string|None)]
+        list of macros to define; each macro is defined using a 2-tuple,
+        where 'value' is either the string to define it to or None to
+        define it without a particular value (equivalent of "#define
+        FOO" in source or -DFOO on Unix C compiler command line)
+      undef_macros : [string]
+        list of macros to undefine explicitly
+      library_dirs : [string]
+        list of directories to search for C/C++ libraries at link time
+      libraries : [string]
+        list of library names (not filenames or paths) to link against
+      runtime_library_dirs : [string]
+        list of directories to search for C/C++ libraries at run time
+        (for shared extensions, this is when the extension is loaded)
+      extra_objects : [string]
+        list of extra files to link with (eg. object files not implied
+        by 'sources', static library that must be explicitly specified,
+        binary resource files, etc.)
+      extra_compile_args : [string]
+        any extra platform- and compiler-specific information to use
+        when compiling the source files in 'sources'.  For platforms and
+        compilers where "command line" makes sense, this is typically a
+        list of command-line arguments, but for other platforms it could
+        be anything.
+      extra_link_args : [string]
+        any extra platform- and compiler-specific information to use
+        when linking object files together to create the extension (or
+        to create a new static Python interpreter).  Similar
+        interpretation as for 'extra_compile_args'.
+      export_symbols : [string]
+        list of symbols to be exported from a shared extension.  Not
+        used on all platforms, and not generally necessary for Python
+        extensions, which typically export exactly one symbol: "init" +
+        extension_name.
+      swig_opts : [string]
+        any extra options to pass to SWIG if a source file has the .i
+        extension.
+      depends : [string]
+        list of files that the extension depends on
+      language : string
+        extension language (i.e. "c", "c++", "objc"). Will be detected
+        from the source extensions if not provided.
+      optional : boolean
+        specifies that a build failure in the extension should not abort the
+        build process, but simply not install the failing extension.
+    """
+
+    # When adding arguments to this constructor, be sure to update
+    # setup_keywords in core.py.
+    def __init__(self, name, sources,
+                  include_dirs=None,
+                  define_macros=None,
+                  undef_macros=None,
+                  library_dirs=None,
+                  libraries=None,
+                  runtime_library_dirs=None,
+                  extra_objects=None,
+                  extra_compile_args=None,
+                  extra_link_args=None,
+                  export_symbols=None,
+                  swig_opts = None,
+                  depends=None,
+                  language=None,
+                  optional=None,
+                  **kw                      # To catch unknown keywords
+                 ):
+        if not isinstance(name, str):
+            raise AssertionError("'name' must be a string")
+        if not (isinstance(sources, list) and
+                all(isinstance(v, str) for v in sources)):
+            raise AssertionError("'sources' must be a list of strings")
+
+        self.name = name
+        self.sources = sources
+        self.include_dirs = include_dirs or []
+        self.define_macros = define_macros or []
+        self.undef_macros = undef_macros or []
+        self.library_dirs = library_dirs or []
+        self.libraries = libraries or []
+        self.runtime_library_dirs = runtime_library_dirs or []
+        self.extra_objects = extra_objects or []
+        self.extra_compile_args = extra_compile_args or []
+        self.extra_link_args = extra_link_args or []
+        self.export_symbols = export_symbols or []
+        self.swig_opts = swig_opts or []
+        self.depends = depends or []
+        self.language = language
+        self.optional = optional
+
+        # If there are unknown keyword options, warn about them
+        if len(kw) > 0:
+            options = [repr(option) for option in kw]
+            options = ', '.join(sorted(options))
+            msg = "Unknown Extension options: %s" % options
+            warnings.warn(msg)
+
+    def __repr__(self):
+        return '<%s.%s(%r) at %#x>' % (
+            self.__class__.__module__,
+            self.__class__.__qualname__,
+            self.name,
+            id(self))
+
+
+def read_setup_file(filename):
+    """Reads a Setup file and returns Extension instances."""
+    from distutils.sysconfig import (parse_makefile, expand_makefile_vars,
+                                     _variable_rx)
+
+    from distutils.text_file import TextFile
+    from distutils.util import split_quoted
+
+    # First pass over the file to gather "VAR = VALUE" assignments.
+    vars = parse_makefile(filename)
+
+    # Second pass to gobble up the real content: lines of the form
+    #   <module> ... [<sourcefile> ...] [<cpparg> ...] [<library> ...]
+    file = TextFile(filename,
+                    strip_comments=1, skip_blanks=1, join_lines=1,
+                    lstrip_ws=1, rstrip_ws=1)
+    try:
+        extensions = []
+
+        while True:
+            line = file.readline()
+            if line is None:                # eof
+                break
+            if _variable_rx.match(line):    # VAR=VALUE, handled in first pass
+                continue
+
+            if line[0] == line[-1] == "*":
+                file.warn("'%s' lines not handled yet" % line)
+                continue
+
+            line = expand_makefile_vars(line, vars)
+            words = split_quoted(line)
+
+            # NB. this parses a slightly different syntax than the old
+            # makesetup script: here, there must be exactly one extension per
+            # line, and it must be the first word of the line.  I have no idea
+            # why the old syntax supported multiple extensions per line, as
+            # they all wind up being the same.
+
+            module = words[0]
+            ext = Extension(module, [])
+            append_next_word = None
+
+            for word in words[1:]:
+                if append_next_word is not None:
+                    append_next_word.append(word)
+                    append_next_word = None
+                    continue
+
+                suffix = os.path.splitext(word)[1]
+                switch = word[0:2] ; value = word[2:]
+
+                if suffix in (".c", ".cc", ".cpp", ".cxx", ".c++", ".m", ".mm"):
+                    # hmm, should we do something about C vs. C++ sources?
+                    # or leave it up to the CCompiler implementation to
+                    # worry about?
+                    ext.sources.append(word)
+                elif switch == "-I":
+                    ext.include_dirs.append(value)
+                elif switch == "-D":
+                    equals = value.find("=")
+                    if equals == -1:        # bare "-DFOO" -- no value
+                        ext.define_macros.append((value, None))
+                    else:                   # "-DFOO=blah"
+                        ext.define_macros.append((value[0:equals],
+                                                  value[equals+2:]))
+                elif switch == "-U":
+                    ext.undef_macros.append(value)
+                elif switch == "-C":        # only here 'cause makesetup has it!
+                    ext.extra_compile_args.append(word)
+                elif switch == "-l":
+                    ext.libraries.append(value)
+                elif switch == "-L":
+                    ext.library_dirs.append(value)
+                elif switch == "-R":
+                    ext.runtime_library_dirs.append(value)
+                elif word == "-rpath":
+                    append_next_word = ext.runtime_library_dirs
+                elif word == "-Xlinker":
+                    append_next_word = ext.extra_link_args
+                elif word == "-Xcompiler":
+                    append_next_word = ext.extra_compile_args
+                elif switch == "-u":
+                    ext.extra_link_args.append(word)
+                    if not value:
+                        append_next_word = ext.extra_link_args
+                elif suffix in (".a", ".so", ".sl", ".o", ".dylib"):
+                    # NB. a really faithful emulation of makesetup would
+                    # append a .o file to extra_objects only if it
+                    # had a slash in it; otherwise, it would s/.o/.c/
+                    # and append it to sources.  Hmmmm.
+                    ext.extra_objects.append(word)
+                else:
+                    file.warn("unrecognized argument '%s'" % word)
+
+            extensions.append(ext)
+    finally:
+        file.close()
+
+    return extensions
diff --git a/venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py b/venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py
new file mode 100644
index 0000000..7d170dd
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py
@@ -0,0 +1,457 @@
+"""distutils.fancy_getopt
+
+Wrapper around the standard getopt module that provides the following
+additional features:
+  * short and long options are tied together
+  * options have help strings, so fancy_getopt could potentially
+    create a complete usage summary
+  * options set attributes of a passed-in object
+"""
+
+import sys, string, re
+import getopt
+from distutils.errors import *
+
+# Much like command_re in distutils.core, this is close to but not quite
+# the same as a Python NAME -- except, in the spirit of most GNU
+# utilities, we use '-' in place of '_'.  (The spirit of LISP lives on!)
+# The similarities to NAME are again not a coincidence...
+longopt_pat = r'[a-zA-Z](?:[a-zA-Z0-9-]*)'
+longopt_re = re.compile(r'^%s$' % longopt_pat)
+
+# For recognizing "negative alias" options, eg. "quiet=!verbose"
+neg_alias_re = re.compile("^(%s)=!(%s)$" % (longopt_pat, longopt_pat))
+
+# This is used to translate long options to legitimate Python identifiers
+# (for use as attributes of some object).
+longopt_xlate = str.maketrans('-', '_')
+
+class FancyGetopt:
+    """Wrapper around the standard 'getopt()' module that provides some
+    handy extra functionality:
+      * short and long options are tied together
+      * options have help strings, and help text can be assembled
+        from them
+      * options set attributes of a passed-in object
+      * boolean options can have "negative aliases" -- eg. if
+        --quiet is the "negative alias" of --verbose, then "--quiet"
+        on the command line sets 'verbose' to false
+    """
+
+    def __init__(self, option_table=None):
+        # The option table is (currently) a list of tuples.  The
+        # tuples may have 3 or four values:
+        #   (long_option, short_option, help_string [, repeatable])
+        # if an option takes an argument, its long_option should have '='
+        # appended; short_option should just be a single character, no ':'
+        # in any case.  If a long_option doesn't have a corresponding
+        # short_option, short_option should be None.  All option tuples
+        # must have long options.
+        self.option_table = option_table
+
+        # 'option_index' maps long option names to entries in the option
+        # table (ie. those 3-tuples).
+        self.option_index = {}
+        if self.option_table:
+            self._build_index()
+
+        # 'alias' records (duh) alias options; {'foo': 'bar'} means
+        # --foo is an alias for --bar
+        self.alias = {}
+
+        # 'negative_alias' keeps track of options that are the boolean
+        # opposite of some other option
+        self.negative_alias = {}
+
+        # These keep track of the information in the option table.  We
+        # don't actually populate these structures until we're ready to
+        # parse the command-line, since the 'option_table' passed in here
+        # isn't necessarily the final word.
+        self.short_opts = []
+        self.long_opts = []
+        self.short2long = {}
+        self.attr_name = {}
+        self.takes_arg = {}
+
+        # And 'option_order' is filled up in 'getopt()'; it records the
+        # original order of options (and their values) on the command-line,
+        # but expands short options, converts aliases, etc.
+        self.option_order = []
+
+    def _build_index(self):
+        self.option_index.clear()
+        for option in self.option_table:
+            self.option_index[option[0]] = option
+
+    def set_option_table(self, option_table):
+        self.option_table = option_table
+        self._build_index()
+
+    def add_option(self, long_option, short_option=None, help_string=None):
+        if long_option in self.option_index:
+            raise DistutilsGetoptError(
+                  "option conflict: already an option '%s'" % long_option)
+        else:
+            option = (long_option, short_option, help_string)
+            self.option_table.append(option)
+            self.option_index[long_option] = option
+
+    def has_option(self, long_option):
+        """Return true if the option table for this parser has an
+        option with long name 'long_option'."""
+        return long_option in self.option_index
+
+    def get_attr_name(self, long_option):
+        """Translate long option name 'long_option' to the form it
+        has as an attribute of some object: ie., translate hyphens
+        to underscores."""
+        return long_option.translate(longopt_xlate)
+
+    def _check_alias_dict(self, aliases, what):
+        assert isinstance(aliases, dict)
+        for (alias, opt) in aliases.items():
+            if alias not in self.option_index:
+                raise DistutilsGetoptError(("invalid %s '%s': "
+                       "option '%s' not defined") % (what, alias, alias))
+            if opt not in self.option_index:
+                raise DistutilsGetoptError(("invalid %s '%s': "
+                       "aliased option '%s' not defined") % (what, alias, opt))
+
+    def set_aliases(self, alias):
+        """Set the aliases for this option parser."""
+        self._check_alias_dict(alias, "alias")
+        self.alias = alias
+
+    def set_negative_aliases(self, negative_alias):
+        """Set the negative aliases for this option parser.
+        'negative_alias' should be a dictionary mapping option names to
+        option names, both the key and value must already be defined
+        in the option table."""
+        self._check_alias_dict(negative_alias, "negative alias")
+        self.negative_alias = negative_alias
+
+    def _grok_option_table(self):
+        """Populate the various data structures that keep tabs on the
+        option table.  Called by 'getopt()' before it can do anything
+        worthwhile.
+        """
+        self.long_opts = []
+        self.short_opts = []
+        self.short2long.clear()
+        self.repeat = {}
+
+        for option in self.option_table:
+            if len(option) == 3:
+                long, short, help = option
+                repeat = 0
+            elif len(option) == 4:
+                long, short, help, repeat = option
+            else:
+                # the option table is part of the code, so simply
+                # assert that it is correct
+                raise ValueError("invalid option tuple: %r" % (option,))
+
+            # Type- and value-check the option names
+            if not isinstance(long, str) or len(long) < 2:
+                raise DistutilsGetoptError(("invalid long option '%s': "
+                       "must be a string of length >= 2") % long)
+
+            if (not ((short is None) or
+                     (isinstance(short, str) and len(short) == 1))):
+                raise DistutilsGetoptError("invalid short option '%s': "
+                       "must a single character or None" % short)
+
+            self.repeat[long] = repeat
+            self.long_opts.append(long)
+
+            if long[-1] == '=':             # option takes an argument?
+                if short: short = short + ':'
+                long = long[0:-1]
+                self.takes_arg[long] = 1
+            else:
+                # Is option is a "negative alias" for some other option (eg.
+                # "quiet" == "!verbose")?
+                alias_to = self.negative_alias.get(long)
+                if alias_to is not None:
+                    if self.takes_arg[alias_to]:
+                        raise DistutilsGetoptError(
+                              "invalid negative alias '%s': "
+                              "aliased option '%s' takes a value"
+                              % (long, alias_to))
+
+                    self.long_opts[-1] = long # XXX redundant?!
+                self.takes_arg[long] = 0
+
+            # If this is an alias option, make sure its "takes arg" flag is
+            # the same as the option it's aliased to.
+            alias_to = self.alias.get(long)
+            if alias_to is not None:
+                if self.takes_arg[long] != self.takes_arg[alias_to]:
+                    raise DistutilsGetoptError(
+                          "invalid alias '%s': inconsistent with "
+                          "aliased option '%s' (one of them takes a value, "
+                          "the other doesn't"
+                          % (long, alias_to))
+
+            # Now enforce some bondage on the long option name, so we can
+            # later translate it to an attribute name on some object.  Have
+            # to do this a bit late to make sure we've removed any trailing
+            # '='.
+            if not longopt_re.match(long):
+                raise DistutilsGetoptError(
+                       "invalid long option name '%s' "
+                       "(must be letters, numbers, hyphens only" % long)
+
+            self.attr_name[long] = self.get_attr_name(long)
+            if short:
+                self.short_opts.append(short)
+                self.short2long[short[0]] = long
+
+    def getopt(self, args=None, object=None):
+        """Parse command-line options in args. Store as attributes on object.
+
+        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
+        'object' is None or not supplied, creates a new OptionDummy
+        object, stores option values there, and returns a tuple (args,
+        object).  If 'object' is supplied, it is modified in place and
+        'getopt()' just returns 'args'; in both cases, the returned
+        'args' is a modified copy of the passed-in 'args' list, which
+        is left untouched.
+        """
+        if args is None:
+            args = sys.argv[1:]
+        if object is None:
+            object = OptionDummy()
+            created_object = True
+        else:
+            created_object = False
+
+        self._grok_option_table()
+
+        short_opts = ' '.join(self.short_opts)
+        try:
+            opts, args = getopt.getopt(args, short_opts, self.long_opts)
+        except getopt.error as msg:
+            raise DistutilsArgError(msg)
+
+        for opt, val in opts:
+            if len(opt) == 2 and opt[0] == '-': # it's a short option
+                opt = self.short2long[opt[1]]
+            else:
+                assert len(opt) > 2 and opt[:2] == '--'
+                opt = opt[2:]
+
+            alias = self.alias.get(opt)
+            if alias:
+                opt = alias
+
+            if not self.takes_arg[opt]:     # boolean option?
+                assert val == '', "boolean option can't have value"
+                alias = self.negative_alias.get(opt)
+                if alias:
+                    opt = alias
+                    val = 0
+                else:
+                    val = 1
+
+            attr = self.attr_name[opt]
+            # The only repeating option at the moment is 'verbose'.
+            # It has a negative option -q quiet, which should set verbose = 0.
+            if val and self.repeat.get(attr) is not None:
+                val = getattr(object, attr, 0) + 1
+            setattr(object, attr, val)
+            self.option_order.append((opt, val))
+
+        # for opts
+        if created_object:
+            return args, object
+        else:
+            return args
+
+    def get_option_order(self):
+        """Returns the list of (option, value) tuples processed by the
+        previous run of 'getopt()'.  Raises RuntimeError if
+        'getopt()' hasn't been called yet.
+        """
+        if self.option_order is None:
+            raise RuntimeError("'getopt()' hasn't been called yet")
+        else:
+            return self.option_order
+
+    def generate_help(self, header=None):
+        """Generate help text (a list of strings, one per suggested line of
+        output) from the option table for this FancyGetopt object.
+        """
+        # Blithely assume the option table is good: probably wouldn't call
+        # 'generate_help()' unless you've already called 'getopt()'.
+
+        # First pass: determine maximum length of long option names
+        max_opt = 0
+        for option in self.option_table:
+            long = option[0]
+            short = option[1]
+            l = len(long)
+            if long[-1] == '=':
+                l = l - 1
+            if short is not None:
+                l = l + 5                   # " (-x)" where short == 'x'
+            if l > max_opt:
+                max_opt = l
+
+        opt_width = max_opt + 2 + 2 + 2     # room for indent + dashes + gutter
+
+        # Typical help block looks like this:
+        #   --foo       controls foonabulation
+        # Help block for longest option looks like this:
+        #   --flimflam  set the flim-flam level
+        # and with wrapped text:
+        #   --flimflam  set the flim-flam level (must be between
+        #               0 and 100, except on Tuesdays)
+        # Options with short names will have the short name shown (but
+        # it doesn't contribute to max_opt):
+        #   --foo (-f)  controls foonabulation
+        # If adding the short option would make the left column too wide,
+        # we push the explanation off to the next line
+        #   --flimflam (-l)
+        #               set the flim-flam level
+        # Important parameters:
+        #   - 2 spaces before option block start lines
+        #   - 2 dashes for each long option name
+        #   - min. 2 spaces between option and explanation (gutter)
+        #   - 5 characters (incl. space) for short option name
+
+        # Now generate lines of help text.  (If 80 columns were good enough
+        # for Jesus, then 78 columns are good enough for me!)
+        line_width = 78
+        text_width = line_width - opt_width
+        big_indent = ' ' * opt_width
+        if header:
+            lines = [header]
+        else:
+            lines = ['Option summary:']
+
+        for option in self.option_table:
+            long, short, help = option[:3]
+            text = wrap_text(help, text_width)
+            if long[-1] == '=':
+                long = long[0:-1]
+
+            # Case 1: no short option at all (makes life easy)
+            if short is None:
+                if text:
+                    lines.append("  --%-*s  %s" % (max_opt, long, text[0]))
+                else:
+                    lines.append("  --%-*s  " % (max_opt, long))
+
+            # Case 2: we have a short option, so we have to include it
+            # just after the long option
+            else:
+                opt_names = "%s (-%s)" % (long, short)
+                if text:
+                    lines.append("  --%-*s  %s" %
+                                 (max_opt, opt_names, text[0]))
+                else:
+                    lines.append("  --%-*s" % opt_names)
+
+            for l in text[1:]:
+                lines.append(big_indent + l)
+        return lines
+
+    def print_help(self, header=None, file=None):
+        if file is None:
+            file = sys.stdout
+        for line in self.generate_help(header):
+            file.write(line + "\n")
+
+
+def fancy_getopt(options, negative_opt, object, args):
+    parser = FancyGetopt(options)
+    parser.set_negative_aliases(negative_opt)
+    return parser.getopt(args, object)
+
+
+WS_TRANS = {ord(_wschar) : ' ' for _wschar in string.whitespace}
+
+def wrap_text(text, width):
+    """wrap_text(text : string, width : int) -> [string]
+
+    Split 'text' into multiple lines of no more than 'width' characters
+    each, and return the list of strings that results.
+    """
+    if text is None:
+        return []
+    if len(text) <= width:
+        return [text]
+
+    text = text.expandtabs()
+    text = text.translate(WS_TRANS)
+    chunks = re.split(r'( +|-+)', text)
+    chunks = [ch for ch in chunks if ch] # ' - ' results in empty strings
+    lines = []
+
+    while chunks:
+        cur_line = []                   # list of chunks (to-be-joined)
+        cur_len = 0                     # length of current line
+
+        while chunks:
+            l = len(chunks[0])
+            if cur_len + l <= width:    # can squeeze (at least) this chunk in
+                cur_line.append(chunks[0])
+                del chunks[0]
+                cur_len = cur_len + l
+            else:                       # this line is full
+                # drop last chunk if all space
+                if cur_line and cur_line[-1][0] == ' ':
+                    del cur_line[-1]
+                break
+
+        if chunks:                      # any chunks left to process?
+            # if the current line is still empty, then we had a single
+            # chunk that's too big too fit on a line -- so we break
+            # down and break it up at the line width
+            if cur_len == 0:
+                cur_line.append(chunks[0][0:width])
+                chunks[0] = chunks[0][width:]
+
+            # all-whitespace chunks at the end of a line can be discarded
+            # (and we know from the re.split above that if a chunk has
+            # *any* whitespace, it is *all* whitespace)
+            if chunks[0][0] == ' ':
+                del chunks[0]
+
+        # and store this line in the list-of-all-lines -- as a single
+        # string, of course!
+        lines.append(''.join(cur_line))
+
+    return lines
+
+
+def translate_longopt(opt):
+    """Convert a long option name to a valid Python identifier by
+    changing "-" to "_".
+    """
+    return opt.translate(longopt_xlate)
+
+
+class OptionDummy:
+    """Dummy class just used as a place to hold command-line option
+    values as instance attributes."""
+
+    def __init__(self, options=[]):
+        """Create a new OptionDummy instance.  The attributes listed in
+        'options' will be initialized to None."""
+        for opt in options:
+            setattr(self, opt, None)
+
+
+if __name__ == "__main__":
+    text = """\
+Tra-la-la, supercalifragilisticexpialidocious.
+How *do* you spell that odd word, anyways?
+(Someone ask Mary -- she'll know [or she'll
+say, "How should I know?"].)"""
+
+    for w in (10, 20, 30, 40):
+        print("width: %d" % w)
+        print("\n".join(wrap_text(text, w)))
+        print()
diff --git a/venv/Lib/site-packages/setuptools/_distutils/file_util.py b/venv/Lib/site-packages/setuptools/_distutils/file_util.py
new file mode 100644
index 0000000..b3fee35
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/file_util.py
@@ -0,0 +1,238 @@
+"""distutils.file_util
+
+Utility functions for operating on single files.
+"""
+
+import os
+from distutils.errors import DistutilsFileError
+from distutils import log
+
+# for generating verbose output in 'copy_file()'
+_copy_action = { None:   'copying',
+                 'hard': 'hard linking',
+                 'sym':  'symbolically linking' }
+
+
+def _copy_file_contents(src, dst, buffer_size=16*1024):
+    """Copy the file 'src' to 'dst'; both must be filenames.  Any error
+    opening either file, reading from 'src', or writing to 'dst', raises
+    DistutilsFileError.  Data is read/written in chunks of 'buffer_size'
+    bytes (default 16k).  No attempt is made to handle anything apart from
+    regular files.
+    """
+    # Stolen from shutil module in the standard library, but with
+    # custom error-handling added.
+    fsrc = None
+    fdst = None
+    try:
+        try:
+            fsrc = open(src, 'rb')
+        except OSError as e:
+            raise DistutilsFileError("could not open '%s': %s" % (src, e.strerror))
+
+        if os.path.exists(dst):
+            try:
+                os.unlink(dst)
+            except OSError as e:
+                raise DistutilsFileError(
+                      "could not delete '%s': %s" % (dst, e.strerror))
+
+        try:
+            fdst = open(dst, 'wb')
+        except OSError as e:
+            raise DistutilsFileError(
+                  "could not create '%s': %s" % (dst, e.strerror))
+
+        while True:
+            try:
+                buf = fsrc.read(buffer_size)
+            except OSError as e:
+                raise DistutilsFileError(
+                      "could not read from '%s': %s" % (src, e.strerror))
+
+            if not buf:
+                break
+
+            try:
+                fdst.write(buf)
+            except OSError as e:
+                raise DistutilsFileError(
+                      "could not write to '%s': %s" % (dst, e.strerror))
+    finally:
+        if fdst:
+            fdst.close()
+        if fsrc:
+            fsrc.close()
+
+def copy_file(src, dst, preserve_mode=1, preserve_times=1, update=0,
+              link=None, verbose=1, dry_run=0):
+    """Copy a file 'src' to 'dst'.  If 'dst' is a directory, then 'src' is
+    copied there with the same name; otherwise, it must be a filename.  (If
+    the file exists, it will be ruthlessly clobbered.)  If 'preserve_mode'
+    is true (the default), the file's mode (type and permission bits, or
+    whatever is analogous on the current platform) is copied.  If
+    'preserve_times' is true (the default), the last-modified and
+    last-access times are copied as well.  If 'update' is true, 'src' will
+    only be copied if 'dst' does not exist, or if 'dst' does exist but is
+    older than 'src'.
+
+    'link' allows you to make hard links (os.link) or symbolic links
+    (os.symlink) instead of copying: set it to "hard" or "sym"; if it is
+    None (the default), files are copied.  Don't set 'link' on systems that
+    don't support it: 'copy_file()' doesn't check if hard or symbolic
+    linking is available. If hardlink fails, falls back to
+    _copy_file_contents().
+
+    Under Mac OS, uses the native file copy function in macostools; on
+    other systems, uses '_copy_file_contents()' to copy file contents.
+
+    Return a tuple (dest_name, copied): 'dest_name' is the actual name of
+    the output file, and 'copied' is true if the file was copied (or would
+    have been copied, if 'dry_run' true).
+    """
+    # XXX if the destination file already exists, we clobber it if
+    # copying, but blow up if linking.  Hmmm.  And I don't know what
+    # macostools.copyfile() does.  Should definitely be consistent, and
+    # should probably blow up if destination exists and we would be
+    # changing it (ie. it's not already a hard/soft link to src OR
+    # (not update) and (src newer than dst).
+
+    from distutils.dep_util import newer
+    from stat import ST_ATIME, ST_MTIME, ST_MODE, S_IMODE
+
+    if not os.path.isfile(src):
+        raise DistutilsFileError(
+              "can't copy '%s': doesn't exist or not a regular file" % src)
+
+    if os.path.isdir(dst):
+        dir = dst
+        dst = os.path.join(dst, os.path.basename(src))
+    else:
+        dir = os.path.dirname(dst)
+
+    if update and not newer(src, dst):
+        if verbose >= 1:
+            log.debug("not copying %s (output up-to-date)", src)
+        return (dst, 0)
+
+    try:
+        action = _copy_action[link]
+    except KeyError:
+        raise ValueError("invalid value '%s' for 'link' argument" % link)
+
+    if verbose >= 1:
+        if os.path.basename(dst) == os.path.basename(src):
+            log.info("%s %s -> %s", action, src, dir)
+        else:
+            log.info("%s %s -> %s", action, src, dst)
+
+    if dry_run:
+        return (dst, 1)
+
+    # If linking (hard or symbolic), use the appropriate system call
+    # (Unix only, of course, but that's the caller's responsibility)
+    elif link == 'hard':
+        if not (os.path.exists(dst) and os.path.samefile(src, dst)):
+            try:
+                os.link(src, dst)
+                return (dst, 1)
+            except OSError:
+                # If hard linking fails, fall back on copying file
+                # (some special filesystems don't support hard linking
+                #  even under Unix, see issue #8876).
+                pass
+    elif link == 'sym':
+        if not (os.path.exists(dst) and os.path.samefile(src, dst)):
+            os.symlink(src, dst)
+            return (dst, 1)
+
+    # Otherwise (non-Mac, not linking), copy the file contents and
+    # (optionally) copy the times and mode.
+    _copy_file_contents(src, dst)
+    if preserve_mode or preserve_times:
+        st = os.stat(src)
+
+        # According to David Ascher <da@ski.org>, utime() should be done
+        # before chmod() (at least under NT).
+        if preserve_times:
+            os.utime(dst, (st[ST_ATIME], st[ST_MTIME]))
+        if preserve_mode:
+            os.chmod(dst, S_IMODE(st[ST_MODE]))
+
+    return (dst, 1)
+
+
+# XXX I suspect this is Unix-specific -- need porting help!
+def move_file (src, dst,
+               verbose=1,
+               dry_run=0):
+
+    """Move a file 'src' to 'dst'.  If 'dst' is a directory, the file will
+    be moved into it with the same name; otherwise, 'src' is just renamed
+    to 'dst'.  Return the new full name of the file.
+
+    Handles cross-device moves on Unix using 'copy_file()'.  What about
+    other systems???
+    """
+    from os.path import exists, isfile, isdir, basename, dirname
+    import errno
+
+    if verbose >= 1:
+        log.info("moving %s -> %s", src, dst)
+
+    if dry_run:
+        return dst
+
+    if not isfile(src):
+        raise DistutilsFileError("can't move '%s': not a regular file" % src)
+
+    if isdir(dst):
+        dst = os.path.join(dst, basename(src))
+    elif exists(dst):
+        raise DistutilsFileError(
+              "can't move '%s': destination '%s' already exists" %
+              (src, dst))
+
+    if not isdir(dirname(dst)):
+        raise DistutilsFileError(
+              "can't move '%s': destination '%s' not a valid path" %
+              (src, dst))
+
+    copy_it = False
+    try:
+        os.rename(src, dst)
+    except OSError as e:
+        (num, msg) = e.args
+        if num == errno.EXDEV:
+            copy_it = True
+        else:
+            raise DistutilsFileError(
+                  "couldn't move '%s' to '%s': %s" % (src, dst, msg))
+
+    if copy_it:
+        copy_file(src, dst, verbose=verbose)
+        try:
+            os.unlink(src)
+        except OSError as e:
+            (num, msg) = e.args
+            try:
+                os.unlink(dst)
+            except OSError:
+                pass
+            raise DistutilsFileError(
+                  "couldn't move '%s' to '%s' by copy/delete: "
+                  "delete '%s' failed: %s"
+                  % (src, dst, src, msg))
+    return dst
+
+
+def write_file (filename, contents):
+    """Create a file with the specified name and write 'contents' (a
+    sequence of strings without line terminators) to it.
+    """
+    f = open(filename, "w")
+    try:
+        for line in contents:
+            f.write(line + "\n")
+    finally:
+        f.close()
diff --git a/venv/Lib/site-packages/setuptools/_distutils/filelist.py b/venv/Lib/site-packages/setuptools/_distutils/filelist.py
new file mode 100644
index 0000000..c92d5fd
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/filelist.py
@@ -0,0 +1,327 @@
+"""distutils.filelist
+
+Provides the FileList class, used for poking about the filesystem
+and building lists of files.
+"""
+
+import os, re
+import fnmatch
+import functools
+from distutils.util import convert_path
+from distutils.errors import DistutilsTemplateError, DistutilsInternalError
+from distutils import log
+
+class FileList:
+    """A list of files built by on exploring the filesystem and filtered by
+    applying various patterns to what we find there.
+
+    Instance attributes:
+      dir
+        directory from which files will be taken -- only used if
+        'allfiles' not supplied to constructor
+      files
+        list of filenames currently being built/filtered/manipulated
+      allfiles
+        complete list of files under consideration (ie. without any
+        filtering applied)
+    """
+
+    def __init__(self, warn=None, debug_print=None):
+        # ignore argument to FileList, but keep them for backwards
+        # compatibility
+        self.allfiles = None
+        self.files = []
+
+    def set_allfiles(self, allfiles):
+        self.allfiles = allfiles
+
+    def findall(self, dir=os.curdir):
+        self.allfiles = findall(dir)
+
+    def debug_print(self, msg):
+        """Print 'msg' to stdout if the global DEBUG (taken from the
+        DISTUTILS_DEBUG environment variable) flag is true.
+        """
+        from distutils.debug import DEBUG
+        if DEBUG:
+            print(msg)
+
+    # -- List-like methods ---------------------------------------------
+
+    def append(self, item):
+        self.files.append(item)
+
+    def extend(self, items):
+        self.files.extend(items)
+
+    def sort(self):
+        # Not a strict lexical sort!
+        sortable_files = sorted(map(os.path.split, self.files))
+        self.files = []
+        for sort_tuple in sortable_files:
+            self.files.append(os.path.join(*sort_tuple))
+
+
+    # -- Other miscellaneous utility methods ---------------------------
+
+    def remove_duplicates(self):
+        # Assumes list has been sorted!
+        for i in range(len(self.files) - 1, 0, -1):
+            if self.files[i] == self.files[i - 1]:
+                del self.files[i]
+
+
+    # -- "File template" methods ---------------------------------------
+
+    def _parse_template_line(self, line):
+        words = line.split()
+        action = words[0]
+
+        patterns = dir = dir_pattern = None
+
+        if action in ('include', 'exclude',
+                      'global-include', 'global-exclude'):
+            if len(words) < 2:
+                raise DistutilsTemplateError(
+                      "'%s' expects <pattern1> <pattern2> ..." % action)
+            patterns = [convert_path(w) for w in words[1:]]
+        elif action in ('recursive-include', 'recursive-exclude'):
+            if len(words) < 3:
+                raise DistutilsTemplateError(
+                      "'%s' expects <dir> <pattern1> <pattern2> ..." % action)
+            dir = convert_path(words[1])
+            patterns = [convert_path(w) for w in words[2:]]
+        elif action in ('graft', 'prune'):
+            if len(words) != 2:
+                raise DistutilsTemplateError(
+                      "'%s' expects a single <dir_pattern>" % action)
+            dir_pattern = convert_path(words[1])
+        else:
+            raise DistutilsTemplateError("unknown action '%s'" % action)
+
+        return (action, patterns, dir, dir_pattern)
+
+    def process_template_line(self, line):
+        # Parse the line: split it up, make sure the right number of words
+        # is there, and return the relevant words.  'action' is always
+        # defined: it's the first word of the line.  Which of the other
+        # three are defined depends on the action; it'll be either
+        # patterns, (dir and patterns), or (dir_pattern).
+        (action, patterns, dir, dir_pattern) = self._parse_template_line(line)
+
+        # OK, now we know that the action is valid and we have the
+        # right number of words on the line for that action -- so we
+        # can proceed with minimal error-checking.
+        if action == 'include':
+            self.debug_print("include " + ' '.join(patterns))
+            for pattern in patterns:
+                if not self.include_pattern(pattern, anchor=1):
+                    log.warn("warning: no files found matching '%s'",
+                             pattern)
+
+        elif action == 'exclude':
+            self.debug_print("exclude " + ' '.join(patterns))
+            for pattern in patterns:
+                if not self.exclude_pattern(pattern, anchor=1):
+                    log.warn(("warning: no previously-included files "
+                              "found matching '%s'"), pattern)
+
+        elif action == 'global-include':
+            self.debug_print("global-include " + ' '.join(patterns))
+            for pattern in patterns:
+                if not self.include_pattern(pattern, anchor=0):
+                    log.warn(("warning: no files found matching '%s' "
+                              "anywhere in distribution"), pattern)
+
+        elif action == 'global-exclude':
+            self.debug_print("global-exclude " + ' '.join(patterns))
+            for pattern in patterns:
+                if not self.exclude_pattern(pattern, anchor=0):
+                    log.warn(("warning: no previously-included files matching "
+                              "'%s' found anywhere in distribution"),
+                             pattern)
+
+        elif action == 'recursive-include':
+            self.debug_print("recursive-include %s %s" %
+                             (dir, ' '.join(patterns)))
+            for pattern in patterns:
+                if not self.include_pattern(pattern, prefix=dir):
+                    log.warn(("warning: no files found matching '%s' "
+                                "under directory '%s'"),
+                             pattern, dir)
+
+        elif action == 'recursive-exclude':
+            self.debug_print("recursive-exclude %s %s" %
+                             (dir, ' '.join(patterns)))
+            for pattern in patterns:
+                if not self.exclude_pattern(pattern, prefix=dir):
+                    log.warn(("warning: no previously-included files matching "
+                              "'%s' found under directory '%s'"),
+                             pattern, dir)
+
+        elif action == 'graft':
+            self.debug_print("graft " + dir_pattern)
+            if not self.include_pattern(None, prefix=dir_pattern):
+                log.warn("warning: no directories found matching '%s'",
+                         dir_pattern)
+
+        elif action == 'prune':
+            self.debug_print("prune " + dir_pattern)
+            if not self.exclude_pattern(None, prefix=dir_pattern):
+                log.warn(("no previously-included directories found "
+                          "matching '%s'"), dir_pattern)
+        else:
+            raise DistutilsInternalError(
+                  "this cannot happen: invalid action '%s'" % action)
+
+
+    # -- Filtering/selection methods -----------------------------------
+
+    def include_pattern(self, pattern, anchor=1, prefix=None, is_regex=0):
+        """Select strings (presumably filenames) from 'self.files' that
+        match 'pattern', a Unix-style wildcard (glob) pattern.  Patterns
+        are not quite the same as implemented by the 'fnmatch' module: '*'
+        and '?'  match non-special characters, where "special" is platform-
+        dependent: slash on Unix; colon, slash, and backslash on
+        DOS/Windows; and colon on Mac OS.
+
+        If 'anchor' is true (the default), then the pattern match is more
+        stringent: "*.py" will match "foo.py" but not "foo/bar.py".  If
+        'anchor' is false, both of these will match.
+
+        If 'prefix' is supplied, then only filenames starting with 'prefix'
+        (itself a pattern) and ending with 'pattern', with anything in between
+        them, will match.  'anchor' is ignored in this case.
+
+        If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
+        'pattern' is assumed to be either a string containing a regex or a
+        regex object -- no translation is done, the regex is just compiled
+        and used as-is.
+
+        Selected strings will be added to self.files.
+
+        Return True if files are found, False otherwise.
+        """
+        # XXX docstring lying about what the special chars are?
+        files_found = False
+        pattern_re = translate_pattern(pattern, anchor, prefix, is_regex)
+        self.debug_print("include_pattern: applying regex r'%s'" %
+                         pattern_re.pattern)
+
+        # delayed loading of allfiles list
+        if self.allfiles is None:
+            self.findall()
+
+        for name in self.allfiles:
+            if pattern_re.search(name):
+                self.debug_print(" adding " + name)
+                self.files.append(name)
+                files_found = True
+        return files_found
+
+
+    def exclude_pattern (self, pattern,
+                         anchor=1, prefix=None, is_regex=0):
+        """Remove strings (presumably filenames) from 'files' that match
+        'pattern'.  Other parameters are the same as for
+        'include_pattern()', above.
+        The list 'self.files' is modified in place.
+        Return True if files are found, False otherwise.
+        """
+        files_found = False
+        pattern_re = translate_pattern(pattern, anchor, prefix, is_regex)
+        self.debug_print("exclude_pattern: applying regex r'%s'" %
+                         pattern_re.pattern)
+        for i in range(len(self.files)-1, -1, -1):
+            if pattern_re.search(self.files[i]):
+                self.debug_print(" removing " + self.files[i])
+                del self.files[i]
+                files_found = True
+        return files_found
+
+
+# ----------------------------------------------------------------------
+# Utility functions
+
+def _find_all_simple(path):
+    """
+    Find all files under 'path'
+    """
+    results = (
+        os.path.join(base, file)
+        for base, dirs, files in os.walk(path, followlinks=True)
+        for file in files
+    )
+    return filter(os.path.isfile, results)
+
+
+def findall(dir=os.curdir):
+    """
+    Find all files under 'dir' and return the list of full filenames.
+    Unless dir is '.', return full filenames with dir prepended.
+    """
+    files = _find_all_simple(dir)
+    if dir == os.curdir:
+        make_rel = functools.partial(os.path.relpath, start=dir)
+        files = map(make_rel, files)
+    return list(files)
+
+
+def glob_to_re(pattern):
+    """Translate a shell-like glob pattern to a regular expression; return
+    a string containing the regex.  Differs from 'fnmatch.translate()' in
+    that '*' does not match "special characters" (which are
+    platform-specific).
+    """
+    pattern_re = fnmatch.translate(pattern)
+
+    # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which
+    # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix,
+    # and by extension they shouldn't match such "special characters" under
+    # any OS.  So change all non-escaped dots in the RE to match any
+    # character except the special characters (currently: just os.sep).
+    sep = os.sep
+    if os.sep == '\\':
+        # we're using a regex to manipulate a regex, so we need
+        # to escape the backslash twice
+        sep = r'\\\\'
+    escaped = r'\1[^%s]' % sep
+    pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re)
+    return pattern_re
+
+
+def translate_pattern(pattern, anchor=1, prefix=None, is_regex=0):
+    """Translate a shell-like wildcard pattern to a compiled regular
+    expression.  Return the compiled regex.  If 'is_regex' true,
+    then 'pattern' is directly compiled to a regex (if it's a string)
+    or just returned as-is (assumes it's a regex object).
+    """
+    if is_regex:
+        if isinstance(pattern, str):
+            return re.compile(pattern)
+        else:
+            return pattern
+
+    # ditch start and end characters
+    start, _, end = glob_to_re('_').partition('_')
+
+    if pattern:
+        pattern_re = glob_to_re(pattern)
+        assert pattern_re.startswith(start) and pattern_re.endswith(end)
+    else:
+        pattern_re = ''
+
+    if prefix is not None:
+        prefix_re = glob_to_re(prefix)
+        assert prefix_re.startswith(start) and prefix_re.endswith(end)
+        prefix_re = prefix_re[len(start): len(prefix_re) - len(end)]
+        sep = os.sep
+        if os.sep == '\\':
+            sep = r'\\'
+        pattern_re = pattern_re[len(start): len(pattern_re) - len(end)]
+        pattern_re = r'%s\A%s%s.*%s%s' % (start, prefix_re, sep, pattern_re, end)
+    else:                               # no prefix -- respect anchor flag
+        if anchor:
+            pattern_re = r'%s\A%s' % (start, pattern_re[len(start):])
+
+    return re.compile(pattern_re)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/log.py b/venv/Lib/site-packages/setuptools/_distutils/log.py
new file mode 100644
index 0000000..8ef6b28
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/log.py
@@ -0,0 +1,77 @@
+"""A simple log mechanism styled after PEP 282."""
+
+# The class here is styled after PEP 282 so that it could later be
+# replaced with a standard Python logging implementation.
+
+DEBUG = 1
+INFO = 2
+WARN = 3
+ERROR = 4
+FATAL = 5
+
+import sys
+
+class Log:
+
+    def __init__(self, threshold=WARN):
+        self.threshold = threshold
+
+    def _log(self, level, msg, args):
+        if level not in (DEBUG, INFO, WARN, ERROR, FATAL):
+            raise ValueError('%s wrong log level' % str(level))
+
+        if level >= self.threshold:
+            if args:
+                msg = msg % args
+            if level in (WARN, ERROR, FATAL):
+                stream = sys.stderr
+            else:
+                stream = sys.stdout
+            try:
+                stream.write('%s\n' % msg)
+            except UnicodeEncodeError:
+                # emulate backslashreplace error handler
+                encoding = stream.encoding
+                msg = msg.encode(encoding, "backslashreplace").decode(encoding)
+                stream.write('%s\n' % msg)
+            stream.flush()
+
+    def log(self, level, msg, *args):
+        self._log(level, msg, args)
+
+    def debug(self, msg, *args):
+        self._log(DEBUG, msg, args)
+
+    def info(self, msg, *args):
+        self._log(INFO, msg, args)
+
+    def warn(self, msg, *args):
+        self._log(WARN, msg, args)
+
+    def error(self, msg, *args):
+        self._log(ERROR, msg, args)
+
+    def fatal(self, msg, *args):
+        self._log(FATAL, msg, args)
+
+_global_log = Log()
+log = _global_log.log
+debug = _global_log.debug
+info = _global_log.info
+warn = _global_log.warn
+error = _global_log.error
+fatal = _global_log.fatal
+
+def set_threshold(level):
+    # return the old threshold for use from tests
+    old = _global_log.threshold
+    _global_log.threshold = level
+    return old
+
+def set_verbosity(v):
+    if v <= 0:
+        set_threshold(WARN)
+    elif v == 1:
+        set_threshold(INFO)
+    elif v >= 2:
+        set_threshold(DEBUG)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py b/venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py
new file mode 100644
index 0000000..6934e96
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py
@@ -0,0 +1,788 @@
+"""distutils.msvc9compiler
+
+Contains MSVCCompiler, an implementation of the abstract CCompiler class
+for the Microsoft Visual Studio 2008.
+
+The module is compatible with VS 2005 and VS 2008. You can find legacy support
+for older versions of VS in distutils.msvccompiler.
+"""
+
+# Written by Perry Stoll
+# hacked by Robin Becker and Thomas Heller to do a better job of
+#   finding DevStudio (through the registry)
+# ported to VS2005 and VS 2008 by Christian Heimes
+
+import os
+import subprocess
+import sys
+import re
+
+from distutils.errors import DistutilsExecError, DistutilsPlatformError, \
+                             CompileError, LibError, LinkError
+from distutils.ccompiler import CCompiler, gen_lib_options
+from distutils import log
+from distutils.util import get_platform
+
+import winreg
+
+RegOpenKeyEx = winreg.OpenKeyEx
+RegEnumKey = winreg.EnumKey
+RegEnumValue = winreg.EnumValue
+RegError = winreg.error
+
+HKEYS = (winreg.HKEY_USERS,
+         winreg.HKEY_CURRENT_USER,
+         winreg.HKEY_LOCAL_MACHINE,
+         winreg.HKEY_CLASSES_ROOT)
+
+NATIVE_WIN64 = (sys.platform == 'win32' and sys.maxsize > 2**32)
+if NATIVE_WIN64:
+    # Visual C++ is a 32-bit application, so we need to look in
+    # the corresponding registry branch, if we're running a
+    # 64-bit Python on Win64
+    VS_BASE = r"Software\Wow6432Node\Microsoft\VisualStudio\%0.1f"
+    WINSDK_BASE = r"Software\Wow6432Node\Microsoft\Microsoft SDKs\Windows"
+    NET_BASE = r"Software\Wow6432Node\Microsoft\.NETFramework"
+else:
+    VS_BASE = r"Software\Microsoft\VisualStudio\%0.1f"
+    WINSDK_BASE = r"Software\Microsoft\Microsoft SDKs\Windows"
+    NET_BASE = r"Software\Microsoft\.NETFramework"
+
+# A map keyed by get_platform() return values to values accepted by
+# 'vcvarsall.bat'.  Note a cross-compile may combine these (eg, 'x86_amd64' is
+# the param to cross-compile on x86 targeting amd64.)
+PLAT_TO_VCVARS = {
+    'win32' : 'x86',
+    'win-amd64' : 'amd64',
+}
+
+class Reg:
+    """Helper class to read values from the registry
+    """
+
+    def get_value(cls, path, key):
+        for base in HKEYS:
+            d = cls.read_values(base, path)
+            if d and key in d:
+                return d[key]
+        raise KeyError(key)
+    get_value = classmethod(get_value)
+
+    def read_keys(cls, base, key):
+        """Return list of registry keys."""
+        try:
+            handle = RegOpenKeyEx(base, key)
+        except RegError:
+            return None
+        L = []
+        i = 0
+        while True:
+            try:
+                k = RegEnumKey(handle, i)
+            except RegError:
+                break
+            L.append(k)
+            i += 1
+        return L
+    read_keys = classmethod(read_keys)
+
+    def read_values(cls, base, key):
+        """Return dict of registry keys and values.
+
+        All names are converted to lowercase.
+        """
+        try:
+            handle = RegOpenKeyEx(base, key)
+        except RegError:
+            return None
+        d = {}
+        i = 0
+        while True:
+            try:
+                name, value, type = RegEnumValue(handle, i)
+            except RegError:
+                break
+            name = name.lower()
+            d[cls.convert_mbcs(name)] = cls.convert_mbcs(value)
+            i += 1
+        return d
+    read_values = classmethod(read_values)
+
+    def convert_mbcs(s):
+        dec = getattr(s, "decode", None)
+        if dec is not None:
+            try:
+                s = dec("mbcs")
+            except UnicodeError:
+                pass
+        return s
+    convert_mbcs = staticmethod(convert_mbcs)
+
+class MacroExpander:
+
+    def __init__(self, version):
+        self.macros = {}
+        self.vsbase = VS_BASE % version
+        self.load_macros(version)
+
+    def set_macro(self, macro, path, key):
+        self.macros["$(%s)" % macro] = Reg.get_value(path, key)
+
+    def load_macros(self, version):
+        self.set_macro("VCInstallDir", self.vsbase + r"\Setup\VC", "productdir")
+        self.set_macro("VSInstallDir", self.vsbase + r"\Setup\VS", "productdir")
+        self.set_macro("FrameworkDir", NET_BASE, "installroot")
+        try:
+            if version >= 8.0:
+                self.set_macro("FrameworkSDKDir", NET_BASE,
+                               "sdkinstallrootv2.0")
+            else:
+                raise KeyError("sdkinstallrootv2.0")
+        except KeyError:
+            raise DistutilsPlatformError(
+            """Python was built with Visual Studio 2008;
+extensions must be built with a compiler than can generate compatible binaries.
+Visual Studio 2008 was not found on this system. If you have Cygwin installed,
+you can try compiling with MingW32, by passing "-c mingw32" to setup.py.""")
+
+        if version >= 9.0:
+            self.set_macro("FrameworkVersion", self.vsbase, "clr version")
+            self.set_macro("WindowsSdkDir", WINSDK_BASE, "currentinstallfolder")
+        else:
+            p = r"Software\Microsoft\NET Framework Setup\Product"
+            for base in HKEYS:
+                try:
+                    h = RegOpenKeyEx(base, p)
+                except RegError:
+                    continue
+                key = RegEnumKey(h, 0)
+                d = Reg.get_value(base, r"%s\%s" % (p, key))
+                self.macros["$(FrameworkVersion)"] = d["version"]
+
+    def sub(self, s):
+        for k, v in self.macros.items():
+            s = s.replace(k, v)
+        return s
+
+def get_build_version():
+    """Return the version of MSVC that was used to build Python.
+
+    For Python 2.3 and up, the version number is included in
+    sys.version.  For earlier versions, assume the compiler is MSVC 6.
+    """
+    prefix = "MSC v."
+    i = sys.version.find(prefix)
+    if i == -1:
+        return 6
+    i = i + len(prefix)
+    s, rest = sys.version[i:].split(" ", 1)
+    majorVersion = int(s[:-2]) - 6
+    if majorVersion >= 13:
+        # v13 was skipped and should be v14
+        majorVersion += 1
+    minorVersion = int(s[2:3]) / 10.0
+    # I don't think paths are affected by minor version in version 6
+    if majorVersion == 6:
+        minorVersion = 0
+    if majorVersion >= 6:
+        return majorVersion + minorVersion
+    # else we don't know what version of the compiler this is
+    return None
+
+def normalize_and_reduce_paths(paths):
+    """Return a list of normalized paths with duplicates removed.
+
+    The current order of paths is maintained.
+    """
+    # Paths are normalized so things like:  /a and /a/ aren't both preserved.
+    reduced_paths = []
+    for p in paths:
+        np = os.path.normpath(p)
+        # XXX(nnorwitz): O(n**2), if reduced_paths gets long perhaps use a set.
+        if np not in reduced_paths:
+            reduced_paths.append(np)
+    return reduced_paths
+
+def removeDuplicates(variable):
+    """Remove duplicate values of an environment variable.
+    """
+    oldList = variable.split(os.pathsep)
+    newList = []
+    for i in oldList:
+        if i not in newList:
+            newList.append(i)
+    newVariable = os.pathsep.join(newList)
+    return newVariable
+
+def find_vcvarsall(version):
+    """Find the vcvarsall.bat file
+
+    At first it tries to find the productdir of VS 2008 in the registry. If
+    that fails it falls back to the VS90COMNTOOLS env var.
+    """
+    vsbase = VS_BASE % version
+    try:
+        productdir = Reg.get_value(r"%s\Setup\VC" % vsbase,
+                                   "productdir")
+    except KeyError:
+        log.debug("Unable to find productdir in registry")
+        productdir = None
+
+    if not productdir or not os.path.isdir(productdir):
+        toolskey = "VS%0.f0COMNTOOLS" % version
+        toolsdir = os.environ.get(toolskey, None)
+
+        if toolsdir and os.path.isdir(toolsdir):
+            productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")
+            productdir = os.path.abspath(productdir)
+            if not os.path.isdir(productdir):
+                log.debug("%s is not a valid directory" % productdir)
+                return None
+        else:
+            log.debug("Env var %s is not set or invalid" % toolskey)
+    if not productdir:
+        log.debug("No productdir found")
+        return None
+    vcvarsall = os.path.join(productdir, "vcvarsall.bat")
+    if os.path.isfile(vcvarsall):
+        return vcvarsall
+    log.debug("Unable to find vcvarsall.bat")
+    return None
+
+def query_vcvarsall(version, arch="x86"):
+    """Launch vcvarsall.bat and read the settings from its environment
+    """
+    vcvarsall = find_vcvarsall(version)
+    interesting = {"include", "lib", "libpath", "path"}
+    result = {}
+
+    if vcvarsall is None:
+        raise DistutilsPlatformError("Unable to find vcvarsall.bat")
+    log.debug("Calling 'vcvarsall.bat %s' (version=%s)", arch, version)
+    popen = subprocess.Popen('"%s" %s & set' % (vcvarsall, arch),
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE)
+    try:
+        stdout, stderr = popen.communicate()
+        if popen.wait() != 0:
+            raise DistutilsPlatformError(stderr.decode("mbcs"))
+
+        stdout = stdout.decode("mbcs")
+        for line in stdout.split("\n"):
+            line = Reg.convert_mbcs(line)
+            if '=' not in line:
+                continue
+            line = line.strip()
+            key, value = line.split('=', 1)
+            key = key.lower()
+            if key in interesting:
+                if value.endswith(os.pathsep):
+                    value = value[:-1]
+                result[key] = removeDuplicates(value)
+
+    finally:
+        popen.stdout.close()
+        popen.stderr.close()
+
+    if len(result) != len(interesting):
+        raise ValueError(str(list(result.keys())))
+
+    return result
+
+# More globals
+VERSION = get_build_version()
+if VERSION < 8.0:
+    raise DistutilsPlatformError("VC %0.1f is not supported by this module" % VERSION)
+# MACROS = MacroExpander(VERSION)
+
+class MSVCCompiler(CCompiler) :
+    """Concrete class that implements an interface to Microsoft Visual C++,
+       as defined by the CCompiler abstract class."""
+
+    compiler_type = 'msvc'
+
+    # Just set this so CCompiler's constructor doesn't barf.  We currently
+    # don't use the 'set_executables()' bureaucracy provided by CCompiler,
+    # as it really isn't necessary for this sort of single-compiler class.
+    # Would be nice to have a consistent interface with UnixCCompiler,
+    # though, so it's worth thinking about.
+    executables = {}
+
+    # Private class data (need to distinguish C from C++ source for compiler)
+    _c_extensions = ['.c']
+    _cpp_extensions = ['.cc', '.cpp', '.cxx']
+    _rc_extensions = ['.rc']
+    _mc_extensions = ['.mc']
+
+    # Needed for the filename generation methods provided by the
+    # base class, CCompiler.
+    src_extensions = (_c_extensions + _cpp_extensions +
+                      _rc_extensions + _mc_extensions)
+    res_extension = '.res'
+    obj_extension = '.obj'
+    static_lib_extension = '.lib'
+    shared_lib_extension = '.dll'
+    static_lib_format = shared_lib_format = '%s%s'
+    exe_extension = '.exe'
+
+    def __init__(self, verbose=0, dry_run=0, force=0):
+        CCompiler.__init__ (self, verbose, dry_run, force)
+        self.__version = VERSION
+        self.__root = r"Software\Microsoft\VisualStudio"
+        # self.__macros = MACROS
+        self.__paths = []
+        # target platform (.plat_name is consistent with 'bdist')
+        self.plat_name = None
+        self.__arch = None # deprecated name
+        self.initialized = False
+
+    def initialize(self, plat_name=None):
+        # multi-init means we would need to check platform same each time...
+        assert not self.initialized, "don't init multiple times"
+        if plat_name is None:
+            plat_name = get_platform()
+        # sanity check for platforms to prevent obscure errors later.
+        ok_plats = 'win32', 'win-amd64'
+        if plat_name not in ok_plats:
+            raise DistutilsPlatformError("--plat-name must be one of %s" %
+                                         (ok_plats,))
+
+        if "DISTUTILS_USE_SDK" in os.environ and "MSSdk" in os.environ and self.find_exe("cl.exe"):
+            # Assume that the SDK set up everything alright; don't try to be
+            # smarter
+            self.cc = "cl.exe"
+            self.linker = "link.exe"
+            self.lib = "lib.exe"
+            self.rc = "rc.exe"
+            self.mc = "mc.exe"
+        else:
+            # On x86, 'vcvars32.bat amd64' creates an env that doesn't work;
+            # to cross compile, you use 'x86_amd64'.
+            # On AMD64, 'vcvars32.bat amd64' is a native build env; to cross
+            # compile use 'x86' (ie, it runs the x86 compiler directly)
+            if plat_name == get_platform() or plat_name == 'win32':
+                # native build or cross-compile to win32
+                plat_spec = PLAT_TO_VCVARS[plat_name]
+            else:
+                # cross compile from win32 -> some 64bit
+                plat_spec = PLAT_TO_VCVARS[get_platform()] + '_' + \
+                            PLAT_TO_VCVARS[plat_name]
+
+            vc_env = query_vcvarsall(VERSION, plat_spec)
+
+            self.__paths = vc_env['path'].split(os.pathsep)
+            os.environ['lib'] = vc_env['lib']
+            os.environ['include'] = vc_env['include']
+
+            if len(self.__paths) == 0:
+                raise DistutilsPlatformError("Python was built with %s, "
+                       "and extensions need to be built with the same "
+                       "version of the compiler, but it isn't installed."
+                       % self.__product)
+
+            self.cc = self.find_exe("cl.exe")
+            self.linker = self.find_exe("link.exe")
+            self.lib = self.find_exe("lib.exe")
+            self.rc = self.find_exe("rc.exe")   # resource compiler
+            self.mc = self.find_exe("mc.exe")   # message compiler
+            #self.set_path_env_var('lib')
+            #self.set_path_env_var('include')
+
+        # extend the MSVC path with the current path
+        try:
+            for p in os.environ['path'].split(';'):
+                self.__paths.append(p)
+        except KeyError:
+            pass
+        self.__paths = normalize_and_reduce_paths(self.__paths)
+        os.environ['path'] = ";".join(self.__paths)
+
+        self.preprocess_options = None
+        if self.__arch == "x86":
+            self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3',
+                                     '/DNDEBUG']
+            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3',
+                                          '/Z7', '/D_DEBUG']
+        else:
+            # Win64
+            self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GS-' ,
+                                     '/DNDEBUG']
+            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GS-',
+                                          '/Z7', '/D_DEBUG']
+
+        self.ldflags_shared = ['/DLL', '/nologo', '/INCREMENTAL:NO']
+        if self.__version >= 7:
+            self.ldflags_shared_debug = [
+                '/DLL', '/nologo', '/INCREMENTAL:no', '/DEBUG'
+                ]
+        self.ldflags_static = [ '/nologo']
+
+        self.initialized = True
+
+    # -- Worker methods ------------------------------------------------
+
+    def object_filenames(self,
+                         source_filenames,
+                         strip_dir=0,
+                         output_dir=''):
+        # Copied from ccompiler.py, extended to return .res as 'object'-file
+        # for .rc input file
+        if output_dir is None: output_dir = ''
+        obj_names = []
+        for src_name in source_filenames:
+            (base, ext) = os.path.splitext (src_name)
+            base = os.path.splitdrive(base)[1] # Chop off the drive
+            base = base[os.path.isabs(base):]  # If abs, chop off leading /
+            if ext not in self.src_extensions:
+                # Better to raise an exception instead of silently continuing
+                # and later complain about sources and targets having
+                # different lengths
+                raise CompileError ("Don't know how to compile %s" % src_name)
+            if strip_dir:
+                base = os.path.basename (base)
+            if ext in self._rc_extensions:
+                obj_names.append (os.path.join (output_dir,
+                                                base + self.res_extension))
+            elif ext in self._mc_extensions:
+                obj_names.append (os.path.join (output_dir,
+                                                base + self.res_extension))
+            else:
+                obj_names.append (os.path.join (output_dir,
+                                                base + self.obj_extension))
+        return obj_names
+
+
+    def compile(self, sources,
+                output_dir=None, macros=None, include_dirs=None, debug=0,
+                extra_preargs=None, extra_postargs=None, depends=None):
+
+        if not self.initialized:
+            self.initialize()
+        compile_info = self._setup_compile(output_dir, macros, include_dirs,
+                                           sources, depends, extra_postargs)
+        macros, objects, extra_postargs, pp_opts, build = compile_info
+
+        compile_opts = extra_preargs or []
+        compile_opts.append ('/c')
+        if debug:
+            compile_opts.extend(self.compile_options_debug)
+        else:
+            compile_opts.extend(self.compile_options)
+
+        for obj in objects:
+            try:
+                src, ext = build[obj]
+            except KeyError:
+                continue
+            if debug:
+                # pass the full pathname to MSVC in debug mode,
+                # this allows the debugger to find the source file
+                # without asking the user to browse for it
+                src = os.path.abspath(src)
+
+            if ext in self._c_extensions:
+                input_opt = "/Tc" + src
+            elif ext in self._cpp_extensions:
+                input_opt = "/Tp" + src
+            elif ext in self._rc_extensions:
+                # compile .RC to .RES file
+                input_opt = src
+                output_opt = "/fo" + obj
+                try:
+                    self.spawn([self.rc] + pp_opts +
+                               [output_opt] + [input_opt])
+                except DistutilsExecError as msg:
+                    raise CompileError(msg)
+                continue
+            elif ext in self._mc_extensions:
+                # Compile .MC to .RC file to .RES file.
+                #   * '-h dir' specifies the directory for the
+                #     generated include file
+                #   * '-r dir' specifies the target directory of the
+                #     generated RC file and the binary message resource
+                #     it includes
+                #
+                # For now (since there are no options to change this),
+                # we use the source-directory for the include file and
+                # the build directory for the RC file and message
+                # resources. This works at least for win32all.
+                h_dir = os.path.dirname(src)
+                rc_dir = os.path.dirname(obj)
+                try:
+                    # first compile .MC to .RC and .H file
+                    self.spawn([self.mc] +
+                               ['-h', h_dir, '-r', rc_dir] + [src])
+                    base, _ = os.path.splitext (os.path.basename (src))
+                    rc_file = os.path.join (rc_dir, base + '.rc')
+                    # then compile .RC to .RES file
+                    self.spawn([self.rc] +
+                               ["/fo" + obj] + [rc_file])
+
+                except DistutilsExecError as msg:
+                    raise CompileError(msg)
+                continue
+            else:
+                # how to handle this file?
+                raise CompileError("Don't know how to compile %s to %s"
+                                   % (src, obj))
+
+            output_opt = "/Fo" + obj
+            try:
+                self.spawn([self.cc] + compile_opts + pp_opts +
+                           [input_opt, output_opt] +
+                           extra_postargs)
+            except DistutilsExecError as msg:
+                raise CompileError(msg)
+
+        return objects
+
+
+    def create_static_lib(self,
+                          objects,
+                          output_libname,
+                          output_dir=None,
+                          debug=0,
+                          target_lang=None):
+
+        if not self.initialized:
+            self.initialize()
+        (objects, output_dir) = self._fix_object_args(objects, output_dir)
+        output_filename = self.library_filename(output_libname,
+                                                output_dir=output_dir)
+
+        if self._need_link(objects, output_filename):
+            lib_args = objects + ['/OUT:' + output_filename]
+            if debug:
+                pass # XXX what goes here?
+            try:
+                self.spawn([self.lib] + lib_args)
+            except DistutilsExecError as msg:
+                raise LibError(msg)
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+
+    def link(self,
+             target_desc,
+             objects,
+             output_filename,
+             output_dir=None,
+             libraries=None,
+             library_dirs=None,
+             runtime_library_dirs=None,
+             export_symbols=None,
+             debug=0,
+             extra_preargs=None,
+             extra_postargs=None,
+             build_temp=None,
+             target_lang=None):
+
+        if not self.initialized:
+            self.initialize()
+        (objects, output_dir) = self._fix_object_args(objects, output_dir)
+        fixed_args = self._fix_lib_args(libraries, library_dirs,
+                                        runtime_library_dirs)
+        (libraries, library_dirs, runtime_library_dirs) = fixed_args
+
+        if runtime_library_dirs:
+            self.warn ("I don't know what to do with 'runtime_library_dirs': "
+                       + str (runtime_library_dirs))
+
+        lib_opts = gen_lib_options(self,
+                                   library_dirs, runtime_library_dirs,
+                                   libraries)
+        if output_dir is not None:
+            output_filename = os.path.join(output_dir, output_filename)
+
+        if self._need_link(objects, output_filename):
+            if target_desc == CCompiler.EXECUTABLE:
+                if debug:
+                    ldflags = self.ldflags_shared_debug[1:]
+                else:
+                    ldflags = self.ldflags_shared[1:]
+            else:
+                if debug:
+                    ldflags = self.ldflags_shared_debug
+                else:
+                    ldflags = self.ldflags_shared
+
+            export_opts = []
+            for sym in (export_symbols or []):
+                export_opts.append("/EXPORT:" + sym)
+
+            ld_args = (ldflags + lib_opts + export_opts +
+                       objects + ['/OUT:' + output_filename])
+
+            # The MSVC linker generates .lib and .exp files, which cannot be
+            # suppressed by any linker switches. The .lib files may even be
+            # needed! Make sure they are generated in the temporary build
+            # directory. Since they have different names for debug and release
+            # builds, they can go into the same directory.
+            build_temp = os.path.dirname(objects[0])
+            if export_symbols is not None:
+                (dll_name, dll_ext) = os.path.splitext(
+                    os.path.basename(output_filename))
+                implib_file = os.path.join(
+                    build_temp,
+                    self.library_filename(dll_name))
+                ld_args.append ('/IMPLIB:' + implib_file)
+
+            self.manifest_setup_ldargs(output_filename, build_temp, ld_args)
+
+            if extra_preargs:
+                ld_args[:0] = extra_preargs
+            if extra_postargs:
+                ld_args.extend(extra_postargs)
+
+            self.mkpath(os.path.dirname(output_filename))
+            try:
+                self.spawn([self.linker] + ld_args)
+            except DistutilsExecError as msg:
+                raise LinkError(msg)
+
+            # embed the manifest
+            # XXX - this is somewhat fragile - if mt.exe fails, distutils
+            # will still consider the DLL up-to-date, but it will not have a
+            # manifest.  Maybe we should link to a temp file?  OTOH, that
+            # implies a build environment error that shouldn't go undetected.
+            mfinfo = self.manifest_get_embed_info(target_desc, ld_args)
+            if mfinfo is not None:
+                mffilename, mfid = mfinfo
+                out_arg = '-outputresource:%s;%s' % (output_filename, mfid)
+                try:
+                    self.spawn(['mt.exe', '-nologo', '-manifest',
+                                mffilename, out_arg])
+                except DistutilsExecError as msg:
+                    raise LinkError(msg)
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+    def manifest_setup_ldargs(self, output_filename, build_temp, ld_args):
+        # If we need a manifest at all, an embedded manifest is recommended.
+        # See MSDN article titled
+        # "How to: Embed a Manifest Inside a C/C++ Application"
+        # (currently at http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx)
+        # Ask the linker to generate the manifest in the temp dir, so
+        # we can check it, and possibly embed it, later.
+        temp_manifest = os.path.join(
+                build_temp,
+                os.path.basename(output_filename) + ".manifest")
+        ld_args.append('/MANIFESTFILE:' + temp_manifest)
+
+    def manifest_get_embed_info(self, target_desc, ld_args):
+        # If a manifest should be embedded, return a tuple of
+        # (manifest_filename, resource_id).  Returns None if no manifest
+        # should be embedded.  See http://bugs.python.org/issue7833 for why
+        # we want to avoid any manifest for extension modules if we can)
+        for arg in ld_args:
+            if arg.startswith("/MANIFESTFILE:"):
+                temp_manifest = arg.split(":", 1)[1]
+                break
+        else:
+            # no /MANIFESTFILE so nothing to do.
+            return None
+        if target_desc == CCompiler.EXECUTABLE:
+            # by default, executables always get the manifest with the
+            # CRT referenced.
+            mfid = 1
+        else:
+            # Extension modules try and avoid any manifest if possible.
+            mfid = 2
+            temp_manifest = self._remove_visual_c_ref(temp_manifest)
+        if temp_manifest is None:
+            return None
+        return temp_manifest, mfid
+
+    def _remove_visual_c_ref(self, manifest_file):
+        try:
+            # Remove references to the Visual C runtime, so they will
+            # fall through to the Visual C dependency of Python.exe.
+            # This way, when installed for a restricted user (e.g.
+            # runtimes are not in WinSxS folder, but in Python's own
+            # folder), the runtimes do not need to be in every folder
+            # with .pyd's.
+            # Returns either the filename of the modified manifest or
+            # None if no manifest should be embedded.
+            manifest_f = open(manifest_file)
+            try:
+                manifest_buf = manifest_f.read()
+            finally:
+                manifest_f.close()
+            pattern = re.compile(
+                r"""<assemblyIdentity.*?name=("|')Microsoft\."""\
+                r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""",
+                re.DOTALL)
+            manifest_buf = re.sub(pattern, "", manifest_buf)
+            pattern = r"<dependentAssembly>\s*</dependentAssembly>"
+            manifest_buf = re.sub(pattern, "", manifest_buf)
+            # Now see if any other assemblies are referenced - if not, we
+            # don't want a manifest embedded.
+            pattern = re.compile(
+                r"""<assemblyIdentity.*?name=(?:"|')(.+?)(?:"|')"""
+                r""".*?(?:/>|</assemblyIdentity>)""", re.DOTALL)
+            if re.search(pattern, manifest_buf) is None:
+                return None
+
+            manifest_f = open(manifest_file, 'w')
+            try:
+                manifest_f.write(manifest_buf)
+                return manifest_file
+            finally:
+                manifest_f.close()
+        except OSError:
+            pass
+
+    # -- Miscellaneous methods -----------------------------------------
+    # These are all used by the 'gen_lib_options() function, in
+    # ccompiler.py.
+
+    def library_dir_option(self, dir):
+        return "/LIBPATH:" + dir
+
+    def runtime_library_dir_option(self, dir):
+        raise DistutilsPlatformError(
+              "don't know how to set runtime library search path for MSVC++")
+
+    def library_option(self, lib):
+        return self.library_filename(lib)
+
+
+    def find_library_file(self, dirs, lib, debug=0):
+        # Prefer a debugging library if found (and requested), but deal
+        # with it if we don't have one.
+        if debug:
+            try_names = [lib + "_d", lib]
+        else:
+            try_names = [lib]
+        for dir in dirs:
+            for name in try_names:
+                libfile = os.path.join(dir, self.library_filename (name))
+                if os.path.exists(libfile):
+                    return libfile
+        else:
+            # Oops, didn't find it in *any* of 'dirs'
+            return None
+
+    # Helper methods for using the MSVC registry settings
+
+    def find_exe(self, exe):
+        """Return path to an MSVC executable program.
+
+        Tries to find the program in several places: first, one of the
+        MSVC program search paths from the registry; next, the directories
+        in the PATH environment variable.  If any of those work, return an
+        absolute path that is known to exist.  If none of them work, just
+        return the original program name, 'exe'.
+        """
+        for p in self.__paths:
+            fn = os.path.join(os.path.abspath(p), exe)
+            if os.path.isfile(fn):
+                return fn
+
+        # didn't find it; try existing path
+        for p in os.environ['Path'].split(';'):
+            fn = os.path.join(os.path.abspath(p),exe)
+            if os.path.isfile(fn):
+                return fn
+
+        return exe
diff --git a/venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py b/venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py
new file mode 100644
index 0000000..d5857cb
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py
@@ -0,0 +1,643 @@
+"""distutils.msvccompiler
+
+Contains MSVCCompiler, an implementation of the abstract CCompiler class
+for the Microsoft Visual Studio.
+"""
+
+# Written by Perry Stoll
+# hacked by Robin Becker and Thomas Heller to do a better job of
+#   finding DevStudio (through the registry)
+
+import sys, os
+from distutils.errors import \
+     DistutilsExecError, DistutilsPlatformError, \
+     CompileError, LibError, LinkError
+from distutils.ccompiler import \
+     CCompiler, gen_lib_options
+from distutils import log
+
+_can_read_reg = False
+try:
+    import winreg
+
+    _can_read_reg = True
+    hkey_mod = winreg
+
+    RegOpenKeyEx = winreg.OpenKeyEx
+    RegEnumKey = winreg.EnumKey
+    RegEnumValue = winreg.EnumValue
+    RegError = winreg.error
+
+except ImportError:
+    try:
+        import win32api
+        import win32con
+        _can_read_reg = True
+        hkey_mod = win32con
+
+        RegOpenKeyEx = win32api.RegOpenKeyEx
+        RegEnumKey = win32api.RegEnumKey
+        RegEnumValue = win32api.RegEnumValue
+        RegError = win32api.error
+    except ImportError:
+        log.info("Warning: Can't read registry to find the "
+                 "necessary compiler setting\n"
+                 "Make sure that Python modules winreg, "
+                 "win32api or win32con are installed.")
+        pass
+
+if _can_read_reg:
+    HKEYS = (hkey_mod.HKEY_USERS,
+             hkey_mod.HKEY_CURRENT_USER,
+             hkey_mod.HKEY_LOCAL_MACHINE,
+             hkey_mod.HKEY_CLASSES_ROOT)
+
+def read_keys(base, key):
+    """Return list of registry keys."""
+    try:
+        handle = RegOpenKeyEx(base, key)
+    except RegError:
+        return None
+    L = []
+    i = 0
+    while True:
+        try:
+            k = RegEnumKey(handle, i)
+        except RegError:
+            break
+        L.append(k)
+        i += 1
+    return L
+
+def read_values(base, key):
+    """Return dict of registry keys and values.
+
+    All names are converted to lowercase.
+    """
+    try:
+        handle = RegOpenKeyEx(base, key)
+    except RegError:
+        return None
+    d = {}
+    i = 0
+    while True:
+        try:
+            name, value, type = RegEnumValue(handle, i)
+        except RegError:
+            break
+        name = name.lower()
+        d[convert_mbcs(name)] = convert_mbcs(value)
+        i += 1
+    return d
+
+def convert_mbcs(s):
+    dec = getattr(s, "decode", None)
+    if dec is not None:
+        try:
+            s = dec("mbcs")
+        except UnicodeError:
+            pass
+    return s
+
+class MacroExpander:
+    def __init__(self, version):
+        self.macros = {}
+        self.load_macros(version)
+
+    def set_macro(self, macro, path, key):
+        for base in HKEYS:
+            d = read_values(base, path)
+            if d:
+                self.macros["$(%s)" % macro] = d[key]
+                break
+
+    def load_macros(self, version):
+        vsbase = r"Software\Microsoft\VisualStudio\%0.1f" % version
+        self.set_macro("VCInstallDir", vsbase + r"\Setup\VC", "productdir")
+        self.set_macro("VSInstallDir", vsbase + r"\Setup\VS", "productdir")
+        net = r"Software\Microsoft\.NETFramework"
+        self.set_macro("FrameworkDir", net, "installroot")
+        try:
+            if version > 7.0:
+                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1")
+            else:
+                self.set_macro("FrameworkSDKDir", net, "sdkinstallroot")
+        except KeyError as exc: #
+            raise DistutilsPlatformError(
+            """Python was built with Visual Studio 2003;
+extensions must be built with a compiler than can generate compatible binaries.
+Visual Studio 2003 was not found on this system. If you have Cygwin installed,
+you can try compiling with MingW32, by passing "-c mingw32" to setup.py.""")
+
+        p = r"Software\Microsoft\NET Framework Setup\Product"
+        for base in HKEYS:
+            try:
+                h = RegOpenKeyEx(base, p)
+            except RegError:
+                continue
+            key = RegEnumKey(h, 0)
+            d = read_values(base, r"%s\%s" % (p, key))
+            self.macros["$(FrameworkVersion)"] = d["version"]
+
+    def sub(self, s):
+        for k, v in self.macros.items():
+            s = s.replace(k, v)
+        return s
+
+def get_build_version():
+    """Return the version of MSVC that was used to build Python.
+
+    For Python 2.3 and up, the version number is included in
+    sys.version.  For earlier versions, assume the compiler is MSVC 6.
+    """
+    prefix = "MSC v."
+    i = sys.version.find(prefix)
+    if i == -1:
+        return 6
+    i = i + len(prefix)
+    s, rest = sys.version[i:].split(" ", 1)
+    majorVersion = int(s[:-2]) - 6
+    if majorVersion >= 13:
+        # v13 was skipped and should be v14
+        majorVersion += 1
+    minorVersion = int(s[2:3]) / 10.0
+    # I don't think paths are affected by minor version in version 6
+    if majorVersion == 6:
+        minorVersion = 0
+    if majorVersion >= 6:
+        return majorVersion + minorVersion
+    # else we don't know what version of the compiler this is
+    return None
+
+def get_build_architecture():
+    """Return the processor architecture.
+
+    Possible results are "Intel" or "AMD64".
+    """
+
+    prefix = " bit ("
+    i = sys.version.find(prefix)
+    if i == -1:
+        return "Intel"
+    j = sys.version.find(")", i)
+    return sys.version[i+len(prefix):j]
+
+def normalize_and_reduce_paths(paths):
+    """Return a list of normalized paths with duplicates removed.
+
+    The current order of paths is maintained.
+    """
+    # Paths are normalized so things like:  /a and /a/ aren't both preserved.
+    reduced_paths = []
+    for p in paths:
+        np = os.path.normpath(p)
+        # XXX(nnorwitz): O(n**2), if reduced_paths gets long perhaps use a set.
+        if np not in reduced_paths:
+            reduced_paths.append(np)
+    return reduced_paths
+
+
+class MSVCCompiler(CCompiler) :
+    """Concrete class that implements an interface to Microsoft Visual C++,
+       as defined by the CCompiler abstract class."""
+
+    compiler_type = 'msvc'
+
+    # Just set this so CCompiler's constructor doesn't barf.  We currently
+    # don't use the 'set_executables()' bureaucracy provided by CCompiler,
+    # as it really isn't necessary for this sort of single-compiler class.
+    # Would be nice to have a consistent interface with UnixCCompiler,
+    # though, so it's worth thinking about.
+    executables = {}
+
+    # Private class data (need to distinguish C from C++ source for compiler)
+    _c_extensions = ['.c']
+    _cpp_extensions = ['.cc', '.cpp', '.cxx']
+    _rc_extensions = ['.rc']
+    _mc_extensions = ['.mc']
+
+    # Needed for the filename generation methods provided by the
+    # base class, CCompiler.
+    src_extensions = (_c_extensions + _cpp_extensions +
+                      _rc_extensions + _mc_extensions)
+    res_extension = '.res'
+    obj_extension = '.obj'
+    static_lib_extension = '.lib'
+    shared_lib_extension = '.dll'
+    static_lib_format = shared_lib_format = '%s%s'
+    exe_extension = '.exe'
+
+    def __init__(self, verbose=0, dry_run=0, force=0):
+        CCompiler.__init__ (self, verbose, dry_run, force)
+        self.__version = get_build_version()
+        self.__arch = get_build_architecture()
+        if self.__arch == "Intel":
+            # x86
+            if self.__version >= 7:
+                self.__root = r"Software\Microsoft\VisualStudio"
+                self.__macros = MacroExpander(self.__version)
+            else:
+                self.__root = r"Software\Microsoft\Devstudio"
+            self.__product = "Visual Studio version %s" % self.__version
+        else:
+            # Win64. Assume this was built with the platform SDK
+            self.__product = "Microsoft SDK compiler %s" % (self.__version + 6)
+
+        self.initialized = False
+
+    def initialize(self):
+        self.__paths = []
+        if "DISTUTILS_USE_SDK" in os.environ and "MSSdk" in os.environ and self.find_exe("cl.exe"):
+            # Assume that the SDK set up everything alright; don't try to be
+            # smarter
+            self.cc = "cl.exe"
+            self.linker = "link.exe"
+            self.lib = "lib.exe"
+            self.rc = "rc.exe"
+            self.mc = "mc.exe"
+        else:
+            self.__paths = self.get_msvc_paths("path")
+
+            if len(self.__paths) == 0:
+                raise DistutilsPlatformError("Python was built with %s, "
+                       "and extensions need to be built with the same "
+                       "version of the compiler, but it isn't installed."
+                       % self.__product)
+
+            self.cc = self.find_exe("cl.exe")
+            self.linker = self.find_exe("link.exe")
+            self.lib = self.find_exe("lib.exe")
+            self.rc = self.find_exe("rc.exe")   # resource compiler
+            self.mc = self.find_exe("mc.exe")   # message compiler
+            self.set_path_env_var('lib')
+            self.set_path_env_var('include')
+
+        # extend the MSVC path with the current path
+        try:
+            for p in os.environ['path'].split(';'):
+                self.__paths.append(p)
+        except KeyError:
+            pass
+        self.__paths = normalize_and_reduce_paths(self.__paths)
+        os.environ['path'] = ";".join(self.__paths)
+
+        self.preprocess_options = None
+        if self.__arch == "Intel":
+            self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GX' ,
+                                     '/DNDEBUG']
+            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GX',
+                                          '/Z7', '/D_DEBUG']
+        else:
+            # Win64
+            self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GS-' ,
+                                     '/DNDEBUG']
+            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GS-',
+                                          '/Z7', '/D_DEBUG']
+
+        self.ldflags_shared = ['/DLL', '/nologo', '/INCREMENTAL:NO']
+        if self.__version >= 7:
+            self.ldflags_shared_debug = [
+                '/DLL', '/nologo', '/INCREMENTAL:no', '/DEBUG'
+                ]
+        else:
+            self.ldflags_shared_debug = [
+                '/DLL', '/nologo', '/INCREMENTAL:no', '/pdb:None', '/DEBUG'
+                ]
+        self.ldflags_static = [ '/nologo']
+
+        self.initialized = True
+
+    # -- Worker methods ------------------------------------------------
+
+    def object_filenames(self,
+                         source_filenames,
+                         strip_dir=0,
+                         output_dir=''):
+        # Copied from ccompiler.py, extended to return .res as 'object'-file
+        # for .rc input file
+        if output_dir is None: output_dir = ''
+        obj_names = []
+        for src_name in source_filenames:
+            (base, ext) = os.path.splitext (src_name)
+            base = os.path.splitdrive(base)[1] # Chop off the drive
+            base = base[os.path.isabs(base):]  # If abs, chop off leading /
+            if ext not in self.src_extensions:
+                # Better to raise an exception instead of silently continuing
+                # and later complain about sources and targets having
+                # different lengths
+                raise CompileError ("Don't know how to compile %s" % src_name)
+            if strip_dir:
+                base = os.path.basename (base)
+            if ext in self._rc_extensions:
+                obj_names.append (os.path.join (output_dir,
+                                                base + self.res_extension))
+            elif ext in self._mc_extensions:
+                obj_names.append (os.path.join (output_dir,
+                                                base + self.res_extension))
+            else:
+                obj_names.append (os.path.join (output_dir,
+                                                base + self.obj_extension))
+        return obj_names
+
+
+    def compile(self, sources,
+                output_dir=None, macros=None, include_dirs=None, debug=0,
+                extra_preargs=None, extra_postargs=None, depends=None):
+
+        if not self.initialized:
+            self.initialize()
+        compile_info = self._setup_compile(output_dir, macros, include_dirs,
+                                           sources, depends, extra_postargs)
+        macros, objects, extra_postargs, pp_opts, build = compile_info
+
+        compile_opts = extra_preargs or []
+        compile_opts.append ('/c')
+        if debug:
+            compile_opts.extend(self.compile_options_debug)
+        else:
+            compile_opts.extend(self.compile_options)
+
+        for obj in objects:
+            try:
+                src, ext = build[obj]
+            except KeyError:
+                continue
+            if debug:
+                # pass the full pathname to MSVC in debug mode,
+                # this allows the debugger to find the source file
+                # without asking the user to browse for it
+                src = os.path.abspath(src)
+
+            if ext in self._c_extensions:
+                input_opt = "/Tc" + src
+            elif ext in self._cpp_extensions:
+                input_opt = "/Tp" + src
+            elif ext in self._rc_extensions:
+                # compile .RC to .RES file
+                input_opt = src
+                output_opt = "/fo" + obj
+                try:
+                    self.spawn([self.rc] + pp_opts +
+                               [output_opt] + [input_opt])
+                except DistutilsExecError as msg:
+                    raise CompileError(msg)
+                continue
+            elif ext in self._mc_extensions:
+                # Compile .MC to .RC file to .RES file.
+                #   * '-h dir' specifies the directory for the
+                #     generated include file
+                #   * '-r dir' specifies the target directory of the
+                #     generated RC file and the binary message resource
+                #     it includes
+                #
+                # For now (since there are no options to change this),
+                # we use the source-directory for the include file and
+                # the build directory for the RC file and message
+                # resources. This works at least for win32all.
+                h_dir = os.path.dirname(src)
+                rc_dir = os.path.dirname(obj)
+                try:
+                    # first compile .MC to .RC and .H file
+                    self.spawn([self.mc] +
+                               ['-h', h_dir, '-r', rc_dir] + [src])
+                    base, _ = os.path.splitext (os.path.basename (src))
+                    rc_file = os.path.join (rc_dir, base + '.rc')
+                    # then compile .RC to .RES file
+                    self.spawn([self.rc] +
+                               ["/fo" + obj] + [rc_file])
+
+                except DistutilsExecError as msg:
+                    raise CompileError(msg)
+                continue
+            else:
+                # how to handle this file?
+                raise CompileError("Don't know how to compile %s to %s"
+                                   % (src, obj))
+
+            output_opt = "/Fo" + obj
+            try:
+                self.spawn([self.cc] + compile_opts + pp_opts +
+                           [input_opt, output_opt] +
+                           extra_postargs)
+            except DistutilsExecError as msg:
+                raise CompileError(msg)
+
+        return objects
+
+
+    def create_static_lib(self,
+                          objects,
+                          output_libname,
+                          output_dir=None,
+                          debug=0,
+                          target_lang=None):
+
+        if not self.initialized:
+            self.initialize()
+        (objects, output_dir) = self._fix_object_args(objects, output_dir)
+        output_filename = self.library_filename(output_libname,
+                                                output_dir=output_dir)
+
+        if self._need_link(objects, output_filename):
+            lib_args = objects + ['/OUT:' + output_filename]
+            if debug:
+                pass # XXX what goes here?
+            try:
+                self.spawn([self.lib] + lib_args)
+            except DistutilsExecError as msg:
+                raise LibError(msg)
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+
+    def link(self,
+             target_desc,
+             objects,
+             output_filename,
+             output_dir=None,
+             libraries=None,
+             library_dirs=None,
+             runtime_library_dirs=None,
+             export_symbols=None,
+             debug=0,
+             extra_preargs=None,
+             extra_postargs=None,
+             build_temp=None,
+             target_lang=None):
+
+        if not self.initialized:
+            self.initialize()
+        (objects, output_dir) = self._fix_object_args(objects, output_dir)
+        fixed_args = self._fix_lib_args(libraries, library_dirs,
+                                        runtime_library_dirs)
+        (libraries, library_dirs, runtime_library_dirs) = fixed_args
+
+        if runtime_library_dirs:
+            self.warn ("I don't know what to do with 'runtime_library_dirs': "
+                       + str (runtime_library_dirs))
+
+        lib_opts = gen_lib_options(self,
+                                   library_dirs, runtime_library_dirs,
+                                   libraries)
+        if output_dir is not None:
+            output_filename = os.path.join(output_dir, output_filename)
+
+        if self._need_link(objects, output_filename):
+            if target_desc == CCompiler.EXECUTABLE:
+                if debug:
+                    ldflags = self.ldflags_shared_debug[1:]
+                else:
+                    ldflags = self.ldflags_shared[1:]
+            else:
+                if debug:
+                    ldflags = self.ldflags_shared_debug
+                else:
+                    ldflags = self.ldflags_shared
+
+            export_opts = []
+            for sym in (export_symbols or []):
+                export_opts.append("/EXPORT:" + sym)
+
+            ld_args = (ldflags + lib_opts + export_opts +
+                       objects + ['/OUT:' + output_filename])
+
+            # The MSVC linker generates .lib and .exp files, which cannot be
+            # suppressed by any linker switches. The .lib files may even be
+            # needed! Make sure they are generated in the temporary build
+            # directory. Since they have different names for debug and release
+            # builds, they can go into the same directory.
+            if export_symbols is not None:
+                (dll_name, dll_ext) = os.path.splitext(
+                    os.path.basename(output_filename))
+                implib_file = os.path.join(
+                    os.path.dirname(objects[0]),
+                    self.library_filename(dll_name))
+                ld_args.append ('/IMPLIB:' + implib_file)
+
+            if extra_preargs:
+                ld_args[:0] = extra_preargs
+            if extra_postargs:
+                ld_args.extend(extra_postargs)
+
+            self.mkpath(os.path.dirname(output_filename))
+            try:
+                self.spawn([self.linker] + ld_args)
+            except DistutilsExecError as msg:
+                raise LinkError(msg)
+
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+
+    # -- Miscellaneous methods -----------------------------------------
+    # These are all used by the 'gen_lib_options() function, in
+    # ccompiler.py.
+
+    def library_dir_option(self, dir):
+        return "/LIBPATH:" + dir
+
+    def runtime_library_dir_option(self, dir):
+        raise DistutilsPlatformError(
+              "don't know how to set runtime library search path for MSVC++")
+
+    def library_option(self, lib):
+        return self.library_filename(lib)
+
+
+    def find_library_file(self, dirs, lib, debug=0):
+        # Prefer a debugging library if found (and requested), but deal
+        # with it if we don't have one.
+        if debug:
+            try_names = [lib + "_d", lib]
+        else:
+            try_names = [lib]
+        for dir in dirs:
+            for name in try_names:
+                libfile = os.path.join(dir, self.library_filename (name))
+                if os.path.exists(libfile):
+                    return libfile
+        else:
+            # Oops, didn't find it in *any* of 'dirs'
+            return None
+
+    # Helper methods for using the MSVC registry settings
+
+    def find_exe(self, exe):
+        """Return path to an MSVC executable program.
+
+        Tries to find the program in several places: first, one of the
+        MSVC program search paths from the registry; next, the directories
+        in the PATH environment variable.  If any of those work, return an
+        absolute path that is known to exist.  If none of them work, just
+        return the original program name, 'exe'.
+        """
+        for p in self.__paths:
+            fn = os.path.join(os.path.abspath(p), exe)
+            if os.path.isfile(fn):
+                return fn
+
+        # didn't find it; try existing path
+        for p in os.environ['Path'].split(';'):
+            fn = os.path.join(os.path.abspath(p),exe)
+            if os.path.isfile(fn):
+                return fn
+
+        return exe
+
+    def get_msvc_paths(self, path, platform='x86'):
+        """Get a list of devstudio directories (include, lib or path).
+
+        Return a list of strings.  The list will be empty if unable to
+        access the registry or appropriate registry keys not found.
+        """
+        if not _can_read_reg:
+            return []
+
+        path = path + " dirs"
+        if self.__version >= 7:
+            key = (r"%s\%0.1f\VC\VC_OBJECTS_PLATFORM_INFO\Win32\Directories"
+                   % (self.__root, self.__version))
+        else:
+            key = (r"%s\6.0\Build System\Components\Platforms"
+                   r"\Win32 (%s)\Directories" % (self.__root, platform))
+
+        for base in HKEYS:
+            d = read_values(base, key)
+            if d:
+                if self.__version >= 7:
+                    return self.__macros.sub(d[path]).split(";")
+                else:
+                    return d[path].split(";")
+        # MSVC 6 seems to create the registry entries we need only when
+        # the GUI is run.
+        if self.__version == 6:
+            for base in HKEYS:
+                if read_values(base, r"%s\6.0" % self.__root) is not None:
+                    self.warn("It seems you have Visual Studio 6 installed, "
+                        "but the expected registry settings are not present.\n"
+                        "You must at least run the Visual Studio GUI once "
+                        "so that these entries are created.")
+                    break
+        return []
+
+    def set_path_env_var(self, name):
+        """Set environment variable 'name' to an MSVC path type value.
+
+        This is equivalent to a SET command prior to execution of spawned
+        commands.
+        """
+
+        if name == "lib":
+            p = self.get_msvc_paths("library")
+        else:
+            p = self.get_msvc_paths(name)
+        if p:
+            os.environ[name] = ';'.join(p)
+
+
+if get_build_version() >= 8.0:
+    log.debug("Importing new compiler from distutils.msvc9compiler")
+    OldMSVCCompiler = MSVCCompiler
+    from distutils.msvc9compiler import MSVCCompiler
+    # get_build_architecture not really relevant now we support cross-compile
+    from distutils.msvc9compiler import MacroExpander
diff --git a/venv/Lib/site-packages/setuptools/_distutils/spawn.py b/venv/Lib/site-packages/setuptools/_distutils/spawn.py
new file mode 100644
index 0000000..fc592d4
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/spawn.py
@@ -0,0 +1,125 @@
+"""distutils.spawn
+
+Provides the 'spawn()' function, a front-end to various platform-
+specific functions for launching another program in a sub-process.
+Also provides the 'find_executable()' to search the path for a given
+executable name.
+"""
+
+import sys
+import os
+import subprocess
+
+from distutils.errors import DistutilsPlatformError, DistutilsExecError
+from distutils.debug import DEBUG
+from distutils import log
+
+
+if sys.platform == 'darwin':
+    _cfg_target = None
+    _cfg_target_split = None
+
+
+def spawn(cmd, search_path=1, verbose=0, dry_run=0, env=None):
+    """Run another program, specified as a command list 'cmd', in a new process.
+
+    'cmd' is just the argument list for the new process, ie.
+    cmd[0] is the program to run and cmd[1:] are the rest of its arguments.
+    There is no way to run a program with a name different from that of its
+    executable.
+
+    If 'search_path' is true (the default), the system's executable
+    search path will be used to find the program; otherwise, cmd[0]
+    must be the exact path to the executable.  If 'dry_run' is true,
+    the command will not actually be run.
+
+    Raise DistutilsExecError if running the program fails in any way; just
+    return on success.
+    """
+    # cmd is documented as a list, but just in case some code passes a tuple
+    # in, protect our %-formatting code against horrible death
+    cmd = list(cmd)
+
+    log.info(' '.join(cmd))
+    if dry_run:
+        return
+
+    if search_path:
+        executable = find_executable(cmd[0])
+        if executable is not None:
+            cmd[0] = executable
+
+    env = env if env is not None else dict(os.environ)
+
+    if sys.platform == 'darwin':
+        global _cfg_target, _cfg_target_split
+        if _cfg_target is None:
+            from distutils import sysconfig
+            _cfg_target = sysconfig.get_config_var(
+                                  'MACOSX_DEPLOYMENT_TARGET') or ''
+            if _cfg_target:
+                _cfg_target_split = [int(x) for x in _cfg_target.split('.')]
+        if _cfg_target:
+            # ensure that the deployment target of build process is not less
+            # than that used when the interpreter was built. This ensures
+            # extension modules are built with correct compatibility values
+            cur_target = os.environ.get('MACOSX_DEPLOYMENT_TARGET', _cfg_target)
+            if _cfg_target_split > [int(x) for x in cur_target.split('.')]:
+                my_msg = ('$MACOSX_DEPLOYMENT_TARGET mismatch: '
+                          'now "%s" but "%s" during configure'
+                                % (cur_target, _cfg_target))
+                raise DistutilsPlatformError(my_msg)
+            env.update(MACOSX_DEPLOYMENT_TARGET=cur_target)
+
+    try:
+        proc = subprocess.Popen(cmd, env=env)
+        proc.wait()
+        exitcode = proc.returncode
+    except OSError as exc:
+        if not DEBUG:
+            cmd = cmd[0]
+        raise DistutilsExecError(
+            "command %r failed: %s" % (cmd, exc.args[-1])) from exc
+
+    if exitcode:
+        if not DEBUG:
+            cmd = cmd[0]
+        raise DistutilsExecError(
+              "command %r failed with exit code %s" % (cmd, exitcode))
+
+
+def find_executable(executable, path=None):
+    """Tries to find 'executable' in the directories listed in 'path'.
+
+    A string listing directories separated by 'os.pathsep'; defaults to
+    os.environ['PATH'].  Returns the complete filename or None if not found.
+    """
+    _, ext = os.path.splitext(executable)
+    if (sys.platform == 'win32') and (ext != '.exe'):
+        executable = executable + '.exe'
+
+    if os.path.isfile(executable):
+        return executable
+
+    if path is None:
+        path = os.environ.get('PATH', None)
+        if path is None:
+            try:
+                path = os.confstr("CS_PATH")
+            except (AttributeError, ValueError):
+                # os.confstr() or CS_PATH is not available
+                path = os.defpath
+        # bpo-35755: Don't use os.defpath if the PATH environment variable is
+        # set to an empty string
+
+    # PATH='' doesn't match, whereas PATH=':' looks in the current directory
+    if not path:
+        return None
+
+    paths = path.split(os.pathsep)
+    for p in paths:
+        f = os.path.join(p, executable)
+        if os.path.isfile(f):
+            # the file exists, we have a shot at spawn working
+            return f
+    return None
diff --git a/venv/Lib/site-packages/setuptools/_distutils/sysconfig.py b/venv/Lib/site-packages/setuptools/_distutils/sysconfig.py
new file mode 100644
index 0000000..879b698
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/sysconfig.py
@@ -0,0 +1,573 @@
+"""Provide access to Python's configuration information.  The specific
+configuration variables available depend heavily on the platform and
+configuration.  The values may be retrieved using
+get_config_var(name), and the list of variables is available via
+get_config_vars().keys().  Additional convenience functions are also
+available.
+
+Written by:   Fred L. Drake, Jr.
+Email:        <fdrake@acm.org>
+"""
+
+import _imp
+import os
+import re
+import sys
+
+from .errors import DistutilsPlatformError
+
+IS_PYPY = '__pypy__' in sys.builtin_module_names
+
+# These are needed in a couple of spots, so just compute them once.
+PREFIX = os.path.normpath(sys.prefix)
+EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+BASE_PREFIX = os.path.normpath(sys.base_prefix)
+BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix)
+
+# Path to the base directory of the project. On Windows the binary may
+# live in project/PCbuild/win32 or project/PCbuild/amd64.
+# set for cross builds
+if "_PYTHON_PROJECT_BASE" in os.environ:
+    project_base = os.path.abspath(os.environ["_PYTHON_PROJECT_BASE"])
+else:
+    if sys.executable:
+        project_base = os.path.dirname(os.path.abspath(sys.executable))
+    else:
+        # sys.executable can be empty if argv[0] has been changed and Python is
+        # unable to retrieve the real program name
+        project_base = os.getcwd()
+
+
+# python_build: (Boolean) if true, we're either building Python or
+# building an extension with an un-installed Python, so we use
+# different (hard-wired) directories.
+def _is_python_source_dir(d):
+    for fn in ("Setup", "Setup.local"):
+        if os.path.isfile(os.path.join(d, "Modules", fn)):
+            return True
+    return False
+
+_sys_home = getattr(sys, '_home', None)
+
+if os.name == 'nt':
+    def _fix_pcbuild(d):
+        if d and os.path.normcase(d).startswith(
+                os.path.normcase(os.path.join(PREFIX, "PCbuild"))):
+            return PREFIX
+        return d
+    project_base = _fix_pcbuild(project_base)
+    _sys_home = _fix_pcbuild(_sys_home)
+
+def _python_build():
+    if _sys_home:
+        return _is_python_source_dir(_sys_home)
+    return _is_python_source_dir(project_base)
+
+python_build = _python_build()
+
+
+# Calculate the build qualifier flags if they are defined.  Adding the flags
+# to the include and lib directories only makes sense for an installation, not
+# an in-source build.
+build_flags = ''
+try:
+    if not python_build:
+        build_flags = sys.abiflags
+except AttributeError:
+    # It's not a configure-based build, so the sys module doesn't have
+    # this attribute, which is fine.
+    pass
+
+def get_python_version():
+    """Return a string containing the major and minor Python version,
+    leaving off the patchlevel.  Sample return values could be '1.5'
+    or '2.2'.
+    """
+    return '%d.%d' % sys.version_info[:2]
+
+
+def get_python_inc(plat_specific=0, prefix=None):
+    """Return the directory containing installed Python header files.
+
+    If 'plat_specific' is false (the default), this is the path to the
+    non-platform-specific header files, i.e. Python.h and so on;
+    otherwise, this is the path to platform-specific header files
+    (namely pyconfig.h).
+
+    If 'prefix' is supplied, use it instead of sys.base_prefix or
+    sys.base_exec_prefix -- i.e., ignore 'plat_specific'.
+    """
+    if prefix is None:
+        prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX
+    if IS_PYPY:
+        return os.path.join(prefix, 'include')
+    elif os.name == "posix":
+        if python_build:
+            # Assume the executable is in the build directory.  The
+            # pyconfig.h file should be in the same directory.  Since
+            # the build directory may not be the source directory, we
+            # must use "srcdir" from the makefile to find the "Include"
+            # directory.
+            if plat_specific:
+                return _sys_home or project_base
+            else:
+                incdir = os.path.join(get_config_var('srcdir'), 'Include')
+                return os.path.normpath(incdir)
+        python_dir = 'python' + get_python_version() + build_flags
+        return os.path.join(prefix, "include", python_dir)
+    elif os.name == "nt":
+        if python_build:
+            # Include both the include and PC dir to ensure we can find
+            # pyconfig.h
+            return (os.path.join(prefix, "include") + os.path.pathsep +
+                    os.path.join(prefix, "PC"))
+        return os.path.join(prefix, "include")
+    else:
+        raise DistutilsPlatformError(
+            "I don't know where Python installs its C header files "
+            "on platform '%s'" % os.name)
+
+
+def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
+    """Return the directory containing the Python library (standard or
+    site additions).
+
+    If 'plat_specific' is true, return the directory containing
+    platform-specific modules, i.e. any module from a non-pure-Python
+    module distribution; otherwise, return the platform-shared library
+    directory.  If 'standard_lib' is true, return the directory
+    containing standard Python library modules; otherwise, return the
+    directory for site-specific modules.
+
+    If 'prefix' is supplied, use it instead of sys.base_prefix or
+    sys.base_exec_prefix -- i.e., ignore 'plat_specific'.
+    """
+    if IS_PYPY:
+        # PyPy-specific schema
+        if prefix is None:
+            prefix = PREFIX
+        if standard_lib:
+            return os.path.join(prefix, "lib-python", sys.version[0])
+        return os.path.join(prefix, 'site-packages')
+
+    if prefix is None:
+        if standard_lib:
+            prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX
+        else:
+            prefix = plat_specific and EXEC_PREFIX or PREFIX
+
+    if os.name == "posix":
+        if plat_specific or standard_lib:
+            # Platform-specific modules (any module from a non-pure-Python
+            # module distribution) or standard Python library modules.
+            libdir = getattr(sys, "platlibdir", "lib")
+        else:
+            # Pure Python
+            libdir = "lib"
+        libpython = os.path.join(prefix, libdir,
+                                 "python" + get_python_version())
+        if standard_lib:
+            return libpython
+        else:
+            return os.path.join(libpython, "site-packages")
+    elif os.name == "nt":
+        if standard_lib:
+            return os.path.join(prefix, "Lib")
+        else:
+            return os.path.join(prefix, "Lib", "site-packages")
+    else:
+        raise DistutilsPlatformError(
+            "I don't know where Python installs its library "
+            "on platform '%s'" % os.name)
+
+
+
+def customize_compiler(compiler):
+    """Do any platform-specific customization of a CCompiler instance.
+
+    Mainly needed on Unix, so we can plug in the information that
+    varies across Unices and is stored in Python's Makefile.
+    """
+    if compiler.compiler_type == "unix":
+        if sys.platform == "darwin":
+            # Perform first-time customization of compiler-related
+            # config vars on OS X now that we know we need a compiler.
+            # This is primarily to support Pythons from binary
+            # installers.  The kind and paths to build tools on
+            # the user system may vary significantly from the system
+            # that Python itself was built on.  Also the user OS
+            # version and build tools may not support the same set
+            # of CPU architectures for universal builds.
+            global _config_vars
+            # Use get_config_var() to ensure _config_vars is initialized.
+            if not get_config_var('CUSTOMIZED_OSX_COMPILER'):
+                import _osx_support
+                _osx_support.customize_compiler(_config_vars)
+                _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
+
+        (cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \
+            get_config_vars('CC', 'CXX', 'CFLAGS',
+                            'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS')
+
+        if 'CC' in os.environ:
+            newcc = os.environ['CC']
+            if (sys.platform == 'darwin'
+                    and 'LDSHARED' not in os.environ
+                    and ldshared.startswith(cc)):
+                # On OS X, if CC is overridden, use that as the default
+                #       command for LDSHARED as well
+                ldshared = newcc + ldshared[len(cc):]
+            cc = newcc
+        if 'CXX' in os.environ:
+            cxx = os.environ['CXX']
+        if 'LDSHARED' in os.environ:
+            ldshared = os.environ['LDSHARED']
+        if 'CPP' in os.environ:
+            cpp = os.environ['CPP']
+        else:
+            cpp = cc + " -E"           # not always
+        if 'LDFLAGS' in os.environ:
+            ldshared = ldshared + ' ' + os.environ['LDFLAGS']
+        if 'CFLAGS' in os.environ:
+            cflags = cflags + ' ' + os.environ['CFLAGS']
+            ldshared = ldshared + ' ' + os.environ['CFLAGS']
+        if 'CPPFLAGS' in os.environ:
+            cpp = cpp + ' ' + os.environ['CPPFLAGS']
+            cflags = cflags + ' ' + os.environ['CPPFLAGS']
+            ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
+        if 'AR' in os.environ:
+            ar = os.environ['AR']
+        if 'ARFLAGS' in os.environ:
+            archiver = ar + ' ' + os.environ['ARFLAGS']
+        else:
+            archiver = ar + ' ' + ar_flags
+
+        cc_cmd = cc + ' ' + cflags
+        compiler.set_executables(
+            preprocessor=cpp,
+            compiler=cc_cmd,
+            compiler_so=cc_cmd + ' ' + ccshared,
+            compiler_cxx=cxx,
+            linker_so=ldshared,
+            linker_exe=cc,
+            archiver=archiver)
+
+        compiler.shared_lib_extension = shlib_suffix
+
+
+def get_config_h_filename():
+    """Return full pathname of installed pyconfig.h file."""
+    if python_build:
+        if os.name == "nt":
+            inc_dir = os.path.join(_sys_home or project_base, "PC")
+        else:
+            inc_dir = _sys_home or project_base
+    else:
+        inc_dir = get_python_inc(plat_specific=1)
+
+    return os.path.join(inc_dir, 'pyconfig.h')
+
+
+def get_makefile_filename():
+    """Return full pathname of installed Makefile from the Python build."""
+    if python_build:
+        return os.path.join(_sys_home or project_base, "Makefile")
+    lib_dir = get_python_lib(plat_specific=0, standard_lib=1)
+    config_file = 'config-{}{}'.format(get_python_version(), build_flags)
+    if hasattr(sys.implementation, '_multiarch'):
+        config_file += '-%s' % sys.implementation._multiarch
+    return os.path.join(lib_dir, config_file, 'Makefile')
+
+
+def parse_config_h(fp, g=None):
+    """Parse a config.h-style file.
+
+    A dictionary containing name/value pairs is returned.  If an
+    optional dictionary is passed in as the second argument, it is
+    used instead of a new dictionary.
+    """
+    if g is None:
+        g = {}
+    define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
+    undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
+    #
+    while True:
+        line = fp.readline()
+        if not line:
+            break
+        m = define_rx.match(line)
+        if m:
+            n, v = m.group(1, 2)
+            try: v = int(v)
+            except ValueError: pass
+            g[n] = v
+        else:
+            m = undef_rx.match(line)
+            if m:
+                g[m.group(1)] = 0
+    return g
+
+
+# Regexes needed for parsing Makefile (and similar syntaxes,
+# like old-style Setup files).
+_variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
+_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
+_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
+
+def parse_makefile(fn, g=None):
+    """Parse a Makefile-style file.
+
+    A dictionary containing name/value pairs is returned.  If an
+    optional dictionary is passed in as the second argument, it is
+    used instead of a new dictionary.
+    """
+    from distutils.text_file import TextFile
+    fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1, errors="surrogateescape")
+
+    if g is None:
+        g = {}
+    done = {}
+    notdone = {}
+
+    while True:
+        line = fp.readline()
+        if line is None: # eof
+            break
+        m = _variable_rx.match(line)
+        if m:
+            n, v = m.group(1, 2)
+            v = v.strip()
+            # `$$' is a literal `$' in make
+            tmpv = v.replace('$$', '')
+
+            if "$" in tmpv:
+                notdone[n] = v
+            else:
+                try:
+                    v = int(v)
+                except ValueError:
+                    # insert literal `$'
+                    done[n] = v.replace('$$', '$')
+                else:
+                    done[n] = v
+
+    # Variables with a 'PY_' prefix in the makefile. These need to
+    # be made available without that prefix through sysconfig.
+    # Special care is needed to ensure that variable expansion works, even
+    # if the expansion uses the name without a prefix.
+    renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS')
+
+    # do variable interpolation here
+    while notdone:
+        for name in list(notdone):
+            value = notdone[name]
+            m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
+            if m:
+                n = m.group(1)
+                found = True
+                if n in done:
+                    item = str(done[n])
+                elif n in notdone:
+                    # get it on a subsequent round
+                    found = False
+                elif n in os.environ:
+                    # do it like make: fall back to environment
+                    item = os.environ[n]
+
+                elif n in renamed_variables:
+                    if name.startswith('PY_') and name[3:] in renamed_variables:
+                        item = ""
+
+                    elif 'PY_' + n in notdone:
+                        found = False
+
+                    else:
+                        item = str(done['PY_' + n])
+                else:
+                    done[n] = item = ""
+                if found:
+                    after = value[m.end():]
+                    value = value[:m.start()] + item + after
+                    if "$" in after:
+                        notdone[name] = value
+                    else:
+                        try: value = int(value)
+                        except ValueError:
+                            done[name] = value.strip()
+                        else:
+                            done[name] = value
+                        del notdone[name]
+
+                        if name.startswith('PY_') \
+                            and name[3:] in renamed_variables:
+
+                            name = name[3:]
+                            if name not in done:
+                                done[name] = value
+            else:
+                # bogus variable reference; just drop it since we can't deal
+                del notdone[name]
+
+    fp.close()
+
+    # strip spurious spaces
+    for k, v in done.items():
+        if isinstance(v, str):
+            done[k] = v.strip()
+
+    # save the results in the global dictionary
+    g.update(done)
+    return g
+
+
+def expand_makefile_vars(s, vars):
+    """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
+    'string' according to 'vars' (a dictionary mapping variable names to
+    values).  Variables not present in 'vars' are silently expanded to the
+    empty string.  The variable values in 'vars' should not contain further
+    variable expansions; if 'vars' is the output of 'parse_makefile()',
+    you're fine.  Returns a variable-expanded version of 's'.
+    """
+
+    # This algorithm does multiple expansion, so if vars['foo'] contains
+    # "${bar}", it will expand ${foo} to ${bar}, and then expand
+    # ${bar}... and so forth.  This is fine as long as 'vars' comes from
+    # 'parse_makefile()', which takes care of such expansions eagerly,
+    # according to make's variable expansion semantics.
+
+    while True:
+        m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
+        if m:
+            (beg, end) = m.span()
+            s = s[0:beg] + vars.get(m.group(1)) + s[end:]
+        else:
+            break
+    return s
+
+
+_config_vars = None
+
+def _init_posix():
+    """Initialize the module as appropriate for POSIX systems."""
+    # _sysconfigdata is generated at build time, see the sysconfig module
+    name = os.environ.get('_PYTHON_SYSCONFIGDATA_NAME',
+        '_sysconfigdata_{abi}_{platform}_{multiarch}'.format(
+        abi=sys.abiflags,
+        platform=sys.platform,
+        multiarch=getattr(sys.implementation, '_multiarch', ''),
+    ))
+    try:
+        _temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
+    except ImportError:
+        # Python 3.5 and pypy 7.3.1
+        _temp = __import__(
+            '_sysconfigdata', globals(), locals(), ['build_time_vars'], 0)
+    build_time_vars = _temp.build_time_vars
+    global _config_vars
+    _config_vars = {}
+    _config_vars.update(build_time_vars)
+
+
+def _init_nt():
+    """Initialize the module as appropriate for NT"""
+    g = {}
+    # set basic install directories
+    g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
+    g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
+
+    # XXX hmmm.. a normal install puts include files here
+    g['INCLUDEPY'] = get_python_inc(plat_specific=0)
+
+    g['EXT_SUFFIX'] = _imp.extension_suffixes()[0]
+    g['EXE'] = ".exe"
+    g['VERSION'] = get_python_version().replace(".", "")
+    g['BINDIR'] = os.path.dirname(os.path.abspath(sys.executable))
+
+    global _config_vars
+    _config_vars = g
+
+
+def get_config_vars(*args):
+    """With no arguments, return a dictionary of all configuration
+    variables relevant for the current platform.  Generally this includes
+    everything needed to build extensions and install both pure modules and
+    extensions.  On Unix, this means every variable defined in Python's
+    installed Makefile; on Windows it's a much smaller set.
+
+    With arguments, return a list of values that result from looking up
+    each argument in the configuration variable dictionary.
+    """
+    global _config_vars
+    if _config_vars is None:
+        func = globals().get("_init_" + os.name)
+        if func:
+            func()
+        else:
+            _config_vars = {}
+
+        # Normalized versions of prefix and exec_prefix are handy to have;
+        # in fact, these are the standard versions used most places in the
+        # Distutils.
+        _config_vars['prefix'] = PREFIX
+        _config_vars['exec_prefix'] = EXEC_PREFIX
+
+        if not IS_PYPY:
+            # For backward compatibility, see issue19555
+            SO = _config_vars.get('EXT_SUFFIX')
+            if SO is not None:
+                _config_vars['SO'] = SO
+
+            # Always convert srcdir to an absolute path
+            srcdir = _config_vars.get('srcdir', project_base)
+            if os.name == 'posix':
+                if python_build:
+                    # If srcdir is a relative path (typically '.' or '..')
+                    # then it should be interpreted relative to the directory
+                    # containing Makefile.
+                    base = os.path.dirname(get_makefile_filename())
+                    srcdir = os.path.join(base, srcdir)
+                else:
+                    # srcdir is not meaningful since the installation is
+                    # spread about the filesystem.  We choose the
+                    # directory containing the Makefile since we know it
+                    # exists.
+                    srcdir = os.path.dirname(get_makefile_filename())
+            _config_vars['srcdir'] = os.path.abspath(os.path.normpath(srcdir))
+
+            # Convert srcdir into an absolute path if it appears necessary.
+            # Normally it is relative to the build directory.  However, during
+            # testing, for example, we might be running a non-installed python
+            # from a different directory.
+            if python_build and os.name == "posix":
+                base = project_base
+                if (not os.path.isabs(_config_vars['srcdir']) and
+                    base != os.getcwd()):
+                    # srcdir is relative and we are not in the same directory
+                    # as the executable. Assume executable is in the build
+                    # directory and make srcdir absolute.
+                    srcdir = os.path.join(base, _config_vars['srcdir'])
+                    _config_vars['srcdir'] = os.path.normpath(srcdir)
+
+        # OS X platforms require special customization to handle
+        # multi-architecture, multi-os-version installers
+        if sys.platform == 'darwin':
+            import _osx_support
+            _osx_support.customize_config_vars(_config_vars)
+
+    if args:
+        vals = []
+        for name in args:
+            vals.append(_config_vars.get(name))
+        return vals
+    else:
+        return _config_vars
+
+def get_config_var(name):
+    """Return the value of a single variable using the dictionary
+    returned by 'get_config_vars()'.  Equivalent to
+    get_config_vars().get(name)
+    """
+    if name == 'SO':
+        import warnings
+        warnings.warn('SO is deprecated, use EXT_SUFFIX', DeprecationWarning, 2)
+    return get_config_vars().get(name)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/text_file.py b/venv/Lib/site-packages/setuptools/_distutils/text_file.py
new file mode 100644
index 0000000..93abad3
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/text_file.py
@@ -0,0 +1,286 @@
+"""text_file
+
+provides the TextFile class, which gives an interface to text files
+that (optionally) takes care of stripping comments, ignoring blank
+lines, and joining lines with backslashes."""
+
+import sys, io
+
+
+class TextFile:
+    """Provides a file-like object that takes care of all the things you
+       commonly want to do when processing a text file that has some
+       line-by-line syntax: strip comments (as long as "#" is your
+       comment character), skip blank lines, join adjacent lines by
+       escaping the newline (ie. backslash at end of line), strip
+       leading and/or trailing whitespace.  All of these are optional
+       and independently controllable.
+
+       Provides a 'warn()' method so you can generate warning messages that
+       report physical line number, even if the logical line in question
+       spans multiple physical lines.  Also provides 'unreadline()' for
+       implementing line-at-a-time lookahead.
+
+       Constructor is called as:
+
+           TextFile (filename=None, file=None, **options)
+
+       It bombs (RuntimeError) if both 'filename' and 'file' are None;
+       'filename' should be a string, and 'file' a file object (or
+       something that provides 'readline()' and 'close()' methods).  It is
+       recommended that you supply at least 'filename', so that TextFile
+       can include it in warning messages.  If 'file' is not supplied,
+       TextFile creates its own using 'io.open()'.
+
+       The options are all boolean, and affect the value returned by
+       'readline()':
+         strip_comments [default: true]
+           strip from "#" to end-of-line, as well as any whitespace
+           leading up to the "#" -- unless it is escaped by a backslash
+         lstrip_ws [default: false]
+           strip leading whitespace from each line before returning it
+         rstrip_ws [default: true]
+           strip trailing whitespace (including line terminator!) from
+           each line before returning it
+         skip_blanks [default: true}
+           skip lines that are empty *after* stripping comments and
+           whitespace.  (If both lstrip_ws and rstrip_ws are false,
+           then some lines may consist of solely whitespace: these will
+           *not* be skipped, even if 'skip_blanks' is true.)
+         join_lines [default: false]
+           if a backslash is the last non-newline character on a line
+           after stripping comments and whitespace, join the following line
+           to it to form one "logical line"; if N consecutive lines end
+           with a backslash, then N+1 physical lines will be joined to
+           form one logical line.
+         collapse_join [default: false]
+           strip leading whitespace from lines that are joined to their
+           predecessor; only matters if (join_lines and not lstrip_ws)
+         errors [default: 'strict']
+           error handler used to decode the file content
+
+       Note that since 'rstrip_ws' can strip the trailing newline, the
+       semantics of 'readline()' must differ from those of the builtin file
+       object's 'readline()' method!  In particular, 'readline()' returns
+       None for end-of-file: an empty string might just be a blank line (or
+       an all-whitespace line), if 'rstrip_ws' is true but 'skip_blanks' is
+       not."""
+
+    default_options = { 'strip_comments': 1,
+                        'skip_blanks':    1,
+                        'lstrip_ws':      0,
+                        'rstrip_ws':      1,
+                        'join_lines':     0,
+                        'collapse_join':  0,
+                        'errors':         'strict',
+                      }
+
+    def __init__(self, filename=None, file=None, **options):
+        """Construct a new TextFile object.  At least one of 'filename'
+           (a string) and 'file' (a file-like object) must be supplied.
+           They keyword argument options are described above and affect
+           the values returned by 'readline()'."""
+        if filename is None and file is None:
+            raise RuntimeError("you must supply either or both of 'filename' and 'file'")
+
+        # set values for all options -- either from client option hash
+        # or fallback to default_options
+        for opt in self.default_options.keys():
+            if opt in options:
+                setattr(self, opt, options[opt])
+            else:
+                setattr(self, opt, self.default_options[opt])
+
+        # sanity check client option hash
+        for opt in options.keys():
+            if opt not in self.default_options:
+                raise KeyError("invalid TextFile option '%s'" % opt)
+
+        if file is None:
+            self.open(filename)
+        else:
+            self.filename = filename
+            self.file = file
+            self.current_line = 0       # assuming that file is at BOF!
+
+        # 'linebuf' is a stack of lines that will be emptied before we
+        # actually read from the file; it's only populated by an
+        # 'unreadline()' operation
+        self.linebuf = []
+
+    def open(self, filename):
+        """Open a new file named 'filename'.  This overrides both the
+           'filename' and 'file' arguments to the constructor."""
+        self.filename = filename
+        self.file = io.open(self.filename, 'r', errors=self.errors)
+        self.current_line = 0
+
+    def close(self):
+        """Close the current file and forget everything we know about it
+           (filename, current line number)."""
+        file = self.file
+        self.file = None
+        self.filename = None
+        self.current_line = None
+        file.close()
+
+    def gen_error(self, msg, line=None):
+        outmsg = []
+        if line is None:
+            line = self.current_line
+        outmsg.append(self.filename + ", ")
+        if isinstance(line, (list, tuple)):
+            outmsg.append("lines %d-%d: " % tuple(line))
+        else:
+            outmsg.append("line %d: " % line)
+        outmsg.append(str(msg))
+        return "".join(outmsg)
+
+    def error(self, msg, line=None):
+        raise ValueError("error: " + self.gen_error(msg, line))
+
+    def warn(self, msg, line=None):
+        """Print (to stderr) a warning message tied to the current logical
+           line in the current file.  If the current logical line in the
+           file spans multiple physical lines, the warning refers to the
+           whole range, eg. "lines 3-5".  If 'line' supplied, it overrides
+           the current line number; it may be a list or tuple to indicate a
+           range of physical lines, or an integer for a single physical
+           line."""
+        sys.stderr.write("warning: " + self.gen_error(msg, line) + "\n")
+
+    def readline(self):
+        """Read and return a single logical line from the current file (or
+           from an internal buffer if lines have previously been "unread"
+           with 'unreadline()').  If the 'join_lines' option is true, this
+           may involve reading multiple physical lines concatenated into a
+           single string.  Updates the current line number, so calling
+           'warn()' after 'readline()' emits a warning about the physical
+           line(s) just read.  Returns None on end-of-file, since the empty
+           string can occur if 'rstrip_ws' is true but 'strip_blanks' is
+           not."""
+        # If any "unread" lines waiting in 'linebuf', return the top
+        # one.  (We don't actually buffer read-ahead data -- lines only
+        # get put in 'linebuf' if the client explicitly does an
+        # 'unreadline()'.
+        if self.linebuf:
+            line = self.linebuf[-1]
+            del self.linebuf[-1]
+            return line
+
+        buildup_line = ''
+
+        while True:
+            # read the line, make it None if EOF
+            line = self.file.readline()
+            if line == '':
+                line = None
+
+            if self.strip_comments and line:
+
+                # Look for the first "#" in the line.  If none, never
+                # mind.  If we find one and it's the first character, or
+                # is not preceded by "\", then it starts a comment --
+                # strip the comment, strip whitespace before it, and
+                # carry on.  Otherwise, it's just an escaped "#", so
+                # unescape it (and any other escaped "#"'s that might be
+                # lurking in there) and otherwise leave the line alone.
+
+                pos = line.find("#")
+                if pos == -1: # no "#" -- no comments
+                    pass
+
+                # It's definitely a comment -- either "#" is the first
+                # character, or it's elsewhere and unescaped.
+                elif pos == 0 or line[pos-1] != "\\":
+                    # Have to preserve the trailing newline, because it's
+                    # the job of a later step (rstrip_ws) to remove it --
+                    # and if rstrip_ws is false, we'd better preserve it!
+                    # (NB. this means that if the final line is all comment
+                    # and has no trailing newline, we will think that it's
+                    # EOF; I think that's OK.)
+                    eol = (line[-1] == '\n') and '\n' or ''
+                    line = line[0:pos] + eol
+
+                    # If all that's left is whitespace, then skip line
+                    # *now*, before we try to join it to 'buildup_line' --
+                    # that way constructs like
+                    #   hello \\
+                    #   # comment that should be ignored
+                    #   there
+                    # result in "hello there".
+                    if line.strip() == "":
+                        continue
+                else: # it's an escaped "#"
+                    line = line.replace("\\#", "#")
+
+            # did previous line end with a backslash? then accumulate
+            if self.join_lines and buildup_line:
+                # oops: end of file
+                if line is None:
+                    self.warn("continuation line immediately precedes "
+                              "end-of-file")
+                    return buildup_line
+
+                if self.collapse_join:
+                    line = line.lstrip()
+                line = buildup_line + line
+
+                # careful: pay attention to line number when incrementing it
+                if isinstance(self.current_line, list):
+                    self.current_line[1] = self.current_line[1] + 1
+                else:
+                    self.current_line = [self.current_line,
+                                         self.current_line + 1]
+            # just an ordinary line, read it as usual
+            else:
+                if line is None: # eof
+                    return None
+
+                # still have to be careful about incrementing the line number!
+                if isinstance(self.current_line, list):
+                    self.current_line = self.current_line[1] + 1
+                else:
+                    self.current_line = self.current_line + 1
+
+            # strip whitespace however the client wants (leading and
+            # trailing, or one or the other, or neither)
+            if self.lstrip_ws and self.rstrip_ws:
+                line = line.strip()
+            elif self.lstrip_ws:
+                line = line.lstrip()
+            elif self.rstrip_ws:
+                line = line.rstrip()
+
+            # blank line (whether we rstrip'ed or not)? skip to next line
+            # if appropriate
+            if (line == '' or line == '\n') and self.skip_blanks:
+                continue
+
+            if self.join_lines:
+                if line[-1] == '\\':
+                    buildup_line = line[:-1]
+                    continue
+
+                if line[-2:] == '\\\n':
+                    buildup_line = line[0:-2] + '\n'
+                    continue
+
+            # well, I guess there's some actual content there: return it
+            return line
+
+    def readlines(self):
+        """Read and return the list of all logical lines remaining in the
+           current file."""
+        lines = []
+        while True:
+            line = self.readline()
+            if line is None:
+                return lines
+            lines.append(line)
+
+    def unreadline(self, line):
+        """Push 'line' (a string) onto an internal buffer that will be
+           checked by future 'readline()' calls.  Handy for implementing
+           a parser with line-at-a-time lookahead."""
+        self.linebuf.append(line)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py b/venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py
new file mode 100644
index 0000000..4d7a6de
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py
@@ -0,0 +1,328 @@
+"""distutils.unixccompiler
+
+Contains the UnixCCompiler class, a subclass of CCompiler that handles
+the "typical" Unix-style command-line C compiler:
+  * macros defined with -Dname[=value]
+  * macros undefined with -Uname
+  * include search directories specified with -Idir
+  * libraries specified with -lllib
+  * library search directories specified with -Ldir
+  * compile handled by 'cc' (or similar) executable with -c option:
+    compiles .c to .o
+  * link static library handled by 'ar' command (possibly with 'ranlib')
+  * link shared library handled by 'cc -shared'
+"""
+
+import os, sys, re
+
+from distutils import sysconfig
+from distutils.dep_util import newer
+from distutils.ccompiler import \
+     CCompiler, gen_preprocess_options, gen_lib_options
+from distutils.errors import \
+     DistutilsExecError, CompileError, LibError, LinkError
+from distutils import log
+
+if sys.platform == 'darwin':
+    import _osx_support
+
+# XXX Things not currently handled:
+#   * optimization/debug/warning flags; we just use whatever's in Python's
+#     Makefile and live with it.  Is this adequate?  If not, we might
+#     have to have a bunch of subclasses GNUCCompiler, SGICCompiler,
+#     SunCCompiler, and I suspect down that road lies madness.
+#   * even if we don't know a warning flag from an optimization flag,
+#     we need some way for outsiders to feed preprocessor/compiler/linker
+#     flags in to us -- eg. a sysadmin might want to mandate certain flags
+#     via a site config file, or a user might want to set something for
+#     compiling this module distribution only via the setup.py command
+#     line, whatever.  As long as these options come from something on the
+#     current system, they can be as system-dependent as they like, and we
+#     should just happily stuff them into the preprocessor/compiler/linker
+#     options and carry on.
+
+
+class UnixCCompiler(CCompiler):
+
+    compiler_type = 'unix'
+
+    # These are used by CCompiler in two places: the constructor sets
+    # instance attributes 'preprocessor', 'compiler', etc. from them, and
+    # 'set_executable()' allows any of these to be set.  The defaults here
+    # are pretty generic; they will probably have to be set by an outsider
+    # (eg. using information discovered by the sysconfig about building
+    # Python extensions).
+    executables = {'preprocessor' : None,
+                   'compiler'     : ["cc"],
+                   'compiler_so'  : ["cc"],
+                   'compiler_cxx' : ["cc"],
+                   'linker_so'    : ["cc", "-shared"],
+                   'linker_exe'   : ["cc"],
+                   'archiver'     : ["ar", "-cr"],
+                   'ranlib'       : None,
+                  }
+
+    if sys.platform[:6] == "darwin":
+        executables['ranlib'] = ["ranlib"]
+
+    # Needed for the filename generation methods provided by the base
+    # class, CCompiler.  NB. whoever instantiates/uses a particular
+    # UnixCCompiler instance should set 'shared_lib_ext' -- we set a
+    # reasonable common default here, but it's not necessarily used on all
+    # Unices!
+
+    src_extensions = [".c",".C",".cc",".cxx",".cpp",".m"]
+    obj_extension = ".o"
+    static_lib_extension = ".a"
+    shared_lib_extension = ".so"
+    dylib_lib_extension = ".dylib"
+    xcode_stub_lib_extension = ".tbd"
+    static_lib_format = shared_lib_format = dylib_lib_format = "lib%s%s"
+    xcode_stub_lib_format = dylib_lib_format
+    if sys.platform == "cygwin":
+        exe_extension = ".exe"
+
+    def preprocess(self, source, output_file=None, macros=None,
+                   include_dirs=None, extra_preargs=None, extra_postargs=None):
+        fixed_args = self._fix_compile_args(None, macros, include_dirs)
+        ignore, macros, include_dirs = fixed_args
+        pp_opts = gen_preprocess_options(macros, include_dirs)
+        pp_args = self.preprocessor + pp_opts
+        if output_file:
+            pp_args.extend(['-o', output_file])
+        if extra_preargs:
+            pp_args[:0] = extra_preargs
+        if extra_postargs:
+            pp_args.extend(extra_postargs)
+        pp_args.append(source)
+
+        # We need to preprocess: either we're being forced to, or we're
+        # generating output to stdout, or there's a target output file and
+        # the source file is newer than the target (or the target doesn't
+        # exist).
+        if self.force or output_file is None or newer(source, output_file):
+            if output_file:
+                self.mkpath(os.path.dirname(output_file))
+            try:
+                self.spawn(pp_args)
+            except DistutilsExecError as msg:
+                raise CompileError(msg)
+
+    def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
+        compiler_so = self.compiler_so
+        if sys.platform == 'darwin':
+            compiler_so = _osx_support.compiler_fixup(compiler_so,
+                                                    cc_args + extra_postargs)
+        try:
+            self.spawn(compiler_so + cc_args + [src, '-o', obj] +
+                       extra_postargs)
+        except DistutilsExecError as msg:
+            raise CompileError(msg)
+
+    def create_static_lib(self, objects, output_libname,
+                          output_dir=None, debug=0, target_lang=None):
+        objects, output_dir = self._fix_object_args(objects, output_dir)
+
+        output_filename = \
+            self.library_filename(output_libname, output_dir=output_dir)
+
+        if self._need_link(objects, output_filename):
+            self.mkpath(os.path.dirname(output_filename))
+            self.spawn(self.archiver +
+                       [output_filename] +
+                       objects + self.objects)
+
+            # Not many Unices required ranlib anymore -- SunOS 4.x is, I
+            # think the only major Unix that does.  Maybe we need some
+            # platform intelligence here to skip ranlib if it's not
+            # needed -- or maybe Python's configure script took care of
+            # it for us, hence the check for leading colon.
+            if self.ranlib:
+                try:
+                    self.spawn(self.ranlib + [output_filename])
+                except DistutilsExecError as msg:
+                    raise LibError(msg)
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+    def link(self, target_desc, objects,
+             output_filename, output_dir=None, libraries=None,
+             library_dirs=None, runtime_library_dirs=None,
+             export_symbols=None, debug=0, extra_preargs=None,
+             extra_postargs=None, build_temp=None, target_lang=None):
+        objects, output_dir = self._fix_object_args(objects, output_dir)
+        fixed_args = self._fix_lib_args(libraries, library_dirs,
+                                        runtime_library_dirs)
+        libraries, library_dirs, runtime_library_dirs = fixed_args
+
+        lib_opts = gen_lib_options(self, library_dirs, runtime_library_dirs,
+                                   libraries)
+        if not isinstance(output_dir, (str, type(None))):
+            raise TypeError("'output_dir' must be a string or None")
+        if output_dir is not None:
+            output_filename = os.path.join(output_dir, output_filename)
+
+        if self._need_link(objects, output_filename):
+            ld_args = (objects + self.objects +
+                       lib_opts + ['-o', output_filename])
+            if debug:
+                ld_args[:0] = ['-g']
+            if extra_preargs:
+                ld_args[:0] = extra_preargs
+            if extra_postargs:
+                ld_args.extend(extra_postargs)
+            self.mkpath(os.path.dirname(output_filename))
+            try:
+                if target_desc == CCompiler.EXECUTABLE:
+                    linker = self.linker_exe[:]
+                else:
+                    linker = self.linker_so[:]
+                if target_lang == "c++" and self.compiler_cxx:
+                    # skip over environment variable settings if /usr/bin/env
+                    # is used to set up the linker's environment.
+                    # This is needed on OSX. Note: this assumes that the
+                    # normal and C++ compiler have the same environment
+                    # settings.
+                    i = 0
+                    if os.path.basename(linker[0]) == "env":
+                        i = 1
+                        while '=' in linker[i]:
+                            i += 1
+
+                    if os.path.basename(linker[i]) == 'ld_so_aix':
+                        # AIX platforms prefix the compiler with the ld_so_aix
+                        # script, so we need to adjust our linker index
+                        offset = 1
+                    else:
+                        offset = 0
+
+                    linker[i+offset] = self.compiler_cxx[i]
+
+                if sys.platform == 'darwin':
+                    linker = _osx_support.compiler_fixup(linker, ld_args)
+
+                self.spawn(linker + ld_args)
+            except DistutilsExecError as msg:
+                raise LinkError(msg)
+        else:
+            log.debug("skipping %s (up-to-date)", output_filename)
+
+    # -- Miscellaneous methods -----------------------------------------
+    # These are all used by the 'gen_lib_options() function, in
+    # ccompiler.py.
+
+    def library_dir_option(self, dir):
+        return "-L" + dir
+
+    def _is_gcc(self, compiler_name):
+        return "gcc" in compiler_name or "g++" in compiler_name
+
+    def runtime_library_dir_option(self, dir):
+        # XXX Hackish, at the very least.  See Python bug #445902:
+        # http://sourceforge.net/tracker/index.php
+        #   ?func=detail&aid=445902&group_id=5470&atid=105470
+        # Linkers on different platforms need different options to
+        # specify that directories need to be added to the list of
+        # directories searched for dependencies when a dynamic library
+        # is sought.  GCC on GNU systems (Linux, FreeBSD, ...) has to
+        # be told to pass the -R option through to the linker, whereas
+        # other compilers and gcc on other systems just know this.
+        # Other compilers may need something slightly different.  At
+        # this time, there's no way to determine this information from
+        # the configuration data stored in the Python installation, so
+        # we use this hack.
+        compiler = os.path.basename(sysconfig.get_config_var("CC"))
+        if sys.platform[:6] == "darwin":
+            # MacOSX's linker doesn't understand the -R flag at all
+            return "-L" + dir
+        elif sys.platform[:7] == "freebsd":
+            return "-Wl,-rpath=" + dir
+        elif sys.platform[:5] == "hp-ux":
+            if self._is_gcc(compiler):
+                return ["-Wl,+s", "-L" + dir]
+            return ["+s", "-L" + dir]
+        else:
+            if self._is_gcc(compiler):
+                # gcc on non-GNU systems does not need -Wl, but can
+                # use it anyway.  Since distutils has always passed in
+                # -Wl whenever gcc was used in the past it is probably
+                # safest to keep doing so.
+                if sysconfig.get_config_var("GNULD") == "yes":
+                    # GNU ld needs an extra option to get a RUNPATH
+                    # instead of just an RPATH.
+                    return "-Wl,--enable-new-dtags,-R" + dir
+                else:
+                    return "-Wl,-R" + dir
+            else:
+                # No idea how --enable-new-dtags would be passed on to
+                # ld if this system was using GNU ld.  Don't know if a
+                # system like this even exists.
+                return "-R" + dir
+
+    def library_option(self, lib):
+        return "-l" + lib
+
+    def find_library_file(self, dirs, lib, debug=0):
+        shared_f = self.library_filename(lib, lib_type='shared')
+        dylib_f = self.library_filename(lib, lib_type='dylib')
+        xcode_stub_f = self.library_filename(lib, lib_type='xcode_stub')
+        static_f = self.library_filename(lib, lib_type='static')
+
+        if sys.platform == 'darwin':
+            # On OSX users can specify an alternate SDK using
+            # '-isysroot', calculate the SDK root if it is specified
+            # (and use it further on)
+            #
+            # Note that, as of Xcode 7, Apple SDKs may contain textual stub
+            # libraries with .tbd extensions rather than the normal .dylib
+            # shared libraries installed in /.  The Apple compiler tool
+            # chain handles this transparently but it can cause problems
+            # for programs that are being built with an SDK and searching
+            # for specific libraries.  Callers of find_library_file need to
+            # keep in mind that the base filename of the returned SDK library
+            # file might have a different extension from that of the library
+            # file installed on the running system, for example:
+            #   /Applications/Xcode.app/Contents/Developer/Platforms/
+            #       MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
+            #       usr/lib/libedit.tbd
+            # vs
+            #   /usr/lib/libedit.dylib
+            cflags = sysconfig.get_config_var('CFLAGS')
+            m = re.search(r'-isysroot\s*(\S+)', cflags)
+            if m is None:
+                sysroot = '/'
+            else:
+                sysroot = m.group(1)
+
+
+
+        for dir in dirs:
+            shared = os.path.join(dir, shared_f)
+            dylib = os.path.join(dir, dylib_f)
+            static = os.path.join(dir, static_f)
+            xcode_stub = os.path.join(dir, xcode_stub_f)
+
+            if sys.platform == 'darwin' and (
+                dir.startswith('/System/') or (
+                dir.startswith('/usr/') and not dir.startswith('/usr/local/'))):
+
+                shared = os.path.join(sysroot, dir[1:], shared_f)
+                dylib = os.path.join(sysroot, dir[1:], dylib_f)
+                static = os.path.join(sysroot, dir[1:], static_f)
+                xcode_stub = os.path.join(sysroot, dir[1:], xcode_stub_f)
+
+            # We're second-guessing the linker here, with not much hard
+            # data to go on: GCC seems to prefer the shared library, so I'm
+            # assuming that *all* Unix C compilers do.  And of course I'm
+            # ignoring even GCC's "-static" option.  So sue me.
+            if os.path.exists(dylib):
+                return dylib
+            elif os.path.exists(xcode_stub):
+                return xcode_stub
+            elif os.path.exists(shared):
+                return shared
+            elif os.path.exists(static):
+                return static
+
+        # Oops, didn't find it in *any* of 'dirs'
+        return None
diff --git a/venv/Lib/site-packages/setuptools/_distutils/util.py b/venv/Lib/site-packages/setuptools/_distutils/util.py
new file mode 100644
index 0000000..4b002ec
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/util.py
@@ -0,0 +1,559 @@
+"""distutils.util
+
+Miscellaneous utility functions -- anything that doesn't fit into
+one of the other *util.py modules.
+"""
+
+import os
+import re
+import importlib.util
+import string
+import sys
+from distutils.errors import DistutilsPlatformError
+from distutils.dep_util import newer
+from distutils.spawn import spawn
+from distutils import log
+from distutils.errors import DistutilsByteCompileError
+
+def get_host_platform():
+    """Return a string that identifies the current platform.  This is used mainly to
+    distinguish platform-specific build directories and platform-specific built
+    distributions.  Typically includes the OS name and version and the
+    architecture (as supplied by 'os.uname()'), although the exact information
+    included depends on the OS; eg. on Linux, the kernel version isn't
+    particularly important.
+
+    Examples of returned values:
+       linux-i586
+       linux-alpha (?)
+       solaris-2.6-sun4u
+
+    Windows will return one of:
+       win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc)
+       win32 (all others - specifically, sys.platform is returned)
+
+    For other non-POSIX platforms, currently just returns 'sys.platform'.
+
+    """
+    if os.name == 'nt':
+        if 'amd64' in sys.version.lower():
+            return 'win-amd64'
+        if '(arm)' in sys.version.lower():
+            return 'win-arm32'
+        if '(arm64)' in sys.version.lower():
+            return 'win-arm64'
+        return sys.platform
+
+    # Set for cross builds explicitly
+    if "_PYTHON_HOST_PLATFORM" in os.environ:
+        return os.environ["_PYTHON_HOST_PLATFORM"]
+
+    if os.name != "posix" or not hasattr(os, 'uname'):
+        # XXX what about the architecture? NT is Intel or Alpha,
+        # Mac OS is M68k or PPC, etc.
+        return sys.platform
+
+    # Try to distinguish various flavours of Unix
+
+    (osname, host, release, version, machine) = os.uname()
+
+    # Convert the OS name to lowercase, remove '/' characters, and translate
+    # spaces (for "Power Macintosh")
+    osname = osname.lower().replace('/', '')
+    machine = machine.replace(' ', '_')
+    machine = machine.replace('/', '-')
+
+    if osname[:5] == "linux":
+        # At least on Linux/Intel, 'machine' is the processor --
+        # i386, etc.
+        # XXX what about Alpha, SPARC, etc?
+        return  "%s-%s" % (osname, machine)
+    elif osname[:5] == "sunos":
+        if release[0] >= "5":           # SunOS 5 == Solaris 2
+            osname = "solaris"
+            release = "%d.%s" % (int(release[0]) - 3, release[2:])
+            # We can't use "platform.architecture()[0]" because a
+            # bootstrap problem. We use a dict to get an error
+            # if some suspicious happens.
+            bitness = {2147483647:"32bit", 9223372036854775807:"64bit"}
+            machine += ".%s" % bitness[sys.maxsize]
+        # fall through to standard osname-release-machine representation
+    elif osname[:3] == "aix":
+        from _aix_support import aix_platform
+        return aix_platform()
+    elif osname[:6] == "cygwin":
+        osname = "cygwin"
+        rel_re = re.compile (r'[\d.]+', re.ASCII)
+        m = rel_re.match(release)
+        if m:
+            release = m.group()
+    elif osname[:6] == "darwin":
+        import _osx_support, distutils.sysconfig
+        osname, release, machine = _osx_support.get_platform_osx(
+                                        distutils.sysconfig.get_config_vars(),
+                                        osname, release, machine)
+
+    return "%s-%s-%s" % (osname, release, machine)
+
+def get_platform():
+    if os.name == 'nt':
+        TARGET_TO_PLAT = {
+            'x86' : 'win32',
+            'x64' : 'win-amd64',
+            'arm' : 'win-arm32',
+        }
+        return TARGET_TO_PLAT.get(os.environ.get('VSCMD_ARG_TGT_ARCH')) or get_host_platform()
+    else:
+        return get_host_platform()
+
+def convert_path (pathname):
+    """Return 'pathname' as a name that will work on the native filesystem,
+    i.e. split it on '/' and put it back together again using the current
+    directory separator.  Needed because filenames in the setup script are
+    always supplied in Unix style, and have to be converted to the local
+    convention before we can actually use them in the filesystem.  Raises
+    ValueError on non-Unix-ish systems if 'pathname' either starts or
+    ends with a slash.
+    """
+    if os.sep == '/':
+        return pathname
+    if not pathname:
+        return pathname
+    if pathname[0] == '/':
+        raise ValueError("path '%s' cannot be absolute" % pathname)
+    if pathname[-1] == '/':
+        raise ValueError("path '%s' cannot end with '/'" % pathname)
+
+    paths = pathname.split('/')
+    while '.' in paths:
+        paths.remove('.')
+    if not paths:
+        return os.curdir
+    return os.path.join(*paths)
+
+# convert_path ()
+
+
+def change_root (new_root, pathname):
+    """Return 'pathname' with 'new_root' prepended.  If 'pathname' is
+    relative, this is equivalent to "os.path.join(new_root,pathname)".
+    Otherwise, it requires making 'pathname' relative and then joining the
+    two, which is tricky on DOS/Windows and Mac OS.
+    """
+    if os.name == 'posix':
+        if not os.path.isabs(pathname):
+            return os.path.join(new_root, pathname)
+        else:
+            return os.path.join(new_root, pathname[1:])
+
+    elif os.name == 'nt':
+        (drive, path) = os.path.splitdrive(pathname)
+        if path[0] == '\\':
+            path = path[1:]
+        return os.path.join(new_root, path)
+
+    else:
+        raise DistutilsPlatformError("nothing known about platform '%s'" % os.name)
+
+
+_environ_checked = 0
+def check_environ ():
+    """Ensure that 'os.environ' has all the environment variables we
+    guarantee that users can use in config files, command-line options,
+    etc.  Currently this includes:
+      HOME - user's home directory (Unix only)
+      PLAT - description of the current platform, including hardware
+             and OS (see 'get_platform()')
+    """
+    global _environ_checked
+    if _environ_checked:
+        return
+
+    if os.name == 'posix' and 'HOME' not in os.environ:
+        try:
+            import pwd
+            os.environ['HOME'] = pwd.getpwuid(os.getuid())[5]
+        except (ImportError, KeyError):
+            # bpo-10496: if the current user identifier doesn't exist in the
+            # password database, do nothing
+            pass
+
+    if 'PLAT' not in os.environ:
+        os.environ['PLAT'] = get_platform()
+
+    _environ_checked = 1
+
+
+def subst_vars (s, local_vars):
+    """Perform shell/Perl-style variable substitution on 'string'.  Every
+    occurrence of '$' followed by a name is considered a variable, and
+    variable is substituted by the value found in the 'local_vars'
+    dictionary, or in 'os.environ' if it's not in 'local_vars'.
+    'os.environ' is first checked/augmented to guarantee that it contains
+    certain values: see 'check_environ()'.  Raise ValueError for any
+    variables not found in either 'local_vars' or 'os.environ'.
+    """
+    check_environ()
+    def _subst (match, local_vars=local_vars):
+        var_name = match.group(1)
+        if var_name in local_vars:
+            return str(local_vars[var_name])
+        else:
+            return os.environ[var_name]
+
+    try:
+        return re.sub(r'\$([a-zA-Z_][a-zA-Z_0-9]*)', _subst, s)
+    except KeyError as var:
+        raise ValueError("invalid variable '$%s'" % var)
+
+# subst_vars ()
+
+
+def grok_environment_error (exc, prefix="error: "):
+    # Function kept for backward compatibility.
+    # Used to try clever things with EnvironmentErrors,
+    # but nowadays str(exception) produces good messages.
+    return prefix + str(exc)
+
+
+# Needed by 'split_quoted()'
+_wordchars_re = _squote_re = _dquote_re = None
+def _init_regex():
+    global _wordchars_re, _squote_re, _dquote_re
+    _wordchars_re = re.compile(r'[^\\\'\"%s ]*' % string.whitespace)
+    _squote_re = re.compile(r"'(?:[^'\\]|\\.)*'")
+    _dquote_re = re.compile(r'"(?:[^"\\]|\\.)*"')
+
+def split_quoted (s):
+    """Split a string up according to Unix shell-like rules for quotes and
+    backslashes.  In short: words are delimited by spaces, as long as those
+    spaces are not escaped by a backslash, or inside a quoted string.
+    Single and double quotes are equivalent, and the quote characters can
+    be backslash-escaped.  The backslash is stripped from any two-character
+    escape sequence, leaving only the escaped character.  The quote
+    characters are stripped from any quoted string.  Returns a list of
+    words.
+    """
+
+    # This is a nice algorithm for splitting up a single string, since it
+    # doesn't require character-by-character examination.  It was a little
+    # bit of a brain-bender to get it working right, though...
+    if _wordchars_re is None: _init_regex()
+
+    s = s.strip()
+    words = []
+    pos = 0
+
+    while s:
+        m = _wordchars_re.match(s, pos)
+        end = m.end()
+        if end == len(s):
+            words.append(s[:end])
+            break
+
+        if s[end] in string.whitespace: # unescaped, unquoted whitespace: now
+            words.append(s[:end])       # we definitely have a word delimiter
+            s = s[end:].lstrip()
+            pos = 0
+
+        elif s[end] == '\\':            # preserve whatever is being escaped;
+                                        # will become part of the current word
+            s = s[:end] + s[end+1:]
+            pos = end+1
+
+        else:
+            if s[end] == "'":           # slurp singly-quoted string
+                m = _squote_re.match(s, end)
+            elif s[end] == '"':         # slurp doubly-quoted string
+                m = _dquote_re.match(s, end)
+            else:
+                raise RuntimeError("this can't happen (bad char '%c')" % s[end])
+
+            if m is None:
+                raise ValueError("bad string (mismatched %s quotes?)" % s[end])
+
+            (beg, end) = m.span()
+            s = s[:beg] + s[beg+1:end-1] + s[end:]
+            pos = m.end() - 2
+
+        if pos >= len(s):
+            words.append(s)
+            break
+
+    return words
+
+# split_quoted ()
+
+
+def execute (func, args, msg=None, verbose=0, dry_run=0):
+    """Perform some action that affects the outside world (eg.  by
+    writing to the filesystem).  Such actions are special because they
+    are disabled by the 'dry_run' flag.  This method takes care of all
+    that bureaucracy for you; all you have to do is supply the
+    function to call and an argument tuple for it (to embody the
+    "external action" being performed), and an optional message to
+    print.
+    """
+    if msg is None:
+        msg = "%s%r" % (func.__name__, args)
+        if msg[-2:] == ',)':        # correct for singleton tuple
+            msg = msg[0:-2] + ')'
+
+    log.info(msg)
+    if not dry_run:
+        func(*args)
+
+
+def strtobool (val):
+    """Convert a string representation of truth to true (1) or false (0).
+
+    True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
+    are 'n', 'no', 'f', 'false', 'off', and '0'.  Raises ValueError if
+    'val' is anything else.
+    """
+    val = val.lower()
+    if val in ('y', 'yes', 't', 'true', 'on', '1'):
+        return 1
+    elif val in ('n', 'no', 'f', 'false', 'off', '0'):
+        return 0
+    else:
+        raise ValueError("invalid truth value %r" % (val,))
+
+
+def byte_compile (py_files,
+                  optimize=0, force=0,
+                  prefix=None, base_dir=None,
+                  verbose=1, dry_run=0,
+                  direct=None):
+    """Byte-compile a collection of Python source files to .pyc
+    files in a __pycache__ subdirectory.  'py_files' is a list
+    of files to compile; any files that don't end in ".py" are silently
+    skipped.  'optimize' must be one of the following:
+      0 - don't optimize
+      1 - normal optimization (like "python -O")
+      2 - extra optimization (like "python -OO")
+    If 'force' is true, all files are recompiled regardless of
+    timestamps.
+
+    The source filename encoded in each bytecode file defaults to the
+    filenames listed in 'py_files'; you can modify these with 'prefix' and
+    'basedir'.  'prefix' is a string that will be stripped off of each
+    source filename, and 'base_dir' is a directory name that will be
+    prepended (after 'prefix' is stripped).  You can supply either or both
+    (or neither) of 'prefix' and 'base_dir', as you wish.
+
+    If 'dry_run' is true, doesn't actually do anything that would
+    affect the filesystem.
+
+    Byte-compilation is either done directly in this interpreter process
+    with the standard py_compile module, or indirectly by writing a
+    temporary script and executing it.  Normally, you should let
+    'byte_compile()' figure out to use direct compilation or not (see
+    the source for details).  The 'direct' flag is used by the script
+    generated in indirect mode; unless you know what you're doing, leave
+    it set to None.
+    """
+
+    # Late import to fix a bootstrap issue: _posixsubprocess is built by
+    # setup.py, but setup.py uses distutils.
+    import subprocess
+
+    # nothing is done if sys.dont_write_bytecode is True
+    if sys.dont_write_bytecode:
+        raise DistutilsByteCompileError('byte-compiling is disabled.')
+
+    # First, if the caller didn't force us into direct or indirect mode,
+    # figure out which mode we should be in.  We take a conservative
+    # approach: choose direct mode *only* if the current interpreter is
+    # in debug mode and optimize is 0.  If we're not in debug mode (-O
+    # or -OO), we don't know which level of optimization this
+    # interpreter is running with, so we can't do direct
+    # byte-compilation and be certain that it's the right thing.  Thus,
+    # always compile indirectly if the current interpreter is in either
+    # optimize mode, or if either optimization level was requested by
+    # the caller.
+    if direct is None:
+        direct = (__debug__ and optimize == 0)
+
+    # "Indirect" byte-compilation: write a temporary script and then
+    # run it with the appropriate flags.
+    if not direct:
+        try:
+            from tempfile import mkstemp
+            (script_fd, script_name) = mkstemp(".py")
+        except ImportError:
+            from tempfile import mktemp
+            (script_fd, script_name) = None, mktemp(".py")
+        log.info("writing byte-compilation script '%s'", script_name)
+        if not dry_run:
+            if script_fd is not None:
+                script = os.fdopen(script_fd, "w")
+            else:
+                script = open(script_name, "w")
+
+            with script:
+                script.write("""\
+from distutils.util import byte_compile
+files = [
+""")
+
+                # XXX would be nice to write absolute filenames, just for
+                # safety's sake (script should be more robust in the face of
+                # chdir'ing before running it).  But this requires abspath'ing
+                # 'prefix' as well, and that breaks the hack in build_lib's
+                # 'byte_compile()' method that carefully tacks on a trailing
+                # slash (os.sep really) to make sure the prefix here is "just
+                # right".  This whole prefix business is rather delicate -- the
+                # problem is that it's really a directory, but I'm treating it
+                # as a dumb string, so trailing slashes and so forth matter.
+
+                #py_files = map(os.path.abspath, py_files)
+                #if prefix:
+                #    prefix = os.path.abspath(prefix)
+
+                script.write(",\n".join(map(repr, py_files)) + "]\n")
+                script.write("""
+byte_compile(files, optimize=%r, force=%r,
+             prefix=%r, base_dir=%r,
+             verbose=%r, dry_run=0,
+             direct=1)
+""" % (optimize, force, prefix, base_dir, verbose))
+
+        cmd = [sys.executable]
+        cmd.extend(subprocess._optim_args_from_interpreter_flags())
+        cmd.append(script_name)
+        spawn(cmd, dry_run=dry_run)
+        execute(os.remove, (script_name,), "removing %s" % script_name,
+                dry_run=dry_run)
+
+    # "Direct" byte-compilation: use the py_compile module to compile
+    # right here, right now.  Note that the script generated in indirect
+    # mode simply calls 'byte_compile()' in direct mode, a weird sort of
+    # cross-process recursion.  Hey, it works!
+    else:
+        from py_compile import compile
+
+        for file in py_files:
+            if file[-3:] != ".py":
+                # This lets us be lazy and not filter filenames in
+                # the "install_lib" command.
+                continue
+
+            # Terminology from the py_compile module:
+            #   cfile - byte-compiled file
+            #   dfile - purported source filename (same as 'file' by default)
+            if optimize >= 0:
+                opt = '' if optimize == 0 else optimize
+                cfile = importlib.util.cache_from_source(
+                    file, optimization=opt)
+            else:
+                cfile = importlib.util.cache_from_source(file)
+            dfile = file
+            if prefix:
+                if file[:len(prefix)] != prefix:
+                    raise ValueError("invalid prefix: filename %r doesn't start with %r"
+                           % (file, prefix))
+                dfile = dfile[len(prefix):]
+            if base_dir:
+                dfile = os.path.join(base_dir, dfile)
+
+            cfile_base = os.path.basename(cfile)
+            if direct:
+                if force or newer(file, cfile):
+                    log.info("byte-compiling %s to %s", file, cfile_base)
+                    if not dry_run:
+                        compile(file, cfile, dfile)
+                else:
+                    log.debug("skipping byte-compilation of %s to %s",
+                              file, cfile_base)
+
+# byte_compile ()
+
+def rfc822_escape (header):
+    """Return a version of the string escaped for inclusion in an
+    RFC-822 header, by ensuring there are 8 spaces space after each newline.
+    """
+    lines = header.split('\n')
+    sep = '\n' + 8 * ' '
+    return sep.join(lines)
+
+# 2to3 support
+
+def run_2to3(files, fixer_names=None, options=None, explicit=None):
+    """Invoke 2to3 on a list of Python files.
+    The files should all come from the build area, as the
+    modification is done in-place. To reduce the build time,
+    only files modified since the last invocation of this
+    function should be passed in the files argument."""
+
+    if not files:
+        return
+
+    # Make this class local, to delay import of 2to3
+    from lib2to3.refactor import RefactoringTool, get_fixers_from_package
+    class DistutilsRefactoringTool(RefactoringTool):
+        def log_error(self, msg, *args, **kw):
+            log.error(msg, *args)
+
+        def log_message(self, msg, *args):
+            log.info(msg, *args)
+
+        def log_debug(self, msg, *args):
+            log.debug(msg, *args)
+
+    if fixer_names is None:
+        fixer_names = get_fixers_from_package('lib2to3.fixes')
+    r = DistutilsRefactoringTool(fixer_names, options=options)
+    r.refactor(files, write=True)
+
+def copydir_run_2to3(src, dest, template=None, fixer_names=None,
+                     options=None, explicit=None):
+    """Recursively copy a directory, only copying new and changed files,
+    running run_2to3 over all newly copied Python modules afterward.
+
+    If you give a template string, it's parsed like a MANIFEST.in.
+    """
+    from distutils.dir_util import mkpath
+    from distutils.file_util import copy_file
+    from distutils.filelist import FileList
+    filelist = FileList()
+    curdir = os.getcwd()
+    os.chdir(src)
+    try:
+        filelist.findall()
+    finally:
+        os.chdir(curdir)
+    filelist.files[:] = filelist.allfiles
+    if template:
+        for line in template.splitlines():
+            line = line.strip()
+            if not line: continue
+            filelist.process_template_line(line)
+    copied = []
+    for filename in filelist.files:
+        outname = os.path.join(dest, filename)
+        mkpath(os.path.dirname(outname))
+        res = copy_file(os.path.join(src, filename), outname, update=1)
+        if res[1]: copied.append(outname)
+    run_2to3([fn for fn in copied if fn.lower().endswith('.py')],
+             fixer_names=fixer_names, options=options, explicit=explicit)
+    return copied
+
+class Mixin2to3:
+    '''Mixin class for commands that run 2to3.
+    To configure 2to3, setup scripts may either change
+    the class variables, or inherit from individual commands
+    to override how 2to3 is invoked.'''
+
+    # provide list of fixers to run;
+    # defaults to all from lib2to3.fixers
+    fixer_names = None
+
+    # options dictionary
+    options = None
+
+    # list of fixers to invoke even though they are marked as explicit
+    explicit = None
+
+    def run_2to3(self, files):
+        return run_2to3(files, self.fixer_names, self.options, self.explicit)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/version.py b/venv/Lib/site-packages/setuptools/_distutils/version.py
new file mode 100644
index 0000000..c33beba
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/version.py
@@ -0,0 +1,347 @@
+#
+# distutils/version.py
+#
+# Implements multiple version numbering conventions for the
+# Python Module Distribution Utilities.
+#
+# $Id$
+#
+
+"""Provides classes to represent module version numbers (one class for
+each style of version numbering).  There are currently two such classes
+implemented: StrictVersion and LooseVersion.
+
+Every version number class implements the following interface:
+  * the 'parse' method takes a string and parses it to some internal
+    representation; if the string is an invalid version number,
+    'parse' raises a ValueError exception
+  * the class constructor takes an optional string argument which,
+    if supplied, is passed to 'parse'
+  * __str__ reconstructs the string that was passed to 'parse' (or
+    an equivalent string -- ie. one that will generate an equivalent
+    version number instance)
+  * __repr__ generates Python code to recreate the version number instance
+  * _cmp compares the current instance with either another instance
+    of the same class or a string (which will be parsed to an instance
+    of the same class, thus must follow the same rules)
+"""
+
+import re
+
+class Version:
+    """Abstract base class for version numbering classes.  Just provides
+    constructor (__init__) and reproducer (__repr__), because those
+    seem to be the same for all version numbering classes; and route
+    rich comparisons to _cmp.
+    """
+
+    def __init__ (self, vstring=None):
+        if vstring:
+            self.parse(vstring)
+
+    def __repr__ (self):
+        return "%s ('%s')" % (self.__class__.__name__, str(self))
+
+    def __eq__(self, other):
+        c = self._cmp(other)
+        if c is NotImplemented:
+            return c
+        return c == 0
+
+    def __lt__(self, other):
+        c = self._cmp(other)
+        if c is NotImplemented:
+            return c
+        return c < 0
+
+    def __le__(self, other):
+        c = self._cmp(other)
+        if c is NotImplemented:
+            return c
+        return c <= 0
+
+    def __gt__(self, other):
+        c = self._cmp(other)
+        if c is NotImplemented:
+            return c
+        return c > 0
+
+    def __ge__(self, other):
+        c = self._cmp(other)
+        if c is NotImplemented:
+            return c
+        return c >= 0
+
+
+# Interface for version-number classes -- must be implemented
+# by the following classes (the concrete ones -- Version should
+# be treated as an abstract class).
+#    __init__ (string) - create and take same action as 'parse'
+#                        (string parameter is optional)
+#    parse (string)    - convert a string representation to whatever
+#                        internal representation is appropriate for
+#                        this style of version numbering
+#    __str__ (self)    - convert back to a string; should be very similar
+#                        (if not identical to) the string supplied to parse
+#    __repr__ (self)   - generate Python code to recreate
+#                        the instance
+#    _cmp (self, other) - compare two version numbers ('other' may
+#                        be an unparsed version string, or another
+#                        instance of your version class)
+
+
+class StrictVersion (Version):
+
+    """Version numbering for anal retentives and software idealists.
+    Implements the standard interface for version number classes as
+    described above.  A version number consists of two or three
+    dot-separated numeric components, with an optional "pre-release" tag
+    on the end.  The pre-release tag consists of the letter 'a' or 'b'
+    followed by a number.  If the numeric components of two version
+    numbers are equal, then one with a pre-release tag will always
+    be deemed earlier (lesser) than one without.
+
+    The following are valid version numbers (shown in the order that
+    would be obtained by sorting according to the supplied cmp function):
+
+        0.4       0.4.0  (these two are equivalent)
+        0.4.1
+        0.5a1
+        0.5b3
+        0.5
+        0.9.6
+        1.0
+        1.0.4a3
+        1.0.4b1
+        1.0.4
+
+    The following are examples of invalid version numbers:
+
+        1
+        2.7.2.2
+        1.3.a4
+        1.3pl1
+        1.3c4
+
+    The rationale for this version numbering system will be explained
+    in the distutils documentation.
+    """
+
+    version_re = re.compile(r'^(\d+) \. (\d+) (\. (\d+))? ([ab](\d+))?$',
+                            re.VERBOSE | re.ASCII)
+
+
+    def parse (self, vstring):
+        match = self.version_re.match(vstring)
+        if not match:
+            raise ValueError("invalid version number '%s'" % vstring)
+
+        (major, minor, patch, prerelease, prerelease_num) = \
+            match.group(1, 2, 4, 5, 6)
+
+        if patch:
+            self.version = tuple(map(int, [major, minor, patch]))
+        else:
+            self.version = tuple(map(int, [major, minor])) + (0,)
+
+        if prerelease:
+            self.prerelease = (prerelease[0], int(prerelease_num))
+        else:
+            self.prerelease = None
+
+
+    def __str__ (self):
+
+        if self.version[2] == 0:
+            vstring = '.'.join(map(str, self.version[0:2]))
+        else:
+            vstring = '.'.join(map(str, self.version))
+
+        if self.prerelease:
+            vstring = vstring + self.prerelease[0] + str(self.prerelease[1])
+
+        return vstring
+
+
+    def _cmp (self, other):
+        if isinstance(other, str):
+            other = StrictVersion(other)
+        elif not isinstance(other, StrictVersion):
+            return NotImplemented
+
+        if self.version != other.version:
+            # numeric versions don't match
+            # prerelease stuff doesn't matter
+            if self.version < other.version:
+                return -1
+            else:
+                return 1
+
+        # have to compare prerelease
+        # case 1: neither has prerelease; they're equal
+        # case 2: self has prerelease, other doesn't; other is greater
+        # case 3: self doesn't have prerelease, other does: self is greater
+        # case 4: both have prerelease: must compare them!
+
+        if (not self.prerelease and not other.prerelease):
+            return 0
+        elif (self.prerelease and not other.prerelease):
+            return -1
+        elif (not self.prerelease and other.prerelease):
+            return 1
+        elif (self.prerelease and other.prerelease):
+            if self.prerelease == other.prerelease:
+                return 0
+            elif self.prerelease < other.prerelease:
+                return -1
+            else:
+                return 1
+        else:
+            assert False, "never get here"
+
+# end class StrictVersion
+
+
+# The rules according to Greg Stein:
+# 1) a version number has 1 or more numbers separated by a period or by
+#    sequences of letters. If only periods, then these are compared
+#    left-to-right to determine an ordering.
+# 2) sequences of letters are part of the tuple for comparison and are
+#    compared lexicographically
+# 3) recognize the numeric components may have leading zeroes
+#
+# The LooseVersion class below implements these rules: a version number
+# string is split up into a tuple of integer and string components, and
+# comparison is a simple tuple comparison.  This means that version
+# numbers behave in a predictable and obvious way, but a way that might
+# not necessarily be how people *want* version numbers to behave.  There
+# wouldn't be a problem if people could stick to purely numeric version
+# numbers: just split on period and compare the numbers as tuples.
+# However, people insist on putting letters into their version numbers;
+# the most common purpose seems to be:
+#   - indicating a "pre-release" version
+#     ('alpha', 'beta', 'a', 'b', 'pre', 'p')
+#   - indicating a post-release patch ('p', 'pl', 'patch')
+# but of course this can't cover all version number schemes, and there's
+# no way to know what a programmer means without asking him.
+#
+# The problem is what to do with letters (and other non-numeric
+# characters) in a version number.  The current implementation does the
+# obvious and predictable thing: keep them as strings and compare
+# lexically within a tuple comparison.  This has the desired effect if
+# an appended letter sequence implies something "post-release":
+# eg. "0.99" < "0.99pl14" < "1.0", and "5.001" < "5.001m" < "5.002".
+#
+# However, if letters in a version number imply a pre-release version,
+# the "obvious" thing isn't correct.  Eg. you would expect that
+# "1.5.1" < "1.5.2a2" < "1.5.2", but under the tuple/lexical comparison
+# implemented here, this just isn't so.
+#
+# Two possible solutions come to mind.  The first is to tie the
+# comparison algorithm to a particular set of semantic rules, as has
+# been done in the StrictVersion class above.  This works great as long
+# as everyone can go along with bondage and discipline.  Hopefully a
+# (large) subset of Python module programmers will agree that the
+# particular flavour of bondage and discipline provided by StrictVersion
+# provides enough benefit to be worth using, and will submit their
+# version numbering scheme to its domination.  The free-thinking
+# anarchists in the lot will never give in, though, and something needs
+# to be done to accommodate them.
+#
+# Perhaps a "moderately strict" version class could be implemented that
+# lets almost anything slide (syntactically), and makes some heuristic
+# assumptions about non-digits in version number strings.  This could
+# sink into special-case-hell, though; if I was as talented and
+# idiosyncratic as Larry Wall, I'd go ahead and implement a class that
+# somehow knows that "1.2.1" < "1.2.2a2" < "1.2.2" < "1.2.2pl3", and is
+# just as happy dealing with things like "2g6" and "1.13++".  I don't
+# think I'm smart enough to do it right though.
+#
+# In any case, I've coded the test suite for this module (see
+# ../test/test_version.py) specifically to fail on things like comparing
+# "1.2a2" and "1.2".  That's not because the *code* is doing anything
+# wrong, it's because the simple, obvious design doesn't match my
+# complicated, hairy expectations for real-world version numbers.  It
+# would be a snap to fix the test suite to say, "Yep, LooseVersion does
+# the Right Thing" (ie. the code matches the conception).  But I'd rather
+# have a conception that matches common notions about version numbers.
+
+class LooseVersion (Version):
+
+    """Version numbering for anarchists and software realists.
+    Implements the standard interface for version number classes as
+    described above.  A version number consists of a series of numbers,
+    separated by either periods or strings of letters.  When comparing
+    version numbers, the numeric components will be compared
+    numerically, and the alphabetic components lexically.  The following
+    are all valid version numbers, in no particular order:
+
+        1.5.1
+        1.5.2b2
+        161
+        3.10a
+        8.02
+        3.4j
+        1996.07.12
+        3.2.pl0
+        3.1.1.6
+        2g6
+        11g
+        0.960923
+        2.2beta29
+        1.13++
+        5.5.kw
+        2.0b1pl0
+
+    In fact, there is no such thing as an invalid version number under
+    this scheme; the rules for comparison are simple and predictable,
+    but may not always give the results you want (for some definition
+    of "want").
+    """
+
+    component_re = re.compile(r'(\d+ | [a-z]+ | \.)', re.VERBOSE)
+
+    def __init__ (self, vstring=None):
+        if vstring:
+            self.parse(vstring)
+
+
+    def parse (self, vstring):
+        # I've given up on thinking I can reconstruct the version string
+        # from the parsed tuple -- so I just store the string here for
+        # use by __str__
+        self.vstring = vstring
+        components = [x for x in self.component_re.split(vstring)
+                              if x and x != '.']
+        for i, obj in enumerate(components):
+            try:
+                components[i] = int(obj)
+            except ValueError:
+                pass
+
+        self.version = components
+
+
+    def __str__ (self):
+        return self.vstring
+
+
+    def __repr__ (self):
+        return "LooseVersion ('%s')" % str(self)
+
+
+    def _cmp (self, other):
+        if isinstance(other, str):
+            other = LooseVersion(other)
+        elif not isinstance(other, LooseVersion):
+            return NotImplemented
+
+        if self.version == other.version:
+            return 0
+        if self.version < other.version:
+            return -1
+        if self.version > other.version:
+            return 1
+
+
+# end class LooseVersion
diff --git a/venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py b/venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py
new file mode 100644
index 0000000..062c98f
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py
@@ -0,0 +1,166 @@
+"""Module for parsing and testing package version predicate strings.
+"""
+import re
+import distutils.version
+import operator
+
+
+re_validPackage = re.compile(r"(?i)^\s*([a-z_]\w*(?:\.[a-z_]\w*)*)(.*)",
+    re.ASCII)
+# (package) (rest)
+
+re_paren = re.compile(r"^\s*\((.*)\)\s*$") # (list) inside of parentheses
+re_splitComparison = re.compile(r"^\s*(<=|>=|<|>|!=|==)\s*([^\s,]+)\s*$")
+# (comp) (version)
+
+
+def splitUp(pred):
+    """Parse a single version comparison.
+
+    Return (comparison string, StrictVersion)
+    """
+    res = re_splitComparison.match(pred)
+    if not res:
+        raise ValueError("bad package restriction syntax: %r" % pred)
+    comp, verStr = res.groups()
+    return (comp, distutils.version.StrictVersion(verStr))
+
+compmap = {"<": operator.lt, "<=": operator.le, "==": operator.eq,
+           ">": operator.gt, ">=": operator.ge, "!=": operator.ne}
+
+class VersionPredicate:
+    """Parse and test package version predicates.
+
+    >>> v = VersionPredicate('pyepat.abc (>1.0, <3333.3a1, !=1555.1b3)')
+
+    The `name` attribute provides the full dotted name that is given::
+
+    >>> v.name
+    'pyepat.abc'
+
+    The str() of a `VersionPredicate` provides a normalized
+    human-readable version of the expression::
+
+    >>> print(v)
+    pyepat.abc (> 1.0, < 3333.3a1, != 1555.1b3)
+
+    The `satisfied_by()` method can be used to determine with a given
+    version number is included in the set described by the version
+    restrictions::
+
+    >>> v.satisfied_by('1.1')
+    True
+    >>> v.satisfied_by('1.4')
+    True
+    >>> v.satisfied_by('1.0')
+    False
+    >>> v.satisfied_by('4444.4')
+    False
+    >>> v.satisfied_by('1555.1b3')
+    False
+
+    `VersionPredicate` is flexible in accepting extra whitespace::
+
+    >>> v = VersionPredicate(' pat( ==  0.1  )  ')
+    >>> v.name
+    'pat'
+    >>> v.satisfied_by('0.1')
+    True
+    >>> v.satisfied_by('0.2')
+    False
+
+    If any version numbers passed in do not conform to the
+    restrictions of `StrictVersion`, a `ValueError` is raised::
+
+    >>> v = VersionPredicate('p1.p2.p3.p4(>=1.0, <=1.3a1, !=1.2zb3)')
+    Traceback (most recent call last):
+      ...
+    ValueError: invalid version number '1.2zb3'
+
+    It the module or package name given does not conform to what's
+    allowed as a legal module or package name, `ValueError` is
+    raised::
+
+    >>> v = VersionPredicate('foo-bar')
+    Traceback (most recent call last):
+      ...
+    ValueError: expected parenthesized list: '-bar'
+
+    >>> v = VersionPredicate('foo bar (12.21)')
+    Traceback (most recent call last):
+      ...
+    ValueError: expected parenthesized list: 'bar (12.21)'
+
+    """
+
+    def __init__(self, versionPredicateStr):
+        """Parse a version predicate string.
+        """
+        # Fields:
+        #    name:  package name
+        #    pred:  list of (comparison string, StrictVersion)
+
+        versionPredicateStr = versionPredicateStr.strip()
+        if not versionPredicateStr:
+            raise ValueError("empty package restriction")
+        match = re_validPackage.match(versionPredicateStr)
+        if not match:
+            raise ValueError("bad package name in %r" % versionPredicateStr)
+        self.name, paren = match.groups()
+        paren = paren.strip()
+        if paren:
+            match = re_paren.match(paren)
+            if not match:
+                raise ValueError("expected parenthesized list: %r" % paren)
+            str = match.groups()[0]
+            self.pred = [splitUp(aPred) for aPred in str.split(",")]
+            if not self.pred:
+                raise ValueError("empty parenthesized list in %r"
+                                 % versionPredicateStr)
+        else:
+            self.pred = []
+
+    def __str__(self):
+        if self.pred:
+            seq = [cond + " " + str(ver) for cond, ver in self.pred]
+            return self.name + " (" + ", ".join(seq) + ")"
+        else:
+            return self.name
+
+    def satisfied_by(self, version):
+        """True if version is compatible with all the predicates in self.
+        The parameter version must be acceptable to the StrictVersion
+        constructor.  It may be either a string or StrictVersion.
+        """
+        for cond, ver in self.pred:
+            if not compmap[cond](version, ver):
+                return False
+        return True
+
+
+_provision_rx = None
+
+def split_provision(value):
+    """Return the name and optional version number of a provision.
+
+    The version number, if given, will be returned as a `StrictVersion`
+    instance, otherwise it will be `None`.
+
+    >>> split_provision('mypkg')
+    ('mypkg', None)
+    >>> split_provision(' mypkg( 1.2 ) ')
+    ('mypkg', StrictVersion ('1.2'))
+    """
+    global _provision_rx
+    if _provision_rx is None:
+        _provision_rx = re.compile(
+            r"([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)(?:\s*\(\s*([^)\s]+)\s*\))?$",
+            re.ASCII)
+    value = value.strip()
+    m = _provision_rx.match(value)
+    if not m:
+        raise ValueError("illegal provides specification: %r" % value)
+    ver = m.group(2) or None
+    if ver:
+        ver = distutils.version.StrictVersion(ver)
+    return m.group(1), ver
diff --git a/venv/lib/python3.8/site-packages/setuptools/_imp.py b/venv/Lib/site-packages/setuptools/_imp.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/_imp.py
rename to venv/Lib/site-packages/setuptools/_imp.py
diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/__init__.py b/venv/Lib/site-packages/setuptools/_vendor/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/serial/urlhandler/__init__.py
rename to venv/Lib/site-packages/setuptools/_vendor/__init__.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/ordered_set.py b/venv/Lib/site-packages/setuptools/_vendor/ordered_set.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/ordered_set.py
rename to venv/Lib/site-packages/setuptools/_vendor/ordered_set.py
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py
similarity index 64%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py
rename to venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py
index 95d330e..4d99857 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py
@@ -4,18 +4,24 @@
 from __future__ import absolute_import, division, print_function
 
 __all__ = [
-    "__title__", "__summary__", "__uri__", "__version__", "__author__",
-    "__email__", "__license__", "__copyright__",
+    "__title__",
+    "__summary__",
+    "__uri__",
+    "__version__",
+    "__author__",
+    "__email__",
+    "__license__",
+    "__copyright__",
 ]
 
 __title__ = "packaging"
 __summary__ = "Core utilities for Python packages"
 __uri__ = "https://github.com/pypa/packaging"
 
-__version__ = "16.8"
+__version__ = "20.4"
 
 __author__ = "Donald Stufft and individual contributors"
 __email__ = "donald@stufft.io"
 
-__license__ = "BSD or Apache License, Version 2.0"
-__copyright__ = "Copyright 2014-2016 %s" % __author__
+__license__ = "BSD-2-Clause or Apache-2.0"
+__copyright__ = "Copyright 2014-2019 %s" % __author__
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py
similarity index 51%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py
rename to venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py
index 5ee6220..a0cf67d 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py
@@ -4,11 +4,23 @@
 from __future__ import absolute_import, division, print_function
 
 from .__about__ import (
-    __author__, __copyright__, __email__, __license__, __summary__, __title__,
-    __uri__, __version__
+    __author__,
+    __copyright__,
+    __email__,
+    __license__,
+    __summary__,
+    __title__,
+    __uri__,
+    __version__,
 )
 
 __all__ = [
-    "__title__", "__summary__", "__uri__", "__version__", "__author__",
-    "__email__", "__license__", "__copyright__",
+    "__title__",
+    "__summary__",
+    "__uri__",
+    "__version__",
+    "__author__",
+    "__email__",
+    "__license__",
+    "__copyright__",
 ]
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py
similarity index 63%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py
rename to venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py
index 210bb80..e54bd4e 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py
@@ -5,6 +5,11 @@ from __future__ import absolute_import, division, print_function
 
 import sys
 
+from ._typing import TYPE_CHECKING
+
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import Any, Dict, Tuple, Type
+
 
 PY2 = sys.version_info[0] == 2
 PY3 = sys.version_info[0] == 3
@@ -12,19 +17,22 @@ PY3 = sys.version_info[0] == 3
 # flake8: noqa
 
 if PY3:
-    string_types = str,
+    string_types = (str,)
 else:
-    string_types = basestring,
+    string_types = (basestring,)
 
 
 def with_metaclass(meta, *bases):
+    # type: (Type[Any], Tuple[Type[Any], ...]) -> Any
     """
     Create a base class with a metaclass.
     """
     # This requires a bit of explanation: the basic idea is to make a dummy
     # metaclass for one level of class instantiation that replaces itself with
     # the actual metaclass.
-    class metaclass(meta):
+    class metaclass(meta):  # type: ignore
         def __new__(cls, name, this_bases, d):
+            # type: (Type[Any], str, Tuple[Any], Dict[Any, Any]) -> Any
             return meta(name, bases, d)
-    return type.__new__(metaclass, 'temporary_class', (), {})
+
+    return type.__new__(metaclass, "temporary_class", (), {})
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py
similarity index 64%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py
rename to venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py
index ccc2786..800d5c5 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py
@@ -4,65 +4,83 @@
 from __future__ import absolute_import, division, print_function
 
 
-class Infinity(object):
-
+class InfinityType(object):
     def __repr__(self):
+        # type: () -> str
         return "Infinity"
 
     def __hash__(self):
+        # type: () -> int
         return hash(repr(self))
 
     def __lt__(self, other):
+        # type: (object) -> bool
         return False
 
     def __le__(self, other):
+        # type: (object) -> bool
         return False
 
     def __eq__(self, other):
+        # type: (object) -> bool
         return isinstance(other, self.__class__)
 
     def __ne__(self, other):
+        # type: (object) -> bool
         return not isinstance(other, self.__class__)
 
     def __gt__(self, other):
+        # type: (object) -> bool
         return True
 
     def __ge__(self, other):
+        # type: (object) -> bool
         return True
 
     def __neg__(self):
+        # type: (object) -> NegativeInfinityType
         return NegativeInfinity
 
-Infinity = Infinity()
 
+Infinity = InfinityType()
 
-class NegativeInfinity(object):
 
+class NegativeInfinityType(object):
     def __repr__(self):
+        # type: () -> str
         return "-Infinity"
 
     def __hash__(self):
+        # type: () -> int
         return hash(repr(self))
 
     def __lt__(self, other):
+        # type: (object) -> bool
         return True
 
     def __le__(self, other):
+        # type: (object) -> bool
         return True
 
     def __eq__(self, other):
+        # type: (object) -> bool
         return isinstance(other, self.__class__)
 
     def __ne__(self, other):
+        # type: (object) -> bool
         return not isinstance(other, self.__class__)
 
     def __gt__(self, other):
+        # type: (object) -> bool
         return False
 
     def __ge__(self, other):
+        # type: (object) -> bool
         return False
 
     def __neg__(self):
+        # type: (object) -> InfinityType
         return Infinity
 
-NegativeInfinity = NegativeInfinity()
+
+NegativeInfinity = NegativeInfinityType()
diff --git a/venv/Lib/site-packages/setuptools/_vendor/packaging/_typing.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/_typing.py
new file mode 100644
index 0000000..77a8b91
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/_typing.py
@@ -0,0 +1,48 @@
+"""For neatly implementing static typing in packaging.
+
+`mypy` - the static type analysis tool we use - uses the `typing` module, which
+provides core functionality fundamental to mypy's functioning.
+
+Generally, `typing` would be imported at runtime and used in that fashion -
+it acts as a no-op at runtime and does not have any run-time overhead by
+design.
+
+As it turns out, `typing` is not vendorable - it uses separate sources for
+Python 2/Python 3. Thus, this codebase can not expect it to be present.
+To work around this, mypy allows the typing import to be behind a False-y
+optional to prevent it from running at runtime and type-comments can be used
+to remove the need for the types to be accessible directly during runtime.
+
+This module provides the False-y guard in a nicely named fashion so that a
+curious maintainer can reach here to read this.
+
+In packaging, all static-typing related imports should be guarded as follows:
+
+    from packaging._typing import TYPE_CHECKING
+
+    if TYPE_CHECKING:
+        from typing import ...
+
+Ref: https://github.com/python/mypy/issues/3216
+"""
+
+__all__ = ["TYPE_CHECKING", "cast"]
+
+# The TYPE_CHECKING constant defined by the typing module is False at runtime
+# but True while type checking.
+if False:  # pragma: no cover
+    from typing import TYPE_CHECKING
+else:
+    TYPE_CHECKING = False
+
+# typing's cast syntax requires calling typing.cast at runtime, but we don't
+# want to import typing at runtime. Here, we inform the type checkers that
+# we're importing `typing.cast` as `cast` and re-implement typing.cast's
+# runtime behavior in a block that is ignored by type checkers.
+if TYPE_CHECKING:  # pragma: no cover
+    # not executed at runtime
+    from typing import cast
+else:
+    # executed at runtime
+    def cast(type_, value):  # noqa
+        return value
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py
similarity index 82%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py
rename to venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py
index 4bdfdb2..03fbdfc 100644
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py
@@ -13,8 +13,14 @@ from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString
 from setuptools.extern.pyparsing import Literal as L  # noqa
 
 from ._compat import string_types
+from ._typing import TYPE_CHECKING
 from .specifiers import Specifier, InvalidSpecifier
 
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import Any, Callable, Dict, List, Optional, Tuple, Union
+
+    Operator = Callable[[str, str], bool]
+
 
 __all__ = [
     "InvalidMarker",
@@ -46,30 +52,37 @@ class UndefinedEnvironmentName(ValueError):
 
 class Node(object):
     def __init__(self, value):
+        # type: (Any) -> None
         self.value = value
 
     def __str__(self):
+        # type: () -> str
         return str(self.value)
 
     def __repr__(self):
+        # type: () -> str
         return "<{0}({1!r})>".format(self.__class__.__name__, str(self))
 
     def serialize(self):
+        # type: () -> str
         raise NotImplementedError
 
 
 class Variable(Node):
     def serialize(self):
+        # type: () -> str
         return str(self)
 
 
 class Value(Node):
     def serialize(self):
+        # type: () -> str
         return '"{0}"'.format(self)
 
 
 class Op(Node):
     def serialize(self):
+        # type: () -> str
         return str(self)
 
 
@@ -85,13 +98,13 @@ VARIABLE = (
     | L("python_version")
     | L("sys_platform")
     | L("os_name")
-    | L("os.name")
+    | L("os.name")  # PEP-345
     | L("sys.platform")  # PEP-345
     | L("platform.version")  # PEP-345
     | L("platform.machine")  # PEP-345
     | L("platform.python_implementation")  # PEP-345
-    | L("python_implementation")  # PEP-345
-    | L("extra")  # undocumented setuptools legacy
+    | L("python_implementation")  # undocumented setuptools legacy
+    | L("extra")  # PEP-508
 )
 ALIASES = {
     "os.name": "os_name",
@@ -131,6 +144,7 @@ MARKER = stringStart + MARKER_EXPR + stringEnd
 
 
 def _coerce_parse_result(results):
+    # type: (Union[ParseResults, List[Any]]) -> List[Any]
     if isinstance(results, ParseResults):
         return [_coerce_parse_result(i) for i in results]
     else:
@@ -138,6 +152,8 @@ def _coerce_parse_result(results):
 
 
 def _format_marker(marker, first=True):
+    # type: (Union[List[str], Tuple[Node, ...], str], Optional[bool]) -> str
+
     assert isinstance(marker, (list, tuple, string_types))
 
     # Sometimes we have a structure like [[...]] which is a single item list
@@ -172,10 +188,11 @@ _operators = {
     "!=": operator.ne,
     ">=": operator.ge,
     ">": operator.gt,
-}
+}  # type: Dict[str, Operator]
 
 
 def _eval_op(lhs, op, rhs):
+    # type: (str, Op, str) -> bool
     try:
         spec = Specifier("".join([op.serialize(), rhs]))
     except InvalidSpecifier:
@@ -183,7 +200,7 @@ def _eval_op(lhs, op, rhs):
     else:
         return spec.contains(lhs)
 
-    oper = _operators.get(op.serialize())
+    oper = _operators.get(op.serialize())  # type: Optional[Operator]
     if oper is None:
         raise UndefinedComparison(
             "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
@@ -192,13 +209,18 @@ def _eval_op(lhs, op, rhs):
     return oper(lhs, rhs)
 
 
-_undefined = object()
+class Undefined(object):
+    pass
+
+
+_undefined = Undefined()
 
 
 def _get_env(environment, name):
-    value = environment.get(name, _undefined)
+    # type: (Dict[str, str], str) -> str
+    value = environment.get(name, _undefined)  # type: Union[str, Undefined]
 
-    if value is _undefined:
+    if isinstance(value, Undefined):
         raise UndefinedEnvironmentName(
             "{0!r} does not exist in evaluation environment.".format(name)
         )
@@ -207,7 +229,8 @@ def _get_env(environment, name):
 
 
 def _evaluate_markers(markers, environment):
-    groups = [[]]
+    # type: (List[Any], Dict[str, str]) -> bool
+    groups = [[]]  # type: List[List[bool]]
 
     for marker in markers:
         assert isinstance(marker, (list, tuple, string_types))
@@ -234,6 +257,7 @@ def _evaluate_markers(markers, environment):
 
 
 def format_full_version(info):
+    # type: (sys._version_info) -> str
     version = "{0.major}.{0.minor}.{0.micro}".format(info)
     kind = info.releaselevel
     if kind != "final":
@@ -242,9 +266,13 @@ def format_full_version(info):
 
 
 def default_environment():
+    # type: () -> Dict[str, str]
     if hasattr(sys, "implementation"):
-        iver = format_full_version(sys.implementation.version)
-        implementation_name = sys.implementation.name
+        # Ignoring the `sys.implementation` reference for type checking due to
+        # mypy not liking that the attribute doesn't exist in Python 2.7 when
+        # run with the `--py27` flag.
+        iver = format_full_version(sys.implementation.version)  # type: ignore
+        implementation_name = sys.implementation.name  # type: ignore
     else:
         iver = "0"
         implementation_name = ""
@@ -266,6 +294,7 @@ def default_environment():
 
 class Marker(object):
     def __init__(self, marker):
+        # type: (str) -> None
         try:
             self._markers = _coerce_parse_result(MARKER.parseString(marker))
         except ParseException as e:
@@ -275,12 +304,15 @@ class Marker(object):
             raise InvalidMarker(err_str)
 
     def __str__(self):
+        # type: () -> str
         return _format_marker(self._markers)
 
     def __repr__(self):
+        # type: () -> str
         return "<Marker({0!r})>".format(str(self))
 
     def evaluate(self, environment=None):
+        # type: (Optional[Dict[str, str]]) -> bool
         """Evaluate a marker.
 
         Return the boolean from evaluating the given marker against the
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py
similarity index 95%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py
rename to venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py
index 8a0c2cb..06b1748 100644
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py
@@ -11,9 +11,13 @@ from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combi
 from setuptools.extern.pyparsing import Literal as L  # noqa
 from setuptools.extern.six.moves.urllib import parse as urlparse
 
+from ._typing import TYPE_CHECKING
 from .markers import MARKER_EXPR, Marker
 from .specifiers import LegacySpecifier, Specifier, SpecifierSet
 
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import List
+
 
 class InvalidRequirement(ValueError):
     """
@@ -89,6 +93,7 @@ class Requirement(object):
     # TODO: Can we normalize the name and extra name?
 
     def __init__(self, requirement_string):
+        # type: (str) -> None
         try:
             req = REQUIREMENT.parseString(requirement_string)
         except ParseException as e:
@@ -116,7 +121,8 @@ class Requirement(object):
         self.marker = req.marker if req.marker else None
 
     def __str__(self):
-        parts = [self.name]
+        # type: () -> str
+        parts = [self.name]  # type: List[str]
 
         if self.extras:
             parts.append("[{0}]".format(",".join(sorted(self.extras))))
@@ -135,4 +141,5 @@ class Requirement(object):
         return "".join(parts)
 
     def __repr__(self):
+        # type: () -> str
         return "<Requirement({0!r})>".format(str(self))
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py
similarity index 78%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py
rename to venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py
index 7f5a76c..fe09bb1 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py
@@ -9,8 +9,27 @@ import itertools
 import re
 
 from ._compat import string_types, with_metaclass
+from ._typing import TYPE_CHECKING
+from .utils import canonicalize_version
 from .version import Version, LegacyVersion, parse
 
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import (
+        List,
+        Dict,
+        Union,
+        Iterable,
+        Iterator,
+        Optional,
+        Callable,
+        Tuple,
+        FrozenSet,
+    )
+
+    ParsedVersion = Union[Version, LegacyVersion]
+    UnparsedVersion = Union[Version, LegacyVersion, str]
+    CallableOperator = Callable[[ParsedVersion, str], bool]
+
 
 class InvalidSpecifier(ValueError):
     """
@@ -18,10 +37,10 @@ class InvalidSpecifier(ValueError):
     """
 
 
-class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
-
+class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):  # type: ignore
     @abc.abstractmethod
     def __str__(self):
+        # type: () -> str
         """
         Returns the str representation of this Specifier like object. This
         should be representative of the Specifier itself.
@@ -29,12 +48,14 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @abc.abstractmethod
     def __hash__(self):
+        # type: () -> int
         """
         Returns a hash value for this Specifier like object.
         """
 
     @abc.abstractmethod
     def __eq__(self, other):
+        # type: (object) -> bool
         """
         Returns a boolean representing whether or not the two Specifier like
         objects are equal.
@@ -42,6 +63,7 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @abc.abstractmethod
     def __ne__(self, other):
+        # type: (object) -> bool
         """
         Returns a boolean representing whether or not the two Specifier like
         objects are not equal.
@@ -49,6 +71,7 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @abc.abstractproperty
     def prereleases(self):
+        # type: () -> Optional[bool]
         """
         Returns whether or not pre-releases as a whole are allowed by this
         specifier.
@@ -56,6 +79,7 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @prereleases.setter
     def prereleases(self, value):
+        # type: (bool) -> None
         """
         Sets whether or not pre-releases as a whole are allowed by this
         specifier.
@@ -63,12 +87,14 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
     @abc.abstractmethod
     def contains(self, item, prereleases=None):
+        # type: (str, Optional[bool]) -> bool
         """
         Determines if the given item is contained within this specifier.
         """
 
     @abc.abstractmethod
     def filter(self, iterable, prereleases=None):
+        # type: (Iterable[UnparsedVersion], Optional[bool]) -> Iterable[UnparsedVersion]
         """
         Takes an iterable of items and filters them so that only items which
         are contained within this specifier are allowed in it.
@@ -77,9 +103,10 @@ class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):
 
 class _IndividualSpecifier(BaseSpecifier):
 
-    _operators = {}
+    _operators = {}  # type: Dict[str, str]
 
     def __init__(self, spec="", prereleases=None):
+        # type: (str, Optional[bool]) -> None
         match = self._regex.search(spec)
         if not match:
             raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec))
@@ -87,45 +114,51 @@ class _IndividualSpecifier(BaseSpecifier):
         self._spec = (
             match.group("operator").strip(),
             match.group("version").strip(),
-        )
+        )  # type: Tuple[str, str]
 
         # Store whether or not this Specifier should accept prereleases
         self._prereleases = prereleases
 
     def __repr__(self):
+        # type: () -> str
         pre = (
             ", prereleases={0!r}".format(self.prereleases)
             if self._prereleases is not None
             else ""
         )
 
-        return "<{0}({1!r}{2})>".format(
-            self.__class__.__name__,
-            str(self),
-            pre,
-        )
+        return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre)
 
     def __str__(self):
+        # type: () -> str
         return "{0}{1}".format(*self._spec)
 
+    @property
+    def _canonical_spec(self):
+        # type: () -> Tuple[str, Union[Version, str]]
+        return self._spec[0], canonicalize_version(self._spec[1])
+
     def __hash__(self):
-        return hash(self._spec)
+        # type: () -> int
+        return hash(self._canonical_spec)
 
     def __eq__(self, other):
+        # type: (object) -> bool
         if isinstance(other, string_types):
             try:
-                other = self.__class__(other)
+                other = self.__class__(str(other))
             except InvalidSpecifier:
                 return NotImplemented
         elif not isinstance(other, self.__class__):
             return NotImplemented
 
-        return self._spec == other._spec
+        return self._canonical_spec == other._canonical_spec
 
     def __ne__(self, other):
+        # type: (object) -> bool
         if isinstance(other, string_types):
             try:
-                other = self.__class__(other)
+                other = self.__class__(str(other))
             except InvalidSpecifier:
                 return NotImplemented
         elif not isinstance(other, self.__class__):
@@ -134,52 +167,67 @@ class _IndividualSpecifier(BaseSpecifier):
         return self._spec != other._spec
 
     def _get_operator(self, op):
-        return getattr(self, "_compare_{0}".format(self._operators[op]))
+        # type: (str) -> CallableOperator
+        operator_callable = getattr(
+            self, "_compare_{0}".format(self._operators[op])
+        )  # type: CallableOperator
+        return operator_callable
 
     def _coerce_version(self, version):
+        # type: (UnparsedVersion) -> ParsedVersion
         if not isinstance(version, (LegacyVersion, Version)):
             version = parse(version)
         return version
 
     @property
     def operator(self):
+        # type: () -> str
         return self._spec[0]
 
     @property
     def version(self):
+        # type: () -> str
         return self._spec[1]
 
     @property
     def prereleases(self):
+        # type: () -> Optional[bool]
         return self._prereleases
 
     @prereleases.setter
     def prereleases(self, value):
+        # type: (bool) -> None
         self._prereleases = value
 
     def __contains__(self, item):
+        # type: (str) -> bool
         return self.contains(item)
 
     def contains(self, item, prereleases=None):
+        # type: (UnparsedVersion, Optional[bool]) -> bool
+
         # Determine if prereleases are to be allowed or not.
         if prereleases is None:
             prereleases = self.prereleases
 
         # Normalize item to a Version or LegacyVersion, this allows us to have
         # a shortcut for ``"2.0" in Specifier(">=2")
-        item = self._coerce_version(item)
+        normalized_item = self._coerce_version(item)
 
         # Determine if we should be supporting prereleases in this specifier
         # or not, if we do not support prereleases than we can short circuit
         # logic if this version is a prereleases.
-        if item.is_prerelease and not prereleases:
+        if normalized_item.is_prerelease and not prereleases:
             return False
 
         # Actually do the comparison to determine if this item is contained
         # within this Specifier or not.
-        return self._get_operator(self.operator)(item, self.version)
+        operator_callable = self._get_operator(self.operator)  # type: CallableOperator
+        return operator_callable(normalized_item, self.version)
 
     def filter(self, iterable, prereleases=None):
+        # type: (Iterable[UnparsedVersion], Optional[bool]) -> Iterable[UnparsedVersion]
+
         yielded = False
         found_prereleases = []
 
@@ -194,11 +242,12 @@ class _IndividualSpecifier(BaseSpecifier):
                 # If our version is a prerelease, and we were not set to allow
                 # prereleases, then we'll store it for later incase nothing
                 # else matches this specifier.
-                if (parsed_version.is_prerelease and not
-                        (prereleases or self.prereleases)):
+                if parsed_version.is_prerelease and not (
+                    prereleases or self.prereleases
+                ):
                     found_prereleases.append(version)
                 # Either this is not a prerelease, or we should have been
-                # accepting prereleases from the begining.
+                # accepting prereleases from the beginning.
                 else:
                     yielded = True
                     yield version
@@ -213,8 +262,7 @@ class _IndividualSpecifier(BaseSpecifier):
 
 class LegacySpecifier(_IndividualSpecifier):
 
-    _regex_str = (
-        r"""
+    _regex_str = r"""
         (?P<operator>(==|!=|<=|>=|<|>))
         \s*
         (?P<version>
@@ -225,10 +273,8 @@ class LegacySpecifier(_IndividualSpecifier):
                       # them, and a comma since it's a version separator.
         )
         """
-    )
 
-    _regex = re.compile(
-        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+    _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
 
     _operators = {
         "==": "equal",
@@ -240,42 +286,53 @@ class LegacySpecifier(_IndividualSpecifier):
     }
 
     def _coerce_version(self, version):
+        # type: (Union[ParsedVersion, str]) -> LegacyVersion
         if not isinstance(version, LegacyVersion):
             version = LegacyVersion(str(version))
         return version
 
     def _compare_equal(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective == self._coerce_version(spec)
 
     def _compare_not_equal(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective != self._coerce_version(spec)
 
     def _compare_less_than_equal(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective <= self._coerce_version(spec)
 
     def _compare_greater_than_equal(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective >= self._coerce_version(spec)
 
     def _compare_less_than(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective < self._coerce_version(spec)
 
     def _compare_greater_than(self, prospective, spec):
+        # type: (LegacyVersion, str) -> bool
         return prospective > self._coerce_version(spec)
 
 
-def _require_version_compare(fn):
+def _require_version_compare(
+    fn  # type: (Callable[[Specifier, ParsedVersion, str], bool])
+):
+    # type: (...) -> Callable[[Specifier, ParsedVersion, str], bool]
     @functools.wraps(fn)
     def wrapped(self, prospective, spec):
+        # type: (Specifier, ParsedVersion, str) -> bool
         if not isinstance(prospective, Version):
             return False
         return fn(self, prospective, spec)
+
     return wrapped
 
 
 class Specifier(_IndividualSpecifier):
 
-    _regex_str = (
-        r"""
+    _regex_str = r"""
         (?P<operator>(~=|==|!=|<=|>=|<|>|===))
         (?P<version>
             (?:
@@ -367,10 +424,8 @@ class Specifier(_IndividualSpecifier):
             )
         )
         """
-    )
 
-    _regex = re.compile(
-        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+    _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
 
     _operators = {
         "~=": "compatible",
@@ -385,6 +440,8 @@ class Specifier(_IndividualSpecifier):
 
     @_require_version_compare
     def _compare_compatible(self, prospective, spec):
+        # type: (ParsedVersion, str) -> bool
+
         # Compatible releases have an equivalent combination of >= and ==. That
         # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to
         # implement this in terms of the other specifiers instead of
@@ -397,8 +454,7 @@ class Specifier(_IndividualSpecifier):
         prefix = ".".join(
             list(
                 itertools.takewhile(
-                    lambda x: (not x.startswith("post") and not
-                               x.startswith("dev")),
+                    lambda x: (not x.startswith("post") and not x.startswith("dev")),
                     _version_split(spec),
                 )
             )[:-1]
@@ -407,61 +463,81 @@ class Specifier(_IndividualSpecifier):
         # Add the prefix notation to the end of our string
         prefix += ".*"
 
-        return (self._get_operator(">=")(prospective, spec) and
-                self._get_operator("==")(prospective, prefix))
+        return self._get_operator(">=")(prospective, spec) and self._get_operator("==")(
+            prospective, prefix
+        )
 
     @_require_version_compare
     def _compare_equal(self, prospective, spec):
+        # type: (ParsedVersion, str) -> bool
+
         # We need special logic to handle prefix matching
         if spec.endswith(".*"):
             # In the case of prefix matching we want to ignore local segment.
             prospective = Version(prospective.public)
             # Split the spec out by dots, and pretend that there is an implicit
             # dot in between a release segment and a pre-release segment.
-            spec = _version_split(spec[:-2])  # Remove the trailing .*
+            split_spec = _version_split(spec[:-2])  # Remove the trailing .*
 
             # Split the prospective version out by dots, and pretend that there
             # is an implicit dot in between a release segment and a pre-release
             # segment.
-            prospective = _version_split(str(prospective))
+            split_prospective = _version_split(str(prospective))
 
             # Shorten the prospective version to be the same length as the spec
             # so that we can determine if the specifier is a prefix of the
             # prospective version or not.
-            prospective = prospective[:len(spec)]
+            shortened_prospective = split_prospective[: len(split_spec)]
 
             # Pad out our two sides with zeros so that they both equal the same
             # length.
-            spec, prospective = _pad_version(spec, prospective)
+            padded_spec, padded_prospective = _pad_version(
+                split_spec, shortened_prospective
+            )
+
+            return padded_prospective == padded_spec
         else:
             # Convert our spec string into a Version
-            spec = Version(spec)
+            spec_version = Version(spec)
 
             # If the specifier does not have a local segment, then we want to
             # act as if the prospective version also does not have a local
             # segment.
-            if not spec.local:
+            if not spec_version.local:
                 prospective = Version(prospective.public)
 
-        return prospective == spec
+            return prospective == spec_version
 
     @_require_version_compare
     def _compare_not_equal(self, prospective, spec):
+        # type: (ParsedVersion, str) -> bool
         return not self._compare_equal(prospective, spec)
 
     @_require_version_compare
     def _compare_less_than_equal(self, prospective, spec):
-        return prospective <= Version(spec)
+        # type: (ParsedVersion, str) -> bool
+
+        # NB: Local version identifiers are NOT permitted in the version
+        # specifier, so local version labels can be universally removed from
+        # the prospective version.
+        return Version(prospective.public) <= Version(spec)
 
     @_require_version_compare
     def _compare_greater_than_equal(self, prospective, spec):
-        return prospective >= Version(spec)
+        # type: (ParsedVersion, str) -> bool
+
+        # NB: Local version identifiers are NOT permitted in the version
+        # specifier, so local version labels can be universally removed from
+        # the prospective version.
+        return Version(prospective.public) >= Version(spec)
 
     @_require_version_compare
-    def _compare_less_than(self, prospective, spec):
+    def _compare_less_than(self, prospective, spec_str):
+        # type: (ParsedVersion, str) -> bool
+
         # Convert our spec to a Version instance, since we'll want to work with
         # it as a version.
-        spec = Version(spec)
+        spec = Version(spec_str)
 
         # Check to see if the prospective version is less than the spec
         # version. If it's not we can short circuit and just return False now
@@ -483,10 +559,12 @@ class Specifier(_IndividualSpecifier):
         return True
 
     @_require_version_compare
-    def _compare_greater_than(self, prospective, spec):
+    def _compare_greater_than(self, prospective, spec_str):
+        # type: (ParsedVersion, str) -> bool
+
         # Convert our spec to a Version instance, since we'll want to work with
         # it as a version.
-        spec = Version(spec)
+        spec = Version(spec_str)
 
         # Check to see if the prospective version is greater than the spec
         # version. If it's not we can short circuit and just return False now
@@ -503,7 +581,7 @@ class Specifier(_IndividualSpecifier):
                 return False
 
         # Ensure that we do not allow a local version of the version mentioned
-        # in the specifier, which is techincally greater than, to match.
+        # in the specifier, which is technically greater than, to match.
         if prospective.local is not None:
             if Version(prospective.base_version) == Version(spec.base_version):
                 return False
@@ -514,10 +592,13 @@ class Specifier(_IndividualSpecifier):
         return True
 
     def _compare_arbitrary(self, prospective, spec):
+        # type: (Version, str) -> bool
         return str(prospective).lower() == str(spec).lower()
 
     @property
     def prereleases(self):
+        # type: () -> bool
+
         # If there is an explicit prereleases set for this, then we'll just
         # blindly use that.
         if self._prereleases is not None:
@@ -542,6 +623,7 @@ class Specifier(_IndividualSpecifier):
 
     @prereleases.setter
     def prereleases(self, value):
+        # type: (bool) -> None
         self._prereleases = value
 
 
@@ -549,7 +631,8 @@ _prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")
 
 
 def _version_split(version):
-    result = []
+    # type: (str) -> List[str]
+    result = []  # type: List[str]
     for item in version.split("."):
         match = _prefix_regex.search(item)
         if match:
@@ -560,6 +643,7 @@ def _version_split(version):
 
 
 def _pad_version(left, right):
+    # type: (List[str], List[str]) -> Tuple[List[str], List[str]]
     left_split, right_split = [], []
 
     # Get the release segment of our versions
@@ -567,36 +651,28 @@ def _pad_version(left, right):
     right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right)))
 
     # Get the rest of our versions
-    left_split.append(left[len(left_split[0]):])
-    right_split.append(right[len(right_split[0]):])
+    left_split.append(left[len(left_split[0]) :])
+    right_split.append(right[len(right_split[0]) :])
 
     # Insert our padding
-    left_split.insert(
-        1,
-        ["0"] * max(0, len(right_split[0]) - len(left_split[0])),
-    )
-    right_split.insert(
-        1,
-        ["0"] * max(0, len(left_split[0]) - len(right_split[0])),
-    )
+    left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0])))
+    right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0])))
 
-    return (
-        list(itertools.chain(*left_split)),
-        list(itertools.chain(*right_split)),
-    )
+    return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split)))
 
 
 class SpecifierSet(BaseSpecifier):
-
     def __init__(self, specifiers="", prereleases=None):
-        # Split on , to break each indidivual specifier into it's own item, and
+        # type: (str, Optional[bool]) -> None
+
+        # Split on , to break each individual specifier into it's own item, and
         # strip each item to remove leading/trailing whitespace.
-        specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
+        split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
 
         # Parsed each individual specifier, attempting first to make it a
         # Specifier and falling back to a LegacySpecifier.
         parsed = set()
-        for specifier in specifiers:
+        for specifier in split_specifiers:
             try:
                 parsed.add(Specifier(specifier))
             except InvalidSpecifier:
@@ -610,6 +686,7 @@ class SpecifierSet(BaseSpecifier):
         self._prereleases = prereleases
 
     def __repr__(self):
+        # type: () -> str
         pre = (
             ", prereleases={0!r}".format(self.prereleases)
             if self._prereleases is not None
@@ -619,12 +696,15 @@ class SpecifierSet(BaseSpecifier):
         return "<SpecifierSet({0!r}{1})>".format(str(self), pre)
 
     def __str__(self):
+        # type: () -> str
         return ",".join(sorted(str(s) for s in self._specs))
 
     def __hash__(self):
+        # type: () -> int
         return hash(self._specs)
 
     def __and__(self, other):
+        # type: (Union[SpecifierSet, str]) -> SpecifierSet
         if isinstance(other, string_types):
             other = SpecifierSet(other)
         elif not isinstance(other, SpecifierSet):
@@ -648,9 +728,8 @@ class SpecifierSet(BaseSpecifier):
         return specifier
 
     def __eq__(self, other):
-        if isinstance(other, string_types):
-            other = SpecifierSet(other)
-        elif isinstance(other, _IndividualSpecifier):
+        # type: (object) -> bool
+        if isinstance(other, (string_types, _IndividualSpecifier)):
             other = SpecifierSet(str(other))
         elif not isinstance(other, SpecifierSet):
             return NotImplemented
@@ -658,9 +737,8 @@ class SpecifierSet(BaseSpecifier):
         return self._specs == other._specs
 
     def __ne__(self, other):
-        if isinstance(other, string_types):
-            other = SpecifierSet(other)
-        elif isinstance(other, _IndividualSpecifier):
+        # type: (object) -> bool
+        if isinstance(other, (string_types, _IndividualSpecifier)):
             other = SpecifierSet(str(other))
         elif not isinstance(other, SpecifierSet):
             return NotImplemented
@@ -668,13 +746,17 @@ class SpecifierSet(BaseSpecifier):
         return self._specs != other._specs
 
     def __len__(self):
+        # type: () -> int
         return len(self._specs)
 
     def __iter__(self):
+        # type: () -> Iterator[FrozenSet[_IndividualSpecifier]]
         return iter(self._specs)
 
     @property
     def prereleases(self):
+        # type: () -> Optional[bool]
+
         # If we have been given an explicit prerelease modifier, then we'll
         # pass that through here.
         if self._prereleases is not None:
@@ -692,12 +774,16 @@ class SpecifierSet(BaseSpecifier):
 
     @prereleases.setter
     def prereleases(self, value):
+        # type: (bool) -> None
         self._prereleases = value
 
     def __contains__(self, item):
+        # type: (Union[ParsedVersion, str]) -> bool
         return self.contains(item)
 
     def contains(self, item, prereleases=None):
+        # type: (Union[ParsedVersion, str], Optional[bool]) -> bool
+
         # Ensure that our item is a Version or LegacyVersion instance.
         if not isinstance(item, (LegacyVersion, Version)):
             item = parse(item)
@@ -721,12 +807,15 @@ class SpecifierSet(BaseSpecifier):
         # given version is contained within all of them.
         # Note: This use of all() here means that an empty set of specifiers
         #       will always return True, this is an explicit design decision.
-        return all(
-            s.contains(item, prereleases=prereleases)
-            for s in self._specs
-        )
+        return all(s.contains(item, prereleases=prereleases) for s in self._specs)
+
+    def filter(
+        self,
+        iterable,  # type: Iterable[Union[ParsedVersion, str]]
+        prereleases=None,  # type: Optional[bool]
+    ):
+        # type: (...) -> Iterable[Union[ParsedVersion, str]]
 
-    def filter(self, iterable, prereleases=None):
         # Determine if we're forcing a prerelease or not, if we're not forcing
         # one for this particular filter call, then we'll use whatever the
         # SpecifierSet thinks for whether or not we should support prereleases.
@@ -744,8 +833,8 @@ class SpecifierSet(BaseSpecifier):
         # which will filter out any pre-releases, unless there are no final
         # releases, and which will filter out LegacyVersion in general.
         else:
-            filtered = []
-            found_prereleases = []
+            filtered = []  # type: List[Union[ParsedVersion, str]]
+            found_prereleases = []  # type: List[Union[ParsedVersion, str]]
 
             for item in iterable:
                 # Ensure that we some kind of Version class for this item.
diff --git a/venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py
new file mode 100644
index 0000000..9064910
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py
@@ -0,0 +1,751 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+
+from __future__ import absolute_import
+
+import distutils.util
+
+try:
+    from importlib.machinery import EXTENSION_SUFFIXES
+except ImportError:  # pragma: no cover
+    import imp
+
+    EXTENSION_SUFFIXES = [x[0] for x in imp.get_suffixes()]
+    del imp
+import logging
+import os
+import platform
+import re
+import struct
+import sys
+import sysconfig
+import warnings
+
+from ._typing import TYPE_CHECKING, cast
+
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import (
+        Dict,
+        FrozenSet,
+        IO,
+        Iterable,
+        Iterator,
+        List,
+        Optional,
+        Sequence,
+        Tuple,
+        Union,
+    )
+
+    PythonVersion = Sequence[int]
+    MacVersion = Tuple[int, int]
+    GlibcVersion = Tuple[int, int]
+
+
+logger = logging.getLogger(__name__)
+
+INTERPRETER_SHORT_NAMES = {
+    "python": "py",  # Generic.
+    "cpython": "cp",
+    "pypy": "pp",
+    "ironpython": "ip",
+    "jython": "jy",
+}  # type: Dict[str, str]
+
+
+_32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32
+
+
+class Tag(object):
+    """
+    A representation of the tag triple for a wheel.
+
+    Instances are considered immutable and thus are hashable. Equality checking
+    is also supported.
+    """
+
+    __slots__ = ["_interpreter", "_abi", "_platform"]
+
+    def __init__(self, interpreter, abi, platform):
+        # type: (str, str, str) -> None
+        self._interpreter = interpreter.lower()
+        self._abi = abi.lower()
+        self._platform = platform.lower()
+
+    @property
+    def interpreter(self):
+        # type: () -> str
+        return self._interpreter
+
+    @property
+    def abi(self):
+        # type: () -> str
+        return self._abi
+
+    @property
+    def platform(self):
+        # type: () -> str
+        return self._platform
+
+    def __eq__(self, other):
+        # type: (object) -> bool
+        if not isinstance(other, Tag):
+            return NotImplemented
+
+        return (
+            (self.platform == other.platform)
+            and (self.abi == other.abi)
+            and (self.interpreter == other.interpreter)
+        )
+
+    def __hash__(self):
+        # type: () -> int
+        return hash((self._interpreter, self._abi, self._platform))
+
+    def __str__(self):
+        # type: () -> str
+        return "{}-{}-{}".format(self._interpreter, self._abi, self._platform)
+
+    def __repr__(self):
+        # type: () -> str
+        return "<{self} @ {self_id}>".format(self=self, self_id=id(self))
+
+
+def parse_tag(tag):
+    # type: (str) -> FrozenSet[Tag]
+    """
+    Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances.
+
+    Returning a set is required due to the possibility that the tag is a
+    compressed tag set.
+    """
+    tags = set()
+    interpreters, abis, platforms = tag.split("-")
+    for interpreter in interpreters.split("."):
+        for abi in abis.split("."):
+            for platform_ in platforms.split("."):
+                tags.add(Tag(interpreter, abi, platform_))
+    return frozenset(tags)
+
+
+def _warn_keyword_parameter(func_name, kwargs):
+    # type: (str, Dict[str, bool]) -> bool
+    """
+    Backwards-compatibility with Python 2.7 to allow treating 'warn' as keyword-only.
+    """
+    if not kwargs:
+        return False
+    elif len(kwargs) > 1 or "warn" not in kwargs:
+        kwargs.pop("warn", None)
+        arg = next(iter(kwargs.keys()))
+        raise TypeError(
+            "{}() got an unexpected keyword argument {!r}".format(func_name, arg)
+        )
+    return kwargs["warn"]
+
+
+def _get_config_var(name, warn=False):
+    # type: (str, bool) -> Union[int, str, None]
+    value = sysconfig.get_config_var(name)
+    if value is None and warn:
+        logger.debug(
+            "Config variable '%s' is unset, Python ABI tag may be incorrect", name
+        )
+    return value
+
+
+def _normalize_string(string):
+    # type: (str) -> str
+    return string.replace(".", "_").replace("-", "_")
+
+
+def _abi3_applies(python_version):
+    # type: (PythonVersion) -> bool
+    """
+    Determine if the Python version supports abi3.
+
+    PEP 384 was first implemented in Python 3.2.
+    """
+    return len(python_version) > 1 and tuple(python_version) >= (3, 2)
+
+
+def _cpython_abis(py_version, warn=False):
+    # type: (PythonVersion, bool) -> List[str]
+    py_version = tuple(py_version)  # To allow for version comparison.
+    abis = []
+    version = _version_nodot(py_version[:2])
+    debug = pymalloc = ucs4 = ""
+    with_debug = _get_config_var("Py_DEBUG", warn)
+    has_refcount = hasattr(sys, "gettotalrefcount")
+    # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled
+    # extension modules is the best option.
+    # https://github.com/pypa/pip/issues/3383#issuecomment-173267692
+    has_ext = "_d.pyd" in EXTENSION_SUFFIXES
+    if with_debug or (with_debug is None and (has_refcount or has_ext)):
+        debug = "d"
+    if py_version < (3, 8):
+        with_pymalloc = _get_config_var("WITH_PYMALLOC", warn)
+        if with_pymalloc or with_pymalloc is None:
+            pymalloc = "m"
+        if py_version < (3, 3):
+            unicode_size = _get_config_var("Py_UNICODE_SIZE", warn)
+            if unicode_size == 4 or (
+                unicode_size is None and sys.maxunicode == 0x10FFFF
+            ):
+                ucs4 = "u"
+    elif debug:
+        # Debug builds can also load "normal" extension modules.
+        # We can also assume no UCS-4 or pymalloc requirement.
+        abis.append("cp{version}".format(version=version))
+    abis.insert(
+        0,
+        "cp{version}{debug}{pymalloc}{ucs4}".format(
+            version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4
+        ),
+    )
+    return abis
+
+
+def cpython_tags(
+    python_version=None,  # type: Optional[PythonVersion]
+    abis=None,  # type: Optional[Iterable[str]]
+    platforms=None,  # type: Optional[Iterable[str]]
+    **kwargs  # type: bool
+):
+    # type: (...) -> Iterator[Tag]
+    """
+    Yields the tags for a CPython interpreter.
+
+    The tags consist of:
+    - cp<python_version>-<abi>-<platform>
+    - cp<python_version>-abi3-<platform>
+    - cp<python_version>-none-<platform>
+    - cp<less than python_version>-abi3-<platform>  # Older Python versions down to 3.2.
+
+    If python_version only specifies a major version then user-provided ABIs and
+    the 'none' ABItag will be used.
+
+    If 'abi3' or 'none' are specified in 'abis' then they will be yielded at
+    their normal position and not at the beginning.
+    """
+    warn = _warn_keyword_parameter("cpython_tags", kwargs)
+    if not python_version:
+        python_version = sys.version_info[:2]
+
+    interpreter = "cp{}".format(_version_nodot(python_version[:2]))
+
+    if abis is None:
+        if len(python_version) > 1:
+            abis = _cpython_abis(python_version, warn)
+        else:
+            abis = []
+    abis = list(abis)
+    # 'abi3' and 'none' are explicitly handled later.
+    for explicit_abi in ("abi3", "none"):
+        try:
+            abis.remove(explicit_abi)
+        except ValueError:
+            pass
+
+    platforms = list(platforms or _platform_tags())
+    for abi in abis:
+        for platform_ in platforms:
+            yield Tag(interpreter, abi, platform_)
+    if _abi3_applies(python_version):
+        for tag in (Tag(interpreter, "abi3", platform_) for platform_ in platforms):
+            yield tag
+    for tag in (Tag(interpreter, "none", platform_) for platform_ in platforms):
+        yield tag
+
+    if _abi3_applies(python_version):
+        for minor_version in range(python_version[1] - 1, 1, -1):
+            for platform_ in platforms:
+                interpreter = "cp{version}".format(
+                    version=_version_nodot((python_version[0], minor_version))
+                )
+                yield Tag(interpreter, "abi3", platform_)
+
+
+def _generic_abi():
+    # type: () -> Iterator[str]
+    abi = sysconfig.get_config_var("SOABI")
+    if abi:
+        yield _normalize_string(abi)
+
+
+def generic_tags(
+    interpreter=None,  # type: Optional[str]
+    abis=None,  # type: Optional[Iterable[str]]
+    platforms=None,  # type: Optional[Iterable[str]]
+    **kwargs  # type: bool
+):
+    # type: (...) -> Iterator[Tag]
+    """
+    Yields the tags for a generic interpreter.
+
+    The tags consist of:
+    - <interpreter>-<abi>-<platform>
+
+    The "none" ABI will be added if it was not explicitly provided.
+    """
+    warn = _warn_keyword_parameter("generic_tags", kwargs)
+    if not interpreter:
+        interp_name = interpreter_name()
+        interp_version = interpreter_version(warn=warn)
+        interpreter = "".join([interp_name, interp_version])
+    if abis is None:
+        abis = _generic_abi()
+    platforms = list(platforms or _platform_tags())
+    abis = list(abis)
+    if "none" not in abis:
+        abis.append("none")
+    for abi in abis:
+        for platform_ in platforms:
+            yield Tag(interpreter, abi, platform_)
+
+
+def _py_interpreter_range(py_version):
+    # type: (PythonVersion) -> Iterator[str]
+    """
+    Yields Python versions in descending order.
+
+    After the latest version, the major-only version will be yielded, and then
+    all previous versions of that major version.
+    """
+    if len(py_version) > 1:
+        yield "py{version}".format(version=_version_nodot(py_version[:2]))
+    yield "py{major}".format(major=py_version[0])
+    if len(py_version) > 1:
+        for minor in range(py_version[1] - 1, -1, -1):
+            yield "py{version}".format(version=_version_nodot((py_version[0], minor)))
+
+
+def compatible_tags(
+    python_version=None,  # type: Optional[PythonVersion]
+    interpreter=None,  # type: Optional[str]
+    platforms=None,  # type: Optional[Iterable[str]]
+):
+    # type: (...) -> Iterator[Tag]
+    """
+    Yields the sequence of tags that are compatible with a specific version of Python.
+
+    The tags consist of:
+    - py*-none-<platform>
+    - <interpreter>-none-any  # ... if `interpreter` is provided.
+    - py*-none-any
+    """
+    if not python_version:
+        python_version = sys.version_info[:2]
+    platforms = list(platforms or _platform_tags())
+    for version in _py_interpreter_range(python_version):
+        for platform_ in platforms:
+            yield Tag(version, "none", platform_)
+    if interpreter:
+        yield Tag(interpreter, "none", "any")
+    for version in _py_interpreter_range(python_version):
+        yield Tag(version, "none", "any")
+
+
+def _mac_arch(arch, is_32bit=_32_BIT_INTERPRETER):
+    # type: (str, bool) -> str
+    if not is_32bit:
+        return arch
+
+    if arch.startswith("ppc"):
+        return "ppc"
+
+    return "i386"
+
+
+def _mac_binary_formats(version, cpu_arch):
+    # type: (MacVersion, str) -> List[str]
+    formats = [cpu_arch]
+    if cpu_arch == "x86_64":
+        if version < (10, 4):
+            return []
+        formats.extend(["intel", "fat64", "fat32"])
+
+    elif cpu_arch == "i386":
+        if version < (10, 4):
+            return []
+        formats.extend(["intel", "fat32", "fat"])
+
+    elif cpu_arch == "ppc64":
+        # TODO: Need to care about 32-bit PPC for ppc64 through 10.2?
+        if version > (10, 5) or version < (10, 4):
+            return []
+        formats.append("fat64")
+
+    elif cpu_arch == "ppc":
+        if version > (10, 6):
+            return []
+        formats.extend(["fat32", "fat"])
+
+    formats.append("universal")
+    return formats
+
+
+def mac_platforms(version=None, arch=None):
+    # type: (Optional[MacVersion], Optional[str]) -> Iterator[str]
+    """
+    Yields the platform tags for a macOS system.
+
+    The `version` parameter is a two-item tuple specifying the macOS version to
+    generate platform tags for. The `arch` parameter is the CPU architecture to
+    generate platform tags for. Both parameters default to the appropriate value
+    for the current system.
+    """
+    version_str, _, cpu_arch = platform.mac_ver()  # type: ignore
+    if version is None:
+        version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2])))
+    else:
+        version = version
+    if arch is None:
+        arch = _mac_arch(cpu_arch)
+    else:
+        arch = arch
+    for minor_version in range(version[1], -1, -1):
+        compat_version = version[0], minor_version
+        binary_formats = _mac_binary_formats(compat_version, arch)
+        for binary_format in binary_formats:
+            yield "macosx_{major}_{minor}_{binary_format}".format(
+                major=compat_version[0],
+                minor=compat_version[1],
+                binary_format=binary_format,
+            )
+
+
+# From PEP 513.
+def _is_manylinux_compatible(name, glibc_version):
+    # type: (str, GlibcVersion) -> bool
+    # Check for presence of _manylinux module.
+    try:
+        import _manylinux  # noqa
+
+        return bool(getattr(_manylinux, name + "_compatible"))
+    except (ImportError, AttributeError):
+        # Fall through to heuristic check below.
+        pass
+
+    return _have_compatible_glibc(*glibc_version)
+
+
+def _glibc_version_string():
+    # type: () -> Optional[str]
+    # Returns glibc version string, or None if not using glibc.
+    return _glibc_version_string_confstr() or _glibc_version_string_ctypes()
+
+
+def _glibc_version_string_confstr():
+    # type: () -> Optional[str]
+    """
+    Primary implementation of glibc_version_string using os.confstr.
+    """
+    # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely
+    # to be broken or missing. This strategy is used in the standard library
+    # platform module.
+    # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183
+    try:
+        # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17".
+        version_string = os.confstr(  # type: ignore[attr-defined] # noqa: F821
+            "CS_GNU_LIBC_VERSION"
+        )
+        assert version_string is not None
+        _, version = version_string.split()  # type: Tuple[str, str]
+    except (AssertionError, AttributeError, OSError, ValueError):
+        # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)...
+        return None
+    return version
+
+
+def _glibc_version_string_ctypes():
+    # type: () -> Optional[str]
+    """
+    Fallback implementation of glibc_version_string using ctypes.
+    """
+    try:
+        import ctypes
+    except ImportError:
+        return None
+
+    # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
+    # manpage says, "If filename is NULL, then the returned handle is for the
+    # main program". This way we can let the linker do the work to figure out
+    # which libc our process is actually using.
+    #
+    # Note: typeshed is wrong here so we are ignoring this line.
+    process_namespace = ctypes.CDLL(None)  # type: ignore
+    try:
+        gnu_get_libc_version = process_namespace.gnu_get_libc_version
+    except AttributeError:
+        # Symbol doesn't exist -> therefore, we are not linked to
+        # glibc.
+        return None
+
+    # Call gnu_get_libc_version, which returns a string like "2.5"
+    gnu_get_libc_version.restype = ctypes.c_char_p
+    version_str = gnu_get_libc_version()  # type: str
+    # py2 / py3 compatibility:
+    if not isinstance(version_str, str):
+        version_str = version_str.decode("ascii")
+
+    return version_str
+
+
+# Separated out from have_compatible_glibc for easier unit testing.
+def _check_glibc_version(version_str, required_major, minimum_minor):
+    # type: (str, int, int) -> bool
+    # Parse string and check against requested version.
+    #
+    # We use a regexp instead of str.split because we want to discard any
+    # random junk that might come after the minor version -- this might happen
+    # in patched/forked versions of glibc (e.g. Linaro's version of glibc
+    # uses version strings like "2.20-2014.11"). See gh-3588.
+    m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str)
+    if not m:
+        warnings.warn(
+            "Expected glibc version with 2 components major.minor,"
+            " got: %s" % version_str,
+            RuntimeWarning,
+        )
+        return False
+    return (
+        int(m.group("major")) == required_major
+        and int(m.group("minor")) >= minimum_minor
+    )
+
+
+def _have_compatible_glibc(required_major, minimum_minor):
+    # type: (int, int) -> bool
+    version_str = _glibc_version_string()
+    if version_str is None:
+        return False
+    return _check_glibc_version(version_str, required_major, minimum_minor)
+
+
+# Python does not provide platform information at sufficient granularity to
+# identify the architecture of the running executable in some cases, so we
+# determine it dynamically by reading the information from the running
+# process. This only applies on Linux, which uses the ELF format.
+class _ELFFileHeader(object):
+    # https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
+    class _InvalidELFFileHeader(ValueError):
+        """
+        An invalid ELF file header was found.
+        """
+
+    ELF_MAGIC_NUMBER = 0x7F454C46
+    ELFCLASS32 = 1
+    ELFCLASS64 = 2
+    ELFDATA2LSB = 1
+    ELFDATA2MSB = 2
+    EM_386 = 3
+    EM_S390 = 22
+    EM_ARM = 40
+    EM_X86_64 = 62
+    EF_ARM_ABIMASK = 0xFF000000
+    EF_ARM_ABI_VER5 = 0x05000000
+    EF_ARM_ABI_FLOAT_HARD = 0x00000400
+
+    def __init__(self, file):
+        # type: (IO[bytes]) -> None
+        def unpack(fmt):
+            # type: (str) -> int
+            try:
+                (result,) = struct.unpack(
+                    fmt, file.read(struct.calcsize(fmt))
+                )  # type: (int, )
+            except struct.error:
+                raise _ELFFileHeader._InvalidELFFileHeader()
+            return result
+
+        self.e_ident_magic = unpack(">I")
+        if self.e_ident_magic != self.ELF_MAGIC_NUMBER:
+            raise _ELFFileHeader._InvalidELFFileHeader()
+        self.e_ident_class = unpack("B")
+        if self.e_ident_class not in {self.ELFCLASS32, self.ELFCLASS64}:
+            raise _ELFFileHeader._InvalidELFFileHeader()
+        self.e_ident_data = unpack("B")
+        if self.e_ident_data not in {self.ELFDATA2LSB, self.ELFDATA2MSB}:
+            raise _ELFFileHeader._InvalidELFFileHeader()
+        self.e_ident_version = unpack("B")
+        self.e_ident_osabi = unpack("B")
+        self.e_ident_abiversion = unpack("B")
+        self.e_ident_pad = file.read(7)
+        format_h = "<H" if self.e_ident_data == self.ELFDATA2LSB else ">H"
+        format_i = "<I" if self.e_ident_data == self.ELFDATA2LSB else ">I"
+        format_q = "<Q" if self.e_ident_data == self.ELFDATA2LSB else ">Q"
+        format_p = format_i if self.e_ident_class == self.ELFCLASS32 else format_q
+        self.e_type = unpack(format_h)
+        self.e_machine = unpack(format_h)
+        self.e_version = unpack(format_i)
+        self.e_entry = unpack(format_p)
+        self.e_phoff = unpack(format_p)
+        self.e_shoff = unpack(format_p)
+        self.e_flags = unpack(format_i)
+        self.e_ehsize = unpack(format_h)
+        self.e_phentsize = unpack(format_h)
+        self.e_phnum = unpack(format_h)
+        self.e_shentsize = unpack(format_h)
+        self.e_shnum = unpack(format_h)
+        self.e_shstrndx = unpack(format_h)
+
+
+def _get_elf_header():
+    # type: () -> Optional[_ELFFileHeader]
+    try:
+        with open(sys.executable, "rb") as f:
+            elf_header = _ELFFileHeader(f)
+    except (IOError, OSError, TypeError, _ELFFileHeader._InvalidELFFileHeader):
+        return None
+    return elf_header
+
+
+def _is_linux_armhf():
+    # type: () -> bool
+    # hard-float ABI can be detected from the ELF header of the running
+    # process
+    # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf
+    elf_header = _get_elf_header()
+    if elf_header is None:
+        return False
+    result = elf_header.e_ident_class == elf_header.ELFCLASS32
+    result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB
+    result &= elf_header.e_machine == elf_header.EM_ARM
+    result &= (
+        elf_header.e_flags & elf_header.EF_ARM_ABIMASK
+    ) == elf_header.EF_ARM_ABI_VER5
+    result &= (
+        elf_header.e_flags & elf_header.EF_ARM_ABI_FLOAT_HARD
+    ) == elf_header.EF_ARM_ABI_FLOAT_HARD
+    return result
+
+
+def _is_linux_i686():
+    # type: () -> bool
+    elf_header = _get_elf_header()
+    if elf_header is None:
+        return False
+    result = elf_header.e_ident_class == elf_header.ELFCLASS32
+    result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB
+    result &= elf_header.e_machine == elf_header.EM_386
+    return result
+
+
+def _have_compatible_manylinux_abi(arch):
+    # type: (str) -> bool
+    if arch == "armv7l":
+        return _is_linux_armhf()
+    if arch == "i686":
+        return _is_linux_i686()
+    return True
+
+
+def _linux_platforms(is_32bit=_32_BIT_INTERPRETER):
+    # type: (bool) -> Iterator[str]
+    linux = _normalize_string(distutils.util.get_platform())
+    if is_32bit:
+        if linux == "linux_x86_64":
+            linux = "linux_i686"
+        elif linux == "linux_aarch64":
+            linux = "linux_armv7l"
+    manylinux_support = []
+    _, arch = linux.split("_", 1)
+    if _have_compatible_manylinux_abi(arch):
+        if arch in {"x86_64", "i686", "aarch64", "armv7l", "ppc64", "ppc64le", "s390x"}:
+            manylinux_support.append(
+                ("manylinux2014", (2, 17))
+            )  # CentOS 7 w/ glibc 2.17 (PEP 599)
+        if arch in {"x86_64", "i686"}:
+            manylinux_support.append(
+                ("manylinux2010", (2, 12))
+            )  # CentOS 6 w/ glibc 2.12 (PEP 571)
+            manylinux_support.append(
+                ("manylinux1", (2, 5))
+            )  # CentOS 5 w/ glibc 2.5 (PEP 513)
+    manylinux_support_iter = iter(manylinux_support)
+    for name, glibc_version in manylinux_support_iter:
+        if _is_manylinux_compatible(name, glibc_version):
+            yield linux.replace("linux", name)
+            break
+    # Support for a later manylinux implies support for an earlier version.
+    for name, _ in manylinux_support_iter:
+        yield linux.replace("linux", name)
+    yield linux
+
+
+def _generic_platforms():
+    # type: () -> Iterator[str]
+    yield _normalize_string(distutils.util.get_platform())
+
+
+def _platform_tags():
+    # type: () -> Iterator[str]
+    """
+    Provides the platform tags for this installation.
+    """
+    if platform.system() == "Darwin":
+        return mac_platforms()
+    elif platform.system() == "Linux":
+        return _linux_platforms()
+    else:
+        return _generic_platforms()
+
+
+def interpreter_name():
+    # type: () -> str
+    """
+    Returns the name of the running interpreter.
+    """
+    try:
+        name = sys.implementation.name  # type: ignore
+    except AttributeError:  # pragma: no cover
+        # Python 2.7 compatibility.
+        name = platform.python_implementation().lower()
+    return INTERPRETER_SHORT_NAMES.get(name) or name
+
+
+def interpreter_version(**kwargs):
+    # type: (bool) -> str
+    """
+    Returns the version of the running interpreter.
+    """
+    warn = _warn_keyword_parameter("interpreter_version", kwargs)
+    version = _get_config_var("py_version_nodot", warn=warn)
+    if version:
+        version = str(version)
+    else:
+        version = _version_nodot(sys.version_info[:2])
+    return version
+
+
+def _version_nodot(version):
+    # type: (PythonVersion) -> str
+    if any(v >= 10 for v in version):
+        sep = "_"
+    else:
+        sep = ""
+    return sep.join(map(str, version))
+
+
+def sys_tags(**kwargs):
+    # type: (bool) -> Iterator[Tag]
+    """
+    Returns the sequence of tag triples for the running interpreter.
+
+    The order of the sequence corresponds to priority order for the
+    interpreter, from most to least important.
+    """
+    warn = _warn_keyword_parameter("sys_tags", kwargs)
+
+    interp_name = interpreter_name()
+    if interp_name == "cp":
+        for tag in cpython_tags(warn=warn):
+            yield tag
+    else:
+        for tag in generic_tags():
+            yield tag
+
+    for tag in compatible_tags():
+        yield tag
diff --git a/venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py
new file mode 100644
index 0000000..19579c1
--- /dev/null
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py
@@ -0,0 +1,65 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+from __future__ import absolute_import, division, print_function
+
+import re
+
+from ._typing import TYPE_CHECKING, cast
+from .version import InvalidVersion, Version
+
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import NewType, Union
+
+    NormalizedName = NewType("NormalizedName", str)
+
+_canonicalize_regex = re.compile(r"[-_.]+")
+
+
+def canonicalize_name(name):
+    # type: (str) -> NormalizedName
+    # This is taken from PEP 503.
+    value = _canonicalize_regex.sub("-", name).lower()
+    return cast("NormalizedName", value)
+
+
+def canonicalize_version(_version):
+    # type: (str) -> Union[Version, str]
+    """
+    This is very similar to Version.__str__, but has one subtle difference
+    with the way it handles the release segment.
+    """
+
+    try:
+        version = Version(_version)
+    except InvalidVersion:
+        # Legacy versions cannot be normalized
+        return _version
+
+    parts = []
+
+    # Epoch
+    if version.epoch != 0:
+        parts.append("{0}!".format(version.epoch))
+
+    # Release segment
+    # NB: This strips trailing '.0's to normalize
+    parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release)))
+
+    # Pre-release
+    if version.pre is not None:
+        parts.append("".join(str(x) for x in version.pre))
+
+    # Post-release
+    if version.post is not None:
+        parts.append(".post{0}".format(version.post))
+
+    # Development release
+    if version.dev is not None:
+        parts.append(".dev{0}".format(version.dev))
+
+    # Local version segment
+    if version.local is not None:
+        parts.append("+{0}".format(version.local))
+
+    return "".join(parts)
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py b/venv/Lib/site-packages/setuptools/_vendor/packaging/version.py
similarity index 57%
rename from venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py
rename to venv/Lib/site-packages/setuptools/_vendor/packaging/version.py
index 83b5ee8..00371e8 100644
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py
+++ b/venv/Lib/site-packages/setuptools/_vendor/packaging/version.py
@@ -7,21 +7,46 @@ import collections
 import itertools
 import re
 
-from ._structures import Infinity
-
-
-__all__ = [
-    "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"
-]
+from ._structures import Infinity, NegativeInfinity
+from ._typing import TYPE_CHECKING
+
+if TYPE_CHECKING:  # pragma: no cover
+    from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union
+
+    from ._structures import InfinityType, NegativeInfinityType
+
+    InfiniteTypes = Union[InfinityType, NegativeInfinityType]
+    PrePostDevType = Union[InfiniteTypes, Tuple[str, int]]
+    SubLocalType = Union[InfiniteTypes, int, str]
+    LocalType = Union[
+        NegativeInfinityType,
+        Tuple[
+            Union[
+                SubLocalType,
+                Tuple[SubLocalType, str],
+                Tuple[NegativeInfinityType, SubLocalType],
+            ],
+            ...,
+        ],
+    ]
+    CmpKey = Tuple[
+        int, Tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType
+    ]
+    LegacyCmpKey = Tuple[int, Tuple[str, ...]]
+    VersionComparisonMethod = Callable[
+        [Union[CmpKey, LegacyCmpKey], Union[CmpKey, LegacyCmpKey]], bool
+    ]
+
+__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"]
 
 
 _Version = collections.namedtuple(
-    "_Version",
-    ["epoch", "release", "dev", "pre", "post", "local"],
+    "_Version", ["epoch", "release", "dev", "pre", "post", "local"]
 )
 
 
 def parse(version):
+    # type: (str) -> Union[LegacyVersion, Version]
     """
     Parse the given version string and return either a :class:`Version` object
     or a :class:`LegacyVersion` object depending on if the given version is
@@ -40,29 +65,38 @@ class InvalidVersion(ValueError):
 
 
 class _BaseVersion(object):
+    _key = None  # type: Union[CmpKey, LegacyCmpKey]
 
     def __hash__(self):
+        # type: () -> int
         return hash(self._key)
 
     def __lt__(self, other):
+        # type: (_BaseVersion) -> bool
         return self._compare(other, lambda s, o: s < o)
 
     def __le__(self, other):
+        # type: (_BaseVersion) -> bool
         return self._compare(other, lambda s, o: s <= o)
 
     def __eq__(self, other):
+        # type: (object) -> bool
         return self._compare(other, lambda s, o: s == o)
 
     def __ge__(self, other):
+        # type: (_BaseVersion) -> bool
         return self._compare(other, lambda s, o: s >= o)
 
     def __gt__(self, other):
+        # type: (_BaseVersion) -> bool
         return self._compare(other, lambda s, o: s > o)
 
     def __ne__(self, other):
+        # type: (object) -> bool
         return self._compare(other, lambda s, o: s != o)
 
     def _compare(self, other, method):
+        # type: (object, VersionComparisonMethod) -> Union[bool, NotImplemented]
         if not isinstance(other, _BaseVersion):
             return NotImplemented
 
@@ -70,48 +104,88 @@ class _BaseVersion(object):
 
 
 class LegacyVersion(_BaseVersion):
-
     def __init__(self, version):
+        # type: (str) -> None
         self._version = str(version)
         self._key = _legacy_cmpkey(self._version)
 
     def __str__(self):
+        # type: () -> str
         return self._version
 
     def __repr__(self):
+        # type: () -> str
         return "<LegacyVersion({0})>".format(repr(str(self)))
 
     @property
     def public(self):
+        # type: () -> str
         return self._version
 
     @property
     def base_version(self):
+        # type: () -> str
         return self._version
 
+    @property
+    def epoch(self):
+        # type: () -> int
+        return -1
+
+    @property
+    def release(self):
+        # type: () -> None
+        return None
+
+    @property
+    def pre(self):
+        # type: () -> None
+        return None
+
+    @property
+    def post(self):
+        # type: () -> None
+        return None
+
+    @property
+    def dev(self):
+        # type: () -> None
+        return None
+
     @property
     def local(self):
+        # type: () -> None
         return None
 
     @property
     def is_prerelease(self):
+        # type: () -> bool
         return False
 
     @property
     def is_postrelease(self):
+        # type: () -> bool
         return False
 
+    @property
+    def is_devrelease(self):
+        # type: () -> bool
+        return False
 
-_legacy_version_component_re = re.compile(
-    r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE,
-)
+
+_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE)
 
 _legacy_version_replacement_map = {
-    "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@",
+    "pre": "c",
+    "preview": "c",
+    "-": "final-",
+    "rc": "c",
+    "dev": "@",
 }
 
 
 def _parse_version_parts(s):
+    # type: (str) -> Iterator[str]
     for part in _legacy_version_component_re.split(s):
         part = _legacy_version_replacement_map.get(part, part)
 
@@ -129,6 +203,8 @@ def _parse_version_parts(s):
 
 
 def _legacy_cmpkey(version):
+    # type: (str) -> LegacyCmpKey
+
     # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch
     # greater than or equal to 0. This will effectively put the LegacyVersion,
     # which uses the defacto standard originally implemented by setuptools,
@@ -137,7 +213,7 @@ def _legacy_cmpkey(version):
 
     # This scheme is taken from pkg_resources.parse_version setuptools prior to
     # it's adoption of the packaging library.
-    parts = []
+    parts = []  # type: List[str]
     for part in _parse_version_parts(version.lower()):
         if part.startswith("*"):
             # remove "-" before a prerelease tag
@@ -150,9 +226,9 @@ def _legacy_cmpkey(version):
                 parts.pop()
 
         parts.append(part)
-    parts = tuple(parts)
 
-    return epoch, parts
+    return epoch, tuple(parts)
+
 
 # Deliberately not anchored to the start and end of the string, to make it
 # easier for 3rd party code to reuse
@@ -190,12 +266,11 @@ VERSION_PATTERN = r"""
 
 class Version(_BaseVersion):
 
-    _regex = re.compile(
-        r"^\s*" + VERSION_PATTERN + r"\s*$",
-        re.VERBOSE | re.IGNORECASE,
-    )
+    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
 
     def __init__(self, version):
+        # type: (str) -> None
+
         # Validate the version and parse it into pieces
         match = self._regex.search(version)
         if not match:
@@ -205,18 +280,11 @@ class Version(_BaseVersion):
         self._version = _Version(
             epoch=int(match.group("epoch")) if match.group("epoch") else 0,
             release=tuple(int(i) for i in match.group("release").split(".")),
-            pre=_parse_letter_version(
-                match.group("pre_l"),
-                match.group("pre_n"),
-            ),
+            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
             post=_parse_letter_version(
-                match.group("post_l"),
-                match.group("post_n1") or match.group("post_n2"),
-            ),
-            dev=_parse_letter_version(
-                match.group("dev_l"),
-                match.group("dev_n"),
+                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
             ),
+            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
             local=_parse_local_version(match.group("local")),
         )
 
@@ -231,71 +299,130 @@ class Version(_BaseVersion):
         )
 
     def __repr__(self):
+        # type: () -> str
         return "<Version({0})>".format(repr(str(self)))
 
     def __str__(self):
+        # type: () -> str
         parts = []
 
         # Epoch
-        if self._version.epoch != 0:
-            parts.append("{0}!".format(self._version.epoch))
+        if self.epoch != 0:
+            parts.append("{0}!".format(self.epoch))
 
         # Release segment
-        parts.append(".".join(str(x) for x in self._version.release))
+        parts.append(".".join(str(x) for x in self.release))
 
         # Pre-release
-        if self._version.pre is not None:
-            parts.append("".join(str(x) for x in self._version.pre))
+        if self.pre is not None:
+            parts.append("".join(str(x) for x in self.pre))
 
         # Post-release
-        if self._version.post is not None:
-            parts.append(".post{0}".format(self._version.post[1]))
+        if self.post is not None:
+            parts.append(".post{0}".format(self.post))
 
         # Development release
-        if self._version.dev is not None:
-            parts.append(".dev{0}".format(self._version.dev[1]))
+        if self.dev is not None:
+            parts.append(".dev{0}".format(self.dev))
 
         # Local version segment
-        if self._version.local is not None:
-            parts.append(
-                "+{0}".format(".".join(str(x) for x in self._version.local))
-            )
+        if self.local is not None:
+            parts.append("+{0}".format(self.local))
 
         return "".join(parts)
 
+    @property
+    def epoch(self):
+        # type: () -> int
+        _epoch = self._version.epoch  # type: int
+        return _epoch
+
+    @property
+    def release(self):
+        # type: () -> Tuple[int, ...]
+        _release = self._version.release  # type: Tuple[int, ...]
+        return _release
+
+    @property
+    def pre(self):
+        # type: () -> Optional[Tuple[str, int]]
+        _pre = self._version.pre  # type: Optional[Tuple[str, int]]
+        return _pre
+
+    @property
+    def post(self):
+        # type: () -> Optional[Tuple[str, int]]
+        return self._version.post[1] if self._version.post else None
+
+    @property
+    def dev(self):
+        # type: () -> Optional[Tuple[str, int]]
+        return self._version.dev[1] if self._version.dev else None
+
+    @property
+    def local(self):
+        # type: () -> Optional[str]
+        if self._version.local:
+            return ".".join(str(x) for x in self._version.local)
+        else:
+            return None
+
     @property
     def public(self):
+        # type: () -> str
         return str(self).split("+", 1)[0]
 
     @property
     def base_version(self):
+        # type: () -> str
         parts = []
 
         # Epoch
-        if self._version.epoch != 0:
-            parts.append("{0}!".format(self._version.epoch))
+        if self.epoch != 0:
+            parts.append("{0}!".format(self.epoch))
 
         # Release segment
-        parts.append(".".join(str(x) for x in self._version.release))
+        parts.append(".".join(str(x) for x in self.release))
 
         return "".join(parts)
 
-    @property
-    def local(self):
-        version_string = str(self)
-        if "+" in version_string:
-            return version_string.split("+", 1)[1]
-
     @property
     def is_prerelease(self):
-        return bool(self._version.dev or self._version.pre)
+        # type: () -> bool
+        return self.dev is not None or self.pre is not None
 
     @property
     def is_postrelease(self):
-        return bool(self._version.post)
+        # type: () -> bool
+        return self.post is not None
 
+    @property
+    def is_devrelease(self):
+        # type: () -> bool
+        return self.dev is not None
+
+    @property
+    def major(self):
+        # type: () -> int
+        return self.release[0] if len(self.release) >= 1 else 0
+
+    @property
+    def minor(self):
+        # type: () -> int
+        return self.release[1] if len(self.release) >= 2 else 0
+
+    @property
+    def micro(self):
+        # type: () -> int
+        return self.release[2] if len(self.release) >= 3 else 0
+
+
+def _parse_letter_version(
+    letter,  # type: str
+    number,  # type: Union[str, bytes, SupportsInt]
+):
+    # type: (...) -> Optional[Tuple[str, int]]
 
-def _parse_letter_version(letter, number):
     if letter:
         # We consider there to be an implicit 0 in a pre-release if there is
         # not a numeral associated with it.
@@ -325,34 +452,42 @@ def _parse_letter_version(letter, number):
 
         return letter, int(number)
 
+    return None
+
 
-_local_version_seperators = re.compile(r"[\._-]")
+_local_version_separators = re.compile(r"[\._-]")
 
 
 def _parse_local_version(local):
+    # type: (str) -> Optional[LocalType]
     """
     Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
     """
     if local is not None:
         return tuple(
             part.lower() if not part.isdigit() else int(part)
-            for part in _local_version_seperators.split(local)
+            for part in _local_version_separators.split(local)
         )
+    return None
 
 
-def _cmpkey(epoch, release, pre, post, dev, local):
+def _cmpkey(
+    epoch,  # type: int
+    release,  # type: Tuple[int, ...]
+    pre,  # type: Optional[Tuple[str, int]]
+    post,  # type: Optional[Tuple[str, int]]
+    dev,  # type: Optional[Tuple[str, int]]
+    local,  # type: Optional[Tuple[SubLocalType]]
+):
+    # type: (...) -> CmpKey
+
     # When we compare a release version, we want to compare it with all of the
     # trailing zeros removed. So we'll use a reverse the list, drop all the now
     # leading zeros until we come to something non zero, then take the rest
     # re-reverse it back into the correct order and make it a tuple and use
     # that for our sorting key.
-    release = tuple(
-        reversed(list(
-            itertools.dropwhile(
-                lambda x: x == 0,
-                reversed(release),
-            )
-        ))
+    _release = tuple(
+        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
     )
 
     # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
@@ -360,23 +495,31 @@ def _cmpkey(epoch, release, pre, post, dev, local):
     # if there is not a pre or a post segment. If we have one of those then
     # the normal sorting rules will handle this case correctly.
     if pre is None and post is None and dev is not None:
-        pre = -Infinity
+        _pre = NegativeInfinity  # type: PrePostDevType
     # Versions without a pre-release (except as noted above) should sort after
     # those with one.
     elif pre is None:
-        pre = Infinity
+        _pre = Infinity
+    else:
+        _pre = pre
 
     # Versions without a post segment should sort before those with one.
     if post is None:
-        post = -Infinity
+        _post = NegativeInfinity  # type: PrePostDevType
+
+    else:
+        _post = post
 
     # Versions without a development segment should sort after those with one.
     if dev is None:
-        dev = Infinity
+        _dev = Infinity  # type: PrePostDevType
+
+    else:
+        _dev = dev
 
     if local is None:
         # Versions without a local segment should sort before those with one.
-        local = -Infinity
+        _local = NegativeInfinity  # type: LocalType
     else:
         # Versions with a local segment need that segment parsed to implement
         # the sorting rules in PEP440.
@@ -385,9 +528,8 @@ def _cmpkey(epoch, release, pre, post, dev, local):
         # - Numeric segments sort numerically
         # - Shorter versions sort before longer versions when the prefixes
         #   match exactly
-        local = tuple(
-            (i, "") if isinstance(i, int) else (-Infinity, i)
-            for i in local
+        _local = tuple(
+            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
         )
 
-    return epoch, release, pre, post, dev, local
+    return epoch, _release, _pre, _post, _dev, _local
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/pyparsing.py b/venv/Lib/site-packages/setuptools/_vendor/pyparsing.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/pyparsing.py
rename to venv/Lib/site-packages/setuptools/_vendor/pyparsing.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/six.py b/venv/Lib/site-packages/setuptools/_vendor/six.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/_vendor/six.py
rename to venv/Lib/site-packages/setuptools/_vendor/six.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/archive_util.py b/venv/Lib/site-packages/setuptools/archive_util.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/setuptools/archive_util.py
rename to venv/Lib/site-packages/setuptools/archive_util.py
index 64528ca..0ce190b 100644
--- a/venv/lib/python3.8/site-packages/setuptools/archive_util.py
+++ b/venv/Lib/site-packages/setuptools/archive_util.py
@@ -134,10 +134,10 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter):
     """
     try:
         tarobj = tarfile.open(filename)
-    except tarfile.TarError:
+    except tarfile.TarError as e:
         raise UnrecognizedFormat(
             "%s is not a compressed or uncompressed tar file" % (filename,)
-        )
+        ) from e
     with contextlib.closing(tarobj):
         # don't do any chowning!
         tarobj.chown = lambda *args: None
diff --git a/venv/lib/python3.8/site-packages/setuptools/build_meta.py b/venv/Lib/site-packages/setuptools/build_meta.py
similarity index 93%
rename from venv/lib/python3.8/site-packages/setuptools/build_meta.py
rename to venv/Lib/site-packages/setuptools/build_meta.py
index a1c951c..3713218 100644
--- a/venv/lib/python3.8/site-packages/setuptools/build_meta.py
+++ b/venv/Lib/site-packages/setuptools/build_meta.py
@@ -38,7 +38,6 @@ import distutils
 from setuptools.py31compat import TemporaryDirectory
 
 from pkg_resources import parse_requirements
-from pkg_resources.py31compat import makedirs
 
 __all__ = ['get_requires_for_build_sdist',
            'get_requires_for_build_wheel',
@@ -76,6 +75,22 @@ class Distribution(setuptools.dist.Distribution):
             distutils.core.Distribution = orig
 
 
+@contextlib.contextmanager
+def no_install_setup_requires():
+    """Temporarily disable installing setup_requires
+
+    Under PEP 517, the backend reports build dependencies to the frontend,
+    and the frontend is responsible for ensuring they're installed.
+    So setuptools (acting as a backend) should not try to install them.
+    """
+    orig = setuptools._install_setup_requires
+    setuptools._install_setup_requires = lambda attrs: None
+    try:
+        yield
+    finally:
+        setuptools._install_setup_requires = orig
+
+
 def _to_str(s):
     """
     Convert a filename to a string (on Python 2, explicitly
@@ -155,7 +170,8 @@ class _BuildMetaBackend(object):
                                          config_settings=None):
         sys.argv = sys.argv[:1] + ['dist_info', '--egg-base',
                                    _to_str(metadata_directory)]
-        self.run_setup()
+        with no_install_setup_requires():
+            self.run_setup()
 
         dist_info_directory = metadata_directory
         while True:
@@ -190,12 +206,13 @@ class _BuildMetaBackend(object):
         result_directory = os.path.abspath(result_directory)
 
         # Build in a temporary directory, then copy to the target.
-        makedirs(result_directory, exist_ok=True)
+        os.makedirs(result_directory, exist_ok=True)
         with TemporaryDirectory(dir=result_directory) as tmp_dist_dir:
             sys.argv = (sys.argv[:1] + setup_command +
                         ['--dist-dir', tmp_dist_dir] +
                         config_settings["--global-option"])
-            self.run_setup()
+            with no_install_setup_requires():
+                self.run_setup()
 
             result_basename = _file_with_extension(
                 tmp_dist_dir, result_extension)
diff --git a/venv/lib/python3.8/site-packages/setuptools/cli-32.exe b/venv/Lib/site-packages/setuptools/cli-32.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/cli-32.exe
rename to venv/Lib/site-packages/setuptools/cli-32.exe
diff --git a/venv/lib/python3.8/site-packages/setuptools/cli-64.exe b/venv/Lib/site-packages/setuptools/cli-64.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/cli-64.exe
rename to venv/Lib/site-packages/setuptools/cli-64.exe
diff --git a/venv/lib/python3.8/site-packages/setuptools/cli.exe b/venv/Lib/site-packages/setuptools/cli.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/cli.exe
rename to venv/Lib/site-packages/setuptools/cli.exe
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/__init__.py b/venv/Lib/site-packages/setuptools/command/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/__init__.py
rename to venv/Lib/site-packages/setuptools/command/__init__.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/alias.py b/venv/Lib/site-packages/setuptools/command/alias.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/alias.py
rename to venv/Lib/site-packages/setuptools/command/alias.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/bdist_egg.py b/venv/Lib/site-packages/setuptools/command/bdist_egg.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/setuptools/command/bdist_egg.py
rename to venv/Lib/site-packages/setuptools/command/bdist_egg.py
index 1b28d4c..4be1545 100644
--- a/venv/lib/python3.8/site-packages/setuptools/command/bdist_egg.py
+++ b/venv/Lib/site-packages/setuptools/command/bdist_egg.py
@@ -55,10 +55,12 @@ def write_stub(resource, pyfile):
     _stub_template = textwrap.dedent("""
         def __bootstrap__():
             global __bootstrap__, __loader__, __file__
-            import sys, pkg_resources, imp
+            import sys, pkg_resources, importlib.util
             __file__ = pkg_resources.resource_filename(__name__, %r)
             __loader__ = None; del __bootstrap__, __loader__
-            imp.load_dynamic(__name__,__file__)
+            spec = importlib.util.spec_from_file_location(__name__,__file__)
+            mod = importlib.util.module_from_spec(spec)
+            spec.loader.exec_module(mod)
         __bootstrap__()
         """).lstrip()
     with open(pyfile, 'w') as f:
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/bdist_rpm.py b/venv/Lib/site-packages/setuptools/command/bdist_rpm.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/bdist_rpm.py
rename to venv/Lib/site-packages/setuptools/command/bdist_rpm.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/bdist_wininst.py b/venv/Lib/site-packages/setuptools/command/bdist_wininst.py
similarity index 69%
rename from venv/lib/python3.8/site-packages/setuptools/command/bdist_wininst.py
rename to venv/Lib/site-packages/setuptools/command/bdist_wininst.py
index 073de97..ff4b634 100644
--- a/venv/lib/python3.8/site-packages/setuptools/command/bdist_wininst.py
+++ b/venv/Lib/site-packages/setuptools/command/bdist_wininst.py
@@ -1,4 +1,7 @@
 import distutils.command.bdist_wininst as orig
+import warnings
+
+from setuptools import SetuptoolsDeprecationWarning
 
 
 class bdist_wininst(orig.bdist_wininst):
@@ -14,6 +17,12 @@ class bdist_wininst(orig.bdist_wininst):
         return cmd
 
     def run(self):
+        warnings.warn(
+            "bdist_wininst is deprecated and will be removed in a future "
+            "version. Use bdist_wheel (wheel packages) instead.",
+            SetuptoolsDeprecationWarning
+        )
+
         self._is_running = True
         try:
             orig.bdist_wininst.run(self)
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/build_clib.py b/venv/Lib/site-packages/setuptools/command/build_clib.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/build_clib.py
rename to venv/Lib/site-packages/setuptools/command/build_clib.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/build_ext.py b/venv/Lib/site-packages/setuptools/command/build_ext.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/setuptools/command/build_ext.py
rename to venv/Lib/site-packages/setuptools/command/build_ext.py
index 03b6f34..89a0e32 100644
--- a/venv/lib/python3.8/site-packages/setuptools/command/build_ext.py
+++ b/venv/Lib/site-packages/setuptools/command/build_ext.py
@@ -254,7 +254,8 @@ class build_ext(_build_ext):
                 '\n'.join([
                     "def __bootstrap__():",
                     "   global __bootstrap__, __file__, __loader__",
-                    "   import sys, os, pkg_resources, imp" + if_dl(", dl"),
+                    "   import sys, os, pkg_resources, importlib.util" +
+                    if_dl(", dl"),
                     "   __file__ = pkg_resources.resource_filename"
                     "(__name__,%r)"
                     % os.path.basename(ext._file_name),
@@ -266,7 +267,10 @@ class build_ext(_build_ext):
                     "   try:",
                     "     os.chdir(os.path.dirname(__file__))",
                     if_dl("     sys.setdlopenflags(dl.RTLD_NOW)"),
-                    "     imp.load_dynamic(__name__,__file__)",
+                    "     spec = importlib.util.spec_from_file_location(",
+                    "                __name__, __file__)",
+                    "     mod = importlib.util.module_from_spec(spec)",
+                    "     spec.loader.exec_module(mod)",
                     "   finally:",
                     if_dl("     sys.setdlopenflags(old_flags)"),
                     "     os.chdir(old_dir)",
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/build_py.py b/venv/Lib/site-packages/setuptools/command/build_py.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/build_py.py
rename to venv/Lib/site-packages/setuptools/command/build_py.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/develop.py b/venv/Lib/site-packages/setuptools/command/develop.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/setuptools/command/develop.py
rename to venv/Lib/site-packages/setuptools/command/develop.py
index b561924..e7e03cd 100644
--- a/venv/lib/python3.8/site-packages/setuptools/command/develop.py
+++ b/venv/Lib/site-packages/setuptools/command/develop.py
@@ -139,7 +139,6 @@ class develop(namespaces.DevelopInstaller, easy_install):
             self.reinitialize_command('build_ext', inplace=1)
             self.run_command('build_ext')
 
-        self.install_site_py()  # ensure that target dir is site-safe
         if setuptools.bootstrap_install_from:
             self.easy_install(setuptools.bootstrap_install_from)
             setuptools.bootstrap_install_from = None
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/dist_info.py b/venv/Lib/site-packages/setuptools/command/dist_info.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/dist_info.py
rename to venv/Lib/site-packages/setuptools/command/dist_info.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/easy_install.py b/venv/Lib/site-packages/setuptools/command/easy_install.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/setuptools/command/easy_install.py
rename to venv/Lib/site-packages/setuptools/command/easy_install.py
index 64ff045..bcbd4f5 100644
--- a/venv/lib/python3.8/site-packages/setuptools/command/easy_install.py
+++ b/venv/Lib/site-packages/setuptools/command/easy_install.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 """
 Easy Install
 ------------
@@ -64,7 +63,7 @@ from pkg_resources import (
     Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound,
     VersionConflict, DEVELOP_DIST,
 )
-import pkg_resources.py31compat
+import pkg_resources
 
 __metaclass__ = type
 
@@ -206,7 +205,6 @@ class easy_install(Command):
         self.pth_file = self.always_copy_from = None
         self.site_dirs = None
         self.installed_projects = {}
-        self.sitepy_installed = False
         # Always read easy_install options, even if we are subclassed, or have
         # an independent instance created.  This ensures that defaults will
         # always come from the standard configuration file(s)' "easy_install"
@@ -357,8 +355,10 @@ class easy_install(Command):
                 self.optimize = int(self.optimize)
                 if not (0 <= self.optimize <= 2):
                     raise ValueError
-            except ValueError:
-                raise DistutilsOptionError("--optimize must be 0, 1, or 2")
+            except ValueError as e:
+                raise DistutilsOptionError(
+                    "--optimize must be 0, 1, or 2"
+                ) from e
 
         if self.editable and not self.build_directory:
             raise DistutilsArgError(
@@ -495,12 +495,8 @@ class easy_install(Command):
         else:
             self.pth_file = None
 
-        if instdir not in map(normalize_path, _pythonpath()):
-            # only PYTHONPATH dirs need a site.py, so pretend it's there
-            self.sitepy_installed = True
-        elif self.multi_version and not os.path.exists(pth_file):
-            self.sitepy_installed = True  # don't need site.py in this case
-            self.pth_file = None  # and don't create a .pth file
+        if self.multi_version and not os.path.exists(pth_file):
+            self.pth_file = None  # don't create a .pth file
         self.install_dir = instdir
 
     __cant_write_msg = textwrap.dedent("""
@@ -565,7 +561,7 @@ class easy_install(Command):
             if ok_exists:
                 os.unlink(ok_file)
             dirname = os.path.dirname(ok_file)
-            pkg_resources.py31compat.makedirs(dirname, exist_ok=True)
+            os.makedirs(dirname, exist_ok=True)
             f = open(pth_file, 'w')
         except (OSError, IOError):
             self.cant_write_to_target()
@@ -657,9 +653,6 @@ class easy_install(Command):
             os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir))
 
     def easy_install(self, spec, deps=False):
-        if not self.editable:
-            self.install_site_py()
-
         with self._tmpdir() as tmpdir:
             if not isinstance(spec, Requirement):
                 if URL_SCHEME(spec):
@@ -766,9 +759,9 @@ class easy_install(Command):
                 [requirement], self.local_index, self.easy_install
             )
         except DistributionNotFound as e:
-            raise DistutilsError(str(e))
+            raise DistutilsError(str(e)) from e
         except VersionConflict as e:
-            raise DistutilsError(e.report())
+            raise DistutilsError(e.report()) from e
         if self.always_copy or self.always_copy_from:
             # Force all the relevant distros to be copied or activated
             for dist in distros:
@@ -1157,7 +1150,9 @@ class easy_install(Command):
         try:
             run_setup(setup_script, args)
         except SystemExit as v:
-            raise DistutilsError("Setup script exited with %s" % (v.args[0],))
+            raise DistutilsError(
+                "Setup script exited with %s" % (v.args[0],)
+            ) from v
 
     def build_and_install(self, setup_script, setup_base):
         args = ['bdist_egg', '--dist-dir']
@@ -1318,38 +1313,6 @@ class easy_install(Command):
         Please make the appropriate changes for your system and try again.
         """).strip()
 
-    def install_site_py(self):
-        """Make sure there's a site.py in the target dir, if needed"""
-
-        if self.sitepy_installed:
-            return  # already did it, or don't need to
-
-        sitepy = os.path.join(self.install_dir, "site.py")
-        source = resource_string("setuptools", "site-patch.py")
-        source = source.decode('utf-8')
-        current = ""
-
-        if os.path.exists(sitepy):
-            log.debug("Checking existing site.py in %s", self.install_dir)
-            with io.open(sitepy) as strm:
-                current = strm.read()
-
-            if not current.startswith('def __boot():'):
-                raise DistutilsError(
-                    "%s is not a setuptools-generated site.py; please"
-                    " remove it." % sitepy
-                )
-
-        if current != source:
-            log.info("Creating %s", sitepy)
-            if not self.dry_run:
-                ensure_directory(sitepy)
-                with io.open(sitepy, 'w', encoding='utf-8') as strm:
-                    strm.write(source)
-            self.byte_compile([sitepy])
-
-        self.sitepy_installed = True
-
     def create_home_path(self):
         """Create directories under ~."""
         if not self.user:
@@ -2073,17 +2036,38 @@ class ScriptWriter:
 
     template = textwrap.dedent(r"""
         # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
-        __requires__ = %(spec)r
         import re
         import sys
-        from pkg_resources import load_entry_point
+
+        # for compatibility with easy_install; see #2198
+        __requires__ = %(spec)r
+
+        try:
+            from importlib.metadata import distribution
+        except ImportError:
+            try:
+                from importlib_metadata import distribution
+            except ImportError:
+                from pkg_resources import load_entry_point
+
+
+        def importlib_load_entry_point(spec, group, name):
+            dist_name, _, _ = spec.partition('==')
+            matches = (
+                entry_point
+                for entry_point in distribution(dist_name).entry_points
+                if entry_point.group == group and entry_point.name == name
+            )
+            return next(matches).load()
+
+
+        globals().setdefault('load_entry_point', importlib_load_entry_point)
+
 
         if __name__ == '__main__':
             sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
-            sys.exit(
-                load_entry_point(%(spec)r, %(group)r, %(name)r)()
-            )
-    """).lstrip()
+            sys.exit(load_entry_point(%(spec)r, %(group)r, %(name)r)())
+        """).lstrip()
 
     command_spec_class = CommandSpec
 
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/egg_info.py b/venv/Lib/site-packages/setuptools/command/egg_info.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/setuptools/command/egg_info.py
rename to venv/Lib/site-packages/setuptools/command/egg_info.py
index 7fa8954..0855207 100644
--- a/venv/lib/python3.8/site-packages/setuptools/command/egg_info.py
+++ b/venv/Lib/site-packages/setuptools/command/egg_info.py
@@ -208,11 +208,11 @@ class egg_info(InfoCommon, Command):
             list(
                 parse_requirements(spec % (self.egg_name, self.egg_version))
             )
-        except ValueError:
+        except ValueError as e:
             raise distutils.errors.DistutilsOptionError(
                 "Invalid distribution name or version syntax: %s-%s" %
                 (self.egg_name, self.egg_version)
-            )
+            ) from e
 
         if self.egg_base is None:
             dirs = self.distribution.package_dir
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/install.py b/venv/Lib/site-packages/setuptools/command/install.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/install.py
rename to venv/Lib/site-packages/setuptools/command/install.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/install_egg_info.py b/venv/Lib/site-packages/setuptools/command/install_egg_info.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/install_egg_info.py
rename to venv/Lib/site-packages/setuptools/command/install_egg_info.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/install_lib.py b/venv/Lib/site-packages/setuptools/command/install_lib.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/install_lib.py
rename to venv/Lib/site-packages/setuptools/command/install_lib.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/install_scripts.py b/venv/Lib/site-packages/setuptools/command/install_scripts.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/install_scripts.py
rename to venv/Lib/site-packages/setuptools/command/install_scripts.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/launcher manifest.xml b/venv/Lib/site-packages/setuptools/command/launcher manifest.xml
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/launcher manifest.xml
rename to venv/Lib/site-packages/setuptools/command/launcher manifest.xml
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/py36compat.py b/venv/Lib/site-packages/setuptools/command/py36compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/py36compat.py
rename to venv/Lib/site-packages/setuptools/command/py36compat.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/register.py b/venv/Lib/site-packages/setuptools/command/register.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/register.py
rename to venv/Lib/site-packages/setuptools/command/register.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/rotate.py b/venv/Lib/site-packages/setuptools/command/rotate.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/setuptools/command/rotate.py
rename to venv/Lib/site-packages/setuptools/command/rotate.py
index b89353f..e398834 100644
--- a/venv/lib/python3.8/site-packages/setuptools/command/rotate.py
+++ b/venv/Lib/site-packages/setuptools/command/rotate.py
@@ -36,8 +36,8 @@ class rotate(Command):
             raise DistutilsOptionError("Must specify number of files to keep")
         try:
             self.keep = int(self.keep)
-        except ValueError:
-            raise DistutilsOptionError("--keep must be an integer")
+        except ValueError as e:
+            raise DistutilsOptionError("--keep must be an integer") from e
         if isinstance(self.match, six.string_types):
             self.match = [
                 convert_path(p.strip()) for p in self.match.split(',')
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/saveopts.py b/venv/Lib/site-packages/setuptools/command/saveopts.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/saveopts.py
rename to venv/Lib/site-packages/setuptools/command/saveopts.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/sdist.py b/venv/Lib/site-packages/setuptools/command/sdist.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/sdist.py
rename to venv/Lib/site-packages/setuptools/command/sdist.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/setopt.py b/venv/Lib/site-packages/setuptools/command/setopt.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/setopt.py
rename to venv/Lib/site-packages/setuptools/command/setopt.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/test.py b/venv/Lib/site-packages/setuptools/command/test.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/test.py
rename to venv/Lib/site-packages/setuptools/command/test.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/upload.py b/venv/Lib/site-packages/setuptools/command/upload.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/upload.py
rename to venv/Lib/site-packages/setuptools/command/upload.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/command/upload_docs.py b/venv/Lib/site-packages/setuptools/command/upload_docs.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/command/upload_docs.py
rename to venv/Lib/site-packages/setuptools/command/upload_docs.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/config.py b/venv/Lib/site-packages/setuptools/config.py
similarity index 93%
rename from venv/lib/python3.8/site-packages/setuptools/config.py
rename to venv/Lib/site-packages/setuptools/config.py
index 9b9a0c4..a8f8b6b 100644
--- a/venv/lib/python3.8/site-packages/setuptools/config.py
+++ b/venv/Lib/site-packages/setuptools/config.py
@@ -1,14 +1,16 @@
 from __future__ import absolute_import, unicode_literals
+import ast
 import io
 import os
 import sys
 
 import warnings
 import functools
+import importlib
 from collections import defaultdict
 from functools import partial
 from functools import wraps
-from importlib import import_module
+import contextlib
 
 from distutils.errors import DistutilsOptionError, DistutilsFileError
 from setuptools.extern.packaging.version import LegacyVersion, parse
@@ -19,6 +21,45 @@ from setuptools.extern.six import string_types, PY3
 __metaclass__ = type
 
 
+class StaticModule:
+    """
+    Attempt to load the module by the name
+    """
+    def __init__(self, name):
+        spec = importlib.util.find_spec(name)
+        with open(spec.origin) as strm:
+            src = strm.read()
+        module = ast.parse(src)
+        vars(self).update(locals())
+        del self.self
+
+    def __getattr__(self, attr):
+        try:
+            return next(
+                ast.literal_eval(statement.value)
+                for statement in self.module.body
+                if isinstance(statement, ast.Assign)
+                for target in statement.targets
+                if isinstance(target, ast.Name) and target.id == attr
+            )
+        except Exception as e:
+            raise AttributeError(
+                "{self.name} has no attribute {attr}".format(**locals())
+            ) from e
+
+
+@contextlib.contextmanager
+def patch_path(path):
+    """
+    Add path to front of sys.path for the duration of the context.
+    """
+    try:
+        sys.path.insert(0, path)
+        yield
+    finally:
+        sys.path.remove(path)
+
+
 def read_configuration(
         filepath, find_others=False, ignore_option_errors=False):
     """Read given configuration file and returns options from it as a dict.
@@ -344,15 +385,16 @@ class ConfigHandler:
             elif '' in package_dir:
                 # A custom parent directory was specified for all root modules
                 parent_path = os.path.join(os.getcwd(), package_dir[''])
-        sys.path.insert(0, parent_path)
-        try:
-            module = import_module(module_name)
-            value = getattr(module, attr_name)
 
-        finally:
-            sys.path = sys.path[1:]
+        with patch_path(parent_path):
+            try:
+                # attempt to load value statically
+                return getattr(StaticModule(module_name), attr_name)
+            except Exception:
+                # fallback to simple import
+                module = importlib.import_module(module_name)
 
-        return value
+        return getattr(module, attr_name)
 
     @classmethod
     def _get_parser_compound(cls, *parse_methods):
diff --git a/venv/lib/python3.8/site-packages/setuptools/dep_util.py b/venv/Lib/site-packages/setuptools/dep_util.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/dep_util.py
rename to venv/Lib/site-packages/setuptools/dep_util.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/depends.py b/venv/Lib/site-packages/setuptools/depends.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/depends.py
rename to venv/Lib/site-packages/setuptools/depends.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/dist.py b/venv/Lib/site-packages/setuptools/dist.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/setuptools/dist.py
rename to venv/Lib/site-packages/setuptools/dist.py
index fe64afa..e813b11 100644
--- a/venv/lib/python3.8/site-packages/setuptools/dist.py
+++ b/venv/Lib/site-packages/setuptools/dist.py
@@ -204,11 +204,11 @@ def check_importable(dist, attr, value):
     try:
         ep = pkg_resources.EntryPoint.parse('x=' + value)
         assert not ep.extras
-    except (TypeError, ValueError, AttributeError, AssertionError):
+    except (TypeError, ValueError, AttributeError, AssertionError) as e:
         raise DistutilsSetupError(
             "%r must be importable 'module:attrs' string (got %r)"
             % (attr, value)
-        )
+        ) from e
 
 
 def assert_string_list(dist, attr, value):
@@ -219,10 +219,10 @@ def assert_string_list(dist, attr, value):
         assert isinstance(value, (list, tuple))
         # verify that elements of value are strings
         assert ''.join(value) != value
-    except (TypeError, ValueError, AttributeError, AssertionError):
+    except (TypeError, ValueError, AttributeError, AssertionError) as e:
         raise DistutilsSetupError(
             "%r must be a list of strings (got %r)" % (attr, value)
-        )
+        ) from e
 
 
 def check_nsp(dist, attr, value):
@@ -247,12 +247,12 @@ def check_extras(dist, attr, value):
     """Verify that extras_require mapping is valid"""
     try:
         list(itertools.starmap(_check_extra, value.items()))
-    except (TypeError, ValueError, AttributeError):
+    except (TypeError, ValueError, AttributeError) as e:
         raise DistutilsSetupError(
             "'extras_require' must be a dictionary whose values are "
             "strings or lists of strings containing valid project/version "
             "requirement specifiers."
-        )
+        ) from e
 
 
 def _check_extra(extra, reqs):
@@ -280,7 +280,9 @@ def check_requirements(dist, attr, value):
             "{attr!r} must be a string or list of strings "
             "containing valid project/version requirement specifiers; {error}"
         )
-        raise DistutilsSetupError(tmpl.format(attr=attr, error=error))
+        raise DistutilsSetupError(
+            tmpl.format(attr=attr, error=error)
+        ) from error
 
 
 def check_specifier(dist, attr, value):
@@ -292,7 +294,9 @@ def check_specifier(dist, attr, value):
             "{attr!r} must be a string "
             "containing valid version specifiers; {error}"
         )
-        raise DistutilsSetupError(tmpl.format(attr=attr, error=error))
+        raise DistutilsSetupError(
+            tmpl.format(attr=attr, error=error)
+        ) from error
 
 
 def check_entry_points(dist, attr, value):
@@ -300,7 +304,7 @@ def check_entry_points(dist, attr, value):
     try:
         pkg_resources.EntryPoint.parse_map(value)
     except ValueError as e:
-        raise DistutilsSetupError(e)
+        raise DistutilsSetupError(e) from e
 
 
 def check_test_suite(dist, attr, value):
@@ -609,8 +613,8 @@ class Distribution(_Distribution):
                         setattr(self, opt, strtobool(val))
                     else:
                         setattr(self, opt, val)
-                except ValueError as msg:
-                    raise DistutilsOptionError(msg)
+                except ValueError as e:
+                    raise DistutilsOptionError(e) from e
 
     @staticmethod
     def _try_str(val):
@@ -676,8 +680,8 @@ class Distribution(_Distribution):
                     raise DistutilsOptionError(
                         "error in %s: command '%s' has no such option '%s'"
                         % (source, command_name, option))
-            except ValueError as msg:
-                raise DistutilsOptionError(msg)
+            except ValueError as e:
+                raise DistutilsOptionError(e) from e
 
     def parse_config_files(self, filenames=None, ignore_option_errors=False):
         """Parses configuration files from various levels
@@ -843,10 +847,10 @@ class Distribution(_Distribution):
             )
         try:
             old = getattr(self, name)
-        except AttributeError:
+        except AttributeError as e:
             raise DistutilsSetupError(
                 "%s: No such distribution setting" % name
-            )
+            ) from e
         if old is not None and not isinstance(old, sequence):
             raise DistutilsSetupError(
                 name + ": this setting cannot be changed via include/exclude"
@@ -863,10 +867,10 @@ class Distribution(_Distribution):
             )
         try:
             old = getattr(self, name)
-        except AttributeError:
+        except AttributeError as e:
             raise DistutilsSetupError(
                 "%s: No such distribution setting" % name
-            )
+            ) from e
         if old is None:
             setattr(self, name, value)
         elif not isinstance(old, sequence):
diff --git a/venv/lib/python3.8/site-packages/setuptools/errors.py b/venv/Lib/site-packages/setuptools/errors.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/errors.py
rename to venv/Lib/site-packages/setuptools/errors.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/extension.py b/venv/Lib/site-packages/setuptools/extension.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/extension.py
rename to venv/Lib/site-packages/setuptools/extension.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/extern/__init__.py b/venv/Lib/site-packages/setuptools/extern/__init__.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/extern/__init__.py
rename to venv/Lib/site-packages/setuptools/extern/__init__.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/glob.py b/venv/Lib/site-packages/setuptools/glob.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/glob.py
rename to venv/Lib/site-packages/setuptools/glob.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/gui-32.exe b/venv/Lib/site-packages/setuptools/gui-32.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/gui-32.exe
rename to venv/Lib/site-packages/setuptools/gui-32.exe
diff --git a/venv/lib/python3.8/site-packages/setuptools/gui-64.exe b/venv/Lib/site-packages/setuptools/gui-64.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/gui-64.exe
rename to venv/Lib/site-packages/setuptools/gui-64.exe
diff --git a/venv/lib/python3.8/site-packages/setuptools/gui.exe b/venv/Lib/site-packages/setuptools/gui.exe
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/gui.exe
rename to venv/Lib/site-packages/setuptools/gui.exe
diff --git a/venv/lib/python3.8/site-packages/setuptools/installer.py b/venv/Lib/site-packages/setuptools/installer.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/setuptools/installer.py
rename to venv/Lib/site-packages/setuptools/installer.py
index 1f183bd..e5acec2 100644
--- a/venv/lib/python3.8/site-packages/setuptools/installer.py
+++ b/venv/Lib/site-packages/setuptools/installer.py
@@ -127,7 +127,7 @@ def fetch_build_egg(dist, req):
         try:
             subprocess.check_call(cmd)
         except subprocess.CalledProcessError as e:
-            raise DistutilsError(str(e))
+            raise DistutilsError(str(e)) from e
         wheel = Wheel(glob.glob(os.path.join(tmpdir, '*.whl'))[0])
         dist_location = os.path.join(eggs_dir, wheel.egg_name())
         wheel.install_as_egg(dist_location)
diff --git a/venv/lib/python3.8/site-packages/setuptools/launch.py b/venv/Lib/site-packages/setuptools/launch.py
similarity index 92%
rename from venv/lib/python3.8/site-packages/setuptools/launch.py
rename to venv/Lib/site-packages/setuptools/launch.py
index 308283e..0208fdf 100644
--- a/venv/lib/python3.8/site-packages/setuptools/launch.py
+++ b/venv/Lib/site-packages/setuptools/launch.py
@@ -25,7 +25,8 @@ def run():
     sys.argv[:] = sys.argv[1:]
 
     open_ = getattr(tokenize, 'open', open)
-    script = open_(script_name).read()
+    with open_(script_name) as fid:
+        script = fid.read()
     norm_script = script.replace('\\r\\n', '\\n')
     code = compile(norm_script, script_name, 'exec')
     exec(code, namespace)
diff --git a/venv/lib/python3.8/site-packages/setuptools/lib2to3_ex.py b/venv/Lib/site-packages/setuptools/lib2to3_ex.py
similarity index 84%
rename from venv/lib/python3.8/site-packages/setuptools/lib2to3_ex.py
rename to venv/Lib/site-packages/setuptools/lib2to3_ex.py
index 4b1a73f..017f728 100644
--- a/venv/lib/python3.8/site-packages/setuptools/lib2to3_ex.py
+++ b/venv/Lib/site-packages/setuptools/lib2to3_ex.py
@@ -7,11 +7,13 @@ Customized Mixin2to3 support:
 This module raises an ImportError on Python 2.
 """
 
+import warnings
 from distutils.util import Mixin2to3 as _Mixin2to3
 from distutils import log
 from lib2to3.refactor import RefactoringTool, get_fixers_from_package
 
 import setuptools
+from ._deprecation_warning import SetuptoolsDeprecationWarning
 
 
 class DistutilsRefactoringTool(RefactoringTool):
@@ -33,6 +35,13 @@ class Mixin2to3(_Mixin2to3):
             return
         if not files:
             return
+
+        warnings.warn(
+            "2to3 support is deprecated. If the project still "
+            "requires Python 2 support, please migrate to "
+            "a single-codebase solution or employ an "
+            "independent conversion process.",
+            SetuptoolsDeprecationWarning)
         log.info("Fixing " + " ".join(files))
         self.__build_fixer_names()
         self.__exclude_fixers()
diff --git a/venv/lib/python3.8/site-packages/setuptools/monkey.py b/venv/Lib/site-packages/setuptools/monkey.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/setuptools/monkey.py
rename to venv/Lib/site-packages/setuptools/monkey.py
index 3c77f8c..e5f1377 100644
--- a/venv/lib/python3.8/site-packages/setuptools/monkey.py
+++ b/venv/Lib/site-packages/setuptools/monkey.py
@@ -138,7 +138,7 @@ def patch_for_msvc_specialized_compiler():
     msvc = import_module('setuptools.msvc')
 
     if platform.system() != 'Windows':
-        # Compilers only availables on Microsoft Windows
+        # Compilers only available on Microsoft Windows
         return
 
     def patch_params(mod_name, func_name):
diff --git a/venv/lib/python3.8/site-packages/setuptools/msvc.py b/venv/Lib/site-packages/setuptools/msvc.py
similarity index 98%
rename from venv/lib/python3.8/site-packages/setuptools/msvc.py
rename to venv/Lib/site-packages/setuptools/msvc.py
index 213e39c..72383eb 100644
--- a/venv/lib/python3.8/site-packages/setuptools/msvc.py
+++ b/venv/Lib/site-packages/setuptools/msvc.py
@@ -277,7 +277,7 @@ def _msvc14_get_vc_env(plat_spec):
     except subprocess.CalledProcessError as exc:
         raise distutils.errors.DistutilsPlatformError(
             "Error executing {}".format(exc.cmd)
-        )
+        ) from exc
 
     env = {
         key.lower(): value
@@ -643,8 +643,10 @@ class RegistryInfo:
         """
         key_read = winreg.KEY_READ
         openkey = winreg.OpenKey
+        closekey = winreg.CloseKey
         ms = self.microsoft
         for hkey in self.HKEYS:
+            bkey = None
             try:
                 bkey = openkey(hkey, ms(key), 0, key_read)
             except (OSError, IOError):
@@ -659,6 +661,9 @@ class RegistryInfo:
                 return winreg.QueryValueEx(bkey, name)[0]
             except (OSError, IOError):
                 pass
+            finally:
+                if bkey:
+                    closekey(bkey)
 
 
 class SystemInfo:
@@ -726,21 +731,22 @@ class SystemInfo:
                     bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ)
                 except (OSError, IOError):
                     continue
-                subkeys, values, _ = winreg.QueryInfoKey(bkey)
-                for i in range(values):
-                    try:
-                        ver = float(winreg.EnumValue(bkey, i)[0])
-                        if ver not in vs_vers:
-                            vs_vers.append(ver)
-                    except ValueError:
-                        pass
-                for i in range(subkeys):
-                    try:
-                        ver = float(winreg.EnumKey(bkey, i))
-                        if ver not in vs_vers:
-                            vs_vers.append(ver)
-                    except ValueError:
-                        pass
+                with bkey:
+                    subkeys, values, _ = winreg.QueryInfoKey(bkey)
+                    for i in range(values):
+                        try:
+                            ver = float(winreg.EnumValue(bkey, i)[0])
+                            if ver not in vs_vers:
+                                vs_vers.append(ver)
+                        except ValueError:
+                            pass
+                    for i in range(subkeys):
+                        try:
+                            ver = float(winreg.EnumKey(bkey, i))
+                            if ver not in vs_vers:
+                                vs_vers.append(ver)
+                        except ValueError:
+                            pass
         return sorted(vs_vers)
 
     def find_programdata_vs_vers(self):
diff --git a/venv/lib/python3.8/site-packages/setuptools/namespaces.py b/venv/Lib/site-packages/setuptools/namespaces.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/namespaces.py
rename to venv/Lib/site-packages/setuptools/namespaces.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/package_index.py b/venv/Lib/site-packages/setuptools/package_index.py
similarity index 99%
rename from venv/lib/python3.8/site-packages/setuptools/package_index.py
rename to venv/Lib/site-packages/setuptools/package_index.py
index 7a80241..1702c7c 100644
--- a/venv/lib/python3.8/site-packages/setuptools/package_index.py
+++ b/venv/Lib/site-packages/setuptools/package_index.py
@@ -53,10 +53,10 @@ user_agent = _tmpl.format(
 def parse_requirement_arg(spec):
     try:
         return Requirement.parse(spec)
-    except ValueError:
+    except ValueError as e:
         raise DistutilsError(
             "Not a URL, existing file, or requirement spec: %r" % (spec,)
-        )
+        ) from e
 
 
 def parse_bdist_wininst(name):
@@ -772,7 +772,7 @@ class PackageIndex(Environment):
             if warning:
                 self.warn(warning, msg)
             else:
-                raise DistutilsError('%s %s' % (url, msg))
+                raise DistutilsError('%s %s' % (url, msg)) from v
         except urllib.error.HTTPError as v:
             return v
         except urllib.error.URLError as v:
@@ -780,7 +780,7 @@ class PackageIndex(Environment):
                 self.warn(warning, v.reason)
             else:
                 raise DistutilsError("Download error for %s: %s"
-                                     % (url, v.reason))
+                                     % (url, v.reason)) from v
         except http_client.BadStatusLine as v:
             if warning:
                 self.warn(warning, v.line)
@@ -789,13 +789,13 @@ class PackageIndex(Environment):
                     '%s returned a bad status line. The server might be '
                     'down, %s' %
                     (url, v.line)
-                )
+                ) from v
         except (http_client.HTTPException, socket.error) as v:
             if warning:
                 self.warn(warning, v)
             else:
                 raise DistutilsError("Download error for %s: %s"
-                                     % (url, v))
+                                     % (url, v)) from v
 
     def _download_url(self, scheme, url, tmpdir):
         # Determine download filename
@@ -1053,7 +1053,7 @@ def open_with_auth(url, opener=urllib.request.urlopen):
     parsed = urllib.parse.urlparse(url)
     scheme, netloc, path, params, query, frag = parsed
 
-    # Double scheme does not raise on Mac OS X as revealed by a
+    # Double scheme does not raise on macOS as revealed by a
     # failing test. We would expect "nonnumeric port". Refs #20.
     if netloc.endswith(':'):
         raise http_client.InvalidURL("nonnumeric port: ''")
diff --git a/venv/lib/python3.8/site-packages/setuptools/py27compat.py b/venv/Lib/site-packages/setuptools/py27compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/py27compat.py
rename to venv/Lib/site-packages/setuptools/py27compat.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/py31compat.py b/venv/Lib/site-packages/setuptools/py31compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/py31compat.py
rename to venv/Lib/site-packages/setuptools/py31compat.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/py33compat.py b/venv/Lib/site-packages/setuptools/py33compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/py33compat.py
rename to venv/Lib/site-packages/setuptools/py33compat.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/py34compat.py b/venv/Lib/site-packages/setuptools/py34compat.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/py34compat.py
rename to venv/Lib/site-packages/setuptools/py34compat.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/sandbox.py b/venv/Lib/site-packages/setuptools/sandbox.py
similarity index 96%
rename from venv/lib/python3.8/site-packages/setuptools/sandbox.py
rename to venv/Lib/site-packages/setuptools/sandbox.py
index e46dfc8..24a3608 100644
--- a/venv/lib/python3.8/site-packages/setuptools/sandbox.py
+++ b/venv/Lib/site-packages/setuptools/sandbox.py
@@ -12,7 +12,7 @@ import textwrap
 from setuptools.extern import six
 from setuptools.extern.six.moves import builtins, map
 
-import pkg_resources.py31compat
+import pkg_resources
 from distutils.errors import DistutilsError
 from pkg_resources import working_set
 
@@ -70,7 +70,7 @@ def override_temp(replacement):
     """
     Monkey-patch tempfile.tempdir with replacement, ensuring it exists
     """
-    pkg_resources.py31compat.makedirs(replacement, exist_ok=True)
+    os.makedirs(replacement, exist_ok=True)
 
     saved = tempfile.tempdir
 
@@ -185,8 +185,8 @@ def setup_context(setup_dir):
     temp_dir = os.path.join(setup_dir, 'temp')
     with save_pkg_resources_state():
         with save_modules():
-            hide_setuptools()
             with save_path():
+                hide_setuptools()
                 with save_argv():
                     with override_temp(temp_dir):
                         with pushd(setup_dir):
@@ -195,6 +195,15 @@ def setup_context(setup_dir):
                             yield
 
 
+_MODULES_TO_HIDE = {
+    'setuptools',
+    'distutils',
+    'pkg_resources',
+    'Cython',
+    '_distutils_hack',
+}
+
+
 def _needs_hiding(mod_name):
     """
     >>> _needs_hiding('setuptools')
@@ -212,8 +221,8 @@ def _needs_hiding(mod_name):
     >>> _needs_hiding('Cython')
     True
     """
-    pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)')
-    return bool(pattern.match(mod_name))
+    base_module = mod_name.split('.', 1)[0]
+    return base_module in _MODULES_TO_HIDE
 
 
 def hide_setuptools():
@@ -223,6 +232,10 @@ def hide_setuptools():
     necessary to avoid issues such as #315 where setuptools upgrading itself
     would fail to find a function declared in the metadata.
     """
+    _distutils_hack = sys.modules.get('_distutils_hack', None)
+    if _distutils_hack is not None:
+        _distutils_hack.remove_shim()
+
     modules = filter(_needs_hiding, sys.modules)
     _clear_modules(modules)
 
diff --git a/venv/lib/python3.8/site-packages/setuptools/script (dev).tmpl b/venv/Lib/site-packages/setuptools/script (dev).tmpl
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/script (dev).tmpl
rename to venv/Lib/site-packages/setuptools/script (dev).tmpl
diff --git a/venv/lib/python3.8/site-packages/setuptools/script.tmpl b/venv/Lib/site-packages/setuptools/script.tmpl
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/script.tmpl
rename to venv/Lib/site-packages/setuptools/script.tmpl
diff --git a/venv/lib/python3.8/site-packages/setuptools/ssl_support.py b/venv/Lib/site-packages/setuptools/ssl_support.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/ssl_support.py
rename to venv/Lib/site-packages/setuptools/ssl_support.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/unicode_utils.py b/venv/Lib/site-packages/setuptools/unicode_utils.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/unicode_utils.py
rename to venv/Lib/site-packages/setuptools/unicode_utils.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/version.py b/venv/Lib/site-packages/setuptools/version.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/version.py
rename to venv/Lib/site-packages/setuptools/version.py
diff --git a/venv/lib/python3.8/site-packages/setuptools/wheel.py b/venv/Lib/site-packages/setuptools/wheel.py
similarity index 97%
rename from venv/lib/python3.8/site-packages/setuptools/wheel.py
rename to venv/Lib/site-packages/setuptools/wheel.py
index ec1106a..ca09bd1 100644
--- a/venv/lib/python3.8/site-packages/setuptools/wheel.py
+++ b/venv/Lib/site-packages/setuptools/wheel.py
@@ -27,12 +27,8 @@ WHEEL_NAME = re.compile(
     )\.whl$""",
     re.VERBOSE).match
 
-NAMESPACE_PACKAGE_INIT = '''\
-try:
-    __import__('pkg_resources').declare_namespace(__name__)
-except ImportError:
-    __path__ = __import__('pkgutil').extend_path(__path__, __name__)
-'''
+NAMESPACE_PACKAGE_INIT = \
+    "__import__('pkg_resources').declare_namespace(__name__)\n"
 
 
 def unpack(src_dir, dst_dir):
diff --git a/venv/lib/python3.8/site-packages/setuptools/windows_support.py b/venv/Lib/site-packages/setuptools/windows_support.py
similarity index 100%
rename from venv/lib/python3.8/site-packages/setuptools/windows_support.py
rename to venv/Lib/site-packages/setuptools/windows_support.py
diff --git a/venv/Scripts/Activate.ps1 b/venv/Scripts/Activate.ps1
new file mode 100644
index 0000000..6a1b1b2
--- /dev/null
+++ b/venv/Scripts/Activate.ps1
@@ -0,0 +1,374 @@
+<#
+.Synopsis
+Activate a Python virtual environment for the current Powershell session.
+
+.Description
+Pushes the python executable for a virtual environment to the front of the
+$Env:PATH environment variable and sets the prompt to signify that you are
+in a Python virtual environment. Makes use of the command line switches as
+well as the `pyvenv.cfg` file values present in the virtual environment.
+
+.Parameter VenvDir
+Path to the directory that contains the virtual environment to activate. The
+default value for this is the parent of the directory that the Activate.ps1
+script is located within.
+
+.Parameter Prompt
+The prompt prefix to display when this virtual environment is activated. By
+default, this prompt is the name of the virtual environment folder (VenvDir)
+surrounded by parentheses and followed by a single space (ie. '(.venv) ').
+
+.Example
+Activate.ps1
+Activates the Python virtual environment that contains the Activate.ps1 script.
+
+.Example
+Activate.ps1 -Verbose
+Activates the Python virtual environment that contains the Activate.ps1 script,
+and shows extra information about the activation as it executes.
+
+.Example
+Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
+Activates the Python virtual environment located in the specified location.
+
+.Example
+Activate.ps1 -Prompt "MyPython"
+Activates the Python virtual environment that contains the Activate.ps1 script,
+and prefixes the current prompt with the specified string (surrounded in
+parentheses) while the virtual environment is active.
+
+
+#>
+Param(
+    [Parameter(Mandatory = $false)]
+    [String]
+    $VenvDir,
+    [Parameter(Mandatory = $false)]
+    [String]
+    $Prompt
+)
+
+<# Function declarations --------------------------------------------------- #>
+
+<#
+.Synopsis
+Remove all shell session elements added by the Activate script, including the
+addition of the virtual environment's Python executable from the beginning of
+the PATH variable.
+
+.Parameter NonDestructive
+If present, do not remove this function from the global namespace for the
+session.
+
+#>
+function global:deactivate ([switch]$NonDestructive) {
+    # Revert to original values
+
+    # The prior prompt:
+    if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
+        Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
+        Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
+    }
+
+    # The prior PYTHONHOME:
+    if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
+        Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
+        Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
+    }
+
+    # The prior PATH:
+    if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
+        Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
+        Remove-Item -Path Env:_OLD_VIRTUAL_PATH
+    }
+
+    # Just remove the VIRTUAL_ENV altogether:
+    if (Test-Path -Path Env:VIRTUAL_ENV) {
+        Remove-Item -Path env:VIRTUAL_ENV
+    }
+
+    # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
+    if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
+        Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
+    }
+
+    # Leave deactivate function in the global namespace if requested:
+    if (-not $NonDestructive) {
+        Remove-Item -Path function:deactivate
+    }
+}
+
+<#
+.Description
+Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
+given folder, and returns them in a map.
+
+For each line in the pyvenv.cfg file, if that line can be parsed into exactly
+two strings separated by `=` (with any amount of whitespace surrounding the =)
+then it is considered a `key = value` line. The left hand string is the key,
+the right hand is the value.
+
+If the value starts with a `'` or a `"` then the first and last character is
+stripped from the value before being captured.
+
+.Parameter ConfigDir
+Path to the directory that contains the `pyvenv.cfg` file.
+#>
+function Get-PyVenvConfig(
+    [String]
+    $ConfigDir
+) {
+    Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
+
+    # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
+    $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
+
+    # An empty map will be returned if no config file is found.
+    $pyvenvConfig = @{ }
+
+    if ($pyvenvConfigPath) {
+
+        Write-Verbose "File exists, parse `key = value` lines"
+        $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
+
+        $pyvenvConfigContent | ForEach-Object {
+            $keyval = $PSItem -split "\s*=\s*", 2
+            if ($keyval[0] -and $keyval[1]) {
+                $val = $keyval[1]
+
+                # Remove extraneous quotations around a string value.
+                if ("'""".Contains($val.Substring(0,1))) {
+                    $val = $val.Substring(1, $val.Length - 2)
+                }
+
+                $pyvenvConfig[$keyval[0]] = $val
+                Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
+            }
+        }
+    }
+    return $pyvenvConfig
+}
+
+
+<# Begin Activate script --------------------------------------------------- #>
+
+# Determine the containing directory of this script
+$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$VenvExecDir = Get-Item -Path $VenvExecPath
+
+Write-Verbose "Activation script is located in path: '$VenvExecPath'"
+Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
+Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
+
+# Set values required in priority: CmdLine, ConfigFile, Default
+# First, get the location of the virtual environment, it might not be
+# VenvExecDir if specified on the command line.
+if ($VenvDir) {
+    Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
+} else {
+    Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
+    $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
+    Write-Verbose "VenvDir=$VenvDir"
+}
+
+# Next, read the `pyvenv.cfg` file to determine any required value such
+# as `prompt`.
+$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
+
+# Next, set the prompt from the command line, or the config file, or
+# just use the name of the virtual environment folder.
+if ($Prompt) {
+    Write-Verbose "Prompt specified as argument, using '$Prompt'"
+} else {
+    Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
+    if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
+        Write-Verbose "  Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
+        $Prompt = $pyvenvCfg['prompt'];
+    }
+    else {
+        Write-Verbose "  Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
+        Write-Verbose "  Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
+        $Prompt = Split-Path -Path $venvDir -Leaf
+    }
+}
+
+Write-Verbose "Prompt = '$Prompt'"
+Write-Verbose "VenvDir='$VenvDir'"
+
+# Deactivate any currently active virtual environment, but leave the
+# deactivate function in place.
+deactivate -nondestructive
+
+# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
+# that there is an activated venv.
+$env:VIRTUAL_ENV = $VenvDir
+
+if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
+
+    Write-Verbose "Setting prompt to '$Prompt'"
+
+    # Set the prompt to include the env name
+    # Make sure _OLD_VIRTUAL_PROMPT is global
+    function global:_OLD_VIRTUAL_PROMPT { "" }
+    Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
+    New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
+
+    function global:prompt {
+        Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
+        _OLD_VIRTUAL_PROMPT
+    }
+}
+
+# Clear PYTHONHOME
+if (Test-Path -Path Env:PYTHONHOME) {
+    Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
+    Remove-Item -Path Env:PYTHONHOME
+}
+
+# Add the venv to the PATH
+Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
+$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
+
+# SIG # Begin signature block
+# MIIaVgYJKoZIhvcNAQcCoIIaRzCCGkMCAQExDzANBglghkgBZQMEAgEFADB5Bgor
+# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
+# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD+OCVx/PDssJke
+# lhLLB+DoYOXVGOQfEDGSHpBCLzyqjKCCFBgwggPuMIIDV6ADAgECAhB+k+v7fMZO
+# WepLmnfUBvw7MA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJaQTEVMBMGA1UE
+# CBMMV2VzdGVybiBDYXBlMRQwEgYDVQQHEwtEdXJiYW52aWxsZTEPMA0GA1UEChMG
+# VGhhd3RlMR0wGwYDVQQLExRUaGF3dGUgQ2VydGlmaWNhdGlvbjEfMB0GA1UEAxMW
+# VGhhd3RlIFRpbWVzdGFtcGluZyBDQTAeFw0xMjEyMjEwMDAwMDBaFw0yMDEyMzAy
+# MzU5NTlaMF4xCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3Jh
+# dGlvbjEwMC4GA1UEAxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBD
+# QSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsayzSVRLlxwS
+# CtgleZEiVypv3LgmxENza8K/LlBa+xTCdo5DASVDtKHiRfTot3vDdMwi17SUAAL3
+# Te2/tLdEJGvNX0U70UTOQxJzF4KLabQry5kerHIbJk1xH7Ex3ftRYQJTpqr1SSwF
+# eEWlL4nO55nn/oziVz89xpLcSvh7M+R5CvvwdYhBnP/FA1GZqtdsn5Nph2Upg4XC
+# YBTEyMk7FNrAgfAfDXTekiKryvf7dHwn5vdKG3+nw54trorqpuaqJxZ9YfeYcRG8
+# 4lChS+Vd+uUOpyyfqmUg09iW6Mh8pU5IRP8Z4kQHkgvXaISAXWp4ZEXNYEZ+VMET
+# fMV58cnBcQIDAQABo4H6MIH3MB0GA1UdDgQWBBRfmvVuXMzMdJrU3X3vP9vsTIAu
+# 3TAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnRoYXd0
+# ZS5jb20wEgYDVR0TAQH/BAgwBgEB/wIBADA/BgNVHR8EODA2MDSgMqAwhi5odHRw
+# Oi8vY3JsLnRoYXd0ZS5jb20vVGhhd3RlVGltZXN0YW1waW5nQ0EuY3JsMBMGA1Ud
+# JQQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIBBjAoBgNVHREEITAfpB0wGzEZ
+# MBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtMTANBgkqhkiG9w0BAQUFAAOBgQADCZuP
+# ee9/WTCq72i1+uMJHbtPggZdN1+mUp8WjeockglEbvVt61h8MOj5aY0jcwsSb0ep
+# rjkR+Cqxm7Aaw47rWZYArc4MTbLQMaYIXCp6/OJ6HVdMqGUY6XlAYiWWbsfHN2qD
+# IQiOQerd2Vc/HXdJhyoWBl6mOGoiEqNRGYN+tjCCBKMwggOLoAMCAQICEA7P9DjI
+# /r81bgTYapgbGlAwDQYJKoZIhvcNAQEFBQAwXjELMAkGA1UEBhMCVVMxHTAbBgNV
+# BAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRlYyBUaW1l
+# IFN0YW1waW5nIFNlcnZpY2VzIENBIC0gRzIwHhcNMTIxMDE4MDAwMDAwWhcNMjAx
+# MjI5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29y
+# cG9yYXRpb24xNDAyBgNVBAMTK1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2Vydmlj
+# ZXMgU2lnbmVyIC0gRzQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi
+# Yws5RLi7I6dESbsO/6HwYQpTk7CY260sD0rFbv+GPFNVDxXOBD8r/amWltm+YXkL
+# W8lMhnbl4ENLIpXuwitDwZ/YaLSOQE/uhTi5EcUj8mRY8BUyb05Xoa6IpALXKh7N
+# S+HdY9UXiTJbsF6ZWqidKFAOF+6W22E7RVEdzxJWC5JH/Kuu9mY9R6xwcueS51/N
+# ELnEg2SUGb0lgOHo0iKl0LoCeqF3k1tlw+4XdLxBhircCEyMkoyRLZ53RB9o1qh0
+# d9sOWzKLVoszvdljyEmdOsXF6jML0vGjG/SLvtmzV4s73gSneiKyJK4ux3DFvk6D
+# Jgj7C72pT5kI4RAocqrNAgMBAAGjggFXMIIBUzAMBgNVHRMBAf8EAjAAMBYGA1Ud
+# JQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBzBggrBgEFBQcBAQRn
+# MGUwKgYIKwYBBQUHMAGGHmh0dHA6Ly90cy1vY3NwLndzLnN5bWFudGVjLmNvbTA3
+# BggrBgEFBQcwAoYraHR0cDovL3RzLWFpYS53cy5zeW1hbnRlYy5jb20vdHNzLWNh
+# LWcyLmNlcjA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vdHMtY3JsLndzLnN5bWFu
+# dGVjLmNvbS90c3MtY2EtZzIuY3JsMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBU
+# aW1lU3RhbXAtMjA0OC0yMB0GA1UdDgQWBBRGxmmjDkoUHtVM2lJjFz9eNrwN5jAf
+# BgNVHSMEGDAWgBRfmvVuXMzMdJrU3X3vP9vsTIAu3TANBgkqhkiG9w0BAQUFAAOC
+# AQEAeDu0kSoATPCPYjA3eKOEJwdvGLLeJdyg1JQDqoZOJZ+aQAMc3c7jecshaAba
+# tjK0bb/0LCZjM+RJZG0N5sNnDvcFpDVsfIkWxumy37Lp3SDGcQ/NlXTctlzevTcf
+# Q3jmeLXNKAQgo6rxS8SIKZEOgNER/N1cdm5PXg5FRkFuDbDqOJqxOtoJcRD8HHm0
+# gHusafT9nLYMFivxf1sJPZtb4hbKE4FtAC44DagpjyzhsvRaqQGvFZwsL0kb2yK7
+# w/54lFHDhrGCiF3wPbRRoXkzKy57udwgCRNx62oZW8/opTBXLIlJP7nPf8m/PiJo
+# Y1OavWl0rMUdPH+S4MO8HNgEdTCCBTAwggQYoAMCAQICEAQJGBtf1btmdVNDtW+V
+# UAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD
+# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGln
+# aUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAy
+# MjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+# MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hB
+# MiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+# ggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtFmbE620T1f+Wondsy13Hq
+# dp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funRZ9PG+yknx9N7I5TkkSOW
+# kHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPpiCwgla4cSocI3wz14k1g
+# GL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRXu0q16XTmK/5sy350OTYN
+# kO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIPEvTFjg/BougsUfdzvL2F
+# sWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEAAaOCAc0wggHJMBIGA1Ud
+# EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF
+# BwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln
+# aWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j
+# b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8EejB4MDqgOKA2
+# hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290
+# Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRB
+# c3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYKYIZIAYb9bAACBDAqMCgG
+# CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAoGCGCGSAGG
+# /WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAfBgNVHSMEGDAWgBRF
+# 66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsFAAOCAQEAPuwNWiSz8yLR
+# FcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrfIFU3sOH20ZJ1D1G0bqWO
+# WuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+QsRsHDpEV+7qvtVHCjSSu
+# JMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wgXNlxsQyPu6j4xRJon89A
+# y0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0ZGuy62ZD2rOwjNXpDd32
+# ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6EpQYhS6SkepobEQysmah
+# 5xikmmRR7zCCBkcwggUvoAMCAQICEAM+1e2gZdG4yR38+Spsm9gwDQYJKoZIhvcN
+# AQELBQAwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG
+# A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBB
+# c3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTAeFw0xODEyMTgwMDAwMDBaFw0yMTEy
+# MjIxMjAwMDBaMIGDMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTmV3IEhhbXBzaGly
+# ZTESMBAGA1UEBxMJV29sZmVib3JvMSMwIQYDVQQKExpQeXRob24gU29mdHdhcmUg
+# Rm91bmRhdGlvbjEjMCEGA1UEAxMaUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24w
+# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqvaRLsnW5buglHGWx2sRM
+# CMpqt+gflMjw9ZJPphvbE+ig/u8dPiJpVfIvkvN7V/ncnDrtKn67nbh8ld/fSodW
+# IRbG6bLZFYbSdyJTZ36YyrOOVoBZJk0XS7hFy/IMmiQRXRFQ6ojkIbnM8jdb25Do
+# uJSTccJhbqSkfXvsDlPenD8+jw7woSskafVqdqq0ggKr33JLGsxp3/aE8wFF/o11
+# qHt/sc+fWCRJJMCh6PK6oXmH4HSojj4krn5Uu/Prn1VNsBYmxhqSTFnFVZikW/gp
+# 5BJLCijQPMy+YRGxPM29UExaG706uIk2D5B8WZ/3rNVO73dxn6vvEyltfJ8g4YqE
+# cxpG5nyKG5YjHeAj1YcMVfp8EpHz4eWF2RqIERYixdGjL4RBTIrvNSz4Wo6jaxFi
+# 21uzwxMX1gMoVnDI+Of1af6AsZ3k1QRXI28P1BUYES03u/Hztt24lQHwXgPKUSwy
+# 1lN+PD9q7oCY6ead4rlRypIm7BHJloY2TvLeqPTq63H4dNOoeCL3vlSnF/KvACqS
+# i+hkRYFVKm+S7w9WGQFdwuY17owQeUWJoyiIAMB4qZflEVGQ35WuZgZODjNqPF90
+# d4hjxO8t/jy1N+adAl33yB4lC//TU1TL8XG7CoC5ORp7Pk2XUvE/QKlMeGCHM7gV
+# EPiK1PbCpOHiOmiPD1BmewIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoK
+# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFPwqv37Uvqzzgpykz3siATu4jwfyMA4G
+# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg
+# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx
+# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
+# ZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC
+# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsG
+# AQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t
+# ME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl
+# cnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADAN
+# BgkqhkiG9w0BAQsFAAOCAQEAS3WhLbVfRrGJp8+PJj6+ViqNYq5S79gW5hYgSrqJ
+# FFoVps0OGP1EEVAX9omITmaytAQ58APr/qBVIf3WVlYGqDo0R4b1P1JduIA+8n0I
+# RYWx2RdSuNtaG8Ke5nuSpS5TkEC6YjVBFuliBkvdQD6JleSaNsaHWWfytSFYjFsF
+# gvhKDaeqkHjinsJQViQ+P8xvBTaC8FXaleOPlZqyShm2wAIy/mDjYE2hUuhECL56
+# /qzTs8634m0dEibzuVPK5zzCHSzBM9TCSwpstTVl2P0Kmq3Nee5UTTDnR7Em9FIr
+# dW3iD7S+KCkjeo+YN2mR/37gy/LRcw1yqu2HDbRH4+QiUzGCBZQwggWQAgEBMIGG
+# MHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsT
+# EHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJl
+# ZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEAM+1e2gZdG4yR38+Spsm9gwDQYJYIZIAWUD
+# BAIBBQCggdAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB
+# CzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIKwuMOP9xUoz8IY/qorw
+# oGtxknrVrNkjKQ2ycWeqndzkMGQGCisGAQQBgjcCAQwxVjBUoFKAUABCAHUAaQBs
+# AHQAOgAgAFIAZQBsAGUAYQBzAGUAXwBtAGEAcwB0AGUAcgBfAHYAMwAuADgALgAy
+# AF8AMgAwADIAMAAwADIAMgA1AC4AMAAxMA0GCSqGSIb3DQEBAQUABIICAIxhia1z
+# q5Ne1RC0EjQ5Dwxz9WbhsGBoGrqEdFPevbtsrDkGfYjJSn/+lcm513FHHaswZ5Oe
+# 4cYOdYx+CGLeQfKI2Ex8X32mHjBJ05x9WgrVjyNaZgmfEGdgjHQJ0HR8S2zslhMK
+# OVmXPQ5z/yrp8XKyfcz1YxWv6adLEe5VCF23hQrg0X9kAtXRCHl5sYzIGdiN0ZtU
+# qhF/opkiE6RUQbnQNzOdPBHFcmUGXq6QMago4PlajZ9qSV0Jmbz9X3G3m9g7OKUM
+# pMfgcOMh6u8+CgTjfUvzNhQpzpMaRuscMbeLtdPt7Vx3O7zHJkV2IahCNnqg3+yr
+# nrtuGcHgL2UjNCnByAtTZwl9gu8HbWzhfpM/Yeik7EvnuIJjpawgiTYJCdB4nQiN
+# +zAChfqn5EyRJOdKYOD7Le7setZjSz2YhoLu9+ZTqAVIyEQuR+mLr5xZ/NdCtWM5
+# E0lfMACTM811zLBVtWUNDmGrjEsC5YXi0EYro9wxC1C7fr3zio0Riqec6yXGZIXy
+# ZlmcpQX08x94wyhXDu6PxPROibzeH1oxPY8gqdz3GBhBVJ1syPwwe5hpq18npiFa
+# kaUHnmTh5G66ob8KfrW0pLxFYtm0PC01SJFbneId4Nba37vJRz8ljcMOUGG9V1xB
+# wYYv9omIwDcxvej2DriM1+G16VgXgW2i+HSooYICCzCCAgcGCSqGSIb3DQEJBjGC
+# AfgwggH0AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENv
+# cnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZp
+# Y2VzIENBIC0gRzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBdMBgGCSqG
+# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIwMDIyNTIzMjcx
+# NVowIwYJKoZIhvcNAQkEMRYEFFeoNP35f0GEPRx1lIAvgGS7kQaOMA0GCSqGSIb3
+# DQEBAQUABIIBAEEQv1uOdJtm72308aLHvgJ/ydvSwEQtG/hcLBf9hlBcKtkAF/jL
+# hAiMw2ABZ5EYlXkSTREecbS+cNluC0kCG1pei9kkVp+zqk2GxTY1zROE4a5de4f/
+# dgOPpLrSKeu74sbnhGZcaGKP8U2ZpJzq9zVVTGNICgwaZu2meszWkfcisO6GKBYs
+# EASTWqWwd89pNI/ZU6Dxjy6JMC3q8dOm/PwmN92/wd8rK2xJuGacIPKlI9KaMBmZ
+# 67jWuSAyk3T2xW4u38+mo+JSayoP7Vzksk8mIy5JOA4jjK/5V93psJP0HGZoznu1
+# aiQFqc3z8uRQZZXpD0YXo6Zlkr9fbhoRXPQ=
+# SIG # End signature block
diff --git a/venv/bin/activate b/venv/Scripts/activate
similarity index 92%
rename from venv/bin/activate
rename to venv/Scripts/activate
index 7b8cb04..9716d40 100644
--- a/venv/bin/activate
+++ b/venv/Scripts/activate
@@ -1,76 +1,76 @@
-# This file must be used with "source bin/activate" *from bash*
-# you cannot run it directly
-
-deactivate () {
-    # reset old environment variables
-    if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
-        PATH="${_OLD_VIRTUAL_PATH:-}"
-        export PATH
-        unset _OLD_VIRTUAL_PATH
-    fi
-    if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
-        PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
-        export PYTHONHOME
-        unset _OLD_VIRTUAL_PYTHONHOME
-    fi
-
-    # This should detect bash and zsh, which have a hash command that must
-    # be called to get it to forget past commands.  Without forgetting
-    # past commands the $PATH changes we made may not be respected
-    if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
-        hash -r
-    fi
-
-    if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
-        PS1="${_OLD_VIRTUAL_PS1:-}"
-        export PS1
-        unset _OLD_VIRTUAL_PS1
-    fi
-
-    unset VIRTUAL_ENV
-    if [ ! "${1:-}" = "nondestructive" ] ; then
-    # Self destruct!
-        unset -f deactivate
-    fi
-}
-
-# unset irrelevant variables
-deactivate nondestructive
-
-VIRTUAL_ENV="/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv"
-export VIRTUAL_ENV
-
-_OLD_VIRTUAL_PATH="$PATH"
-PATH="$VIRTUAL_ENV/bin:$PATH"
-export PATH
-
-# unset PYTHONHOME if set
-# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
-# could use `if (set -u; : $PYTHONHOME) ;` in bash
-if [ -n "${PYTHONHOME:-}" ] ; then
-    _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
-    unset PYTHONHOME
-fi
-
-if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
-    _OLD_VIRTUAL_PS1="${PS1:-}"
-    if [ "x(venv) " != x ] ; then
-	PS1="(venv) ${PS1:-}"
-    else
-    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
-        # special case for Aspen magic directories
-        # see http://www.zetadev.com/software/aspen/
-        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
-    else
-        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
-    fi
-    fi
-    export PS1
-fi
-
-# This should detect bash and zsh, which have a hash command that must
-# be called to get it to forget past commands.  Without forgetting
-# past commands the $PATH changes we made may not be respected
-if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
-    hash -r
-fi
+# This file must be used with "source bin/activate" *from bash*
+# you cannot run it directly
+
+deactivate () {
+    # reset old environment variables
+    if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
+        PATH="${_OLD_VIRTUAL_PATH:-}"
+        export PATH
+        unset _OLD_VIRTUAL_PATH
+    fi
+    if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
+        PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
+        export PYTHONHOME
+        unset _OLD_VIRTUAL_PYTHONHOME
+    fi
+
+    # This should detect bash and zsh, which have a hash command that must
+    # be called to get it to forget past commands.  Without forgetting
+    # past commands the $PATH changes we made may not be respected
+    if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
+        hash -r
+    fi
+
+    if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
+        PS1="${_OLD_VIRTUAL_PS1:-}"
+        export PS1
+        unset _OLD_VIRTUAL_PS1
+    fi
+
+    unset VIRTUAL_ENV
+    if [ ! "${1:-}" = "nondestructive" ] ; then
+    # Self destruct!
+        unset -f deactivate
+    fi
+}
+
+# unset irrelevant variables
+deactivate nondestructive
+
+VIRTUAL_ENV="C:\Users\Robin\NoSyncDokumente\sourceobsw\tmtc\venv"
+export VIRTUAL_ENV
+
+_OLD_VIRTUAL_PATH="$PATH"
+PATH="$VIRTUAL_ENV/Scripts:$PATH"
+export PATH
+
+# unset PYTHONHOME if set
+# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
+# could use `if (set -u; : $PYTHONHOME) ;` in bash
+if [ -n "${PYTHONHOME:-}" ] ; then
+    _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
+    unset PYTHONHOME
+fi
+
+if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
+    _OLD_VIRTUAL_PS1="${PS1:-}"
+    if [ "x(venv) " != x ] ; then
+	PS1="(venv) ${PS1:-}"
+    else
+    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
+        # special case for Aspen magic directories
+        # see http://www.zetadev.com/software/aspen/
+        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
+    else
+        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
+    fi
+    fi
+    export PS1
+fi
+
+# This should detect bash and zsh, which have a hash command that must
+# be called to get it to forget past commands.  Without forgetting
+# past commands the $PATH changes we made may not be respected
+if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
+    hash -r
+fi
diff --git a/venv/Scripts/activate.bat b/venv/Scripts/activate.bat
new file mode 100644
index 0000000..d4760a0
--- /dev/null
+++ b/venv/Scripts/activate.bat
@@ -0,0 +1,33 @@
+@echo off
+
+rem This file is UTF-8 encoded, so we need to update the current code page while executing it
+for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do (
+    set _OLD_CODEPAGE=%%a
+)
+if defined _OLD_CODEPAGE (
+    "%SystemRoot%\System32\chcp.com" 65001 > nul
+)
+
+set VIRTUAL_ENV=C:\Users\Robin\NoSyncDokumente\sourceobsw\tmtc\venv
+
+if not defined PROMPT set PROMPT=$P$G
+
+if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT%
+if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
+
+set _OLD_VIRTUAL_PROMPT=%PROMPT%
+set PROMPT=(venv) %PROMPT%
+
+if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
+set PYTHONHOME=
+
+if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
+if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH%
+
+set PATH=%VIRTUAL_ENV%\Scripts;%PATH%
+
+:END
+if defined _OLD_CODEPAGE (
+    "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
+    set _OLD_CODEPAGE=
+)
diff --git a/venv/Scripts/deactivate.bat b/venv/Scripts/deactivate.bat
new file mode 100644
index 0000000..313c079
--- /dev/null
+++ b/venv/Scripts/deactivate.bat
@@ -0,0 +1,21 @@
+@echo off
+
+if defined _OLD_VIRTUAL_PROMPT (
+    set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
+)
+set _OLD_VIRTUAL_PROMPT=
+
+if defined _OLD_VIRTUAL_PYTHONHOME (
+    set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
+    set _OLD_VIRTUAL_PYTHONHOME=
+)
+
+if defined _OLD_VIRTUAL_PATH (
+    set "PATH=%_OLD_VIRTUAL_PATH%"
+)
+
+set _OLD_VIRTUAL_PATH=
+
+set VIRTUAL_ENV=
+
+:END
diff --git a/venv/Scripts/easy_install-3.8.exe b/venv/Scripts/easy_install-3.8.exe
new file mode 100644
index 0000000000000000000000000000000000000000..5249f763aebb702ef59593eb1491b13b301670bf
GIT binary patch
literal 106390
zcmeFadwf*owfH^BWXJ#sdr(FK3XTvIjhE0=O&rh+%*Y;@2r6h)P&62^qEeU<tSE^)
zX*2B3DLtpQ_F`*q=h)Mp)5|$W0=AkEAc<VX8;VuD?{QEOH3`@K`>totB*9DH^Zx#M
z|9Sc7?EO6ZxvpnD>sf0(YpvAWu-4^vxm*SOZ`&?cD^K}Xt$zRUkHzN^r*9bH`tPCJ
z&uGnyZ9ik~;yacHmM**J_GP!+6{x%A?z``a2X4JBuq<(R;EuZk;n~*&?z(5uZRZyk
z4=c?!{p(8>-uvE-BPQkkkNbZ(>0Q!CxBPa}7WMqir0=We+DRYs{BYu<liuX{-i_L%
z^(z0dZ22E#pZ}tsSKm>$SlZ0ZU{1v4TJ-H9t_RLKHb0klz%{`&Jb#$WwV#~-baJ~c
z;^|ZG)p_!e_k5SjBR~AhJzYN104>p+5B#bdbCt4nDd{wldq~}Ej=Z`aJ3r4gRlVf7
zelv%cwRx`7hD%27U%qPz11NWspUe7RJ@Z_x&QQO!^!f4IR>t}A;rsl^fMo8n_=Elh
zT&{)ZFI#j={1%tXx>!CikV+m0<bB{@HE43aQ_R&w!X*$J#d9*xLI0{<uD0`+ItA4n
znX9Xa0#m<GuKN6C%a_&hNx|eXzF$p3|FUwoExCt+R|xXT+Q=M!@`ZBK<?H|d@2eru
z+?}{9X1*FtUgN7t&M2u#&I;&_`*klsH$DGWk>}DYHtETx(sFWQ<}(`v&e7D2l5lFe
zt*2t8<$5w)8nAvF097haqD(4GUP@o6r~Lbh@?4f(>~gJ_b+P?xKXSRYb!^-A6@Ah&
zeO3(WlbnChXX8Tp+%)pUKK~$n&KT3*=V{qK_2m3gubzyT`mWQB{Q=YSU(=bJd000;
zuGkwhyJM;8N42MRMa^!j`DE#~OK)zAk25`{Dz_sP%!_K_m!o!jw2Z>xs-u}*x*0F6
z)XfgvoX?z%O@W&`w)OW@q9<3C2Iht4hUSH?4PB?3`{}njW~O5)&shu-_$<9z9yOJb
zinn9Q+bXSv?1_-Mt+|bFMHJC~&~EKIZri#^8Q_{<vD@+iXh~c5Ko#UAR(Bwjdg>^}
zn(dILAB|MBnJ-!C(`61)ZB=RBQw6|3WWE$Nw};IwmZyXzG`H*KF6&*@`W~6;>5OEb
z^fF35%=;a!*V)msW4ilD`a3M&laPx7bF1}J&FPm;AqYpB8Qp<_e!rRRH*9u9&6jj@
zhxMb;QhtXtx{}_QAG5o1I5TIS<{s_gc5DAJ=1A|l`CO<~=!f;<<Ene9S9Y8cST%q~
zO~Z^FP~fO&b4T{;Wqr)`*m!5IF>?!jGBax;eL5W#I~_?c-=>$4wl3nT4|+}_JK?D@
z-^tWVYpEY8`0ZvM&jUZ}_g`r7*;8^YJ~?dg(5KMom8tn<c1`f_%f@Q!Jgt1L4^_G2
z!)nT2Cv*A1jJw8sOD);TGXz)XmsUs3O;Pj4@~F9-*ZcLT`Bv!W&`qHQq4^8g9u5x8
zyH*gjyaM=soVxCO!KQ`QKXX{=sq<zE;;?4th1Sb{WXQVtVnw%<nXD(5lm=}7*P-jp
zZCX<k;Cx!PU*-W2Z@dgXHMexJY~5Px2=mlUNtz_hJ=SaN;O4!Ft5rHv>NFoSzu5c>
z8EHN-wnFwo=|YzDxuI;lTV=7y-;(jDPE|YBS{XHaWKQqv`l)UD#LeuL@|$lOm}~#O
ztk%s}bn}qyPtm?^OmuZZP2@CtN~WL&(iJne>gG%A<jKaO(g0+oo3iE}dM&d3|G~S_
zH$)4+CY!U?*_(6duUht|v41kO=OnXu$n|-y=I*$+Vz=%88dX}Qc}h+0kp1fuK$gtY
zQ-3IJ=mj+!_csic8F+rgp{?j)^HN114^`~0=(hcnX(5)1><g`5E6tdDbYL=P19eDj
zRRq%Zf5L&wl8tO!RXRtCB?=W)%;d9fDgUEhp!fD++it8m;3^;7T&@}0e+Mm4^q(ne
zc3JBvT(Mi$aVfNTvGwblpm{yEZ3D8Ui|N4jKcXtkYtt$I1KH^*f5NH!Eh?}7jKa2m
zxl^c13f<!rTIv*<Cxt#$g|2i8LGik*E1W`iI)%z9q^F91N#+ItVrS$J!Y$bTGO7r&
z*T#UTE)ZE75flxVR_iQWCE#9ETJGX!vV*`cRdh4-fHY$Jo6`!vBDQ}oZ%$E2#8L+%
z!)9B>?r<_D*d8kltQSVc_TNXz7-g7dPhlR|(pk}Mop#8!&9Gqj+|pWBBk37-T^@zQ
z(kxiN(Dr{n`&w%}13XU6rDUJXVIGoB`H#{flMhLAG0E?+ILxwpRrVZ66E7{f4tjsB
z95A~1KD9oimcr-rKoQ7%=qd1q97S=%+PYcZdeE?}-Z(TNJ}G3rXsze$0h7m2_b*a6
zHOp)J4+!*Coy0c1d2f7p)D3#~rgutPDgTct7-|)MN;h{}bwhKM>X+m<w*dw@M_T%1
zomP}+>qbbIBc-z#ohc-wN4G;S|A#u%u&$Tl#+LkS@ggZc&KaAfo3GV}tImv%(bf%@
ze2<eqOgB36`7kl@UiQO&p(br{Z+$p9Q9jCX5IB-M10It3sqt}w2!Vcwy;g5rHX(6#
zy%C(?j3-4QhA%_fBA;_D8J+nuJZAr2lnAwQD5=@s27Ku<P;aarKOsJ5prQYkh8|W8
zJwQW@P{5#I9&v^_MjFp(%t%|;WtBUbMKW$}ox2_oy`v`=&<XTgH<y6Y<`$tbLR<n6
z@A)^w2f!-T!euN48CI4Ioc*cCE5RG+$YX^vOwa6da&%<v5W(El??R*}FopW6%D5*r
z`*@~MTenj;+6uIF&&r<r2~@tKC!DJH3UwVCOP#lvGd(jgmRg*jIXPrLFGGF+R*1Qe
zh#H&oor8|DZvi6j6#^n*0)$%KN@w*|(>{rU(7WQab)m&;W;icz@S+><1J=}1`0Dyl
z^6S@b@w8Osx#n0Cff~ng%D-WVTDR=kT@K07Q-(CIo5zLR1@|l;-B48=*BYvZ#fRy3
zyB_RX_F=}&KA=AQLdyR=nvfO$1QJx;a<L+pWk+IW2QyipKIU?T&7IJK$*NW1FKz!{
z-+{>QP^?j-44|%08u$wh)F<Ps=IHP_bLy*DjyNdJB0g{34N(9bLv?VazUtzH1#V4L
zGgvC!vnS%zmIYVPyUZ!hf_Jjug=)d6afYgKcecj#!8MA%q=pa;&|{|%gKFz_kX_ZU
zmmv$T?~_p<g{a2NRi)MDjv57z71BH(-r~cP3YAmEdzrlAqMo<bdSoVvRUF{cbQ(&f
z76R@K0v&5A%v?6Z_U~kAQ`ejf|1r08eBzuaheIHB!-v+59HD9)mr{pu)PSg_0^m34
zu|9dRUe}?g9+p;Vs{v%INfm@`|95CFminz^RJ28nZaZoogF{Zu$*({7$Ea!Rz0bx{
zA#%G_`Y37L?vA<Jb2-O9mqRj|n(r+HPpl0L3S4;7qlUzIs<nr=Kp|fH1n59eD`UX0
zJeDecmJ;9w+#!IC36B#?a`IbM!vyDcT2W|~I@_)LkMj0q|LW_t(}feFLa_MRGhzNl
z>h0~m`rdZiPUL^mp|^MY(%X?56z?@a%I66Srb}-TbDtwEL@GWAnVa?IZtdYV7G<>c
zt%;m^F8D*2Rmf{aTe^{VRc5y;6MvNigz+3FwZmEqlPvTc%$_6rx!Af$wZT%lGEY<T
z{KN!nVt=y$$sz8nru7H1*RHK-%bbpg5|MROT=oJb4fF|IZx|x2cM756z>CA2!EFg|
z2?w-oTlF<^Iz>%z@fqEGnRz7q);eg<lQM&3i8X_Fvjg6*wSf%Sb`gn`oRD-g*mwbb
z7h26y3R<x#aAU`|%+UJa#`s9xXlLi-$<FzRj6{KMws%yt!FLH=oC8#KZ!B3|5=-iV
zYZP}IfF{7Z=3wc!&ZpTdET23BPOi(&%#s3GK)$Z0*x}Yb@NuoIyc=Mcdt&Ae#R1P1
zn!M9GESU%iF9C}u1X_|AVGBX88Sl+EF=EbbsQ<+Z7BRD3H;d<AlIId`@DFdOy*AqV
zHT|<lw*LllAi=Xp0|95oIXJ?-RI@|iX{?>+JB!NfPpu*&?za|76M$^EbuDkO4b@4n
zh>It-!76MCl~8bZVzqVsRH`Ir_;hn^n}9!gvTnAts<&BQJ?K9M2O2-cZ0I7Z+4D5#
zNWyDPy+levU_JkNHk+wxhBtnyZqD$TEvi`YBT{Ur6`7*iW(YHUJ*tKL#3)0R$=@=g
zB#%SKm;Z^jI&bh8`_Ht+tlv_E+LeLOTu`VQZYFA4&YlRFn`%VZct!>aMvb*@3-mAK
zL9o3QE^>AH_v-WR_#48tf`iXmhhZCIAZj2|RW~YenO@ebtvl_~dgDlF*)V=@SW!@K
zbOeMP8+|IPPi3_Qgi7o7_IPzY{7|qyxF^0P^L3aNp}zs^BcRABpc2};J=W_2Rbdyh
zwT4M8kJQ@6!Ktn5C~FT_!jr~}ge5FDekpJ}rbHGw>a*JjioKY%s}9WvfdIke3O3R1
znE7&*=kiJ*yaE`+zm=Uolg=XYL4+(df9fJ%G&BEL*()=&bwww`_o-POQnP9gaB81a
zZyZ*6hgIIjK-AcnAGN#UjJaFJ{7ih4wr-=guDh%Y#FZvttF3v$l&khn)N{xdHxBJv
zvC0w0n!9x^atL(4>tdn0-HCwp-gKBihUl^$sOHU<w+?}qS*%k?xM;S;qpwNM0ijms
zR(al=1{RJGV)GfbnRRjI_tr8R=~QYx>-PRvn54`})=o-USNCU%xGEYGr9P1@Dez2r
zzBw+>)#1=5)ARO%JlB(=3!ulsR#EU}Ji!hv)}hyRZGg#hB|YsFv5rO<Skm)wjXFgV
zrKvgK_txaN-^j<;osTQC9}8Q@QZaL{lDORTrYA?`>BdHMH|<{C-U_c^dS+2L^R5t-
zl>f+Sd9FxGcSp^xSjzt~Y!rl3Z}0OMZ=4=A3pVO^cGt$tQF&40unkvk96lcR)Uc0-
zbmp@jcGPZ@)}wZJ;%~I4w!Pqu6^y!E4bv80l;?8AJ=XTi6|{H97!XUCz6Gu!OQ&V|
zQpL3lLl3^Z>{5XA>gn>nXT{g#IBfm>zpH=e=w;99z3=Poham#b=<VstQn8UfYyTB&
zgAI3<XxXk)vy_(VM%|wD!mFHh4y+NmjYFdzIN50TSsOlI<BI+ozm^)ZPX6vwWeCqK
zyO813sNr<2I9uEBP5LQ&X3&^=)1Mnq`bOprtjig|e43MPi?t2QN;LXTUn(C{bZAey
z%;`(^Q&Hu}IBV0+7D#*=?cJjk2<;u)s^^JbO$d>mS|VD=1^l0=)RPZXqf66S$oI!H
z%!<u=GJ@pQQzNwMVD`j2#oB!8z=?Mi@9BG33#+1rAq2N98-gfMk$EL*MqH*oihVaX
z1oHzAvO#3qu;?CyISE+5ioqb&?E^<IvzAGd=Llw&SoOS{t~Bcg9daw;Rm|@VD<EWT
zfqFSdl&n;d*ayGx8I_{uwrKFv<tIze)>+cj1ai|0K%?fi2X7ZifBHVX_ha4Y%U@PI
z3j*rX8xOfS30F+fQz)*2?JI`qtp`M0N4(LEeFv<^7@c0WPk7^U81MMmorT-Bu>nrD
zUIfM9xa4rsI$eMNyDUqmF9V_<r(nWo{g$2LZ07U@v?q|rf&hSIp|D8AZ*-j2&t@qi
za1yivJ(Q4ze?{qQ?#UEc3uq?`6g@TjKx38kmGD>(z_STUSHlu*w{909!ej+aR?uVx
zO;#{<n@@CNXo-|gRkUH%@C%|La*mH()|0d%r*FXF4XyXk#x<-$xA0|z9Lf!$VPmKN
zz>Ls&D_ys-zY=x!<Y;onfv8buxhxan!hWd~nglHkpoi<%;leqI0@wUl)DDZ;YBlDe
z8et3%>dCpKO9fxY)_^Yln&zIwS=K@r%IqQV0lb|<_EySf%&GfC38tHWEp1?}Wraqt
z&M-aE-cMt}u6xhcjpKIQhhDQ{x2QGSWIauhq2j+DRIqQw!%;N&+8<x<omqm~m@=98
zkgz$sG&2N!2~vuvN*1Cy(3)!boGlgF02o%sZ;I8e@J5<@;&ZeXQNBcjABMH*pGC|a
zv0%6Mo%b18%!FY_4rR{P+t<?E*(<yub4v{Ry;v`^^gKR`8j7EVG4}zztSkLXRgLcv
zvppKLmMx9|mH^WTzJD)DgN+gMV5s-w3<P&`*!(QodmvnPFf&YEgYQSQnFncJF!~<F
z-_vCz+g;Rr5nk-nd4h0`a?|Lu<99-p%dGUhOh_s;0Vm1k+-6w9>75m7Q2>Euh}v6_
zQ4~aE4=<Lbq|68D*VPdUz>E6<J{!cgeu7T3lbb?z<AoG4W|su?vcCg=RNTFvrYAdj
zzRdekvok%Gl*8{1=mBEMg@KTgB%<cWiVhu)nQsWPEEHt9Q4T{{ox}uP&XHj;b0doW
z=OD$_c-6OX=GO1|&0HXx>kV`XYZY$7`PLwdh|+tTbtT9zdzup0iBit&M7P)`jaSP_
z3rR#oj+u*KXOuvo^q~k@uwpfwZ{|iF{g+iOFm%xWEBJQB{!JFny@%#=ynBhYi~(k`
z-S#WqJ^eZZmohmyD3)4;68j7pf6vU4YOVR(6p$6GpX;pHIY!^{_$0k<mpaA{d60PT
zpONP>-aK8ub9ZgjJ*tc2a7-yD^hjQOynvV#x|Tvc(<@geCds;wl~(*P3J4(C(^^jI
zsJp1GCsf%GKiS&C0JCGgM#j3sX2YH%Bl#1vF!$7$LMXC2!=2VvhL;m5>R6JsQu3gX
zFcB#xBU&k;q8?a!l}rJ@CzSt{`e0W=1g1!<92}&U`#70=XCdyd>(<s4=$SK>0xkwc
z;~<+`S{^prZU4*{fLk{R;?dUeL0i|Zt=l?LxIGcK6z>_S*jr=nLWl#85~HopV3o2H
zdWctu-1h~vFq>}+n|EQ<M03=gI4|=8Y<GR6YD~N&BC=XIh{6aaB_CyEetm?t_9K6e
zg?<hQbKDfQXUaZbFYn9hB~(3H7?aqU5xw6SX@{L0O%97{VG(^MXXQcJAA@Cz>~S8*
z9?>P%gn=pj5e*|`F?|C-v@W@t#Qk15cONJ)>b!_;=nBz+=UKPkB<s}NwsN<5O-b)Y
zG}Nxdu(IV|b4waN#bpLTm9h|euaC;^^!03X$EV7%i*(x0(zOYq^n|_M1`r52DKo60
za#$kY-mJsR1>MU&22V~kH>Y<2-KO0uKekpeGzakM8`wHM8}qcLKk`vVm?*6HApI*6
zW%v7P%>6ayr|$c`(e~q>knzsxv&@16HFthc8|n#r=xtSQ7WvjM7r0!(Es2RrgxjgR
zyK;l*RD)<=_Hplw5?26nFasntUu5>yUDSahw!8@aQQUH{Z^g)-871EMa48I%VD`n`
z=KZDcY-d;Jxvrph)pJ2S-|j5yO@%LHD-EbNMXw3H5K<w^O|%Eu^AITzBv*H+tkfU^
z;J3bs$~23E$5BO!@IKc1IvO*!%T}w9kvY^!E*>2HM5Q#3-n3t4aV}ouymjtN=LnYX
z<II&KHdV7H%uy|8;UW0FUDlt3y@y>Xv3lq)+qL0zo&GoAUeo+`+@o{0z1A7Arjr4S
zxR3vLMH|r+*_Yirv@^1Ym(`iV8L5KOWCUG8jUF>2?8Ta0(AALrf^bPa@%bQC)UMgH
z5_vqbtEEJKWi^tKU71mOYThnnu*Mlo8uD|7e3Y^UEhQOW_T!@L#{$T*R<&SH{q*Gg
z`s3Q89jO_|<(gy;7lMey%O`Uo$i?7Wxy!&TYzE&isG|fmRMbpIg(}I783&2h^s$<9
zTf#3}eT<OZ=GVxA7|1Cuq`GN`dfBZtZRRB!+;#69YXb~IEOmJv1oZ;2$YgHe(v>lD
zyXdE&^IY7Bl1bFC*41*@^&L+vwVJ49R8G*Eze_{by`+*Q=>~cK2Jf`>)_h?cxNv4i
ztM*vtFSI9O5>#Tz&BvwHvBK}Lnv<Qj6JNK+^A=79GUqh6-FG$xFOXv6tU|J#BRMnN
zI*h_JyY}DV6|@sXo-;^rAFTg^i>#CZEp$eM0w>_Ie#9_9#T?HEW$K4F<pXA@BxLp}
z>EUq$=D4N5N5S!L82dh|_#jCcqc0CN%Xm@x9)k@6>3?3u_{|$jB29bm8x}I&IvP&i
zSdtkV>gmXfkK)%G9}&_vyftiDVdsoe5pt!{^++LMvr}<84_~iv3f1W5R76dzTqed8
z&@Vf?$Kg}ims~#$Y|fCmM+SVNdTr;3eo)QlRYrdvnvh|}k-WIaIFg_EyVdkD`xU*j
z@bNpX4`tKtk+*__yuqu^|B}9eSI(}&nD)#xD6MXetK*R4>RM|uKnme*D)g#xmy#Jz
zSV!(4E9seY1~U4(#X`C68*06KySyZ@lo)rG)Ma3^Wb0in*GB)rN5$L>2aV$u)}xXR
zcHTQiH;307Q}3IW&>ZQ*`lw!-i4Q@-@@97GrkmS^mH9bV2<VB;h9Wy(&8I1zUQ9#Q
z7YauICdiRrv6tyL_c&VLldUEsoSe$k$9v{pJvm-DbGM#6-Ryw!INIJ9g*AH#Fvbu-
z8P{yN&Uu|N#!%vm3S1;V>pwFfU~-74S4LT9(_B`OGM-lxgn`S8n$JsBSX+V8DXObj
z@+@bB`Dg%9+WHk&h(3sOL9V8)-NO~L^3^P0RtFHNK#$cepdBGR!%$%=#<AZ<T0biq
znCE2PbLz`zSr^(W7i6pe^+#JiT3<-5{Y)ZF0|{S!gt}tSqQuzDMtGpk0XZ&U>;#vU
z@_CeX38k|8x0B%x@624@6Dl#{mskrgl11NY_F20HVb~g%!W07p+rb$R&14|RvnI>P
zhgp-~mu*}(*=5v~xSSJ4sV|g%i8JQJvx~}uj;~SHU+6qLj>~w3PM^s*s^de9TS{D+
z1J*Y_%${Tya$-0q*+*n$*eJ3o9F%hI50vFbYt0RE(dPLHx5{YE_hu^fI!`wVh~u~A
z;cjoN6tl#{TkD5|2=!HZNn%gMUZb^%H6C&A(5grJc+np2VCdD>Xe3BhWr8s+fMO#b
zz0r9WpszcPB38$_InCYBvq>&FD_8V0lw49YUy4FBUDhN0MPHjtvilwo#H!;ndvMr#
z^bRiT42szPt<M1Rr047C#jQWyt==D@HS70xWy>NbyR6U3q|I++vxZ96n`9}b)>_D5
zK#M|FY&)4T({t%WG>S>jWju7#AK+mYpTe&-?OlPXoH0-esjx^IUcpahwAp8@Dy>G*
zP4@NVY_sm+cdfI)I)E={fuYlrtvi_w>B;GP*>FM^VO6+wZDCjd{re1``+S*~=~*S(
zA^NKoJ|D(=p~#B0)(dSiQ@NL+&pEDmNar51lKM0dMuy@O)@`Wwo#P|rnM$Mb9*9vN
z@ro8jY*@(VGiWO_K{uO9)c}$nuk@M9CXF`8rsrX)ZhAgct$1!0MIYtYN`FbuLUKDj
z7m+!%z}432Dd!F1Diw;6^QGIxybsO3FSY#_b&F#3G0HhBFam(co$o2+1A&{j%F5=E
zFs6NrLU6}Uxp!G$+h5Yft)g@Vp|SnDN$HK7WbE*M%0}=;Z!~#lNi?}UAohZT^&-_Z
z=6&88bBY-%h?@6R)|B<um~X_efiTmL*K5rm&`7lIn|d@ks|z#3U8seF7i&hN92IWh
zKfklcoY5Bx9?%|ooTBE8qw;S2jCbSy0+-hG&+-<`i;od{j*32Nz7TbH+Pj43P4ex*
zc;f@Ey5)E6OH9^{Y4@VIcE!gtW6^V4k1#v%aKr`&c-w9NwPc&K3PQ^6N42%nddMrZ
zn58wZDTvjfm;$_TWAfvEDJBG1aYO;^F*?CbgW{+Xj1Hg7WF2EjS3wwHw*JI>jTs75
zd;pVHQ`Y%-AResPT{Ze%6sEJiW{A19Eh{whc-&iLBX+m@f}@w0WZpppcek0bP9N;s
z5OYaqQN|sH#{+JdTm&y(K2Nu~seG$IcfW4VKtpt3S(O8|<x?WfAH+T3U|D>Myaew&
z8lP+gT`+;*;!2piKj(#*jvfZGHSW%ky(>5LW&fjKkTpvao3uNtVM7PoqzU<SXt(f1
z@EB-52d{m(dEt2OolvsEkw#JvI(Mb7z_p`9ikL4(l)cC$iJXB*Fy4bw)PcRxcT2q7
z=vx+_X!Na!kG9Sm(ocjpcoge81Jd|(o|~;y95RoGh9AgypB~CW8aueo>BtY6yBzZj
zt*L`tc;2Q@fj`$e#-VFg-xvQzsBEX!^ekCMdU$-M-5tNwNSDOVGSb81V~j%uiSI^)
zPyROwM9f{rPG9=BQhmcmg=xXQ>Yh&26oO&K&g%3URccRW71{ZTdyV&w8}A-9cIImv
zJ}k^ErJ=;FG!hzaXX=df-1uxGJt97pF3*v^M;nKRXw756k={;M8+-2}dKr<aLNk^q
zi<n*7hMp0bGD(e7sSihF#$`(uQBuoj+J^UvmU}Qz$rO-*sGT!S(V7crHX;hXrx;?U
zKt3Ub18MfaeV}Wo6$nB&p0ifRWix2a-&Z_u$B@B=F_)R9HLq~K^f%zIRt>NmG_cjm
ze@9f(YBh&3jFU1~awl+}D#DgfMP7fqzle__BQs?bnV^akW{dn)715f9Ih~E5nD2z4
zgsUpFX2&uVy<-Fk-|S?kiiubQ3vC(8oq4>B+ROHQb_yFBa+pk%BqOJVlL>B`6O3gu
z4<G*{$B2>*)_JLLfGg$H=vTrH!tX2}TVAm@H7n2h{S;yRY*BItr(Hb*txambjK8iI
zvO7Txm5r$fTybnj3l8*Dml%n8z11bI2G%x~nt9CV^R4iuX8WvF<!Y!+LKryq(q9uQ
zKk6V{^|v_oV&=G)$l*Te6KO+K*Sq-iI-fEgZlE)(?9TLkOmclK^)2%pX`~C|T*mNo
zX)0NSh}s=TENm~|@R%l){MrubF)^M?y!%yeMTe|mZ>YZRl)jA8Bd$y-4J>fJ_DNma
z|MW&VrN`+~#60bYuu;N>k89+GS&6a*{>sPCM0tVHnsu7(oFEOb5OQw}n5!LiWA<E5
z7N^H@uP2<TBcsfNcIc@;l=|cjqH+HL@QQ&<6*CYqHE)*NeI;(0FB^w!n3w2cx?WVe
zloKpg8b?pk`U3&PUoI3TdOi!9iXdgzu*_m;2${n=FQR7hThRc?=?+N~g`U;ZN}8kK
z;;acG)UjGxT_~&q2Rkf)Sbme3EG^cE;R5<m4)Z6dnK?~2o4qpLWV6$9F7>!tS(So1
zE(KxYdNR^r`+wUm2e8>^`~QVE=|H#r4ZN~CK2#S)#t|C^X{)v9c0QXanY>=H&6@Xj
z7Ay6$Qh^Sd0nVZ2N-Hq`X1Nc6*Kx?_hS8kXp_HCy{fvFYy0>wHOP*i|j1YHe!|7}=
z{dN{Xai|>5AjlPCunsd{jtWbA5dMhrVRLKlE@!)d>x`JNG%@Zt0yby2TH+<5QFhGV
z;J^As>VS0<15r9kc;ZE+0nUYfabyLb7?#M{*!A4v#^j<6y<#|3?F|l#m)UJm_b#LF
zyk!Sdp%09{kt>F@BLBEL8r#EEY(+E6l_3K2<!v4MBOx=~UXbPce!(r1$WBAiZY{^e
zNeD@sPXK_%5x#Kspzqh^zK>Ghv-iy}TQ?3WQ_)|ByS(Xq;P&@a@&pzIvD6$N3l?NZ
zp(JOJqmu>1gZ>S&H)`C!hc&IKXshAcSuBZS!dF<!o?yt0o8+62AO2yY6edsctU$UX
zOgUe)vpwMXmoXV{w#?dr!cBm~shrgjtt#~?-FyJi${ICINlJfHtdG|8BZ^v&>=W>}
zm2-crw9+SA-*$2qO3n(!2-u!~ADQPuX9!d2O4P+tlfE{ZiP!Z-jj2ani86JcWDPkJ
zv`iKp6`+^ssTl!fvyyZx&!gmw(&P+pW=zy9Ix1=nA4mEOuRQeREYNRw<E)Z=v~;S!
zL4r9KcLGhNYQ#q*{xzja@10(vs+zCF*?!MhvnIP-&?6hs%cv{Oks_f<Y9Ry`C4=wm
zpfmxLeNY;;w@lA&cxZ>x?BYy>`$rH3=qvT)yaqP?+Nim!#{5|BMdq*q@vym%$9yH6
z$dU+wS<3&l*0fh`+gio(gY?X9ZxtoSxz?RzWW~rn`bAG4u3YeVe7J5#9y1>6VjYg5
zcS(;QCZsmfAlE=!QN>RVnFqrxdv(M-9Kxz3Iqy%X<3G@v-W&?t%muBA`g5HJI}}b`
z-z7443=)GzqUC9dAdGLW50!P)b8F`3&@bKT<Y`aEy!(tdv<wEm&**g<^*YSW<r>A4
zPYLa*QTgqM3+Q)=`Hb*Rr+PU)&=XFiNqO$brqO1rbba<YHv8;@U!z>}+1VkiU&I81
z?b`Rej8khW1;SYFXiZzdCZlhL)}*VKh}QJq>Sd<Z^n3Mkjn>pcRim#~Yr31dT$aNz
z_1&U1{ZM_c)0&`DE~R*nnnR+-7EX8}Kfo`jo7^UFP<`#`^JoK&+S|jImuOFm_dqR`
zTt6<`_-tR;>`Tiw2y0JQ3Z!e(Nm6K=?kEN!*wMEvg$EQxNMGizQ12%3cuKe<!{0&@
z408iMo=Y8jwH9V4Wc!XZy`?oN8K!wJ%cg7LapP25pETPKo*Aw@C4PqX1SU!I)>^mS
zquOS$Zr$DzvOD<=2klj_h#pUkI*iTcQmy%32!5z%Q?=F<fi%ceyqZzOYdwd`LS@Cn
zi=Hl%uY(53`YWL1rmTQd51uY!l<|vOl&Bb48*Z6fdPl6TL3TH`@@wUATnyIlvS!?s
z9pQZ=Xk)2>EmKgBep^p1*cDP8r>_A5osky#Rv&R^)^lcI7O;&Ylp^NG&9;`jnzai(
z4OXDH1#anw)mq-BeRni<RfS;tgIm|%K>^UDi6elezFTW*Cu2Q8Qn^3pY4k0P-(>VH
z*P2#ww5?BMKfNgBRyv914!)#9f6PQ!{M^K46@D>XR<t8iWbcFv_F+K6ZsD}$YPv&r
zFrkI2PeYOf#QU{YVM_s4JfyTFp})yCi!{A`-@Tz!6l3zXt5R3(mg~KR0@7PEb)ofO
zhbnPpw(#(GGSR4cX+LsUuiTjhsMhoztWG3#LqL|ogSl-cKY4Ku$muog5dmUoJtV>9
zw8n9(x4IetV)H(<aSpy`sstU1mSL!{#VbvXQHw0t5-+ULp1!;<a~hO{hhOClsj1_=
zAYxwLH&Cz`f^(l2LmHX4m*x}0oL1ctv#r^_uTZUYW_ZYWyEha(7Sd)P14ZLv_mp~c
zC#$9R?m4x4;xoVkwXnUjxqCGxPq>fCwM<(S>eBl$embe?NOe^Y=DWAFfbd&0&kLUG
zsb*<G@Pc))JJ^wt=6AHFqtMCbw$^f{ANN+ewWf>^Y<nx)q{W?njYMK3H<jr`D2s=`
zgvN$~heA*PS|Fy)J|s<sg7$-FHFhqLG1l$0>Q3jGjQj}#p*1a~0<5&z8|G3gEMheq
zdI-$V-w-AHmn@_`bxg18p;nvipD3)N>=0&JZq~G5lFpm3g>BdeAV~>+!w!YaqmA#e
zQm*)^5m4+D8f~Ca+y5py0onVI7JHY%d^Lx$*+SQ-LVp`vNYR1n%3#8)7DuFg$kH?5
zkw6d9BqZ#4aEay3i)*cD!5|CVWu)JBGV|jnw+3>Vsg-XqLOnB-DeEdbOf&Oi=91Et
zk+R-!Suf2LB~DUz&t?}YW^v}2I-OCQiPr3mG#JkZx&9Gzr{#R466U4+79{+t(0W<7
zZ0+MAIZ-ixtxa%x*$>{Ln@2(>(o$rtLv3QEi?Y;*J0*LEwSBSLB(XXRE2l|HTOn88
ziyWKU6*L!hA7kdtJ*zjUk!Q|U4{q!kQ8iZ3u+%7@82d{A%Ngc2s!>OP*4(plf{ZnO
znln~`PIjzUQz{Erv1FMOdQv_zR0m}uPyo1S>$&I9OoB9WGH@t6rP5`5l_S^ai^k^|
zeT(BW)-R!UusvR)4r;U+TJsoHXv6;DX^l6m^1bR?VuT#tvcyH{o;=zyw)xT@@WNS>
z-X|GClIlZ7<wc28c&yC-x~fv3^3zXILOxbxKYp$M<EL8smwaqp#7O9k^Y@=6DYVu}
z8j=(u>m=in6vCR)-*R$pCnpsOI0?CJ=gq4%&EZXs%q41p)Y>rl?KzTb?YyiXl<B<?
zR)%-%oW$87ha9R&D+(mrR1OKzVxoSRWLmT}siLO^n5k9zE|s^JypVZVx(ugxsPRgJ
z=Y||YIH*B5Gxm4#k5a+dR?xeL?Jz(67)i7N^HW6)s@*W{O1>e*=qMEIKn>J4G5)pn
zvWHl;iR*=P;ANCT=U}_DQa8}3H-q)xwt`HQ-@MEWS%kvOR1*1_i<m?>Ij=<qx>SDV
z%a0y0-;`;{du`?<K_2M&65;k7{!O(lJfGt5nx|m>7OtG9c*L5=vc|_kVp77OiZnQL
zr;x9om6nU_*|<qb$XSO`WkH6FgLJz=_+;for(7m&|H}WOc+%4-ry(TzY}<bmIa7x$
z9}AJXlU!NJ^3Zx%31$0U$yddcE6FIU^Akxi5S2^7!=hyv2d|s8L=1K=*Q{0C3p$ro
zT=6W>wLczmTEMRbRtfIfu=lMfp}!-;@?03_B3Ih}*?(bRhz{o&(|(Gy;fkZD+-dy|
z0gueB!pZ%m(_O@<GXE}#Ax=UB&lB!*P@tc1PphY{M?_$Q&?LkFUuW#7%t=BF_Ufqz
ze4*5=AuNAKIJuxGmRwL!|H<$5)U+#lC|!1JO~L7MRB<ltNPL1947zuhGIU&1P}Pzr
zZcJQmed3G(5?U$3Z?y;=BK)Ezs711I?Bj79eS9SZ8Ihww7R>bA43aw{$5LR;y`mW{
z5Y7ul#jAhjj!gE098*(y%5?-5X)SqJ7ufB=j%A;%371~G1(qxzhMd=C&eoo|E-$P-
z(H0JFTyaXMj1#Esid3vX+(7gG60m+!N*5TquPJP5OFU;@UW620sg_#AmU8p*0>pdX
zILexrLYI_QTx8QQ6u$c#?94@_)h>#e*A|giiF#!zLRGmGm@HHjL%)uSZnCg{g?xXZ
zc(X8%C)Nllo0M#&yQsv$xHLxpl+?>!jHMoxk?5%_$HmIFgnHb0@u3YveQUzQ-pY(1
znIHEx3=M?VguQRIGzzdXg<I6qC6>YHI$;(PU75=SH?JHA9DWf>RR@f|F)O?@lbRmL
z6mdB}X2l3v0eL^y1}b;}{oFE)S5s<z*l{mxb@VT?faqUJ(7&(=?ne*v78aXK&Iu!6
z{SKaud+D5~#rcOo=96`!wGHHTi9Puvuo14zlJ&(rtQ*Iv>)2mNo-~3aKJG{_1*Z#|
zpL)O^4*!tyw0<Iuib5*bh5qZR?XvqlyD6wAzoY7!o=qyndLFPTOH)n{hq%F`t%Nr<
zD`3?^53)KrC0UCiU+Ful#jITPTDz^4G;U0~tq`CZM~){Zb$YJlofI6*9LTC;PJ4|S
zPL?!fBF2$piIX}#=k}KzPsz;l#*w25q6dISogQEIn^|3ud9vRom+@w0U{r+|<ld-Y
znUmL{G}TOW%Et^_RDptg=0Pip<iPEFAGD!ZYyt9M2-By4FStQ&XY+FGo0%vqz+Yw9
zRh3#34qmR1dt21KU(_AOA<wdOqir1%iBtrRMq7LgwI)EwMZr$nf6sq9`|n*@7xrZU
z&elIYo4HwKUU`}*9)+@4RcC<S4;CbEDhgLEDh+7g{;nz!E<Lkye(9O<^D1le;*+%}
zDzzu{yx^e~{<594dGR;~)G(|d>V7_2wk`3QNF<ddiRbjx<>S{Mr-25qH|pM`zL{4R
zG^T$8?U!qcg7~RM8gELj5eg7##<mtfLNX_}o+OW=)&k^^jHh)ZspREF;bgrx<4)e>
z)l(1ppmgg+5QEGqOU$Zqt5LFQ&8?i!qJqH4P`2E_#1;kwrgQJ&XWWv{K>YSM3;ssK
zuGy*ZIX;{qLX{=)DV5jf#n08A7^yuG$_wsVF$R+GwQ->}?vVTWkT*|qYuwwgECTlJ
z`IQ&~!tHo#+^<H<_9vbMZjB$w)MTVw`g~M?l>bq2e7L<cG4@GkYEL>-d(xTOlQOkf
z*^7Xi!TM&UR-N<d2ALM-lUjWe|Bd$iXxa0~cA&;G3|~c~69aSD#afqhZZ=R{&`o*4
zW#bMgn#~E~`05VW=$eN@#&+A<MHe`{SUwR&%%97y<A{2S6bhl>i~_AG0WPc$fQD8d
zhHpq0glZ5Xek=L9`9o))c7<A15l=nqgP!6!G1l`Ujf71&Uamh>;eV3CsM?<Xh>#lg
zP@EG@l@$$cll|Y#5Rz&L2W)rGx4S5uuQea$(c^iNqb1L|V0}tx3_$p-L~h4t6eK;r
z2HVXU-lXT}>ZK^@`LVpbgc)SPzuPwaNx(Slc>q({XS8+USw0+ooAi~}BfV_Qyh)4&
zzBe8goPXeCimVBbIc<7NQ{K{<s(?rrfks<s#RI1xajj_@BWI?RXh6$jcV=)>_nZbT
zJ79ZdO2t0johdyi3zHmYAC!-7#vB?A8kb=`mpBtRtou+3zKYzA{Bt#BE&uyDty;!Y
z0q{N&|4K&@9se@ZW~C!Hrp*(bQDW430B&1D!TV0nWn_^l=d9?557@Z7HTuXA7Rjxs
zX=C8TWXXxi^1;bes5aCp=*SJ%*M)9Z%{d^-KA+gp&>RZlm3_(|0mr2NthRvovtWSK
zSW9CE?1qIrFfT&m_9NO7SBnGTJdTh4krj{z9Q{MfrE_D;rE`OG(t}6$Lx8PD#|4ub
zofP3tR)z;%b%vMCbH;~*s58EBUW*J6J77hx*)=(PFG@^SUohrri{FRh@u%P=2EXyU
zbkoRz^%kSjm6)%arUTgS_$fveF1Xf;EwZ^xX~9|!=fS%(pZ*f_29<aRL5332s5Na+
z{uK3Y<YqooI-5?xN*P#VT8OJv?34#DT~9a2YL)G@4sBMw&yivz-*=MIjP;uHE{nr?
zyjTt-j^eS#dI5us{EpkmGEFI9{aFg9?yr5yK?BcuQoL&Bf%r+fsVU1OnXSi4N;zXS
z;KpWYHrRm8lJn&r^`$c)yysIQ#wt!12GcpV)3f=`1wg;QmLO6{>Q9ZCBV)nc@eA}M
z8|)eDd=MQ6v^d^r&shIKB4k`5zRoGnB5*Sn+yyzggl!<oF>wxneZ`>MY1jI@%oZhy
z@(67%zV!eHP)R>8Gs60t`u<285Xh9R7xvs*GfEhmlqq@KYzm)iUCUmh8K=M<C-Wi4
zk947B6Mn?$b=x+WPJ7aS{i}07g$!dBpGgC9=~qm=6!MMYQDn%K(d6`xAhN(f-E}CL
zM7f^A$9R56?|QQFF~(rr;&XL|#InWJ*(h{U-nKM~pgUtrW3N1@Q2V~BAVk;UnmQOI
zdKyD=pa4$hf6}2diQlNt$tT<REcV8DK6>K7Q%@Qy%T)8X{tVB*)~T_Ky3Qgp*8%$p
zHE!GQ{VjC5_!3%>i^0RBfEW8GLENmo4PA1iOoEm>nehs<Sd-4oUAF&4Rdy>|?G$*o
z1FWR&e?{^P;)EpKIA)i2C}s)%WrHfKZe+7kQ+A!d=`4_R=uPQ9YYKSVzbuLdoeiJ{
zm|VFaF{71&ZysyYMp@lix|4dsN!2>3$DPz-C-oC2wbV&{*Ga8(QV*(>*`NR_&EDl?
zJSG__&r477P`vLv@}E}c+D>a6KxLIoStX^FleSKi^KvwG42#?x(>%mFjf!hIu`PID
zXH8xksjBBzF<vGzXHq<6g46z$EgK(8E7L%FJ=hl?VO)mGw3HY=u&O^({Pb3<ji>>#
zx;dsg3s>16))Gxv$@oGj;h)v=%=ir_zo&){#5P=4%e$VEE-N%#Ml1^-pJEo53DuA_
zKKN_Z!gz!kPQM~Ky8J!lW!Jb>>ax&VVMY3Pu(L0G$^j*3I<I_Ca5>SM{#`+}W}k&`
z2?JlS&$xe-D{+>#ZXUAH)A%Kh5kKpVfrba5O`Kgd2eO<#j>eg#+PWH_5`^(RUOq`l
zi`Gd<4WQ2u!fE+3)1(BuM~JKTM1ePRt~m>v_(&k6=BeWJ5FQEnIE=`651R?jhl+8c
zn?%0YsX%ryTYip;59PpC<dxznzZ0RvEua8oV>oa%a+IywyT5WW2~frbb&kH|>RRi7
zAz%F3FBJ_@y8HAFR%+We=Y8V{dC#unZ6dpKe@;BC5o&8}wJv&HvbI{+szYk4b$Ryr
zin_Jms(MU|jq)}eW0#-z1tNvj8bi*Pv320a|N62I22+QD;w-3yq<dLf84Z9rD3rl-
zzWr>jW_obV6X>Ba?QS_6&6lCtsp2}`t)I_Sxa5_|Uo9EM*8nKuBMH1x#hpB?2LTRU
z-9Y-22<c~JZmDrURYj)#j7J87_r(bq(+Z_K2^?2^T%+wNPG_1JA9sfc5@P$`C12(=
zptw<URs2I3bWrh<ocMUie#F=?UkRIs)S6i5vnFeeY10v@^Ry=6LOVSoU-RM$w@jMI
zD+W)^&kJ&!#f#|4_TT-OBn}9sl>>3D31pG4m#VLG)Ym?RhcOd9zxeTDmaPO$<0IG_
zI9fe;eA!a#7JSt7s=`Em=3U9SnUmc1`&9isR#-kJ3+?A<dH)FMx91nq4LY*o=T-V$
z(y`zt2~R9&#s3;JKapuq)}3d0f1j9K$ezgjge5V4NfW8!MLeu^Y<jX9oUCt3)^EsK
z8^NDNbD-nn{3V$<v(q!K&jE__p%<zWf^Ky{A9&jSu|F5IWC@n$ET5_eSw6{P?M~N2
zs<w%R49k|6t|cYr<DyVX&r+YZWwk_Mb7Q(na{BkyzvY8+TdisUO??$VKpL@5cIqK&
zT#q0vb{@O1@fd+t%h>2M`c7H)F`+^9N3eLr#<I;Tb`1g~sKg02hA7eI&;uv#*f)5H
zTA-=4TKYU>JqG4h^f)9`Yx*z`Me>zy>!CY^)Pgc1ph?Cz$pFENjcGgfDO{S*herD-
zBi5RPoa(9b-a(HL`s*mSh+&>b{wN)8mmora-$fUA;%UvJD2T%0Ln)|YDb*)0Oapmr
z(ro{TN6AGy_a6P6Lknlpf)k4HXEeap_YYXX2-*d#%2xrRIQ2ev5uFKC`ljAHQ!+M^
zK@)p{T4+53VtBF0U*Wx@Wt+LYB<3MkC)PHY;V)}<-(K3K`dX?hmx1lp7*#Y8!hb!R
zQ|RPy;Q3FJZd!dX=FHf7x1K9@_y(3TXSCxCH!012J~KWz(<yh0WMzZKjlqC2>tv2?
z8i(I(6HQ;Zw0h0(P>Z*|sv<tp-l$?EbmTW4{uKBwdq>n#)zvNkU0T5sTRZ0nD3oQ^
zT$HWmPKf|0;IsV&KwLM!t588i{ZfuQF_;o$aSW#J#9(T9W!9C-;lbcB6-2F@001}=
zAMGS(JMb81O#8!YU<d-EAcwVtJ?8|(xK%c!h>PH8@f%1u**F!7H7edk2Iuxq84*ju
zQOF_0OQCaA5AfMp+NX5Z1Q>MO%0ck8&LYdSBEW1zE$P%Zx>%3#tUq?O@CCG-@QT*v
zPT37f&mu1?=5evv&F#tJOC=TDwLHS+BH+~(y>@-)blWv7oLuJS?E=@ZEz_q+YG$})
z*$g(*B&lF*tR>(=uhWb~>Dp`-e~R9YJM(zyty<I9Wp9X8r6Q%GREyOGo^+vcBJNm0
zjr*Od5-nB|+^VI%qh>JeB`T}Y3ohL%0|g9=P5&>**HbMrTIi<xg`{8Nx*;Vl59z5n
z&VU<ky`bTQL6;93G~mK74z}C$&y-e-PH*tJRV|qz=D3SVV<g<X_rX<|E0x;u#qu~F
zza`WYaplEtkcXG+GP9@@`}Uux9Td^)KGIXgqo}HkCv|f(-kIVNs^guhyU!(<RRLB%
z5m#tUgjv-1S|Y^c`}D_BTWh)lGG|AM?9QmYIcjY329K<2ikR<4O_U$go*p9On;Ntw
zIMUSM@%XTYSkT*$ZU$T-c7oV|cpH27v~mMvpW1D-e+Eg{!WiHG{Sg7ZrM69tKv7qG
z&Uk0cLA3vR^4uV?AQFYrWOZhk(dSNh<Q?5#Ea=M`g4Se*xe)}m!@;6Vu_~^276fJB
zFcq~Sdz0RH1blF5-_^-8iw~eCwEh21RU+K5rvyLQQvqzlQGh${iTysIIX&87UtYN~
zGN)}uzghvK^D%d2a8Em|h3o0jk#r{GDOGA>iNA<m%xOQNXgKw#1-gfWuZPS`NSnDo
z6x^SH3+umYk$Y^BQ*zvd<CFST{Y&6f9N^N@IR}#pOtIZM`<?zFoKxkQNVoS+kV8`7
z9Zvni8Nj&V<cGMq)@B|J1&=1E{0|55RWXtRvU6eQ)ELBvl3h`Hn=Gs_{fP_2hl^1>
z%8|k-cG&*w)F^(Q9YwPoHRdOb;?q#@Q&9~3!%<{;!9jOo%8!<%5W{>9jrT>dN#p@#
z+KC_dHtWtW4#w9%m}h<@Aju7;4}GvRn9oAN&k|3{U|0>Yz;c$PT9{xb%-8^rCju`a
zY*VxItea8eu1($S=8O*n$9b^Ve&9B}?h|Oy%VPSg45?|W=zwzm@>#QRk&;7Wh}{WW
zR%#p>wQ355{~(1a<rplFXN)jiKXNiZw$A)-W#jxE(%3kE;<7t3-*bemeNZFEW2jn2
ztutD28_M}L<n&p%ddi}`T<V^hpSY|yR3iH#evw&Kb|2=t51wcJ74bzkukne4W|wu+
z5-yE96Ph`rq^a#b&DeL07}}XaV^&E33kBq4pV&;xU9RYIlE_vAoN!LwkTV3Me>8C@
zW71z|uUWUV4cYS^=zS(2{@c|I0)O<a)-<}O-*3?`b~tSVN}K_hD<5igwkYW1K|-Jg
zJ9TBA^(rvHk1-@y?`joR!_;W02D*&Zy#;V*W8->-F?F9SzW54r)V`kSn4{lBug@Vs
zt>ya#^4%=jr<SOKOa8pXN!CRSHWciPPqepiG?!*DgZUtF3PrfJv&J|dLt0pF`zNC#
z%AkR!@i%GqsK{j<>81QSixdRd(yA6d?yMCEK@?x{L|-Ti2Hz^4=&Epf7}W-^Uv}O?
zdr%?IeG}r-Q?WN{9yL~b^Acz3bz2;oxJAb-08#&IpRkgtqAooNYd`4+>M%Hy`(LBe
zXB;VA)vZo%XTj9!F$f38=M#gfLx*oQN;g3vGkXW0>k<Q2hVXPLP(_T|_67@v0ZbVo
zM!3nj-<u~33E``wM<EEy|14x!?CCpvqW^oIO242I$kQhZj^VgHC5G7k3MsG3>?EkC
z!lMCt0P29u%C^&UgH(2Rvq`#8uYLN@q*!f7XY0U79LNKD-OFN0LYvcW&hSi(wqE5J
z;{Mc%6BN?ndo~bH2ooON4R3W`9t}s0RmZ@^0>XOTw|+9!tRo@}IRs6!?%qAf8lYAg
zv{|r}qPE%UR85?hJ(>QCfk6aE3s&FrC)D#_8>ripDUK%RA9H1fSabPA?c!28xBX{Q
zDPw%uqKL9U%~L_2$#JtkXP-b~FSO-#(b;~+i6>lCN*`%WBgiBWdVOF+0;{&~e*so1
zhU@<(7D1_py66V|);FHbT~%1UyVOlv=HC851Q1^*zyL>~y*d_rgV1@L4BE_gIE!7K
zCq^kC9zlNqf(il<oFPF4yt)cNknwSaE>Q=Db7l&iEWlxP1c3#nx6D7&{$Iou_=<BA
zrulPG1@^Ok;txD1s=&)+;pp}b4^UKV>Q*n954Z6mQ3YzOMNB;#RiGK}+KDQ#cyLsK
zg>oW__-lzRra1O5vCbEONmK!0D6IggWJ%^hYcwzLXj5ruAfy0|aT|e6g5!ITYfSi>
zE#cE`fHDwK;6)5*Xg5(|ZR0IWM1iw0gPgpjP?Z{IJwa}NK!M+>#3?d@i=>_tP@sD7
ziRVPdD2EoYl`8w4A0|5<57sXj1N2J#92_}0BJ;;1uA3MDeW4y#LCkzMPTbyVZ%y4C
ztd?T#X9-smoA_+Bt^?xeQ=va}ukN1Z?FqTHcoEmCZbEwLkHp+vv5IGi$>|&y=lvcc
z$QUN$aL73L@T`>twH)H5B$mN6Qk@9VI#}90=3(<=oXsBOOxh)T@M7jG5u6q)_f=r4
z^mY>0Dqy}8HoJsBdHQ=SIHU(y3_3!U-T=Xjdxw({9rEyC5_wkQzHD6f;U@s$3;zcB
zM;QBY+!<9W&O6>3{uBe(?<KLaT{YVD=WdIcr%giV>Z%Dow;W5j#y4FDYEnN%MQ?|;
zxFt7nfbe^z5<$`nJbZN3Z;P|IguC4UAx9m8U~-xDigjG%rCB9<-GQF=hoE>*p~viW
z4W$cpWFuaQ%+u3e9WS<irM^wzTjtFQyQdxJ)8zf$o_3$slq6G@$av$po^&T?m2m#^
zjX)4aS3VrT@09bz1=d-A6g*H47x59+7$>z*oGpgK4xceiQ9w5IR_i~Oai9~fh2FKM
z6wPyBz-17o25YN4Ix%OI+FiI+G=K2mm@pQZJFFkpQK~O<ozWd&1nJ9IbqN<X(Kvn_
z*H?1~KDNmBQ;|)HR_Mqx-N-XV8#9IMrRQH^o*{1_J{m*G9cX&;t;jc-6{JLK`bh8>
z<^{{6@|L{JDWcitFe5w>Ma|9DsjBPXF|BzsCAB9++r}DzfJ+8&!@2ixmVVHBqsK7%
zyvwf9p4c5-pO^hd@Umygu3k1??|s>LqcA=sR@Sa3eFVQDHdWNvcUiPOJtR@(BnnBm
z<0I?q>({Q8i!Y)#N{q!%#SVE`%Sf>a;&!#CLp#0NC58AeO02xoT(0HiQa*VVr{PsT
z>Q(dH!~grJ&%@$>l!sUKCH7=~koCvWI!5YR2Q~O{s_?Q$QmPV9OA-g<r!TSVKtoZf
zD?OLR`24;LNbousJ-?-6T$FVYc>yjreKO#M@qFCSngjtJuhyDH%lUXdhksXq$RcU(
z28h;?$E$-{h1RO2atolFArxlZVDGfVV<T+N#47tb9~@#|A=eHwy*VAIT2_Qd7jd^9
zO57|J4kE|P!7)`5@2JFaE)q%XA;D8mU3k2gx4J!g`w@?|k=(Gk2MTt2&7FH|WA4*l
z%M@ZMvStrV+nO2P(ubx#l<;U9?kOp5T&;qcBu=F_Z`{wQh&ks%08rjTTDUza<J9cg
zUhN5GT9?!^qlBL|_W5w!8alJYxZNw^Nd}$t4vWJXKeyC}A+~oOA%q<bO6WT0fUec+
z+6jBo8QBL?+Q|iP%Ly>XI*j=QKAe@-v%EN)J-r#deud4^)$$wOf}Z0@J(}?d?`V&4
z0Kq%$tro%_w%Z=#T|zZ|_fX(&<c>RgYS)CPcppc(xP-EeN9bquy`!xk(J~z@RUOE|
zk-nMFVe>ul$i0-;$FbMANLq(RJ{w-MWJ)DEM9M|-KM3u@$o{GA;g-7=V&XFjJRWX#
z^zM2*FaEgk*72BmFtae5e&pFqD2Uzu^gR%aCWv6n3CMb?)r*NlHeyJT8Ust^O7DXu
zf!n}rTw-JGL}XxEMNBJZ?wMsasVPBr%d2w<g6oA^hY6B|%fa_16k4t|vGSpzOSnY(
zClWH9Z}SYbjL6jq5i~C3ekGc^HZPJ|*c)yMmk*6JeGtDjSAYhpXdr$S7H%~y!*bcw
z(d~^?>60o|p$24$^K&1mbBWX$N1ZVPb({)^s48_X$t??(<*#Cr2s<}LY4C0T=@4ka
z{1#xW*Ufts&!(1Dyi+K+OZ(0@c|}E<_Z?UP_nUOuC#x%yZqS-8<RhcW*P6bIxWsxD
zhZ-&&CTf;)Z$ZY>u&CU7BwDu#1y7CnVbr}vPev>itbnMfsF3BZQWQl~$7)UQ%ljpp
z;>F6a6a`Uw8#(ZAmTq@(Gq8MgG!@B{0AslBY|hU-$i+bV*A!u9YDh9O*t}Yqn&a?E
zBiT6yTh!?>%=WKmN#M`ws~&hYehc$D``flXcv5<NY{LV!!{VohTPEgOUK6Qp2~QcC
z2}XmjC5FrAglCI;Sf&hwae7kG0Dr<=kbI=o=b8y)qREc;bn!}C7|X_jcUjs)MQno%
zyJP^4)egM!GeZRyYWiXGtw`Cs4G%2DTIpFJE1Iq*x$DMuv&Y?#@X}oR&rDw3G-Nd6
zaKY-)jBeRU6tFjHPq?R7{?)bgDgp?-tvxY(y7m;7NTitg$yN^r5}mGdsBLVu(+OI&
z+lWB!6^A$Xp3H*5W7F{$vpZVAYvXYKs*!8lIhaUpcuJLV*q!)7?j_Pv*`CbFz^C_>
zEQIQITld`oRz=>9nRm?zmA&??g=uY#xkb3rirwlj8Av31^t#8IgdXe@Hk$kYW-4`A
zjSO0b`wWN^?BH4!q4cgM+rA<TNP<3fM%-^FSC#AOf2B<G?hUdz<HZ=|pYjh8a-l-V
z+XfJli&hu+yx`>dWY&j*o8nv+yOAgJ1@qFvuYi{eVOEX{VvYqd`J)NG#85sLr2m6%
z1vmfBGY73KZtih#6Nn=lZqCml=g*lTa~)y(Ph;Y8eey#JfS?X@0}eGApGVT5nq7U>
zygfwq=1*~~i9n^CeITg1Ci3#2WL0iOTjrKul8Ffx`}*rA@Uc2Mb1_S$cW#uk00QW?
zcH9nb2>|JR2)(PGPRSJI@(w<vVv$W0pn%s4wTFbc$xO)gB=n&luZyrF2c!-N9n@w4
z1r2I~pT)gV__Lq<lI1;e9M#9GSle80`$rmb;Cd3LS~D@ya84p?zIugHyV4<av_{`u
zi30QW%>RHNx9}-_E}7^U##$AmIAe+is{R-g2RS2+O||_OdN<vejh72sfGR=`%7If7
zsXrvg+xvRmA;Xrl@im&L*o%|%|L~GM8?n7`RqU0s@loD_)870@&PGIIP~g3o*((7I
zW2tFxk&TlWyujPF#4_w<L&gGL<Bh!d9sC`S#y&Y3wI8;D1*5DLv`!~;R3~yiX0C(H
z_&a-Nt*Y7+4xkqqiNQX%X?z(?Z2}+ot?~WCvMN*?>=(Yzf-H$GtolyF@@E{f@ND8W
z%Q!$boxgrC5N_A;7k9X@jjEE2#+vO^%DBzYX@HY!p3mzAqv9Zc0BtUT_LT4RwN4`s
zP%{?>Y$)%HYO1iIC+QfJ6G)a*=|#&sl^NqvFJWEfZ+}Qsv(0+&$nqj<n$({l5P3@Z
zw|{}*Y2N){?922^#6V;~<}1}}h)0a&`is?Tw%c2+s_VhA%g_ci?_K>~wy}P#ah8Qr
zbIaLWtG`W``a@|sxXxA7E+NSL9f1xWa@X421!WNJx$==-D%{s%G!+ewlQeX05r(Wh
zYWw}8W2ENu|6FU_FVO1DZ_D{dKPGly=UTJK$TGisp3eD4KO$x)k+p;Tqc_06ilUMj
zmesH=^Hw8gH2)SrDOptpoAUd1PzKH8WEj2p#8_P$1<$3RSSlO)ka-SyYVK^St#LPX
z%K@K}$hs66N|8`cHPK?vmfGW`_81j&cB2HERX0BpZ1xB3iY=H<#MpDKA28PJu+QMt
zaqB*D*dgNox*4{3ipi~+;6Z0(4SUY<>{h-(S>JAaO9@yb93igVp(kB{otsdB-D2_R
z{vBWBf@t5=+7%~7wWl_*yT0q)cM_p+zu?NvrymS+AwxKh+zTB??yDGxIB<UpR#2W3
zvd=fN`P;J3HQ8sJ9>tM+qV!CMM&Basd&^n;oI7?%YpNuvoVZ_L9gIGlxaCgJ=);M7
zoO-z?9#;<BFRE0|fg6`-3gN*02dbsTaXIV2E%#ao9FFhynfPntTlLQH<tP0Z$FjLp
za*5k^y2s7Y3Es_3@8=DF?e#kyEco-+Xzm5_LcN=nv$lu&9}LG+8&^=XQ)$?cHN?G>
z5<UQ+HQ{s#6E4oesskNo;bl&9={M={b1e<jjGu+S)|GuQV{LLpt=E_xmN+qsYa+Ht
zv?oRdF8-R(n#=o0>5^)RP<TOGx{@)Hw^H&#4cw9#+pFaR_bK8HH=f1ka~R0G((_3e
zefUeesbuus{@`w-?+%BRRDRNbqL9&dk7Fk+KGJo{N4n6Kvm@ce^)&icYRw%q)Or@B
zGjr@N)G`uAADs;J7%%9p`m={J0RSNYxPxuPuF4FvyTU}<FGPN()WNc?oF01me%i@7
zN`KJrD80yWl!nv4Z+^j5cqh#%52da;h@1IUnb|q#=nw9zjttMhV>*6-R@eDifPo5P
zozk;8FxVYhK`^~k78C$E?$GAk(pc6J+Da4(eiSY5_lG`TEv>XdEX~dRPSB$rCupC_
z8{`D7(u4h<KfwRlQvT2H6fOIL|MNTeKXU~*`v|AVBFFz(e4_{apJV?Q{?F0^7a@-S
zGrL`nG-tFXB5c4U;qw$M*P4_|04y&bx46sGM_9syFVt}K_QVXq5<wz7!JVN=Q;qho
z$$Ie20oUinZ$cg&*JoB!+@3RDsVe0hx92SgA_{ogQ%4<-=T_T4<$h)dZO7ADXX(pP
z1`-B#3$K%T4dcAPYk(51;`Mwi>-9Wd`TK^I<MVfD*7m2rCG8MQL+l{bz;iy&H>>a6
zgTFTf&r|Ns9|-?1w0$o~0>rD?Sppvki!fhnzJY10^_wC%;9XuQD0d!i>OGtD;yy`~
zDaUmH63dJvH$Se51Tq%)HnFe@drq@U!)1$TwCp{K<b0o*Bc?uo4p?hpJ2-|OQ?A0Y
z&FAnbr&m7fYBd6Hyo9O+S-0tI)pBc|a4g(UD`3ox-_BiO9p+v{)h7PK!)=TnxION8
z3fMd4Z_!xax-GjK5*L{B9!Jnbkxk#69C*fI1%nTwss|JT*6*%z3fqZ4WC#_~E6(TD
z5?nAlT4$i9^T#Hw`<>DPMjW8ekO9X}9cbB^?XP+nvIA(E`I8W1O&p%z{GmFr#o3t|
zh1F5UHeBeOQk<XND=4srU<Pk%%`>_E!FN?1gf(ji`>qP(Aci^S4+N+`D-E!(@m&=L
zV}M&-&;fo#<CXj_j-So%5)rqLu1Nesk@CzVp@zyOiD4X#k}k@$KpA|QhxiSskXWHL
za%Oy>O}!}L4>hdJa~!3`xB3GuT?<W|TH$<foTTN$XPQ!#PF<umT`UD4t{2D?l6sar
zp`oYCb0ynSp2Q>3c*+U1P_R0rJ+Vz4N7nbtV2yeJ8>(9Te;v2zHQTKJnaxbeSsY$7
z0hNW~nbdhN+x*0$YbcssgY>_^)G+sR5-<!ZjD&1%IUm-_2a^$yPNU+rmAmv)oBG|Q
z<<EBZyG!4iYv$Cfw>0=uiv*U8$_HaRw+$H$B&$`<(X`??N7ts$b}9zqAx1GVK84@1
z_ym5><EEnFXt~xbA-rk9n?8<EB2A?~b6)b&5~xj}UYLH<$;wYlU^W5NO8HTa(Y5jx
zi(rV5osEKH`cD+JzWzi%f7Sj!{8hlp#3SjSb00ZycbU7`b7F&Swa!@pG*Ms@khzx{
z4*w79pSc<WhQ){ZqB5B|bp;^qlX6(?{8Iwri9wbSTTtDmUWO}!tzyFfKlv6dI-%h8
z>|gh3SmgB{bMB&1apxQ|vhsn_L*}%Qa;J)P6*k|@N>?RT1I-%&msQ(8y!7`V!Oh((
zmj|brZ=#OAQ#W6anIA>lk0DZBxRxxmt2)|M#G(%os7jPT6+z_r(|ku*`miU=ErF7i
z*v5Pie|u!5Q>=skodbeZ=ydD|OXGnPV#%r2#}ts^bPp7~R<ay5Ypq-;IicQfzA5Ju
zf(1Y|cSZ8&0KVnJhb3gY=&7p|O|JZf1A+}DJO<$o^KEnq%9rH-NnX*`W#tv(2OzIJ
z%+~r}$t!5=`+dE0b}caRCDkJ2EJPX#n-im^WgaB#WV|S9tW?9z8=0BG-8zFJcFMXM
zB-l<Jd(9ozIQkWR1$`&{M(`X={)l0a{chR7l!z1CB!s3LRfP0GM@w=RF9NCTAJh~4
z{Jbo6V!Wwap8%_rEcL&MH-&TcKH0HKo|5ZLkqMUYf7sgoefCMwe<|wB@!smlQ%C;N
zzj0c4{i=9V^U-`r1OgFCvhk*N6SF8{J|l#leOc{<n>vGX$Rur;ucWTLKAgJgjA$;>
z6iU>-p-^uEC=8A?wdS9kJne}SB296jT|_*XcCK*HYu!d6eAbKdLhb1SxmjEsG7fpU
zX_5xbZZ0CVrYo`{N)34;vh-!szs)|^W}lJl^DIYnX`YiERDbNLlk$btzmNk*#h%&*
z*;Qf-+Cp9sTSUdE#Fjs+7h+Gfv-nDM5q4K%Pt8`br+%isBf3oBB@6<D`(rgN(V7>C
ztfXQ!U4Q}y@+YyHdXR4<R@3}`ekASZ>*r%uRpsQKa@C?#9=`k(WT0^Bp67o|NPKui
zCumjX`x3DVswvbmEY=U>)@_tU+G_oAlHv-uut?twLJy7yg$1Ynl`*TXVK!h-HfGfw
zsx=Ws{%H)Y5VuNe^6`?3UG+P*yCdfiA7RTt?5Y>j@5_PkB|)e{>cUWkrcpCd!9OHo
z(bo|W7Qt<(I8?WNE)LZqSS0?Y(}Zkq_YIf2O9p~aMa*OA2k7zh5vWvb0nGg1m=^5f
z&wp@aiWD^vg-TC9N?J)(mDJBgq3Z09LM1G>lCCy^2K`Z}ex-0?Y5W!?Vf|iea(t)&
zRiX&(k3#hsjY||Ne4_R`GZ(4q)OHbDSw_y5e-w!7_ndw?`6?TT%8{+u^Glx+#Xux=
zhcH|Bt&%uYXhxTm&KFrrz<X2X&YZCI_I+2W(&6Fnq7NM$i0Y~{vJlmp8o*f2{^~)&
zs0s;2Rfu%31Q@u|YuPjcN=N!q4Tk<!&KLNZoFMl9O+>1p5|Ju+T$_Dd!Wb?6vVc@4
z2xJ5|_>zEBc&TS2Qaz`F{^<Q7sU$R*3P}}iei!^lJ{2Y*Tv<lU01{k6fcfE;vh-)%
z`eox$U6zeU^&{3W*yn_!(q{Lu`}NO7qk7?aVP&$Rg%(p>iDeRvN*@%B>Vl^ovCIkA
zH8>j8!*{V`|L>wv9YmpP`|;|hfv=24wOJLqU~nNtm%b2<YN~@wM54-g99k$;G5tP%
zbdbWqQK{yq4?CHIqf*UxqEf|FRH|5O0L+r*RI1u9i%O*gtQW0+MOJ}q3`C_Oj8(s6
z_IEzg_m@Pa%GO>?0WnJas*qF*PY6kM$#}J0J|B{5q2lkYx8X?#LQ)A!xH5B|dT<dc
z$7lv_Av;jjJyyS2sq8`-2G$l7YTmu_W)+s|dL`<u7dT`G`y?GG)TF2rY)UH7rbuX7
z(=`wTk<z9n9f6Zla)5JOOR;QpstYMJD5h1WUC!)(7^-R{H8_Lz4^J2JCQ+Z907xU`
z^p_7s=?@_gkOp7+9bP0<)gH;<llGONs-B?4SB9$kF&_tos#+t-JAi`|eCmEl-qW8H
z>U3hLs+-A4g#u3Lt4YY9o%oV+P%1N~m5xm2gsM`S6RY$ywFv1QkaH(Y72>oKx737l
zVX83Y(~?K&-aO7dimnVWPK;8er?Gp0cTrKQ^z>FW)US+Er6e%Xe*!@#N>y!Iu2=d6
zF`{4P1hEDw_WveI)pa!L&0Hl-XD;VAFH<e+Qiz&JqEuDnLR2jgz~qFmH=UU|OodMf
z5jdm_z=Tayz!(To)hAHH7<C9-TVZ0_7o$~e)CZzf{g^w<e-N$8iay@YvA+0kvKn8E
zkcxTffA-(O^z;3QSaamh9&r!ziu#*JZTy9;wzLJj<Thrk^%2cwmGrB4ZH0+ho$gkj
z`K!B8=Td6L9#QRJ=lHC3KR4xKJXRjU*ohWq>Sad=D{?wlr6>HgVQn3MWah*_)hoAz
znCt!@_Ra)8>grnjce0Qn3zGoRu*rZRQ3N7H4F+sR5}atFVH32diCG{uBr%y0P|!ev
zC5(BcYFlfyrE0D9)s|;n0IP;Yh>8$gQEN%9+Fy)I+#o74|L?i?H<J*8weP*Y_j#Xx
z2Yxx{?)RR%pL_1P@+>cc+H8b;JN1)p&EvOroS)6(iGf{P9LTQGdQxSN;I@9w)l2xQ
z<E-3pF0(S&Qn(uCl24H#%(Blv+Gk+FNvw7jec*6|Y}Sh2?Z{4q_RTEFrmFz`Q^@~u
zHw&4<?5PQlGl%$>8G0PJFHDaLP)!egz9n)f-So&C{{rnTil>Kr7n?_zdl!3K=rv-y
z*iVOwZ6fCMtUa5)#eFr`W5`R%%P=qaKl38a#oe`Fi%0_sJvg7_o}ZRS6rss12DK4x
zvTolr^>bAL>r{65C1c#o5zlk=OYS5FlOHO@S25ave9I70(og7E2a(m2%~F<dv5N8n
zD0qBcd@~b6{cJgbzn)+?o+Fi?#X;O-@bi$VJ&B4$0#B~D`v1*bRrLye3n-4(Yb~5O
zT7JCfVh6Xj*E8@w-SLW)Bftq6rx!=PV@GAcDH!3~B(uodXor+-+6Xq;?OSMwka)Vh
zxF)Oj*Mv+>3uo|XdL*sL|JSDT9r|fwL_w`FQX+0`G)50)YL;Sg1#rYk#0oF}WZxW#
z;C30qP}$#9?eI<X7JsN|Au{EE+b!gXkx+1Ox3lGyDI@82E&n`AZcHH!?`;}BL*nv3
zOvFz=CZvDPdS^8~qH*k_7<pW1SM(Pzn!BZjGFd(Lz>FBeG7uTq?t6iGjntO4@E#FL
z4I~sk!P)AqCdRqo?FY%QUH?7z^TIj_Ca<P~(9=el$#!1Z)R7#bO7oeT;y)BZJ{-Rb
zD{rwSrCfy=oq3bmmy{Pk9Sl=#i}f?6Z=TDbX#|tUNmG&X%dHD4HA6a07P;=NlL3|u
ztd#v1;9W%GF7*bYBloeyXD(FrL0<LBYS;wnc`qgN3;&3NS%q93w0?tkeHDSVoOP#!
zMXlgT#Is&-c|zsvV%_DD(Mbk_OA~<}tG(8aT$!E^h=?6Wlp;_E^Xb-B2^9aV$kv^=
zGkb^=X)9kmRdN~B6t<S!Bh&@a+1Gpr_R&t^KM4U5c^3s<DORlbht2cW-O~Bl8>{wJ
z{DJFKnmHnwRBA65k$&zX>x2BUL$Rv=8(gR00&co}2G=P=bDhp6?Q<x}da*s2odMS=
z4y#?%A&b8O*6MKl9Mj_PD1MPaA7(Y;AQ>nMd$2zIr7nZyUpf{#zI*VPc<hPuW#4G7
zj5tNdcW$C}MO`q6lJ7$-wJ9}H7L79!5q_1R=qr)&&Kq#7%FqwKjIUpo66GHo$Z}72
zqbl8(Jbjda0n<kdh?%ake#!+3tAn$!-9%=N_e~t=XkerbCLb!&huq>MbnV?Xxk$!s
z<8%Hfa~1b0_R~O-4r9sT4Xob)X_330I+c5$O{<&5#CtAsnezRRnO8rfaOZJld11@d
zAd8i}fX4|d1})DRkbI5yC*(EeI#FA9Sc@QI<?!qKo^r(M4gCB45_97p1k^8&a=PSl
znA(yiwt@N$0=QO<((;Hd@2W4GF|YXBs;Mwtngfq-#N>DFsux(#*ZwR1teUzW$B^|Z
zvBo#n2zoU8<BjhIY&x!6HTBjWc5B40Y}M4J9(Jq6ZuY9Fa5uwYZxXw6S53X8huu1{
zJ8jj}M<TlY5f41YRZ}0vjyY2@;mY3DsB;^*Rr0Lwwew_6qb>=j_z(&Oir9D?HC@_Y
zqD_W+N3U+)M}4N%PoKV*c>U4VD=<nK{hoS=`bR9|4gWA1s2|30T6mbgU@*jOS{UhA
z7l}f}zx5oXZ`>6cq)QncWZY^dwrhy3E>rmmWI&B4bX|`jn%bnsp0~0ks2QSbyNBrO
zM(Y9N!q5;Mxu1yqj}hr`B9-{ER}!v%Y&=G)d>lFvF4=RuA==DfdIIepqOB+IGNbcD
zjPcgzD|B?f0$1%yuS5En(?V~vit61$l;d-q&{NOYng_Ex@S10rC}*JfFZg2e8WAYl
z;hge8UFK+i5{&i_vK}4nx~-Y5b--dh8qC2TFJ7#RTpQyJ?s7dkMO^k+MHfrKIcVtR
z0oSaCgT7(x-X6@VJL2~B<8OceFC~)xJI{w54NvO1DF-2wtKqNYqArs&<+{xNejcOS
z-tn=vm$kXvz~S|(X=5aNo?t&)p8>OaaC>lTUFJd`ag6q#)$pu;1mZcI+RZ>Rb2QN~
zY{!X`1mrSqYYueoYwt)xSe*3x?TlGS86?ZB9Xq6X_%7ysSm!ji@BC@~eKR1)*{&yB
ztcHt(IzdXoBUJ0i@OE8z324)yBMv7BvR&*n4G@OBRI0<IgOH?7r+qMXQj};epN+vM
zI;@XoP21CQ_|aB9Pv|@IdaZ>%4bEVt>AwN9m^)GnSzQ=?1~Rn0x-<GB7GdxU4qq<q
zZN!=Q_BKwx?-41%8$ww);v8D&*U<Fdm6H~&sYWletS5xEQ7n@z2L$>z(wq5l?Lu!c
zvIJgKJJrtO`GJqUnfq#3W<6^?u^s<r%FoDait6l+S5N2m&Uq2BX6u4BPVb<1dZ_Z|
z?8XsqfOkaFWzEE*840@4AAfC@6-*vN(O8<9WL*uvp}bTwOCjV4WLd8lMF+#!`?9FX
zK=@N&ns?t<dL^38`#@;Oz$#TQdbm%{2@NX~Dsq-|@V{=8l6A_U;L$PY;1Z0jfnJ+d
zgx97&At(#LIJqQUyj%pBKGW-$MG_@@AskrET#Ctza*Qk$hG$YJcOw@wsb$GsB$>OU
zn%&$X9JZ3MP16Sh`qtla^jabu?$Z@I-1~rU6VBXrWW99#U4&z-NmJgZCf|Kv!cRFJ
z<%LeRFNYYXqf2n+jZE2j1(SDu7dJ^inEWs(w+eEnyn%j|9{6qI1>YGV$Lq0>y;?>d
zi$vMU@WbZh{oYMe?Bwz?59GPBsizSi-pQ<b=tZ#i!Au`9tG@cN3A?Cp*@oyJ`;^V*
zp+=`KQZ$kjd#7<^F{OFcRQ)z%{1)>z<E#{VKX;k(iapcxUh9RtNMWmF4Q7|TpdSi&
zRSFMqvHqJCk4CndSSI+$ZD?Gpae2@kT)#CnC-b?Qw<HC$=!H_JowAn63vA_By=H+_
z{4>_~C>V`qbpCj*X|;+CBKx9R(&q|fjoE6AJk(m>=CE)6im0O5Pvx=A;mVWTj0hb`
znu`%=A*R4nf}Tg}c%y->^R65#1)J=qMUKXm`?J=rT;Oe7*_qSuywBOVvdi;WVn<AN
zV`*3RI>v|m{nmMT(l}jfPUW~oi{h;5^d}zLsj^}iMyBTM_eJK!ejV6jbd|^=x!H5_
zGbsFJEcShuD-9mL49mynqcMZCLhAyskjUgKKVdNmMeZEaf`7yV>Hs~(1F{319YeAX
z?sWQ`B&kU90}msX%IZK~r!$aW$Wvd<o+l!(s&7y9O^`n)%by|g$5sDDmcJn<vy&T^
zw{1f%B(M)nz=4-LVmLePhzPtI*twZFRpY!JCvPRoOk=*89-c&>I$ap=zSE|wNWe+c
zRTSX#=_(qKI$iYx3}DMYqJ0cilM{HSW02>MxG4lu{)krwrJTTDHrIhQ=I{2b>GYkj
zF8VaqG6!2n=PbUzuF12?mED39CCl=i;M&qY6o$=*iS^G$krnKvRIV-W#@F`q#M%Cs
z`tUcbBbG3Uz8LV~c(fLOhcqJPczcwU2sI6j-~F+y{iT+zH$VfbUG|DF5wo%bIXlqs
zRj^A6i|9IyXT_K_+77Cn^DSNgkRgrT*y#(XkH(xfeIaa30Kc30nmvJ?CvWA{cZR-T
znAOnfn@Sv^NGZg@k$pxe1qvp=I=?$oKO*&U9D4t3yL8a4J?^Nn-`FYV?ni>jf1XDk
zTdet%!5Sz9$!Px>^wpcIfkeijd7+7B?l(pA6CI7{^CAvP-xf^16D!txzp)<Y2zr-F
zpl}^`dNQB(_w&^4&Fbhc>NKK2o!-E_wm_U!m`Soa!|!biW!Sz3fW$yfY?tI(9*@sn
zy8;y)#SGbflqsXmvu@WI@7kPJ*P42g%xQql_$!*4r{Qy-KM<FL@{wnQR?Gn^GN(mq
zb%=Ei8C;bizJ2**<ou733YQCdfjId2FPS`)HLiTg`U`i-AjpYj^($W*>QCh2OAG#o
z&7^Cvr`<v9GF4j-{F%KN7Jo27brwdGg)P#fH>)h@@`*nokhA~fZT_gZk2@mbI;r$+
zH1`?PWu@sml`R!uG^PmM9kKv&nK4S~?N*fXkH}t|v!LU|&GK%e-C|<7;k2M5N`@QL
zlMw=>33_;7F*~rbxp8HSYt1jj0?AFv+I;d>VpLhK1`!_>w9Z$Zxz)8s7{mJRNR1$w
z?_8VcsXrWb?F9Ztb0mwU>&g5D+`W<`<YbH@)jAWnE2kxRgjMbUa7}4wvE^*)l96?H
zh&aCy3#j92koOTaiBaK8DU`LEn^oFH-bbXRaGRetQnYGi%SZ6s{0Y2bc0`J;buDu{
zpk?|ICMf?<>fqLoXuq>>4Uc<)ui9TC7t<v_{*gLuMkOopO*@5TQV??KEm<gQpZrO?
zc1)-AzGal$b<;pbA1S@-`$u$cX+9L{owIbITn(QZOI_=&VoCP>=eCP>F^D0#_B<g)
z3&iCX?;tEUJfmB3#_zB)Pt|RPO|C4wBHMB@-@ozo4)n&aY_{8caa{JgQci88jeF|e
zzA<#a)b6_(b=l4mCl4N@!0sra>OlO?0G&H2<HoI4Vsl%JGdn3GD`RD=->nDvp?!Cp
zJg3ub4?nwP_;IcI5!v=Mbdp05)1#k7=&i?C6dr~cln(JsNWR4(rwF0Z!d?v~=fRED
z^f;4u5+r1c^)d1ldBwwWxxOGQ8M?LbVx&ap)s>_;k5G}Z88o08xDvW#&uVe;FHjVO
zxOgCbkGC-@78&pfUuZ^w?rkip8DHI2?t0mDh1O?TdYvR|xfSqmIcoS(GaWa@nnVsl
zQ{&@=2yE8^L-j7%-NHH$Z@$-fk7^k@WIczr-be+@M5|bv;PRBdvYjpb&TQm50$XJb
zEh{eTb&j3_@-{{~fzz1E@IA^~jJ)4gU2{#zgPB!j3}yuLBKxGr-+;^d3k8;2e>Jo;
zve7P!6SLT6$*J|HaR1#C*eVAHg}i;5$MS-?gvQP6fwX9LfGLB6*yprN4eM076A$CV
zpTbJW^_WAr=L5?!Bhc(F7sl%~ciI0gF0RL7$Foq9^-=v7NBjxaKnP;^SsmxW%$k^)
z;C%vS7K%N1(JWc`i$@Q+QViFV*-oxyXLSs;Ui?8QxK#)WL51C;>x5-f#Td8ENXud^
z`}<pnOhk6F$E1k}6!$({kA3V~vxaiXt_9I0)<zT7-^Bv7Y3yr%G$ZVptkSJJagqxK
zFsSxgKhR9vy`dYlbr^fxpv{jQ{-=(}yuh2>p3N9@<20@u%2+1>FVV3CeLBkAo>5La
zI?4&(93>Z3h3hO)M%q!LL}#yc5C*a2a*P<-g<A|Sve?}7eH~-K5*=9Rzsij~{Z9vT
z<X&W>#KRTvG18*k2)6F=Y?399_0T!2F5jRYV_B8cJ;dYGg=5?|oa=3>7&C@TzROPF
zvaj3&<f3wn>ro_qn_+!)3}B!pYp+^fu7m_yMDOnt$N&eQ&Ls4TU9QJ=c4T>rFBY-&
zBaIh3sq<5ar>yY|-nlP6AM55L`iAo|nsH27W16=<23ES>Exk(itj!)NIn7_hP@`zM
z(r~L~>$J>ln1lxz?vt`-y73pty2omQ#j#J6ZM(kVMUMCSJM@l)keYc6d%F=1nlz(l
z9Nwu3V_4nM3t7wB{F83I^7Cx{A?!KL9U`sq=LO#&k;NL24U=K4oG?To+A&JT1pQF0
zPfmCk9rBP|mh7SpmDPBgoLW77wVYaA-j*}9c(DIu*_QWnJqiILvolJ&^hKIZ`yfd#
z(mEb=J?dhq&}Ow!GT}M?M3*qXEj!Q{PlMx3&v8SVC-dVK<Atq80qF5RYL*kM{`i!&
zp-_oM;n{2jWU!_G4)hkUlE7YGq2{T(MGl`kpe-a5u7<PpI1yGP+kOgWtKeqof~OJZ
zF*y~sTLgYc-Dr(9c|gv^Nj`KI0xU))8v$=rF!{j?by3#zCrrnE?19*mwbwBmYJD4_
z_bseDbgj#H=z5f+g|)0()Oj3rT{>3Pv7%VP!zku_EiH7u#;^v5+1A?;iib(H;6ELc
z?DdY)e}IYu?{C<3D4(lr{W_HXG&j89yYl`R|EIZ|f=Bf4hFso+(Z5wFYe(w=joq0S
z`K<TQ3%OJF<(~Ya&q8B+7vW~X9XsE<^}R&!so;}rd=&VJ#yYm)pno%r6$hP*zen`n
zul3)<`tMiz@0a@T7y574_AIUWM&AzO)Kz+NmbdY8KEIdUA`FP=b#QLIQ@D<t;|yG0
zI3);QFbAo{dCV6#oR%GUF*mT)6MQx+BLfNto8@urPPr`3>^gp1uqAVQ(*nneh`|2r
zK<To;A=Whh7<l^Gfx@UmcTqRW+@u}$0uLt0DPH|saOGFf2)6~3H|8?#3a3RM|H>0u
zxtls^2>e_;BX$M+sHXGUau4yyMps15#TPc^O-S^j0D_&v($l<69v7Mim%@&x@3wVX
z*FDb2FuqM5*U1ug+i!Qp?1t;rG057e>s+5l#qLsXzDape4kdng4NmU)Y9=BX6qzjg
zh-5E$5Sf!smPfX-1AaA14uJXN_Q+%C9Aoa%>kl8NC8!}0pCVhx=9Apztm*P`ZM9lX
z38Zsne(d@ID!1r!Ig6Q1Q^VnjOY_^<rx8zk8}y>!i%h}2hhSb&aFjddot2oI*|L;}
z=S`twy<tM>vfr@9F1s)hWuE^rG3|;BmA_oZOgZlG4G5Kgdm@~NH)PPM?3tVJF?TTe
z4hSGBQ+?9{Io0HdjKjp?Kpg%QgE6%hCuPyggN_8dYcJNtft11Ib%cj+)^uU#s;NSA
zf3$UR85wE1xZC1fECOg%%XfOGJa46zNIq$t0UBq3#@SSw7-AxX^+E{`R6p8NEouSx
z$t+gDtxlxLEuX~JFh*8V*{~v-f!aBn;U<d=X5c6X5uj;aa5;p@Gg3XN7&l-Pb#SlX
z?$&yD8CVwE152Sju;`bnQKFcLQqmNZlFHiYs6Lh@eJrh4A3J3oS<!t=1^kPrz-nmE
z7a8*}VKc+}bp)!T4qaXy*dsk;7^J2J(ov+3+|0HwuUJNE5s`S7EZ(pvT=^)TYFoO1
ze!(%k-7n5KUK9B)v%2mca)wH^|3|oa{BTjYdANEs56vFN<J$bd4yvDy64`7;)6i%y
zp+18e8R4AT(@I;8G+$pby0HpbFzQ!Q;CFf`0<7Vl4PhoV9pLbsbp!RDcGW*p?}g!d
z&oa+lTPui7DqQN5db}MV^`0g5u2~{d*-Y}(uDplMg#ul}IZQLu@B+Jr3qn(eSzVaN
z<qM^LyMNu|e;zk!$M18k{yE*6Lq2Cs(ZQ`TzOzKVP~5sGZo0JS$HoqBjbL^NU{P;H
z*st6i+#2OeFji6e-J2*;hqJXk+CR%6k?^l^7lkmkN*taFZHtlRHaF6@YkfGRp%V}d
zIiHFp3UcJ<8reWWkuK=gm*Zx2eV#<f>))}m3UhlKJ#BfSCMS>`+bOnPT5pc06U#3D
zOC&b3{TfE$p7E{cJW?K}t9fJ-5h_<oRIDo{J2uO^YHJ;4vhhBTbcl~lS(x(z@g}`I
z*Y^H=GXLkrCQ4!{7;_WFE=BCzVwXy`vc$ek>@Bf38AHJaww+?z<$oY|l_e=40VKdx
zFPSu&dNxy;$Ce+RLF;oPQ9N{X1$l$dgz89Fkhi`)qDLj^3c@ZbTuGq{D(J4D`gW(#
zR1?nO4_8o(sUQw|!byC~`pJ&%5=wNEuvAbAb&)6)1mOmoWIQ~ToaBF5S5K{}p6>eA
z^~3DB)YK1kA=MJDCR0CKd(=;!ou1IQOXv&1^I{?W+*qlETubcQ#BRUXwURGgLsEUS
zsK`8%GgCoMER(*eezs6Q`qcbww(j~ta9KSEa-G&Wh0^;k<oybRq*$p2aa$t|l4_k`
zkTfenBXL%=vB<IxU#UZTtxpY7V7+IM1=e2-QfTcr$YN`+K{BkJ2C255Fvv3NVT}ZY
zX4d@%Un}^X2464udV|aOVl^0igW$^yF2j#iVepND7aCmVBWtd~n+5k8yhZS725%KS
z&EWe5A7k(~!BY%w2_A3oPQjJIy9EF23ZX+lxWSfXaHrsZGPr2?w^|LJBKQu2y9M85
zaM|r!zcqN8;2R8{A^2?umxZ^r*5F>jR~WoN@M?os3tnRIWr8m-c%9&R245?9mciEx
zo^J5l1y42jV!?+S{C>d`4ZczED1&bjyz6pZ_GZD~H+YNSZ3b@@{3U~L5WL0U`vw1_
z!P^AiXmCsLdkx+x`0WPo68vU^%dvu0XK;BU-SQbcQSikEPZ4~f!QFxv7(7+*Y=fr>
zo?-9|!B00htXT9W8r&=RV1pM3?lkxU!4EIgWiJ%G)8LB*f7{^Ig6}u@GQoEnyiV|D
zgRd3*VS}$1{C<PqF8G}W-yryUgWoTBgTXfnzRcj81g{XBy|rw<WH(&a-PikjGZS*?
zNIVlWQ-`>aCo~c=jZM0-LE<Li3}Z9e*et+ik+DfMHYnapxZKzr`EDpRJ+>%ns5`yf
z6g<BF1D)W@;xTZc8=JR`&30pxip_pw^B=~B*BTS{7@J=hn+$Ar7@H<zlZDL|V{^T+
z@nW;l*pwTa#n?P)Y~~xAYHS`hHaW&-88#0Xn<?5RP)BFR@-Aa}lChML2+Q@xvcIu}
z0%BQjEI+#}M2V2DN}+y&2y=*ll7D#iT8H(M72SNvlfhZa>#9PbW&ZdUF5%8t8|C1V
zE&>q9Q#|YcfZ+ZCYm=-iB;aTg?06a_HqV9^MBVER7DIV~XJrjEY@Or0b%Xn#v(0}A
z8VHDLzW2~p*(UqnUEjSOzMyGv|FTtY1zlyUzU*=>eU3#i3NvXU+x$=EZV7Fl^CDmH
z)_2mN&<r?bTke|ezFi$I?=Uue`-9uzJjyDE4f8lQ$tT+z=3%m7ws9ADoY_1_v3U;2
zsjVH@6yd1+>s7*NDZ*g(^Nw?(V*RHZ9fa8VKeVTQ|43o?xQshHVy&a_V=jzuN9`TC
zTF*)@!gn_1@n#akcTw#}GiMt2=V>i}po#wJptR2H*cAUnS&)g^!{=pQ53MhL779O1
zmmTL1WeLcwF-Q^q0`cfHZ1K9DVIyo(57$iZ@=2!srjoiVLCQMPR2K!I#^$q}^j$=q
zT@b3Xzx1l8eLX7bX`Q!v%h_FF*P_L-Gf1`B)wQ)FUPu$7`nRvEwGxa%2;bO><LC^o
zPph<e;jjhwbtvoHNtg`p7eC&ngndDN$>U*TBBxLx@&ejb&eao2#n_loX22o?76Wt|
zfrNQt6C8VRD#C@Dmzb#aF7?#8loogm^@C`zo^mj-ul_x_yib!K5Z_huCtv<7sDCfg
zH>du+DBr~T_xkxx2tMmO(;Bs0*kvc++4|iw*j!ogn&12x=>-yA0kq4}2Uf2es}}(s
zD==>}=EuccVKs2-WW-R6IH8=Hb&D<L6-S>v7k2HXQSxf-RyL>2-mPs>-pFkt!Dt<2
ztc@0L5y+W06*=<*r;q7ylUlY(Z8{)y;jxf+e==kxZ{?!PTkk&)lhu4=xMDp``H|Lb
zKjkn4E{YTN#oqhS?_B?t)0b5LRh%!r{;Md2$Y6Y?cATCUcv6-|d9u0n*54;MZ`3;d
zgR%pUZUo<Tll&DbbVSP~qC#<;8c4X5qn*G$cnt19^ephmmdt%CPvZegtrh#G4Fo_?
zrNzlBm)wVN2NF{8)bXOV<cA1gG)9dfXEEgLclUBJ&xz;E1009`SkemYMIUoVbbza1
zFJ~U$kub8{pDer9q|k)&8g+g%54bd2GP_advi<8LQUmg)l`XL^YRvWX3Htn`G2zrZ
z<n2crYW}5Li-9*?kfL=caoP<RCYanPXOoT5*WIVV)dD!dj&4HZd_U13u8%add@TD{
zr{;GEM<Ddh2x38bfsd`=ZAPK?6v79SrxRyhpp7OqOq(Z28i?a$?r^Q9O2NBw#~;pX
zs&Z17PS@)1V<#^MOg&xPI&(9huAQgf9cKXcy3T9$Mz*42u_j6Uyz_HWE(Z6=KUDLK
znl5pBGheC66}M+_6TZ?k?^dpkHx2L7NBX~(L(0bJ+kYjApl|pm+KfA|+a<3vj<wqH
z&l02c9m-<McV`K8y}~j#0><I@DP$bzkSY-UqKEbeTTJiHniCe2VW<#(=9Xn7ZVr9C
zo&ft9xk_#=kh7vUyi-Tqdb_5EYt73-mZpSS4h@6J37TFa<>hL)Rk~JF@&!2P(#(<!
zi^Fxg&mj-K>rCw<Mf-q*7kw^~29s08qsWW@+PJqBh*{iE(eBQW`}d9ehOqkp?QV&+
zgkJ=La!&$AOKzd>XfkxE@g7WW4*C0zAdS)ce?q%wuNb{okO3e&LGl74b^%0o>nbFw
zd`OEE^<W(~;X!c;bn^a=PO42*nN5>~&JMmJ0QM?8K97EJPcC0&Xf_{g{LhKS6MP9T
zF$cM)fkZaiB9b}a2_$%QYI}X@!Q|hin{1zoY_DNFj>JQ%?O{+bxykmx9$H>{!%raL
ziysRSYi*ZAu71E~LXn*ILOW@eLm;ml0tGLo9dMQsQgd+mckOq4<QAQl&PMQ)l}~?J
z`HbK^Cds;!4Rh#7HWfUy^g&24iTAzb(2@nu$Fkt*SC-S5)bV^SD<aops_eW*)<pXL
zi@hpp7f*@e$(kv#>UGimtcxCGzB2uO${YECR#7oWHuRqt{BAt(QphtbPRQ9naYVi0
zkPb_)&cLiMIGhb-aSeDVi?Etdc$Uk#ntyoy_}9r)MA?kSs6n}$vdX#ZB;f(IcckWx
z-#3FZk)gc)8<{KekGKgV3L#V04{vLYceo8BLD!l}209&OTv_A7Sw|39FX&h=xu}&~
zNRit8c+vAOCwA`oFCuP8sQ)6;e?lO7@fw=hs6ccfurc8>F%7aZ31`o8E!S`=sTCTA
z<?uuAa+n)mLX=oJfIVRj^Wpb|o-x+s0`P_2`Y+p-&Y(5i3d>Y>cQQD7MH*0~E#cM%
zlgp>*wo5bhSMm1C4_V;T@1L{IKq!bJkN4Jp)pqR@VlxsO>uz#ml<Jy8xilGJGH5=W
z|5<Br)PwT0Gnf`ytO=NTfAeLlBIIzgaTu%}M2PcobJiH<L%ZdL8t$=4+wqMM*8TZy
z-b0_}W;WNltg!?OCEhU|_1JLXpYb`Zt*1yC7%h2wZjbe<o?2w|@tq+01e3huk<5*c
zkpgeGe#itSO2C<Wdgk4%Q{3U<4=KT>-;Qa02T_8wVXQU2$F&V%_y(fyuO%@V5!bkf
ziUc7NcPNh>g&G<zo8&;o7<mMsAD*a)k=75ZgTYZ5*7pE*g&wNX723WPKY0NJXa9;S
zhzB?|&)s^MdoO<*DUXSWTx>x;w@*Cle69?c?F+La4ra9;LDD-y%X@SG2Dvk>6ZsC$
z!E6^=%M-Xq`<&KVerOOC@SOG10jWe+!?SEANhF6vE(k=m;XOu9um6Cxb$Fc~%Q?he
z$f~eekK@t9@HzF;!IBeXI9#sVwg;0hrtT!Nm4t$m&F!Cqt_Il>bKZgz6hPkNO_;$8
zbC3#e$j3#ztZAU#twUJ6?u%H?f^p9yD_dA1%4;f~`V}V@D4*N2F8jp1wRvNTJhJgs
zYqL?UR9}LVoURvkpzZG&>xRGTCYhc~^^M=28_9~97w!J-K|RC3p*BHj1y&S3wN%nW
z;)clka9cu$79zZC>#uLw9)2hu5Io7yf729$;zG^?#}t}Nvic^|lov#LBU&iKVWDul
zd7qZ`GD=B=9v4Xzgky>=8RHf@oAqdXi->}A-b4X}h&h2B!Q`t5CxPU6i?@`<e;rA~
z$(~v=W`XPGXzY+g$)i<J`DR5Nj<b=42O7N!6Ljl1Dq>T%U~)e@?w#b6cosNZH_L?x
zbf#tV?)Y`I9EWZ>5&o07T*twCS$$V*8Rg+(>}@+lv|G*}@?_lz=;8ew*JDDoAD;{-
zJQMH!MfJNPMBr+at=c)Tn`xm0FSTJWBq<5&qR8py)1J(owWqYd_jNFcuzyqXX4ZGX
zT@>am&)RHP9?kMC&#vs40%)M<n|bYD=$7>fORB*B_V+Pp+YS&Yd_AFs5W3;hl8<05
z)5JTv#mUtM-3CX%9&MVFAQ}a-y-km}>2W;5$!WUD&N$Dys4=<09n)g{acfU7Iy~6A
z@qcYUlzMOq6r>;3?D39TC@S98NO;t-W{+p`%%;A18}z4A_wie`8Y)?#>zbB&_oCrU
z{0Eb(CYUOp#0)@f<Det*j_>pqqsz^kxzlxXJozVITSVg0WX`pECjQ$$g&xx7U2FD-
z3MCvY?eTcUn#`m|x$1XBNCo>54mrU?g^7MOJvB2umo>6D#<=Q>BT~Zc$1h>hw<uu~
zl_ZTipON=?B|MFS^e$nhlrRYgU0K!QW0O!o`Y4B_-4!+I=n}=#+T=7xi$;lflzkS&
zq00S`yk=+59xc7OdOUp*ApLkADInh7{<Ts+9gp(aeO<ic5vmi@xkpeQbU8?oWVtVI
zUrBYF?p?gc+jLukRBaB2ZcPcDdhr*JSeYI*q~-(h&g}6!gUNoR{h5X0B3XoIXCAq6
zQ-?E{>^@Cev>21Q2Wtw<IN(8x$LdH3qFWKtZ)+rJ#@U7SUq$;bv`*#N-PY!NE@)#)
z`=&4OoxJZ<iLT=r8DYGP!E8UtLXKYR@m@HINiqI#m=zFhZ^|1T_cAXGCx-TAgb%gj
z@wyOETlLJ4<%{#wtyJj6o{Sgk_Z)cdl6NBDbA#5qRr_@8$J3|e)UipXL0LyWmLu`q
zIc6>MB|_^mZHD)BS0Jdv{;MzDU~*l`XkJdSN=*FLG@WFBlI)=ytcn$FFWq21td6G}
z?6$;Xbc6BGCz4%*x}b&V276_3n4}$`6wK%bi%5c`q8sdGV{1Lw?eQG3>QgtEluxUc
z?!J4f^+_jMmEqu8y8&_xYgy%?MEb5DQKFS{afrvT%)QgQv9e2qjHTQ=HQLTZHS{)D
z_}-~#I~$KxCRTbUvV~^A+Jj5A&Es@~U?)i9Nw$(m9A(h&aV%{sgVV~QPl7s>ageny
z>|k918ooBfitecUsD0=>8ymd9xh%mOh**m#ScL1*tsPF8rho8LqCuuMs()k;6=<P#
zURZCzKcuhhTz2y4D@*sR>!GfUgYF=z|Lf6KHc+&cao?Ht`0{^z$MWKWs<M6GLRFd0
zS8rWqN9%olv|JjvtoY<0MAp51>3#l!vEv)`K98k$SS83*u&eSm=4=oy#p%`@EbL`r
zTdBB-)`z1ND2ou-8*qF*Xri$7K3_hzr{3r9$cnZpImL&c%$>f}9(teC@tFI~dY_Z<
z64v{?^IPhDzLUJ#**+DtuWYk6Z68CnrMQ8)@OfCz??U(EQF@<qP(6*F7Oe;JZAR2?
zz0V;Pk)rqcaa?-oeSY+2=f>eZ^*-B*)tb4bG}HBHL;qG>JzFibs_B(v7fMiMKJ^4z
zSfaZcipiOX!ru%lOJKSUKeg@uY{NTk*gzIUWPXff<)5zzIwrS%ms2({lR^s7zP%#o
zjeeoybJqR)8RPp>1U-_erl%t4UEin(y4*z9ry}TZNUaF^Vx&@fD1zR|&_v}^h@%ui
zpZ|YN5p*H_3VQxC6+wSTs@r<%B|SLkRR_~G`f0heTh@3ss>se};qnhCg4WHaW1_^W
zW9e1|eSTMmD1rur6+weX<pj>>0XCFH|No!}`pUJ8m&a8Ejl5;T6E$qcg?K#`L8p$Q
z9sHLRLEk{M!Q?i##M74|=u5PFb5HkU6hXg0BZ1?RMbBbn`yW*V{e9t12XZ#(3(m4c
zFX*9e>?9Udw4mcCg3cqTUVb)DMaTTNQUrZXoIQMe8%59?j1n<kn$(J*4`w6Qczi|B
zHO9A)@%W0Me|lG#&=h*348};*w^*-D)4epL2->JLmZg7K6ZBIf5TIK(T5EznlZ7%9
zjxW|z-xY)Ud8qWwilJ-HF^lMLQVcyE#lwqz6Zsob485M~JRih$G}fI{!JU!dHZjJx
zFO>-o)zIz2o&<5XGgk-K8AZ@2haOyao#=*^4U`0MwaW~NZfLPbHMDJyYUqh#U&6x%
z0?S<uCkaF~^a%n{4Lv|0s-gP{L^ZVByAl;zh0@NuRYPC94^C4bs-f@rT*}NE;qR-4
zuEML`{M%QN3N+BFq4fv~lT53ImJ2{UcrJ|~yS)ZOZ`IIOXb)OPS$6xZP&BB9)&nQ~
zN-HK4t(c<E`FN_KQ%t~bPz`+$W(P4i+dnW!RQuZoakRf72t<!*-)F2M+FL+`YJIAP
zHl-2gx$VEeqcvn<cnNkNA`DtJ^z{dO-luZIk3^7HG;L?F9!P{20>ca~jn<n4Fq;7{
zt4p4p!H4XRr-_n#IoCMMZVxhKh<DBxmavth5%;J0zeUgvbRr;Pu$@Kcr)!C{59QFZ
zugo~=YKS=p=KN9X<_YP}&@b=w*#8kb+c0ZdID_rCuv3C%er@LTD$=U0JW4mT539cR
ze{zB6HrOQckdCbzdZ2zsC!`x1E_KI=*2{=_*n8^tKuOtac7SrhnF4kUw_Y&z)&t#M
z&juB`N%2J4(=qy?gV8INNch+E!+zFBtMHGi9vMOscu~{2YsMIn9PAi`AqtfmZY;<w
zhfjEt2Q+yd+bdUWj9wpeZW-P;aWLnGMGj3CWhQ+0`_SY{_Rn0rS_IBUQnVJamlVxK
z)WYW!X<AIspIJZs-Gy9K^^b*Pegc=z<2c0_viUQ5Y)AZNdR4F^dNa)jj>1yezw3~V
z!{KGKQGW2!FrBu6LMOZUaM1hKA0>Ckv|PEHd|s28@Q0hoXSsfWc*0ZQ=vvaZ34`SG
z4aw)%yfi19+8nZ*67-#0KmBZ--Elp#JFJiFPI)1iyi*tu5{0)uK9W0Z<oK%v;T$LS
zm19V2-_z6g=#s7X2tc{4ZQ+0&9PunWBQv3ky?X7b-eQE~6QXq1d*0ndYIW<u>_l>o
z<atygEoOrq)3R_(Ry3$?F(N|I$6YATCAw0JIhp#a90G6w{0>qLx9s$HwG=`9iYf8R
zpWbwFe{0-LA|Rm6Lz#-FB--ys*QV$v&|f(D%V74Dc=OcsR}E~2d8O{cK>WM-9g-MK
ze*Z*v|Lm2+XCO?@S;DIIn)a;aICO~zl8>Wrt4fK9CXp*TV}DCL!uROwTs_OEPJB0K
z$_GtXh{~>j<b&f8Hin`C6Puznl!61Frs#i1&YIzSOnorR)fB)rulUdff#DqDaQ)(A
z-8aZ9OyW*&v|?qzYq75SXRtpw!^zWm{|;7vJ;a%2itLn#wZ$lo$wS1sgxr#Wxa_9I
z4t+VLBQiL{CekbQGEslvN8R#;5a_uROw`=c(dO-#QDw{)Ts(beC#iZHr|@RlC-pr3
zHlB=bx+gGki*<KkqW4e-EG?=rDmSphyVd$mUSwNf*VeXZt_*860v)1Hg@I#_6#OB=
zw~wUTWoN$YTJuB75!}@-C-YktfHz&xVx`?6!-rh5VEm}{7QafWD+q;9Mr(carC@G&
zf2~N48^Ua@9lA4129UI!S^Z<{3*+e)%?or49j|QtTQp>5W?-Dxmt5`Jt?-(fcXBJ#
z!NB=lrWZCL*{Br$n|R&~y_NOIYME5gl5o^TJeo_EIXBk)JtvG=BuqF(Gq?NThI1;%
z&63yTFw9)-lOwx`QD{MG=S-4AvS)me_5Fjk8p>;vt*m+72e-TDGTm?QC_&vomR$6+
z4ooq({5<v74_2-<4-o^G$}{x4?5LZ(_5wM2A1IfR67&(LoCp4b^}h8UF_~L-)&bDE
zm0c>J<XT|(HlDC9>m*0@I|{E9ekCzM^PvA!>p?;^T{#*yS|%7bv$@MBOQ{~A+sSp1
zQv-Nz{dPstfO#RZOL5m;d&>#kJ#3H0Twj_BEBr!+{v0lQ$V91cKIb*%WSDDytnEd*
zhxH35P3x2O<U6Q-Why16{D_FW;rk`$s&@sGUxa&K-*ug9%`k0$Oxf@GK4t%qb76f5
zO#!Y0H#xhPM#joEoU_}+T>rk#3<Kc=ZRBQhc)VJS6jybMw{e+U>()!lEtc2c(7+z}
zi#(Z)qy)FyTC6Dgo`@iDwy{_wPYSt%1)W=EPPSwSc*EzWB@d_Isrm}Z&cMrDak4Lp
zMNry~6UXn@+69`tM_k^mTHhe!KsGFPxsk<`1B=}UL!Q`W0v2tH=KMB=wN7HsGhEb8
zPWd44B_ck7H)(1-GyIp?(h%s*%Bloy{}L=OFbefiMpf39=~##`&a^aXY8JhY^HcGZ
z*=982mrY$9;SHR5`_*ztz%#YC?eb=xc?%|g6&KqBAJVZz-&MzDoUk~#)H`*6|MOsT
zSchfdbwVGy1%n$`P@25`t*2{sRnQrleZ#!tKazdM8aPs-3XN?jBQCNI&3<dj2j0d>
z6ndGr@ysD4NIIeC-=e?x9?c}^%au5?t=~ULjE&Jzr4;k(-%5X8zTCQlXVG!3w%(i-
zqJf^r!|lFX28;HeLu^q@rUxYHlbgIw>y+g>(jSnLq(YBRg%0br@u1(WHPTrQ<LNrv
z)6b2ktHl`jQ2Nx(-ax<n@$Y*BM{@UlEf0ZK=NBUy+w9AEQb?aKIxA7|v)jsifb9ZT
z=KMqCCi8hy(-*rMeu)pzcu-jX^i`pbsPyzRo1Gagsf<4&(o=^HFz;}Rvi4@Fx~WU(
zimN3+@ga_CKUda3PUED6WqDI8K3BdG%xIqzl>;TDA`{vu3#Z^t?dZ1{bVJIOf@tn)
zb=AwN6h^^qaE3jbs3~RrNXktquJ5QJC)W$h*yN<0%0&vU<a3qZII)AXagKJrBE*{D
z@`ytRn$C~N+~vC2M{nb)zV1}=GMioXvQIJXhG8t-B!Dt!>6yiQ^BTvrK)x0y(Nfj@
zNilmWx43<NA>J*&2?n3ki^`_>e!RB$9-BdFb>wiKxYyv$RW!Nb-ZZ$M6*ohghJO~z
zD7g$Smgh5;pXQBxg$(Dqa$XK5{{n^{eg?2awtj}pkQq*;TR%O)5R+Htc3Yb;kR`M<
z+|5MNtzu8A+HGBO5nB}T_Cw>X{SG{Z&IW9`mMjqf(RUHup1>Du5iASOlC@O1vFvGB
z5jny?lBSd_c5b8=vKVmn4d#<~if9vsjMmaFecfed3}NID?dr^3ECK`jJe#>?3a_%6
z+tSG0pp3Q8F^@fqQ6m<3Z%R<!k3Qdl<Y3b$W|&~B<SW1~LSBxymSQWLEg!PUZ=xkl
z)-nIKl~jVs-T}0kr(^@rG@lmN!YN`fc@CCdJ=plqu+D`>_QTavKm)k+Iqt~|o;<j+
zeT%ANIkm_7Gw~ynz^l)>nFlxs$#LcH!usSlnR3WVy!UpKlN*M0ykUKjk8MV@KhD|<
zW_0~{(OD|*=j^d=)mgoZqf)IywndiNzsA%tZ~5gAipcSF%g3gWMprWy4}K=q#Qw1Y
zuZQ+~haq2h04)Jt7FYhUR#`Y9>v~WvDKrqDven^0L$eWxTwXifW1Sg}{1EM()q()M
z*39Gil%^5OuamJtKWUk3KWT|Tz;oxV%XVaN0<h5GjA-_(`YV*-iIpc?J^Q}o#$6WD
zO$&h7`s4;4R~&q)0wa{qEf6g|-t+469L_q{n$Mx(L}jePtTG%OX}#=MYx{_f6nr_H
zH+Ce3+{pws8FeT=^T%l2U_5|$==EXEV^y<4Sr(a)3U$hyC9>8`OD9?v<b{T0>(vVp
zI+6*hBQ_9ySrzngKyleRg!)Ovn3T{VBa<(pU+f31jCC}XIVoJ9KDcc)8j`w*#y;`8
zFvYz|YoW-XpB&r<o7Z|>yN;Gr+NJ~#ZgcpCG+ysKxGmAuuntST4SnkfyU@ltDS;U&
zxYf6PRNoTOI3wjZatYf%$+~iaRDUx!JoftrShI|&5EE~;@3Ag@T#qQUaP%j427`xY
zu)SlorghT<#(M*E631Vi$dz<nM~)247{iTDblI-?;D#aDfu{-o{9h<eSI7MNXWe9>
z9j;rDSH4hVcI1ffB#{F}2&gH!b{Xp*6tuvC&`Me&<F|Fhuu+S<l!AH?i8@ibqZWx;
z@sVU#lo-7)Es1?L1Dv~KxK@)ULOMiB(pa($vM$oeXMXKk^CZ3zKhP`RELnUQQCh95
zS1(Q4`&H;MLu6`$twhc66T4ZjFcciGgVFhy)4+I*Q4dL5Sm0!Nn!FKK@O<7*iG<kJ
zPp_6S&~6JutaC32w}t0&CDXR_pVnQI&~g=LkX+>0k;(?_)BYl2zq?HMDthr2NU+#9
zdqp`+ytP@^WWp=PCP-_PR?solNHW+`Dsx3}ike|)YGS2N=3jF?md!e=UaO@EwK;oi
zPSb1oXMA~9+C5B85t2fa*THJW3XT)9>M3TTmzVFg0@oI6BUQ(=fy&Tb9VsT|?n%L#
z$x*E+AT}c$auOtqhH=V7aWIsin1??snDvT~s$D-;#_DIbkTQ3Y8UKUHKZ+$6jnN-|
zS4zIaYxLtVJ-?|f(4Z181o8C?CO<B#D(OnWv8j+QIQBICH{FntRLw7I9;v&%ya^r1
z&$3QBU4+A78E|c0yFdhSDYT+&m$Z<J9fo_8<9mg%UDB-9-Yyc`X3iOvHOp@T^@<Ma
z?h81rrT6s_r4~@LQtW`?97<}N8CsR~wXd&G@#6GWpH4c|t{zUBBw>nZA!h5>J>0`i
z^-t6hExRhS60GmbkGD9Vys?r`?z)z$2n>GKit9m;V=BOuFQd<>0tsU-k!E`e#5<~f
zr1Vm8Q|a;{hfvH%mxdMJlxJ3DL@U+ox@~KKf4%FuekGcrrmz96u3wpsMmKLUvbK8b
z%s%|HS~L8hA4+!6Mn6=nwe`b3>al)hq0*N-u4X|P%2k+lR%1yYwx}eue0F3<*DWnx
zS)=-j$#6jW^>8}6$YwkLE(@JdCZy8-_3KH2+s}{zQK|cExXFe)ZP;eRPi)w4vhhFM
zh8Z@TYr`@duCU=PHvF9pci3>h4J{jX*)Va6iGQ>Wcb{#{TWt7%4cFUnh3#*x4R5pI
zZ*924hOgMrvf*JHrlgzr&$8hKHoU@y%WQbF4ezkwHXFWR!?$eMWy5}Fns^7>&~3xh
zY<QLpy*9kWh9x$vwBZdlyv>FiZ1|83ciQj;8@_GBPiz=<mdVF(8;-GIx(%~zINOF5
zHoVD(ciQkF8}7E@pKSPv4dd<l7;3}QY?xs~uMID=VWkaku;G3ihT7&_yME5KVWAB}
z?#F}cM~iYwrS@N9;QD6_?E1NZy~8yhGWOLc_wC->znE8!`<iuzETvhP^KC%HdBZ?M
z=e9WxoqpY11B+F$V(3)!)Lb=FO;8!&@(Y>IP-m$;m18Wm{Y5HQ%}^JsY;EgRUUiOI
z!oPEfM`AL+5@r6KuH59o{BvtNu~}~all<kYN!osrwv*5W*vZdhL&39EDLE}AovZlE
z@x1-JNL8t8`>?+l-#*+zzUSbl8k^oRc$8l);;Y3?eiwjOkdx3)%$0-+{XE1{qssAP
ze)*~hbFo@%n`h$pDs24PzGpl|#M5nS%A=IYzk;5UU#@xUd`j6RU!nXMSczHElUPkY
zj9I8*(iMM_j>J<$e139LVu!$z-%OqRZo9eUTzu8`@;9G+l<1Nl?J^hNr9FJ-L*vRG
zVdvm}v{~{IN>|a!Bt4}}{9=~)q#P2D<XghC9`T;DWXU<T;RaR0?{s%QKer&u`QeLj
z`IAaYCK*Ek&BkMzj>;}AE?sg}X}F<WRCVo9=8KDcRpLCSwAvSP@c0+`Ysu^d{t6xW
z1^!B1@t*3Ma;fk9qMG7xJ(pfp<1eZSSMUWzmD)(UinJ8*OWcY$B|g4N!Y^0ECGn`4
zrB^A!s5wPGe@zJv{ASja+Zc3N?60W}o1j-|No8pdi@APd%CD-_zUKICSmcv<B)o)C
z_*3{%xJwes5fK>`-7m)3KQ=BtVSp<!Y2cv2$tRqcGGyqm;Ui8O=^i!u<S}DU8JBwM
zY2#0yFmY1a8Iz}^pLy2V8B@>6oHqU3?__z-n~|L}^L%ga1sCS!UvzQ7tl4ws!scCY
z>1E$tc=;7q78YGqTvA%LXmR=XuC7>8Syg>aO|8#=?b2n-ue*N5${TJ}GpcHGmX-So
zYO0D$rFNIlmWrwS8d^cAnn+8k(0xmKP$ey=93Q2O7}Do!v_H2lM}m@dm$aWe`pz8w
z_4E^RmG+cNA3Ogzt}?D%OxyElUwy?eoAEDAP2r!!Ie~aQ<jRaAGM>2ks`x7-h~zV0
zr<eyOr7F>OWjg0ewBN;)s1~e<zY;>mGZ}AWY?OXjPN^4Rs?`0rT#s!%;}Z9B(k#cl
zg1^_<{-pQB>fUAI7k?$V7i)Lvv67~n)MQ+7<5J1r<>XOP6}M{sNsJ~$IWCpdha1XB
zDNU?Pu$7V0t$kii{!QL}^lB-+)M70$R%ky}sth}cPwF&OG8vz`=`=ypX$fh|m?~qA
zTct816l1DUr(!B2zDmqeX33M-NJ|iUN{No8RHe?Nv>-DFNcp6N^$eM<^CY9G<ZGg?
zU1?9D`koxF?@Gc-iA(V()LKMY-K0=WSecO|Rug*#(3DneC0^sQ1fQYYcehMQtvkIl
z!s+$hz9hDz>s`_a(R~K_o{L%PN9w@17)lGxB%c%iDeWUvo)F#A!sQ6%DMY`%N>CD}
zyP-yi9+O#zg!-G*ev$4ard-n7`ije~+n}`LP@cN!J6W9_jxUs-Z&#m7NvrP^`>s<%
zhslf@q5OaQ^rUA=pZ(9IcV;-fYTBr21J@E)4ROk<qXMcO+mk|lvzua}{HKTG`}X<2
zlAOz0X&LGI=)*#xkV#r(s200Z3)S}-YHB#WzUsS*T9x`TBcb%~Dm_}rs9DMwDWg`Y
zjv>^JLeP}wj9%?YawRd!_+Z8y8Na0M^fd>B;_7ZsXY^=KlHX(FTLRT(6ckD<*7Z@O
z$2K!YTz%YhLizpAw4b9>k~N;tyeGB0>D}E=rB-Cr@G<Vnc)OS|GF!;XIYe_af(xaN
zjx7{lT95ks_U%PtH*Hkfjm+~h;~$-Zp+{Pe`uq0r%gS8V_Mw<-d&S*dpJ}Rlyf35P
zsx<9nl##iz8nfUs3&`vyGo_)J%syszFkz%M9!(?JgUPQj(d@V6gi`-(Gwe?N+u$<p
zW>v!;$To90rGK3Rj5`;i^l!aw9%!4hZ1W)7+?HVcBZZ`Y)wX$vZFbw{p|*Kryz!63
znf_(j=Ha%vGtRi5WSj4|%_D7dTdZ+++vaN9JjyoLIgLA~1o~HKn?noeEZcmY?e4bC
zhix-Q7JA<b*IfU)VvIRo_kCFp$e2*3>*x~fq@K*EH$#o*pPLy{daCqDv!cuclbxEh
z5|fKqdrc_`Ow|8)XN|g+*cWM^vgVN4$iyJ=U9DTdQvRN+^VK_*9KxA(>nLK6WpCRv
zwsVNj{8EWQMvMyjp!`xR{S_6U{p7zxaYz~2PxXsPjLON$iI(4)X~ZQS-5CW7Vw~#i
zw6ysJuwUJ7-Nc-QiwpTFwXAv>KPNtTNyg~}IQb{WfBm3<`<Q>JjDzOiv2MrOc&V9h
z`q!Y2{dctgRjT`+Lw&n{J!4p{y8lJM^Z7RaLgC&2Y6HjAzs!LD!!5wED*VrARsZ{c
zLp3OHwWIrAgyY-&3xz+nMgOBVf3F8fN`v_qN>NPRc%rRG{_mIA_~`Bb+m*K4SEB01
z4d!5U?f%uRT3z3;=BDqjZCn?)x#{12u>Oa)+<M!Oe*BZ$e|pEy?!4>gzu550yYIR8
zSNHw;{@*<C@4tQUcfa5G9}oTE;YS{QY}4i~kN@$BC!cEGx^4T8r+4mZdFI*Yc0a#o
zZ|lAnUVQ20S6<!!+Usxp>CHbMX#2}se|`I%cmHO!zt{2p2Ooaa`SB;8e)jpnLtS5d
z`PE@mas8JWG{<Mad@Bac|91KRx6}VG)Bo==$d2!>8D#(4<&Wn471@LEZv<wM$qM~`
z+{@gAx#wEq-+GyU(968Oml-+hqr%_P%Y17uvpmDwGd+2#x2IX8IAl%T%qK_d=a+_f
zjq}SZORAR6@fG>X;fG>BueP-2;;X(_TI|cMEUT(nq8;WFMt->G71jDY#lG@uOAD&1
z{ncT6V`rjM`EW6d7L}e?wakQ^2mddJwdNFd6cgbtqC&<5wEy<2tGlUgRUHeu$eZeJ
zT3t6dI+_*Tnl)=6d|FyvLET#ARH@@K3g*|bUSm;LP_UMu?$o-qb%atZ>lQCw>~zK~
ztFB&JU46`YPEKYn;*;~6G5DXUcQR%r+>?hY`x)Wl73o#6oL`8mtVhSPb`I@A2w&tY
zs&JRq)Kt~D%PZX#MgGd-#icdpxX0FNPc^Ke<u|jayrQ(k?W=NERhL$}OP7@v`+Y@M
zRcHn}?(-_eAns+<gS)8GT~v+762b^q9U@QE@pSvEDJ?2-m(^4)A%uzM<WX`q<e_9<
zXuJT3>INMOo_*C-<S$%}?rZ#|HOtE@7rD!H#*T5XE%o_&IICJ;3B@b%S67r5>xK{t
zXvdFxmEU)K54c05<Gb6@P%p=Fvx=d-a36#hA-hf4AqYQ1IK+mt9NLMFqjoB=9cR~+
z;O5s&|3#%f$Y1Vr7gv>(x~t0E)gfNH_?$?*%lJaSNz{KWDNdpuC6!6I$*w%~%UM=U
z2Qf8kYL0l9EGeQ6sXd_}WE(e;`W`1(?c&m_im<FGuPmjFRD`mpj)`aK;&NYUZFNy`
zsk^AmS6bs9H_2aHGwG`G%1Nb_*NzJX?rsk{_3m~hso}A_rmAvDX{9gZzdN1MnkD6x
zR3*8g>S%luuJKp-O5L=P9?kQ3nVxn`-?);Uz3|h{Rr+w%CeYj-$(Z<;mirb<Q>pb8
z)#%j!kz{-HBVAsbp2%7Ct_Mh_%V+v!PrB=z_4Hp-s+&SjKW=}m5N6)onG?*3Z%_X^
z<#8vEa~IjAkXF<)G$|bGf7CcgTTxN9R3etpy_$m|*fHUbuF+np^pQ?c%_6^4c&$6N
z^jb!m@-lbnl4{@bQ~!Q?SJBk$L8yp~($7o7jaeG3dr9e%D*H%pwB6H2>k(1<nOhxe
z2mfnM_MAY}2M--6S(|;=m!C#mdDZIG4vISCoP{#K)GoY)M!0+-=Up<<)Gn+oUs7FB
zdSz%FU070H>s#nMD}7>hi5W-@nU4Ec;!YamRD(+5)u8k^HE6c0HK94KI+bb^Uehg1
z*pKj~cbO=*fbZ#HP8u4ehE6`AI=OIgnuL+~HpA5Ut1x!#Fpk&=6+5|K+K>qeXO7(A
zQp0=$)QKetq!+JTQ(|lSwMDf?z<k(o4RaR39I;U<HXZIpO}}bKoI}M?635_JH8|a+
z22W1x9MBfu8r$rwjw$R{kTfJ#4cQT=hWLOb{nZfkeGHkM+#1TuCU_pANNK2@m!#p*
zYWR66%_hgNJM26!J58yx#&?&~F(O`#@WrVSC9!J6-2Q3=@s5~0r0vAk<mMz-lyarV
zDA!~|Cn>W`H&uKWh02@~t5Tq8%G@}WLRnH~4{jaUoLHSSxStwa;-oAwQWi~T37<S!
zsWE)v@cklGzu6JrSU#zrQ>U;t;ahB{y9fNQJ<Nud{e=G2edT-7nWzKg3#Hp%)4soo
zo!u{-x2Us}x`(fxGz2=(X%_EDQVw^#a+f42_uNF~P9LD$HN!iHwxzV5&^)->F+5%k
zFL9~ia|fv5)bsG!DV-;@*)(wVQ!eVt1x;PEyJ<LjI<o$-y?$wzWynP6Ua|w)Z&xE6
zPpSdU@zrs5J85Hm<KV5RD7%$AVj@(G<7c}42|e|f*iZ3vuu4n^PL6MO^p8;eCr76Z
zNsCh>)9+Iw9e1juTa#&ntt?Q7OzN*r@;#zXDtTC)l>P^Gl4GMvw9~F8?Ica77){qu
z8>*S5)H8g44CQ~MleF2J)^xX5Y2z8>@9(wS{qvM+xTHI-Bxw(mBf@=b#$`%f%J-_B
zmdTH)XUUJWjaY<a2lIVm`#BZ7fN$UzIPyyx6h$A5QG+JCbX`lBjZ8*w@`b{D1b)ip
z-C-O9qtw9k1U2xMxB`crCx`A2)G7TTX?U!uciO}7n(jIe(dZY2N<CPl)C4;ZLng$j
zVI{NFu(<_lSo+0knBxLvT8XKPEHdR79;b%;QfNyj(w0t8!yN-va@(NRq-NZt|NH3o
z^r<0pW9a|=)R4)^%?{oF=y&wp6xvzJ<Zo_!mETk9Exu6O)Ai$vCtk)D`Y&Tjr=%F7
z?P&;bRPxQT%keRnw!V*<=cV+|k?d5-KE9F|l}w(JCnq&K2Gj4Q?~~8L*h&AlX;_eS
ztpC;!%@$QE^(($RLvas_WeiP(Zj7bSdDtzwYz2;9{Yo;T`v^>Z$B9nH-2Upsxj^dt
z#L0uIwY&Hk-d_#BoAR|KwYr)Us^bge(qd`rNs<m@*f8dWVUthnG&DDDMfz9W4N5)4
zcjK256Y=Qu85b#=v;{{Bbf>&2ls5%C>Y!SellY)Vo0(~13q$36Frd@{zHoe+UIU<4
z0`!VkgKvRelE&Ov(qQ~x>@f9D9WhQ1p|0)mzd0$XpGu<Mk|xV+)}6-5KW8t-w<SbN
zod$CYVF#yEH?!?DsCO6PyVFP@4cY_axo!_Nv@tyfIQ1CNU&f;Iy62Pc|C%)T+DJ#B
zV@#|XlRiX^`DAEkO4|vogPR9dClw|Zn0{;Kx)2?n|GiS3d=WNXhm3NnfpcB-y8&uo
zjUELH!*iw7kv*plV@@3gooElHZ`MSlNj)*|=8W_Wq%M=F`$RQp#(-O5JDqL)TBDjn
z^R72se@T=(QMq1-tJd?i-Of%V?Lkup)btLQ77phk+yLczD6YF*4Tw+!CdY~wJs$Ul
zy=nHrPNhEPlROJdIx&_u%UXf)=ET{9IzufcM5i?^N)393TiQ0AOrPzs4w!6OY{>sX
z{QmJ-rOHEeJ&F0}mbkY5tuf8f)lr3!1rcdNSE0p_v*Og)^lKu=I?5vZnj_r9$e;At
z<Fw^xURCNVzEE2}UVHr6e%d@=s6Cpwsf4-dvOedg7RJMGO!pn7zUB+1Yx+xfpEUCh
z{lv$3$=GC%mu(>$-DmO80N?FL(R2WQY5%mXAvN7JmHFc7cBS6u`-APj0z9EZsTXat
zBbl*}_LTh4fa-+8_yRpHV`e?nIj}9U)wJf=g5#{WI%U1(h>lRv>6~N?lztFPKLAcP
zAszi4s{d8A8R>tkfqD$G`)&<w`1A-h)X`|xmNKtvbAN~KKTgc!W7JSzx?^bi6vt3U
znj^HnsP0c(@%>ahV?g|Dv(|Ksj8`LlNor(CBI}0%YGn8PX3E7F)MLJBll9(^vlG-Q
zzQgL2lCRV$>0hc-9G|K1tjHKE`B={}o6i4vj29E7^_ySX6u}*8nJtShw$<3(9?|W`
z`0W1sFZp&un}5l-8#?@7k#8UA=qbk8<bYo~!|;Xj*h$Y<<D=%33S+OJ$hUaDx&c#9
zE-TzR!+BNrs~Ir*e5JNPC`{CyIxc@r4V(Osn5Z*)eo?t^W>w7`m<tu9cGxBOtSqe|
z^o**?+Nz4u8NQl|9GC*g@SdPNwYBAoD(x8NR&^(-N*u%lyVvI3lIFXTrW9xfJhM=u
zYG?$u`Bf$Uiqe^|ATKIfLc!FpBWDS3u?Nq%JL>Yte1C<n{JiD9(z#Xh%S%dUEH0{1
zKeEdh_UBRRYKeP}ufz){O}Lv*F$>2zM_8@!HHBh5ie>!OsP|R2&7&-}gU(hnDynKj
zrVDdsUzC$KW%9(53RbrPCG?*STjN??ggG$t=BpgX9A6Fpb1BU^+6Pq!<4sC8$D23b
zQ;@5JzZ&5!EvlYbQ%e3`)VN33Ch8NFQwjTNMoqa7W@*J77#qS;SDBG{rA6149%El^
z%34F+&0StCsodPFy?E4~s1PTuoBnS_&8u9j=~I%ktQbLUQlTP9n)yrUb6n?$$lTiO
z(yRQ77M0c%)RfjrlQ<=6wy)xn@*1DNsA66vT&fbKMv7ftRn^u0>X|UMB>{>iET9x|
znNd`YbhflEU+FTR8Y^}tXwEX#5s_O70g5Whuj^f8Pi4uR>hj7NResX_5NZkkt)Qx0
zsHUD1+4LUfH#B9B?jK4$AT+xK29l=i%i53WDTs7v>J>-}RF#5zW-v3ID<Lk<$rn7H
z@?S#EN_2bXd_rC3m|0OPQ5IDo5&m5<k)$zQDkfdcbwbr1t?)UWlIe?c7Yj!|7pg4~
z|E4LZJV{l0jHjdoLf0yFlGvDDV_GQnogO`(#-f{`S|Mo|7egTRrKBP~Oj?Kfo`mO^
zhKj0|BF<MYK(UHadU>w~*Bmvcq7)hXNs)Oo@{6iz(X=p9+a5WaoJxdB`6M+#L*!SB
z98%PrZq~60S36(*Me@;?gBsFZCW%W%0{XB!I@HDIR)zb$`i&VM3QBAAX+&i)?T2<i
z&EFxh%q=gz+AjC59@Mo59mrd!%fGyqYYB79NvBp*22B0H9!JDtzVbxoRTY)wm0wlE
zH3Ulix^5%0OHIXW&~e+tA}!*f9%d>B%3Mw@`fC?UWas(I%4ljz-6quPF)EcHufL?a
zsHQYb+fwn-gGQGW)szcUb-pSxE+rS2NtEogr5tv#WE@fIPo|~QU${4IT7*5qk^STR
z>Z*;LSI9YJKI+syG30uDC~IFc!yeyHPZ#ko-@ktUqQJi>@SmqZsLxHl`@n>sj#ujW
z%iS-Oy(G#H%un1;;0yIPIlmX2t)EKai{?w<>&M3yk27&|uFqCbpYMxZJYOuIxW(~>
z+$3HJE6~L!@ybvkc1e7&+4Lv&qxi%g*1GoRvCT7VGef8jGuyVGV?!CaB>qeJByAR5
zI-Vs!Hy^{Eez1Whi_X84L;TnANuF2Pa5YfMQqL#u4SbTHAM%~b2MbJ_e+iWQ-peQH
z!K%{sj{&7jd-%ltRX%Y~fha;B`GhY2++X5xe<oe`aex2ZeEm<weth98lY`?6|NKwo
z@SmT~ahrfWOCPrhxc~Wi`(H@m|9F!q$T90LM?{n!KJI0JE?m8Q^(dQ^_Z=|EFMnm=
zs$aAn7A)(AIt}l~|JHk6zsGHykNLamh_TAD;UnMDzsL6fDE{}}{r25M)jM}vcXL?Q
z>lcpyhF|IsvzSn3y?({(Zgu7B-+O&>FW-#EFYf=doB^D1g9(Ysq2P=jzP$FmgKQgS
z*>IW-Gi;b{!!#SF+R$yo6dO8i*wxR_`F$I<+3-&`+;78|Y}jhU-8O8o;SL)%+whMz
z++@RtZMe~f_uKGx8{TZg1{;RrUtyblHmtB=p$!+<&}+jC8>ZRtbQ`*D=(J&1v?+Ig
zCVWQ^I(ORkmJQo%xZj4YHf*tBvkf=eaDxrk+i;l;3vF0n!wegy*)Y|HZX2f9Fwuri
z8!8)iMVb6}+R(CLn+^Bdu*HTOZMeaP>unf{zs@#S+py4vUK?iE&}~Df4G%|}e0*lZ
zHXClT;RYM_q;U^&|F@$J7nuAUFXI1gccH^K(V}y9-}x^bY}a>+fz?9|TyK}RAm5l7
zHuM^|<OE|5(LwCxS0{_Vf8wuq*?OCMC*9k<xA`CS|Br_MXUE?=KfTSp)Bl(G|0V_g
z-aV3tUcX5D7b<PnK+|6>8;1J(Rdzp4J!tgs{CB~LBrIQOylJz?on^%)AOBT&qy2l^
zj(3F}?>`EqzeqlN_Z!)3%1_ow@>3T^%NF;)@5ip8Ms^OIvm)A{-sS6@;7}IuVm7=B
zPj#pQ;136JR}(+C0ap%I>U8irU<Y3t{@({CCUZ`Xy})x%#0;JV%o_qv8(d(^aQ5ur
z0$<=0|D8Y=GL(rY6BhUZ-(c`g;Ea<9KhB{_fS>afVBZBib0oZH@C@K`KJl{xIKpjk
zH}I@caK?F!GXvPlCus@1X|yR9x}p?%pLAG(Kj9NUw*$Yj?GFPdj4^&T0q;3QsTHJq
zFYqJ2dnG@>q2rJh10N2Y14CgG_*~#ue68SzfkRG1h2>cM052F1&Bs6!;6r>;mWP40
zr<*+ZfTz(QQt@*-uz@cdT;R_qaZa9!&MDvrX~;Ta-w7OWhKWBBxQ%ZGes%!QWf@+F
zpDf^4d{U=}fk&p0XY5rv=Vg3C!wTTLe4W@^z>8qm90o4{?m7#e3;AyWzRoAK`V;V!
z4DyD($V`kqhj;`BMo%Yi;7;I`=TZjn#lSy&N2%X}KMZ__PvWtF^Rs9J)Yk&wwR}RW
zW?&ni_z}qU1dR)v$tQU(1UB&P$NzfZ{d{fU8-f49_qN0X+{$Nx?*RVjJmfUMZwKz>
zI}F|m+>sA&>=gU}hhAjT8V-DvPiV3Un0>LKt-$nI)Div#e#qwq?*!J(CN0V$@bkIw
zt+4L`zH$jqK7*s5Oq4X~vZO6g>NhaBq+WgtjJ(X0D+;)rZxjC40w3fPI&1`%vK8Bp
z{bJzze3CbTi3?3wfio_LF9m(Fflu=Zty+M0UBUhld;{<`KC%B3@Dm%4zmmSsC-w!v
zdcL{f4ZtV(B&}v(RiVMFfx#m7t@z2fN~tUOB<#(=_7dbdz~2W>;#@-Vp8>p@PyEP9
z#<`1?dKf$l_#|H|cr$QDxxur6&)E2G;N0&)Tl@$-!l!8GTohN!`GkfmfGvCyzrcqp
z@PeOaU^a}y#oz*;<C8w}Ht^X>@&>*em{?`XCGa4h^tCQv)-~jZ_yu0UC+)KkxSdbZ
z64{l%@JSip26}2ZlOb#!a1UQ6cq{O7AEMyk)xgXAq(__!fxo-f<bNaZ#g&YK*uMn)
z=my4H@J`?fH=6iUfWP3A@@@cr%vS;a8F0fozSFS>o)s{DGJq%EOuNKS3h-h+$#Vhl
zmwXcTUf{V+hPGM2J8n09;ZER=pVDXXBXGeTCJ#Q~)Sn@5jr}y>HFp~N_<&#V32hGp
zH{E6EDe(HA6F>e}0RO-zd3YH3IiJuCJ$)+i7X}yDw!y?BF!63a`jo%}_n5J<4fx8v
z45irb2k!or8S@23-DlDjIL*cde#Dn2eG}&HR=x$`JAf6x=j<0;;JF)Vx8Pa88a}D(
z4Zt9u<Wv0z_(QZU{HQ-bXFll{1;D2th7Q=b0+Syx<3I}VN*k{RraX#&{0Mw&lTx37
zzYV-@GyLrF&<FVX7U~`RPr%C_r`>~B1Mhv3HViKCmTlx4{5GK4Zsrkzu{(@?Ja7r0
z(76tn_B3V0e-<!iC+z{;4SbnzE%<)mS9~{v9|jKDWy+feyx|$z0QTrqR4?*LoG$_Y
z{4DJp`!?VqK3$JM^*rMb?NHzvKJmX6IDe197XWXU4|)o`dar4#6~Iqy{4?NOnC+>=
zBXG)o!h)v*<6fgI;PJrOd=md$U^}0T5AOpXf7|qhKLTgHW9n!w@a%VK(}c|c2KXfG
z&A_RDGwp2}@Lj%6{8+$+mdU3;M>}O>&2u_1y#tzp3+#HI^#r)U_zz5*5%>_Fj2jOF
zt3HP2_^AeV@X6W<fe&^2r+nZ7%RZxBfiDLBgiq54IPM_wn%JiUeSBgs@If2j2<(4|
zwD1!TT*W8jPXq8NzWvxY1K;A4uyP+o?t!ewk3hN8azAZY;6=8*K)FjHegw*$2k|3N
zWW&W?pvd?OE>L9f1s5oC^MVUZ_`={KZ!hxhVlPl+#swF++{Q(2T;#jOUZBW>3NG+P
z8y7yJ$OMbMK#_Zuya^PUR<Rc-vY&zr6gf`81&WNO-~#v9xX5XKXyerK|2MxVUD8Mu
z2~4Gl4ggjIQ-EuM0R1!mV)Q;`1NITvZURcUR-m}kMe3q~c&h6MNCCzG5x%Yi=%0zl
zp>Ilh`>>~Vs=_|(CGawFw11&^#JKi2_O~C${{G|GYaQ`@#NTop|ND<)Z}nj>eAq7R
zop&>?K)kn20aWL`teLS7nN#j_sQaDW=H}ng{~&6}J@sMS$99`rU&EZ(ZC>^s{)s!}
zzwJZJlqqEPe&j%AsoR{2o0~6-56NNv9{)FS;zV`+`RA+o^XIGb@^a<(`&FHIudCyK
zox1(@+tsgs{cE*(^JdlD+^k-G^;LD`$Pp#mSMjAiW9Sr9y!yfJI_|ygTDp{>9^>BN
zM~Ca;4=-K1Vug74D7gFZ-r(*-IPb#j#DK2zAm*h@#cb_G>9;mx8&ppId=xxfrrnpW
z=ybkM;NVW%ymYU#OTw3x5x@Ly6#u*TmX+-#eQnn9mzD9*K@dMTO8kd$mmhw#e+e(Y
zibI$Wlm6bF+Dsx6{{cx~{|=EpZ#(QIf5cW+Ciy$O_lpCV4vGhz|J8@r?LNHwpu{2O
zBeNIg;^A-w@nequ<1>R#y>s_oiclu>aqfR`)gU1NKZaE0{Cdsgq`cjG@o_WWiT^iu
zoRMKXXmi)|d+#0n+uho)xD)Pu&$M6{!Q-|6y}S3^Gk15_;k|XuVun7!ujf70byz!#
zf9TtOXID@=Yx+wRmT?yUTIu?J<E-P?d6UQ`zP0wRSsT^ik<B-@Mb>?%4&lHaUnIDL
zPdAO@Kyep;J;O;neSJ4#AFNXjzDT|pJ{RA}ptSQuJ~!XrYv<|d>FB>j<LI0@>bmQ$
z(|HTE@%8K1s|Ox<Kt25M!@7;X^2#gfop;^|xASTd57@{Uy793XY3bKjUmtw5>?w8Q
zQy)E5c6F7ykt!;CDj2-+sg5gY30L3v;pbOA3UcGm-{D2jugX?F^Ul0^^PVcpOaFJ^
zl~-SI&BejsBUc7*XdL&{cjsNHZVcY@)Fbo$UwdZ)US*N&{YFI=l|^(2xa1JFK!kvZ
ztRV>rO9D}F?l7o$W5CEF1V{j3lua2|2FZ-0C?X_rK@t#L5JlPCP_N3S;tDD%qDWLk
zT<iXSo%4o642U@2_k7>;*iSlr-le*$s;jE2tKRb-`g?p9{ZBR9{q46)otNUP<f}zT
zTb*jr=8g?l(Jt0iUW0qMpIW<&Pw*(o^GSy2Fr{hJrY<fnPVZM};}Q}QTynDB_nMaG
zdDp*xe>Y&j0C(Yq7rIL>xx`Jmtfw0~bf_CKVuTwtYLv^()q6x`KPFF}><Y#wy5hej
zxQC~7an}y*;bvZu;%*(C?B?bsxs}s9yT#Me+?~@0yT|5?anIe-$89LO!o{vKch)*{
zZJ#rj_>8&sFPiK6in&2An@icEaM@et`foFrr}~!<%w7D6xgp!l4gTER^y$;xjW^!t
z^7HfE?YH0V?zrO)ch_BaxdjUrxO?xt*U#_LrAytTk3Q;c*^^H`={7&T)LrwXxkpRQ
zJ^Spl?u8d#a4*07vfH?Equa7&i+k&>x7@q$zU%gUwAF3?%G~?!zwhPZ(@#Hjd-v>e
zAAV=9w6xTH`|Y=0R$%Kf@!G5O(=#{{n(DLVyDydSNZD(ZN>1%$mtbw(#n#_VvaxQC
z<-131ncHF;1AFRD5qwNPt*>L8OPDQRcB!715&Y0nt(8{S-6Z(C1iwV^YXrYZ@H-;l
zn+ZOtpY|AI<X6siZq`!8BLu&$RNoaA{8qugC-@Hq|Eb{j2!3A#e0(#-<&q`q7t5a-
zr<l?##Z(@U@2q`@ZK~^RYg=dU_IIXDvF*xtR=UjDzK!Mh$Dbnj7{Rv@d^f>o2wr`a
z4j25Sy3THD>ug?sXAh2bwl-gVE_3$L#slzjKKdOe_~Qj%L+~{PFZ)v}C&of2JL}fg
z*`WT;{x;Ux?fK4@FLSnK;{kYAOYgm?FMp?zo2_@*E!EpaUzOyS>fO9n_abL)$2jYM
zoilB4E&m~B%ho&FxGe%cB=~a$-&gR11wT>nvjl&S;2#$JD#1T5c#WC=j^IBMd}%rS
zS$Zo(AN4R?JzTFI?o|)ZsE7B}Lup-eU$r&2x4*f4W6gb=Z|=Kg=6={{<?yEozLnq;
z1%H9yhX{Ux;BOH89d%8=?O^Va{^r(=HTP=1xp$VC`)uO@`09d(1E&i9G{H9#d^5qH
zCHQW2%?)g8Zft*ZGsmj0d~>UpnR{#F0r-PWLuOftJeiWxJ-K^wsz24YWo*+XF)_`0
zmEVxuJv}WgH8njYF)=wcvsG;K=1rUQ>eV<id_!uQF6%E%A5v2@<63Y-uU?_>_4JIC
z9_fkdzDG)OV)x|Cv$&yY)0jr#>uDKD$?3@{sVRa7v({(D#dQng$Svs^=|SmvT2%ea
z*1CZnn#42;H5QU-^q-!dmYAM-M!g16x~>~y!#6a`6ntVb9i*gZo>s43gR<)$$0ji$
zA(>X*f99#D)T`Gg!FLenscfX{!ao)G<aAv>rQR8R!npNq2?~PGOia!=FFn0SdS*j9
zXb@Gu{+~`f@x;^nf+N>?X?uo7$!vJg4Vkck>nS}l($dp2dSpZ&bc3!pZ|VE*o{^f~
zBO^7V=a~&p4G*CaGF!y9>MQ!`KgACba4oZIlu+PE{PX>{?UErDXY@$V@I-hV1O5yD
z%+$6?ppc%Ck=d|k&wBOhiHP#+ndcs#nH1kcL!77UXZGyrsXV>>dP?o8wL8{o(<41K
zLtO3|?WsJYXIMNEJ0~ZfeQfQjZ4xsxGBeV8WRzhk6H->vQqJj~5`SEkn&*Wtz^k-W
znXB;i%uexjY8+psO5NVV5EL`g6D3Fot|xbB-=<xSW2>K>ri&@vCClfWlag}adS+(#
z<nz1Ks#f(}jgXQ_?`f$A#?MSa?#}OW(lOPNxSo<IaZL}v#XtBX0ZTfeZmsh(Q!)~}
zNY=_P>v~Xn*QwhnBUyY*i?|H`Q~ez}-=SSf7pY3*W#7N%H$7E?nAW3x=L(l2`qxCK
zC3ij;TKaKt$vCKU*;iXLb${(?iQDB|tWlj-R)3E_H&uO9tX7#XH_ath@aGQirv(1o
z1s7c4{gElzy~=%$`zLmDHw^FL=H#ZhN3QANmfktVbyzQ-LUykA8|DVccfe<usP?wo
zZgX?z&UN$V&2t3>1@4}E?(x3D!w)~~{lO=mc*5Z;ytd|kH&_0~QuzwcJoAiu<&{^w
zZ?NNoZSI2)K5#pB>~Nob_L=+q^UvK^U+(d~!8hN0<9_<-Czt=Nxn=SdHvSM{XX6`b
zq3fW9PI@_eh!(m@TIg=kLU*65Ymd0Lw#xOl^=_<fcKP;>TV@|={XVeHxOgpy{h|b~
z#dh{tf<IUANrF!o{KbMFEBNaLKTq%v3H}AaZ!2GC{_s=8zCZkw|1bTNhOVqMY}imr
zq_}ni{x^(j8Xq6ul24(A4Wk-1Y8hRpR;@GT4>yR3ZQ8VX)A+h|YPUE^#|;}bZr)t?
z)~ypA9~U3zPLF9B8-GU4_`15G)=4Lwd3vL!vGFI=j6E}aA{2^k8DG8niLrudadNGb
z8b;M`8Gl0c>NRUrt$JdM+O-=VcYMQ^XPi*ICMV+SM4wu%O0^i>8y|m0jjHtjr>JA<
z>F9*UHEYy}(>|b4)6<SUT~`HihK@CU-07z@ZyXmNAJ<&?Yy6gRaZTdl8pV0~PFLYc
z;6{!7p_^J;Igo0)QNFUTRn%5iI3L`@{epARJ|^hop1Vs`tGJN<|E_Y3pyjdquN}y1
z_ia_RjQoG29E$qGjSaphsGb@f9o<MRwTWu88Z~NY2jpZK;FMfwrS4QuQVlq+kN=SZ
zf9O}cn<FalwvH;|ADTaZ{$I83tlYC_&&OYU@x>=vdp_8`d-q3bx9#1#caQd^JKlNc
zon_BI|NPB*&L^&G*RGO$Pm>l6-;Z`ze%^iy|CnnQ=98N>Yt~pTydu1OBqi$Ni!V+*
zS4B6Ura0m)+DF^!)vN83Pd+iNr>3|I0V><JZJTNTZCn=(rakz(J9qB<RJ6XoY15{=
z*REYVwR`vO?bHwRbh>JN)w-(S!o1cDS3bjIuKh{%4AuIIRkYi`f4?#V+7=x-{td+M
zSEYmJ&_{<39h!lk@bdV-_~MJE7^w+ATd`t=$6GNZ`}pIJZNr8QrkH}i4;c9foZlgs
z`OB6qoBY^gk4=`_*W=o2uRVXvm@%odX3gp+zZ%?HsK(W=U%#DV8yB5@_Sx_*Dm67V
zmVWj5H{t*F*I%1_nf%6$8@Cq^XYJax%M{Zs=ku$tzG`p2`KHHH^W$-6ZnkgVZg0Q+
zwm*iZpvvd*pCxm9zx?vc{gS&M)aTCczyIF8`s%B%UwiGf$3Oh=!)+StJ77fTzoc*N
zg~Kdhe=Gj-r%Yp&SMU!id<`md5>)VqSG2)rj;R41wBQp|;cP+GoLf+Xb3uDF_&@#h
z(=#=XF_MWH(6VmbI!^=gp?H%q2Z}R!c>zasLOSf*&6_tH72RMyXweUJ2bh;$ddbtk
z97_L<c~GpL5N>(V@eexxBiE(FXN!g-)!zpD_U$t*Ltg$ncI?;;Ii@lPiksQWl`Bni
zZt|JE4l@VLiQ;O$g8TaQ>kVDmx^=7n3=P--<PAMxj=*iXem^w(EwjW|%+7hiEdE)u
zxV2`j*O*=KqS>O4%)Z&TZ?kj-{Xdf8@n5xSReqBuP1?(cpCx-~nh#F{HitQYuh7F>
zfIFX=|M%W|&sRRfbNCIu$O5#0H~dFN3qLnYecdc+lUWyq;5#U1&~CkGc*d-yXlVA7
zS<Dk=v))l|;76XSIHKb5m#w#;f`3qhxd_^$(G&CldHL&mX1%uRyBx2H|Ina0IQJ#9
zvqeMB8_IY5sCc)2Bf8BhFII{y9#LtaI4QC`vt7G(F_MKD(4l$o^aOO!!b{``{#Ql^
ze23@E5psk4V|TS@^9Y?U{QJCJMniXff3ll!?JOD;Pqs0l3;c&~Hf!=^nOYnX_HrY&
zW>{eVk$<g6Mh)hJ7W@M_NB)@)<O<mcXhFx3GvprK2wL=l@@M^u_j#frUGm>k{Dy`E
z{X}=Cm&<5qBVACO++tVz+p(iZQat{$#rcZyx7R$(LeH=*mC=E`N6twgSG4e->#PgF
zVrL@DfF06NXn5BwO*Hfn4NG@N-f_s!U+T)8hajfGci(+yT4xTb&=Aysj>_gFpe2%y
zAAb13Ha<Sj?!7wQ?i`zFw~bEnh+Xut*<U_1>%ZMB0~+28>$7C0YoO2AB<V9YshRWu
zeQqUrLZ^RLo~;rZJpP*RnTlP+$ga<T7VIHyKm#puk6c%zBakm-9a-A;Kabe`S9Z0c
z@d<W!UN=tz1YGi|*@a;m`fW4oE1Y_ZhH`y|hOj=j#wN+8HkD0kBpRYul-X8wGra;0
z9{-q_m~#8CHJ)|;7xRJsvK|EUfj)2?=n44C?%A5#FSFuFUG2Ur6Rc1)%o7ciEZNUN
zqG6zH{C|C51`UBeLqnj?*rc}4i|<dHwSWfkKlHfS`La_guT+M=?7f$N>Dny(A#^UF
zBcO#jU_FSOlYkal@W)O*Iz8EzT-C)EiH3VcL&3N*{PXshUHX}5*lG4x(SSZ<lhS3A
z0)2*tK%b!@&}VE?>`ITnp6ofOG(gW-U*u<%S7-=oMLGgqiKK(i&_H=?YA1W>>dv<0
zZ(ZzxiK1abf_+oE%ifSWLqn!$P>#+18llhFB=k91x`0jUD4WFk9N47htIZmh;a|}%
zdHm(y&urhmeT;mR8PI`Uq(x?+1D}T$S~$mA8~9~hW4*;^pgb|HlP#ap$(D(R#iC)M
zXn69D(YAMwgy#s#r=oL|=A<L*vuFr>jOMG#fDhun>_7G*kpIq|J2zu4f{MO^H@Ja&
zKnu1Xd(XZGyUAL`+D2J*O-FlNG(0+`vn{>4i<O9miu(L-*`)kY$u{$f?smiQ6uWk4
zicP&N)ovbtk-hiE27`u3AH(ajY!an1{AKUG{0pC1;0|82-~`_21AGqV1REdeAL9=}
zBl7?B4c+W1(Xc`^JTh4{NEgs&Xh5H_Nq5MuLc?rm7}4FXA0`?uPqitR_3$)+Cq4%2
zbKqmN*ZQXN3;D-pum<BtP!}#-XvM|FhF==gU_NLMrzeWb+J?KcZ0)rj?8)h(LAvm;
zXm~KJ&)B4b@!f1*Za14VCed!qNwQl;Cfm)T;X2W9jcAxG8YmTgjQ^HysQkkIfWKtH
z%fIA$2DDsv-E~${QsU_eXrMh59ngeq0lRbK!?tcl2U{Z=R*D9%&!PdF6zKB;*`&L2
z6YcgfN%k+%FiSMtBpUuMIhvlG>Jh~zB}e!e4@>V=eqsN?Kal?}UAi;_2k_KWA>}kM
zFOhT{j+UQ(`qAEBd#61+GsRY4+tF5r^%<KK=<_|YNzgDiOv67VN3*U-wi}0+(Ey^}
z$B@6>S9PB3)z4-xRgirS8!+cufAjSmLwZh5&WqrRKB5CtrcCiPM9No1S}M*7$JhjP
z;n&I=&nzkTG0^9Kg!Q=s++qD6@MrFO_wLO+*aHtd;C(NA8pQ`}!h{LsG#rkO!_5i!
zV3QufCjFW|iv~(1ysqq21Nfw8ZPv<mTJz@3Ei*II^lXOV*X8Bq*|>4zZ05|FUauAM
z@pcDas4`mMJ!=ED3SS6+l>Gn&eSY=6@%H2Q+HVw1@auD=k8wv>pJz)KD3u`_oKvi#
zwtW5n(y_<CRjXF#>d~GY{lxZX@}vDc6c!fR`RAW+dbY^^@sEF)a!PjVt+#r7*x$o%
zXkaa1oj|Ur>|vk*dx{*g7Q&-vZcepL_k;gFd-0wL2Yd|a0zL-%j7_?8Vg~5{>i$cy
zzZ;bbosRrS*7LRRZ?ETIN~FW4Yo_14GwFnJ+^0_;@Av3=7;itp9bB0sXb39j;5V|z
zJ_p~9xj-M#X|K<k2iE66pRq}i`usnS&BqU%8}RyYZKqD1Zq+kAJ`TdzVO=&oqiA|2
z$rRJF7A;zsd~1&jc;GKZR%i%nKnE@TQIV;jZ*1$!^9I|Ke^1i-T;^l2J{M0;vB&;3
z)ZTt+x$XPro6VZ<BaT1lSxTERW5(BdM#-+Z=9+IVy67SsIdY`uyY`h{mY@N>AnpTh
z&{2^VVi2su$UQz1x<Wi+wf2*o!$)GBfR;*%Sn%C@%-3&?|In9ocY$J*+pfCms-MAA
z&yD(uP6sr!Y}wNE?3$kk)(m7G-zT60e8C@?hfekewCDpmf<6RuLW>OIn*?hQdvEs7
zl9%5U|3tTtf5}pTo)_DKo+=}5S6_X#p9g5bt}3={0|yTD=a~a&2r4uL`(E~x_}Iuj
zc+w(6&=$xS=kclVxn)cKso2xGdd~0`_7F#dKXOk+mWVe)6Sxs`*0XnBe^XLYEGa3;
z^mK}!2d)DX&_El=RWK)ko}eG#9<<02dj{kRKajZ#;v2%BblZulM^e1~6x}nG0*Db0
zXQ0ndJ@u5Q0sas-lzw;`va+(QZ{NONwv?0i_`_>>4lUq~9$<es&mIB!!Pj0bJwON0
z3Hrqb3-_PZ&y1+3s3gsMq2f+Eg)})I@;XOSy#El$ApTFlSMb@kZJWnOb8GS~c&gaz
zgXY^LZ(asiqu?|5Q#pnP>?l0N{y+54L$+ke62AsM_~3&cju?UXv{Sb260MO}3-@(8
zcfF7%?{TF0n+D*E|AYOPKF;D8eWL{z<{i5rIrYAT@+982O4t4RhOI%qkvZ^3570~I
z1UX?2h-Yy<D14@0=7{-VJr}+A3UBNtdBP(t9{)g2X(MGA8iERL(1i@43)f$Ny~$=7
z>vUuRx1a)poxv7SkRSF$RB(r``Sa%!V_cxG#s5~^q0!?X`2XVf3}^`KVn9nk11<c<
zHfinl`vhc)wKkH!;L0)hGdF<`L0$*BN0#6@IwYGhM|d0!?&bJL%0D(Day}}X6X+tw
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

literal 0
HcmV?d00001

diff --git a/venv/Scripts/easy_install.exe b/venv/Scripts/easy_install.exe
new file mode 100644
index 0000000000000000000000000000000000000000..5249f763aebb702ef59593eb1491b13b301670bf
GIT binary patch
literal 106390
zcmeFadwf*owfH^BWXJ#sdr(FK3XTvIjhE0=O&rh+%*Y;@2r6h)P&62^qEeU<tSE^)
zX*2B3DLtpQ_F`*q=h)Mp)5|$W0=AkEAc<VX8;VuD?{QEOH3`@K`>totB*9DH^Zx#M
z|9Sc7?EO6ZxvpnD>sf0(YpvAWu-4^vxm*SOZ`&?cD^K}Xt$zRUkHzN^r*9bH`tPCJ
z&uGnyZ9ik~;yacHmM**J_GP!+6{x%A?z``a2X4JBuq<(R;EuZk;n~*&?z(5uZRZyk
z4=c?!{p(8>-uvE-BPQkkkNbZ(>0Q!CxBPa}7WMqir0=We+DRYs{BYu<liuX{-i_L%
z^(z0dZ22E#pZ}tsSKm>$SlZ0ZU{1v4TJ-H9t_RLKHb0klz%{`&Jb#$WwV#~-baJ~c
z;^|ZG)p_!e_k5SjBR~AhJzYN104>p+5B#bdbCt4nDd{wldq~}Ej=Z`aJ3r4gRlVf7
zelv%cwRx`7hD%27U%qPz11NWspUe7RJ@Z_x&QQO!^!f4IR>t}A;rsl^fMo8n_=Elh
zT&{)ZFI#j={1%tXx>!CikV+m0<bB{@HE43aQ_R&w!X*$J#d9*xLI0{<uD0`+ItA4n
znX9Xa0#m<GuKN6C%a_&hNx|eXzF$p3|FUwoExCt+R|xXT+Q=M!@`ZBK<?H|d@2eru
z+?}{9X1*FtUgN7t&M2u#&I;&_`*klsH$DGWk>}DYHtETx(sFWQ<}(`v&e7D2l5lFe
zt*2t8<$5w)8nAvF097haqD(4GUP@o6r~Lbh@?4f(>~gJ_b+P?xKXSRYb!^-A6@Ah&
zeO3(WlbnChXX8Tp+%)pUKK~$n&KT3*=V{qK_2m3gubzyT`mWQB{Q=YSU(=bJd000;
zuGkwhyJM;8N42MRMa^!j`DE#~OK)zAk25`{Dz_sP%!_K_m!o!jw2Z>xs-u}*x*0F6
z)XfgvoX?z%O@W&`w)OW@q9<3C2Iht4hUSH?4PB?3`{}njW~O5)&shu-_$<9z9yOJb
zinn9Q+bXSv?1_-Mt+|bFMHJC~&~EKIZri#^8Q_{<vD@+iXh~c5Ko#UAR(Bwjdg>^}
zn(dILAB|MBnJ-!C(`61)ZB=RBQw6|3WWE$Nw};IwmZyXzG`H*KF6&*@`W~6;>5OEb
z^fF35%=;a!*V)msW4ilD`a3M&laPx7bF1}J&FPm;AqYpB8Qp<_e!rRRH*9u9&6jj@
zhxMb;QhtXtx{}_QAG5o1I5TIS<{s_gc5DAJ=1A|l`CO<~=!f;<<Ene9S9Y8cST%q~
zO~Z^FP~fO&b4T{;Wqr)`*m!5IF>?!jGBax;eL5W#I~_?c-=>$4wl3nT4|+}_JK?D@
z-^tWVYpEY8`0ZvM&jUZ}_g`r7*;8^YJ~?dg(5KMom8tn<c1`f_%f@Q!Jgt1L4^_G2
z!)nT2Cv*A1jJw8sOD);TGXz)XmsUs3O;Pj4@~F9-*ZcLT`Bv!W&`qHQq4^8g9u5x8
zyH*gjyaM=soVxCO!KQ`QKXX{=sq<zE;;?4th1Sb{WXQVtVnw%<nXD(5lm=}7*P-jp
zZCX<k;Cx!PU*-W2Z@dgXHMexJY~5Px2=mlUNtz_hJ=SaN;O4!Ft5rHv>NFoSzu5c>
z8EHN-wnFwo=|YzDxuI;lTV=7y-;(jDPE|YBS{XHaWKQqv`l)UD#LeuL@|$lOm}~#O
ztk%s}bn}qyPtm?^OmuZZP2@CtN~WL&(iJne>gG%A<jKaO(g0+oo3iE}dM&d3|G~S_
zH$)4+CY!U?*_(6duUht|v41kO=OnXu$n|-y=I*$+Vz=%88dX}Qc}h+0kp1fuK$gtY
zQ-3IJ=mj+!_csic8F+rgp{?j)^HN114^`~0=(hcnX(5)1><g`5E6tdDbYL=P19eDj
zRRq%Zf5L&wl8tO!RXRtCB?=W)%;d9fDgUEhp!fD++it8m;3^;7T&@}0e+Mm4^q(ne
zc3JBvT(Mi$aVfNTvGwblpm{yEZ3D8Ui|N4jKcXtkYtt$I1KH^*f5NH!Eh?}7jKa2m
zxl^c13f<!rTIv*<Cxt#$g|2i8LGik*E1W`iI)%z9q^F91N#+ItVrS$J!Y$bTGO7r&
z*T#UTE)ZE75flxVR_iQWCE#9ETJGX!vV*`cRdh4-fHY$Jo6`!vBDQ}oZ%$E2#8L+%
z!)9B>?r<_D*d8kltQSVc_TNXz7-g7dPhlR|(pk}Mop#8!&9Gqj+|pWBBk37-T^@zQ
z(kxiN(Dr{n`&w%}13XU6rDUJXVIGoB`H#{flMhLAG0E?+ILxwpRrVZ66E7{f4tjsB
z95A~1KD9oimcr-rKoQ7%=qd1q97S=%+PYcZdeE?}-Z(TNJ}G3rXsze$0h7m2_b*a6
zHOp)J4+!*Coy0c1d2f7p)D3#~rgutPDgTct7-|)MN;h{}bwhKM>X+m<w*dw@M_T%1
zomP}+>qbbIBc-z#ohc-wN4G;S|A#u%u&$Tl#+LkS@ggZc&KaAfo3GV}tImv%(bf%@
ze2<eqOgB36`7kl@UiQO&p(br{Z+$p9Q9jCX5IB-M10It3sqt}w2!Vcwy;g5rHX(6#
zy%C(?j3-4QhA%_fBA;_D8J+nuJZAr2lnAwQD5=@s27Ku<P;aarKOsJ5prQYkh8|W8
zJwQW@P{5#I9&v^_MjFp(%t%|;WtBUbMKW$}ox2_oy`v`=&<XTgH<y6Y<`$tbLR<n6
z@A)^w2f!-T!euN48CI4Ioc*cCE5RG+$YX^vOwa6da&%<v5W(El??R*}FopW6%D5*r
z`*@~MTenj;+6uIF&&r<r2~@tKC!DJH3UwVCOP#lvGd(jgmRg*jIXPrLFGGF+R*1Qe
zh#H&oor8|DZvi6j6#^n*0)$%KN@w*|(>{rU(7WQab)m&;W;icz@S+><1J=}1`0Dyl
z^6S@b@w8Osx#n0Cff~ng%D-WVTDR=kT@K07Q-(CIo5zLR1@|l;-B48=*BYvZ#fRy3
zyB_RX_F=}&KA=AQLdyR=nvfO$1QJx;a<L+pWk+IW2QyipKIU?T&7IJK$*NW1FKz!{
z-+{>QP^?j-44|%08u$wh)F<Ps=IHP_bLy*DjyNdJB0g{34N(9bLv?VazUtzH1#V4L
zGgvC!vnS%zmIYVPyUZ!hf_Jjug=)d6afYgKcecj#!8MA%q=pa;&|{|%gKFz_kX_ZU
zmmv$T?~_p<g{a2NRi)MDjv57z71BH(-r~cP3YAmEdzrlAqMo<bdSoVvRUF{cbQ(&f
z76R@K0v&5A%v?6Z_U~kAQ`ejf|1r08eBzuaheIHB!-v+59HD9)mr{pu)PSg_0^m34
zu|9dRUe}?g9+p;Vs{v%INfm@`|95CFminz^RJ28nZaZoogF{Zu$*({7$Ea!Rz0bx{
zA#%G_`Y37L?vA<Jb2-O9mqRj|n(r+HPpl0L3S4;7qlUzIs<nr=Kp|fH1n59eD`UX0
zJeDecmJ;9w+#!IC36B#?a`IbM!vyDcT2W|~I@_)LkMj0q|LW_t(}feFLa_MRGhzNl
z>h0~m`rdZiPUL^mp|^MY(%X?56z?@a%I66Srb}-TbDtwEL@GWAnVa?IZtdYV7G<>c
zt%;m^F8D*2Rmf{aTe^{VRc5y;6MvNigz+3FwZmEqlPvTc%$_6rx!Af$wZT%lGEY<T
z{KN!nVt=y$$sz8nru7H1*RHK-%bbpg5|MROT=oJb4fF|IZx|x2cM756z>CA2!EFg|
z2?w-oTlF<^Iz>%z@fqEGnRz7q);eg<lQM&3i8X_Fvjg6*wSf%Sb`gn`oRD-g*mwbb
z7h26y3R<x#aAU`|%+UJa#`s9xXlLi-$<FzRj6{KMws%yt!FLH=oC8#KZ!B3|5=-iV
zYZP}IfF{7Z=3wc!&ZpTdET23BPOi(&%#s3GK)$Z0*x}Yb@NuoIyc=Mcdt&Ae#R1P1
zn!M9GESU%iF9C}u1X_|AVGBX88Sl+EF=EbbsQ<+Z7BRD3H;d<AlIId`@DFdOy*AqV
zHT|<lw*LllAi=Xp0|95oIXJ?-RI@|iX{?>+JB!NfPpu*&?za|76M$^EbuDkO4b@4n
zh>It-!76MCl~8bZVzqVsRH`Ir_;hn^n}9!gvTnAts<&BQJ?K9M2O2-cZ0I7Z+4D5#
zNWyDPy+levU_JkNHk+wxhBtnyZqD$TEvi`YBT{Ur6`7*iW(YHUJ*tKL#3)0R$=@=g
zB#%SKm;Z^jI&bh8`_Ht+tlv_E+LeLOTu`VQZYFA4&YlRFn`%VZct!>aMvb*@3-mAK
zL9o3QE^>AH_v-WR_#48tf`iXmhhZCIAZj2|RW~YenO@ebtvl_~dgDlF*)V=@SW!@K
zbOeMP8+|IPPi3_Qgi7o7_IPzY{7|qyxF^0P^L3aNp}zs^BcRABpc2};J=W_2Rbdyh
zwT4M8kJQ@6!Ktn5C~FT_!jr~}ge5FDekpJ}rbHGw>a*JjioKY%s}9WvfdIke3O3R1
znE7&*=kiJ*yaE`+zm=Uolg=XYL4+(df9fJ%G&BEL*()=&bwww`_o-POQnP9gaB81a
zZyZ*6hgIIjK-AcnAGN#UjJaFJ{7ih4wr-=guDh%Y#FZvttF3v$l&khn)N{xdHxBJv
zvC0w0n!9x^atL(4>tdn0-HCwp-gKBihUl^$sOHU<w+?}qS*%k?xM;S;qpwNM0ijms
zR(al=1{RJGV)GfbnRRjI_tr8R=~QYx>-PRvn54`})=o-USNCU%xGEYGr9P1@Dez2r
zzBw+>)#1=5)ARO%JlB(=3!ulsR#EU}Ji!hv)}hyRZGg#hB|YsFv5rO<Skm)wjXFgV
zrKvgK_txaN-^j<;osTQC9}8Q@QZaL{lDORTrYA?`>BdHMH|<{C-U_c^dS+2L^R5t-
zl>f+Sd9FxGcSp^xSjzt~Y!rl3Z}0OMZ=4=A3pVO^cGt$tQF&40unkvk96lcR)Uc0-
zbmp@jcGPZ@)}wZJ;%~I4w!Pqu6^y!E4bv80l;?8AJ=XTi6|{H97!XUCz6Gu!OQ&V|
zQpL3lLl3^Z>{5XA>gn>nXT{g#IBfm>zpH=e=w;99z3=Poham#b=<VstQn8UfYyTB&
zgAI3<XxXk)vy_(VM%|wD!mFHh4y+NmjYFdzIN50TSsOlI<BI+ozm^)ZPX6vwWeCqK
zyO813sNr<2I9uEBP5LQ&X3&^=)1Mnq`bOprtjig|e43MPi?t2QN;LXTUn(C{bZAey
z%;`(^Q&Hu}IBV0+7D#*=?cJjk2<;u)s^^JbO$d>mS|VD=1^l0=)RPZXqf66S$oI!H
z%!<u=GJ@pQQzNwMVD`j2#oB!8z=?Mi@9BG33#+1rAq2N98-gfMk$EL*MqH*oihVaX
z1oHzAvO#3qu;?CyISE+5ioqb&?E^<IvzAGd=Llw&SoOS{t~Bcg9daw;Rm|@VD<EWT
zfqFSdl&n;d*ayGx8I_{uwrKFv<tIze)>+cj1ai|0K%?fi2X7ZifBHVX_ha4Y%U@PI
z3j*rX8xOfS30F+fQz)*2?JI`qtp`M0N4(LEeFv<^7@c0WPk7^U81MMmorT-Bu>nrD
zUIfM9xa4rsI$eMNyDUqmF9V_<r(nWo{g$2LZ07U@v?q|rf&hSIp|D8AZ*-j2&t@qi
za1yivJ(Q4ze?{qQ?#UEc3uq?`6g@TjKx38kmGD>(z_STUSHlu*w{909!ej+aR?uVx
zO;#{<n@@CNXo-|gRkUH%@C%|La*mH()|0d%r*FXF4XyXk#x<-$xA0|z9Lf!$VPmKN
zz>Ls&D_ys-zY=x!<Y;onfv8buxhxan!hWd~nglHkpoi<%;leqI0@wUl)DDZ;YBlDe
z8et3%>dCpKO9fxY)_^Yln&zIwS=K@r%IqQV0lb|<_EySf%&GfC38tHWEp1?}Wraqt
z&M-aE-cMt}u6xhcjpKIQhhDQ{x2QGSWIauhq2j+DRIqQw!%;N&+8<x<omqm~m@=98
zkgz$sG&2N!2~vuvN*1Cy(3)!boGlgF02o%sZ;I8e@J5<@;&ZeXQNBcjABMH*pGC|a
zv0%6Mo%b18%!FY_4rR{P+t<?E*(<yub4v{Ry;v`^^gKR`8j7EVG4}zztSkLXRgLcv
zvppKLmMx9|mH^WTzJD)DgN+gMV5s-w3<P&`*!(QodmvnPFf&YEgYQSQnFncJF!~<F
z-_vCz+g;Rr5nk-nd4h0`a?|Lu<99-p%dGUhOh_s;0Vm1k+-6w9>75m7Q2>Euh}v6_
zQ4~aE4=<Lbq|68D*VPdUz>E6<J{!cgeu7T3lbb?z<AoG4W|su?vcCg=RNTFvrYAdj
zzRdekvok%Gl*8{1=mBEMg@KTgB%<cWiVhu)nQsWPEEHt9Q4T{{ox}uP&XHj;b0doW
z=OD$_c-6OX=GO1|&0HXx>kV`XYZY$7`PLwdh|+tTbtT9zdzup0iBit&M7P)`jaSP_
z3rR#oj+u*KXOuvo^q~k@uwpfwZ{|iF{g+iOFm%xWEBJQB{!JFny@%#=ynBhYi~(k`
z-S#WqJ^eZZmohmyD3)4;68j7pf6vU4YOVR(6p$6GpX;pHIY!^{_$0k<mpaA{d60PT
zpONP>-aK8ub9ZgjJ*tc2a7-yD^hjQOynvV#x|Tvc(<@geCds;wl~(*P3J4(C(^^jI
zsJp1GCsf%GKiS&C0JCGgM#j3sX2YH%Bl#1vF!$7$LMXC2!=2VvhL;m5>R6JsQu3gX
zFcB#xBU&k;q8?a!l}rJ@CzSt{`e0W=1g1!<92}&U`#70=XCdyd>(<s4=$SK>0xkwc
z;~<+`S{^prZU4*{fLk{R;?dUeL0i|Zt=l?LxIGcK6z>_S*jr=nLWl#85~HopV3o2H
zdWctu-1h~vFq>}+n|EQ<M03=gI4|=8Y<GR6YD~N&BC=XIh{6aaB_CyEetm?t_9K6e
zg?<hQbKDfQXUaZbFYn9hB~(3H7?aqU5xw6SX@{L0O%97{VG(^MXXQcJAA@Cz>~S8*
z9?>P%gn=pj5e*|`F?|C-v@W@t#Qk15cONJ)>b!_;=nBz+=UKPkB<s}NwsN<5O-b)Y
zG}Nxdu(IV|b4waN#bpLTm9h|euaC;^^!03X$EV7%i*(x0(zOYq^n|_M1`r52DKo60
za#$kY-mJsR1>MU&22V~kH>Y<2-KO0uKekpeGzakM8`wHM8}qcLKk`vVm?*6HApI*6
zW%v7P%>6ayr|$c`(e~q>knzsxv&@16HFthc8|n#r=xtSQ7WvjM7r0!(Es2RrgxjgR
zyK;l*RD)<=_Hplw5?26nFasntUu5>yUDSahw!8@aQQUH{Z^g)-871EMa48I%VD`n`
z=KZDcY-d;Jxvrph)pJ2S-|j5yO@%LHD-EbNMXw3H5K<w^O|%Eu^AITzBv*H+tkfU^
z;J3bs$~23E$5BO!@IKc1IvO*!%T}w9kvY^!E*>2HM5Q#3-n3t4aV}ouymjtN=LnYX
z<II&KHdV7H%uy|8;UW0FUDlt3y@y>Xv3lq)+qL0zo&GoAUeo+`+@o{0z1A7Arjr4S
zxR3vLMH|r+*_Yirv@^1Ym(`iV8L5KOWCUG8jUF>2?8Ta0(AALrf^bPa@%bQC)UMgH
z5_vqbtEEJKWi^tKU71mOYThnnu*Mlo8uD|7e3Y^UEhQOW_T!@L#{$T*R<&SH{q*Gg
z`s3Q89jO_|<(gy;7lMey%O`Uo$i?7Wxy!&TYzE&isG|fmRMbpIg(}I783&2h^s$<9
zTf#3}eT<OZ=GVxA7|1Cuq`GN`dfBZtZRRB!+;#69YXb~IEOmJv1oZ;2$YgHe(v>lD
zyXdE&^IY7Bl1bFC*41*@^&L+vwVJ49R8G*Eze_{by`+*Q=>~cK2Jf`>)_h?cxNv4i
ztM*vtFSI9O5>#Tz&BvwHvBK}Lnv<Qj6JNK+^A=79GUqh6-FG$xFOXv6tU|J#BRMnN
zI*h_JyY}DV6|@sXo-;^rAFTg^i>#CZEp$eM0w>_Ie#9_9#T?HEW$K4F<pXA@BxLp}
z>EUq$=D4N5N5S!L82dh|_#jCcqc0CN%Xm@x9)k@6>3?3u_{|$jB29bm8x}I&IvP&i
zSdtkV>gmXfkK)%G9}&_vyftiDVdsoe5pt!{^++LMvr}<84_~iv3f1W5R76dzTqed8
z&@Vf?$Kg}ims~#$Y|fCmM+SVNdTr;3eo)QlRYrdvnvh|}k-WIaIFg_EyVdkD`xU*j
z@bNpX4`tKtk+*__yuqu^|B}9eSI(}&nD)#xD6MXetK*R4>RM|uKnme*D)g#xmy#Jz
zSV!(4E9seY1~U4(#X`C68*06KySyZ@lo)rG)Ma3^Wb0in*GB)rN5$L>2aV$u)}xXR
zcHTQiH;307Q}3IW&>ZQ*`lw!-i4Q@-@@97GrkmS^mH9bV2<VB;h9Wy(&8I1zUQ9#Q
z7YauICdiRrv6tyL_c&VLldUEsoSe$k$9v{pJvm-DbGM#6-Ryw!INIJ9g*AH#Fvbu-
z8P{yN&Uu|N#!%vm3S1;V>pwFfU~-74S4LT9(_B`OGM-lxgn`S8n$JsBSX+V8DXObj
z@+@bB`Dg%9+WHk&h(3sOL9V8)-NO~L^3^P0RtFHNK#$cepdBGR!%$%=#<AZ<T0biq
znCE2PbLz`zSr^(W7i6pe^+#JiT3<-5{Y)ZF0|{S!gt}tSqQuzDMtGpk0XZ&U>;#vU
z@_CeX38k|8x0B%x@624@6Dl#{mskrgl11NY_F20HVb~g%!W07p+rb$R&14|RvnI>P
zhgp-~mu*}(*=5v~xSSJ4sV|g%i8JQJvx~}uj;~SHU+6qLj>~w3PM^s*s^de9TS{D+
z1J*Y_%${Tya$-0q*+*n$*eJ3o9F%hI50vFbYt0RE(dPLHx5{YE_hu^fI!`wVh~u~A
z;cjoN6tl#{TkD5|2=!HZNn%gMUZb^%H6C&A(5grJc+np2VCdD>Xe3BhWr8s+fMO#b
zz0r9WpszcPB38$_InCYBvq>&FD_8V0lw49YUy4FBUDhN0MPHjtvilwo#H!;ndvMr#
z^bRiT42szPt<M1Rr047C#jQWyt==D@HS70xWy>NbyR6U3q|I++vxZ96n`9}b)>_D5
zK#M|FY&)4T({t%WG>S>jWju7#AK+mYpTe&-?OlPXoH0-esjx^IUcpahwAp8@Dy>G*
zP4@NVY_sm+cdfI)I)E={fuYlrtvi_w>B;GP*>FM^VO6+wZDCjd{re1``+S*~=~*S(
zA^NKoJ|D(=p~#B0)(dSiQ@NL+&pEDmNar51lKM0dMuy@O)@`Wwo#P|rnM$Mb9*9vN
z@ro8jY*@(VGiWO_K{uO9)c}$nuk@M9CXF`8rsrX)ZhAgct$1!0MIYtYN`FbuLUKDj
z7m+!%z}432Dd!F1Diw;6^QGIxybsO3FSY#_b&F#3G0HhBFam(co$o2+1A&{j%F5=E
zFs6NrLU6}Uxp!G$+h5Yft)g@Vp|SnDN$HK7WbE*M%0}=;Z!~#lNi?}UAohZT^&-_Z
z=6&88bBY-%h?@6R)|B<um~X_efiTmL*K5rm&`7lIn|d@ks|z#3U8seF7i&hN92IWh
zKfklcoY5Bx9?%|ooTBE8qw;S2jCbSy0+-hG&+-<`i;od{j*32Nz7TbH+Pj43P4ex*
zc;f@Ey5)E6OH9^{Y4@VIcE!gtW6^V4k1#v%aKr`&c-w9NwPc&K3PQ^6N42%nddMrZ
zn58wZDTvjfm;$_TWAfvEDJBG1aYO;^F*?CbgW{+Xj1Hg7WF2EjS3wwHw*JI>jTs75
zd;pVHQ`Y%-AResPT{Ze%6sEJiW{A19Eh{whc-&iLBX+m@f}@w0WZpppcek0bP9N;s
z5OYaqQN|sH#{+JdTm&y(K2Nu~seG$IcfW4VKtpt3S(O8|<x?WfAH+T3U|D>Myaew&
z8lP+gT`+;*;!2piKj(#*jvfZGHSW%ky(>5LW&fjKkTpvao3uNtVM7PoqzU<SXt(f1
z@EB-52d{m(dEt2OolvsEkw#JvI(Mb7z_p`9ikL4(l)cC$iJXB*Fy4bw)PcRxcT2q7
z=vx+_X!Na!kG9Sm(ocjpcoge81Jd|(o|~;y95RoGh9AgypB~CW8aueo>BtY6yBzZj
zt*L`tc;2Q@fj`$e#-VFg-xvQzsBEX!^ekCMdU$-M-5tNwNSDOVGSb81V~j%uiSI^)
zPyROwM9f{rPG9=BQhmcmg=xXQ>Yh&26oO&K&g%3URccRW71{ZTdyV&w8}A-9cIImv
zJ}k^ErJ=;FG!hzaXX=df-1uxGJt97pF3*v^M;nKRXw756k={;M8+-2}dKr<aLNk^q
zi<n*7hMp0bGD(e7sSihF#$`(uQBuoj+J^UvmU}Qz$rO-*sGT!S(V7crHX;hXrx;?U
zKt3Ub18MfaeV}Wo6$nB&p0ifRWix2a-&Z_u$B@B=F_)R9HLq~K^f%zIRt>NmG_cjm
ze@9f(YBh&3jFU1~awl+}D#DgfMP7fqzle__BQs?bnV^akW{dn)715f9Ih~E5nD2z4
zgsUpFX2&uVy<-Fk-|S?kiiubQ3vC(8oq4>B+ROHQb_yFBa+pk%BqOJVlL>B`6O3gu
z4<G*{$B2>*)_JLLfGg$H=vTrH!tX2}TVAm@H7n2h{S;yRY*BItr(Hb*txambjK8iI
zvO7Txm5r$fTybnj3l8*Dml%n8z11bI2G%x~nt9CV^R4iuX8WvF<!Y!+LKryq(q9uQ
zKk6V{^|v_oV&=G)$l*Te6KO+K*Sq-iI-fEgZlE)(?9TLkOmclK^)2%pX`~C|T*mNo
zX)0NSh}s=TENm~|@R%l){MrubF)^M?y!%yeMTe|mZ>YZRl)jA8Bd$y-4J>fJ_DNma
z|MW&VrN`+~#60bYuu;N>k89+GS&6a*{>sPCM0tVHnsu7(oFEOb5OQw}n5!LiWA<E5
z7N^H@uP2<TBcsfNcIc@;l=|cjqH+HL@QQ&<6*CYqHE)*NeI;(0FB^w!n3w2cx?WVe
zloKpg8b?pk`U3&PUoI3TdOi!9iXdgzu*_m;2${n=FQR7hThRc?=?+N~g`U;ZN}8kK
z;;acG)UjGxT_~&q2Rkf)Sbme3EG^cE;R5<m4)Z6dnK?~2o4qpLWV6$9F7>!tS(So1
zE(KxYdNR^r`+wUm2e8>^`~QVE=|H#r4ZN~CK2#S)#t|C^X{)v9c0QXanY>=H&6@Xj
z7Ay6$Qh^Sd0nVZ2N-Hq`X1Nc6*Kx?_hS8kXp_HCy{fvFYy0>wHOP*i|j1YHe!|7}=
z{dN{Xai|>5AjlPCunsd{jtWbA5dMhrVRLKlE@!)d>x`JNG%@Zt0yby2TH+<5QFhGV
z;J^As>VS0<15r9kc;ZE+0nUYfabyLb7?#M{*!A4v#^j<6y<#|3?F|l#m)UJm_b#LF
zyk!Sdp%09{kt>F@BLBEL8r#EEY(+E6l_3K2<!v4MBOx=~UXbPce!(r1$WBAiZY{^e
zNeD@sPXK_%5x#Kspzqh^zK>Ghv-iy}TQ?3WQ_)|ByS(Xq;P&@a@&pzIvD6$N3l?NZ
zp(JOJqmu>1gZ>S&H)`C!hc&IKXshAcSuBZS!dF<!o?yt0o8+62AO2yY6edsctU$UX
zOgUe)vpwMXmoXV{w#?dr!cBm~shrgjtt#~?-FyJi${ICINlJfHtdG|8BZ^v&>=W>}
zm2-crw9+SA-*$2qO3n(!2-u!~ADQPuX9!d2O4P+tlfE{ZiP!Z-jj2ani86JcWDPkJ
zv`iKp6`+^ssTl!fvyyZx&!gmw(&P+pW=zy9Ix1=nA4mEOuRQeREYNRw<E)Z=v~;S!
zL4r9KcLGhNYQ#q*{xzja@10(vs+zCF*?!MhvnIP-&?6hs%cv{Oks_f<Y9Ry`C4=wm
zpfmxLeNY;;w@lA&cxZ>x?BYy>`$rH3=qvT)yaqP?+Nim!#{5|BMdq*q@vym%$9yH6
z$dU+wS<3&l*0fh`+gio(gY?X9ZxtoSxz?RzWW~rn`bAG4u3YeVe7J5#9y1>6VjYg5
zcS(;QCZsmfAlE=!QN>RVnFqrxdv(M-9Kxz3Iqy%X<3G@v-W&?t%muBA`g5HJI}}b`
z-z7443=)GzqUC9dAdGLW50!P)b8F`3&@bKT<Y`aEy!(tdv<wEm&**g<^*YSW<r>A4
zPYLa*QTgqM3+Q)=`Hb*Rr+PU)&=XFiNqO$brqO1rbba<YHv8;@U!z>}+1VkiU&I81
z?b`Rej8khW1;SYFXiZzdCZlhL)}*VKh}QJq>Sd<Z^n3Mkjn>pcRim#~Yr31dT$aNz
z_1&U1{ZM_c)0&`DE~R*nnnR+-7EX8}Kfo`jo7^UFP<`#`^JoK&+S|jImuOFm_dqR`
zTt6<`_-tR;>`Tiw2y0JQ3Z!e(Nm6K=?kEN!*wMEvg$EQxNMGizQ12%3cuKe<!{0&@
z408iMo=Y8jwH9V4Wc!XZy`?oN8K!wJ%cg7LapP25pETPKo*Aw@C4PqX1SU!I)>^mS
zquOS$Zr$DzvOD<=2klj_h#pUkI*iTcQmy%32!5z%Q?=F<fi%ceyqZzOYdwd`LS@Cn
zi=Hl%uY(53`YWL1rmTQd51uY!l<|vOl&Bb48*Z6fdPl6TL3TH`@@wUATnyIlvS!?s
z9pQZ=Xk)2>EmKgBep^p1*cDP8r>_A5osky#Rv&R^)^lcI7O;&Ylp^NG&9;`jnzai(
z4OXDH1#anw)mq-BeRni<RfS;tgIm|%K>^UDi6elezFTW*Cu2Q8Qn^3pY4k0P-(>VH
z*P2#ww5?BMKfNgBRyv914!)#9f6PQ!{M^K46@D>XR<t8iWbcFv_F+K6ZsD}$YPv&r
zFrkI2PeYOf#QU{YVM_s4JfyTFp})yCi!{A`-@Tz!6l3zXt5R3(mg~KR0@7PEb)ofO
zhbnPpw(#(GGSR4cX+LsUuiTjhsMhoztWG3#LqL|ogSl-cKY4Ku$muog5dmUoJtV>9
zw8n9(x4IetV)H(<aSpy`sstU1mSL!{#VbvXQHw0t5-+ULp1!;<a~hO{hhOClsj1_=
zAYxwLH&Cz`f^(l2LmHX4m*x}0oL1ctv#r^_uTZUYW_ZYWyEha(7Sd)P14ZLv_mp~c
zC#$9R?m4x4;xoVkwXnUjxqCGxPq>fCwM<(S>eBl$embe?NOe^Y=DWAFfbd&0&kLUG
zsb*<G@Pc))JJ^wt=6AHFqtMCbw$^f{ANN+ewWf>^Y<nx)q{W?njYMK3H<jr`D2s=`
zgvN$~heA*PS|Fy)J|s<sg7$-FHFhqLG1l$0>Q3jGjQj}#p*1a~0<5&z8|G3gEMheq
zdI-$V-w-AHmn@_`bxg18p;nvipD3)N>=0&JZq~G5lFpm3g>BdeAV~>+!w!YaqmA#e
zQm*)^5m4+D8f~Ca+y5py0onVI7JHY%d^Lx$*+SQ-LVp`vNYR1n%3#8)7DuFg$kH?5
zkw6d9BqZ#4aEay3i)*cD!5|CVWu)JBGV|jnw+3>Vsg-XqLOnB-DeEdbOf&Oi=91Et
zk+R-!Suf2LB~DUz&t?}YW^v}2I-OCQiPr3mG#JkZx&9Gzr{#R466U4+79{+t(0W<7
zZ0+MAIZ-ixtxa%x*$>{Ln@2(>(o$rtLv3QEi?Y;*J0*LEwSBSLB(XXRE2l|HTOn88
ziyWKU6*L!hA7kdtJ*zjUk!Q|U4{q!kQ8iZ3u+%7@82d{A%Ngc2s!>OP*4(plf{ZnO
znln~`PIjzUQz{Erv1FMOdQv_zR0m}uPyo1S>$&I9OoB9WGH@t6rP5`5l_S^ai^k^|
zeT(BW)-R!UusvR)4r;U+TJsoHXv6;DX^l6m^1bR?VuT#tvcyH{o;=zyw)xT@@WNS>
z-X|GClIlZ7<wc28c&yC-x~fv3^3zXILOxbxKYp$M<EL8smwaqp#7O9k^Y@=6DYVu}
z8j=(u>m=in6vCR)-*R$pCnpsOI0?CJ=gq4%&EZXs%q41p)Y>rl?KzTb?YyiXl<B<?
zR)%-%oW$87ha9R&D+(mrR1OKzVxoSRWLmT}siLO^n5k9zE|s^JypVZVx(ugxsPRgJ
z=Y||YIH*B5Gxm4#k5a+dR?xeL?Jz(67)i7N^HW6)s@*W{O1>e*=qMEIKn>J4G5)pn
zvWHl;iR*=P;ANCT=U}_DQa8}3H-q)xwt`HQ-@MEWS%kvOR1*1_i<m?>Ij=<qx>SDV
z%a0y0-;`;{du`?<K_2M&65;k7{!O(lJfGt5nx|m>7OtG9c*L5=vc|_kVp77OiZnQL
zr;x9om6nU_*|<qb$XSO`WkH6FgLJz=_+;for(7m&|H}WOc+%4-ry(TzY}<bmIa7x$
z9}AJXlU!NJ^3Zx%31$0U$yddcE6FIU^Akxi5S2^7!=hyv2d|s8L=1K=*Q{0C3p$ro
zT=6W>wLczmTEMRbRtfIfu=lMfp}!-;@?03_B3Ih}*?(bRhz{o&(|(Gy;fkZD+-dy|
z0gueB!pZ%m(_O@<GXE}#Ax=UB&lB!*P@tc1PphY{M?_$Q&?LkFUuW#7%t=BF_Ufqz
ze4*5=AuNAKIJuxGmRwL!|H<$5)U+#lC|!1JO~L7MRB<ltNPL1947zuhGIU&1P}Pzr
zZcJQmed3G(5?U$3Z?y;=BK)Ezs711I?Bj79eS9SZ8Ihww7R>bA43aw{$5LR;y`mW{
z5Y7ul#jAhjj!gE098*(y%5?-5X)SqJ7ufB=j%A;%371~G1(qxzhMd=C&eoo|E-$P-
z(H0JFTyaXMj1#Esid3vX+(7gG60m+!N*5TquPJP5OFU;@UW620sg_#AmU8p*0>pdX
zILexrLYI_QTx8QQ6u$c#?94@_)h>#e*A|giiF#!zLRGmGm@HHjL%)uSZnCg{g?xXZ
zc(X8%C)Nllo0M#&yQsv$xHLxpl+?>!jHMoxk?5%_$HmIFgnHb0@u3YveQUzQ-pY(1
znIHEx3=M?VguQRIGzzdXg<I6qC6>YHI$;(PU75=SH?JHA9DWf>RR@f|F)O?@lbRmL
z6mdB}X2l3v0eL^y1}b;}{oFE)S5s<z*l{mxb@VT?faqUJ(7&(=?ne*v78aXK&Iu!6
z{SKaud+D5~#rcOo=96`!wGHHTi9Puvuo14zlJ&(rtQ*Iv>)2mNo-~3aKJG{_1*Z#|
zpL)O^4*!tyw0<Iuib5*bh5qZR?XvqlyD6wAzoY7!o=qyndLFPTOH)n{hq%F`t%Nr<
zD`3?^53)KrC0UCiU+Ful#jITPTDz^4G;U0~tq`CZM~){Zb$YJlofI6*9LTC;PJ4|S
zPL?!fBF2$piIX}#=k}KzPsz;l#*w25q6dISogQEIn^|3ud9vRom+@w0U{r+|<ld-Y
znUmL{G}TOW%Et^_RDptg=0Pip<iPEFAGD!ZYyt9M2-By4FStQ&XY+FGo0%vqz+Yw9
zRh3#34qmR1dt21KU(_AOA<wdOqir1%iBtrRMq7LgwI)EwMZr$nf6sq9`|n*@7xrZU
z&elIYo4HwKUU`}*9)+@4RcC<S4;CbEDhgLEDh+7g{;nz!E<Lkye(9O<^D1le;*+%}
zDzzu{yx^e~{<594dGR;~)G(|d>V7_2wk`3QNF<ddiRbjx<>S{Mr-25qH|pM`zL{4R
zG^T$8?U!qcg7~RM8gELj5eg7##<mtfLNX_}o+OW=)&k^^jHh)ZspREF;bgrx<4)e>
z)l(1ppmgg+5QEGqOU$Zqt5LFQ&8?i!qJqH4P`2E_#1;kwrgQJ&XWWv{K>YSM3;ssK
zuGy*ZIX;{qLX{=)DV5jf#n08A7^yuG$_wsVF$R+GwQ->}?vVTWkT*|qYuwwgECTlJ
z`IQ&~!tHo#+^<H<_9vbMZjB$w)MTVw`g~M?l>bq2e7L<cG4@GkYEL>-d(xTOlQOkf
z*^7Xi!TM&UR-N<d2ALM-lUjWe|Bd$iXxa0~cA&;G3|~c~69aSD#afqhZZ=R{&`o*4
zW#bMgn#~E~`05VW=$eN@#&+A<MHe`{SUwR&%%97y<A{2S6bhl>i~_AG0WPc$fQD8d
zhHpq0glZ5Xek=L9`9o))c7<A15l=nqgP!6!G1l`Ujf71&Uamh>;eV3CsM?<Xh>#lg
zP@EG@l@$$cll|Y#5Rz&L2W)rGx4S5uuQea$(c^iNqb1L|V0}tx3_$p-L~h4t6eK;r
z2HVXU-lXT}>ZK^@`LVpbgc)SPzuPwaNx(Slc>q({XS8+USw0+ooAi~}BfV_Qyh)4&
zzBe8goPXeCimVBbIc<7NQ{K{<s(?rrfks<s#RI1xajj_@BWI?RXh6$jcV=)>_nZbT
zJ79ZdO2t0johdyi3zHmYAC!-7#vB?A8kb=`mpBtRtou+3zKYzA{Bt#BE&uyDty;!Y
z0q{N&|4K&@9se@ZW~C!Hrp*(bQDW430B&1D!TV0nWn_^l=d9?557@Z7HTuXA7Rjxs
zX=C8TWXXxi^1;bes5aCp=*SJ%*M)9Z%{d^-KA+gp&>RZlm3_(|0mr2NthRvovtWSK
zSW9CE?1qIrFfT&m_9NO7SBnGTJdTh4krj{z9Q{MfrE_D;rE`OG(t}6$Lx8PD#|4ub
zofP3tR)z;%b%vMCbH;~*s58EBUW*J6J77hx*)=(PFG@^SUohrri{FRh@u%P=2EXyU
zbkoRz^%kSjm6)%arUTgS_$fveF1Xf;EwZ^xX~9|!=fS%(pZ*f_29<aRL5332s5Na+
z{uK3Y<YqooI-5?xN*P#VT8OJv?34#DT~9a2YL)G@4sBMw&yivz-*=MIjP;uHE{nr?
zyjTt-j^eS#dI5us{EpkmGEFI9{aFg9?yr5yK?BcuQoL&Bf%r+fsVU1OnXSi4N;zXS
z;KpWYHrRm8lJn&r^`$c)yysIQ#wt!12GcpV)3f=`1wg;QmLO6{>Q9ZCBV)nc@eA}M
z8|)eDd=MQ6v^d^r&shIKB4k`5zRoGnB5*Sn+yyzggl!<oF>wxneZ`>MY1jI@%oZhy
z@(67%zV!eHP)R>8Gs60t`u<285Xh9R7xvs*GfEhmlqq@KYzm)iUCUmh8K=M<C-Wi4
zk947B6Mn?$b=x+WPJ7aS{i}07g$!dBpGgC9=~qm=6!MMYQDn%K(d6`xAhN(f-E}CL
zM7f^A$9R56?|QQFF~(rr;&XL|#InWJ*(h{U-nKM~pgUtrW3N1@Q2V~BAVk;UnmQOI
zdKyD=pa4$hf6}2diQlNt$tT<REcV8DK6>K7Q%@Qy%T)8X{tVB*)~T_Ky3Qgp*8%$p
zHE!GQ{VjC5_!3%>i^0RBfEW8GLENmo4PA1iOoEm>nehs<Sd-4oUAF&4Rdy>|?G$*o
z1FWR&e?{^P;)EpKIA)i2C}s)%WrHfKZe+7kQ+A!d=`4_R=uPQ9YYKSVzbuLdoeiJ{
zm|VFaF{71&ZysyYMp@lix|4dsN!2>3$DPz-C-oC2wbV&{*Ga8(QV*(>*`NR_&EDl?
zJSG__&r477P`vLv@}E}c+D>a6KxLIoStX^FleSKi^KvwG42#?x(>%mFjf!hIu`PID
zXH8xksjBBzF<vGzXHq<6g46z$EgK(8E7L%FJ=hl?VO)mGw3HY=u&O^({Pb3<ji>>#
zx;dsg3s>16))Gxv$@oGj;h)v=%=ir_zo&){#5P=4%e$VEE-N%#Ml1^-pJEo53DuA_
zKKN_Z!gz!kPQM~Ky8J!lW!Jb>>ax&VVMY3Pu(L0G$^j*3I<I_Ca5>SM{#`+}W}k&`
z2?JlS&$xe-D{+>#ZXUAH)A%Kh5kKpVfrba5O`Kgd2eO<#j>eg#+PWH_5`^(RUOq`l
zi`Gd<4WQ2u!fE+3)1(BuM~JKTM1ePRt~m>v_(&k6=BeWJ5FQEnIE=`651R?jhl+8c
zn?%0YsX%ryTYip;59PpC<dxznzZ0RvEua8oV>oa%a+IywyT5WW2~frbb&kH|>RRi7
zAz%F3FBJ_@y8HAFR%+We=Y8V{dC#unZ6dpKe@;BC5o&8}wJv&HvbI{+szYk4b$Ryr
zin_Jms(MU|jq)}eW0#-z1tNvj8bi*Pv320a|N62I22+QD;w-3yq<dLf84Z9rD3rl-
zzWr>jW_obV6X>Ba?QS_6&6lCtsp2}`t)I_Sxa5_|Uo9EM*8nKuBMH1x#hpB?2LTRU
z-9Y-22<c~JZmDrURYj)#j7J87_r(bq(+Z_K2^?2^T%+wNPG_1JA9sfc5@P$`C12(=
zptw<URs2I3bWrh<ocMUie#F=?UkRIs)S6i5vnFeeY10v@^Ry=6LOVSoU-RM$w@jMI
zD+W)^&kJ&!#f#|4_TT-OBn}9sl>>3D31pG4m#VLG)Ym?RhcOd9zxeTDmaPO$<0IG_
zI9fe;eA!a#7JSt7s=`Em=3U9SnUmc1`&9isR#-kJ3+?A<dH)FMx91nq4LY*o=T-V$
z(y`zt2~R9&#s3;JKapuq)}3d0f1j9K$ezgjge5V4NfW8!MLeu^Y<jX9oUCt3)^EsK
z8^NDNbD-nn{3V$<v(q!K&jE__p%<zWf^Ky{A9&jSu|F5IWC@n$ET5_eSw6{P?M~N2
zs<w%R49k|6t|cYr<DyVX&r+YZWwk_Mb7Q(na{BkyzvY8+TdisUO??$VKpL@5cIqK&
zT#q0vb{@O1@fd+t%h>2M`c7H)F`+^9N3eLr#<I;Tb`1g~sKg02hA7eI&;uv#*f)5H
zTA-=4TKYU>JqG4h^f)9`Yx*z`Me>zy>!CY^)Pgc1ph?Cz$pFENjcGgfDO{S*herD-
zBi5RPoa(9b-a(HL`s*mSh+&>b{wN)8mmora-$fUA;%UvJD2T%0Ln)|YDb*)0Oapmr
z(ro{TN6AGy_a6P6Lknlpf)k4HXEeap_YYXX2-*d#%2xrRIQ2ev5uFKC`ljAHQ!+M^
zK@)p{T4+53VtBF0U*Wx@Wt+LYB<3MkC)PHY;V)}<-(K3K`dX?hmx1lp7*#Y8!hb!R
zQ|RPy;Q3FJZd!dX=FHf7x1K9@_y(3TXSCxCH!012J~KWz(<yh0WMzZKjlqC2>tv2?
z8i(I(6HQ;Zw0h0(P>Z*|sv<tp-l$?EbmTW4{uKBwdq>n#)zvNkU0T5sTRZ0nD3oQ^
zT$HWmPKf|0;IsV&KwLM!t588i{ZfuQF_;o$aSW#J#9(T9W!9C-;lbcB6-2F@001}=
zAMGS(JMb81O#8!YU<d-EAcwVtJ?8|(xK%c!h>PH8@f%1u**F!7H7edk2Iuxq84*ju
zQOF_0OQCaA5AfMp+NX5Z1Q>MO%0ck8&LYdSBEW1zE$P%Zx>%3#tUq?O@CCG-@QT*v
zPT37f&mu1?=5evv&F#tJOC=TDwLHS+BH+~(y>@-)blWv7oLuJS?E=@ZEz_q+YG$})
z*$g(*B&lF*tR>(=uhWb~>Dp`-e~R9YJM(zyty<I9Wp9X8r6Q%GREyOGo^+vcBJNm0
zjr*Od5-nB|+^VI%qh>JeB`T}Y3ohL%0|g9=P5&>**HbMrTIi<xg`{8Nx*;Vl59z5n
z&VU<ky`bTQL6;93G~mK74z}C$&y-e-PH*tJRV|qz=D3SVV<g<X_rX<|E0x;u#qu~F
zza`WYaplEtkcXG+GP9@@`}Uux9Td^)KGIXgqo}HkCv|f(-kIVNs^guhyU!(<RRLB%
z5m#tUgjv-1S|Y^c`}D_BTWh)lGG|AM?9QmYIcjY329K<2ikR<4O_U$go*p9On;Ntw
zIMUSM@%XTYSkT*$ZU$T-c7oV|cpH27v~mMvpW1D-e+Eg{!WiHG{Sg7ZrM69tKv7qG
z&Uk0cLA3vR^4uV?AQFYrWOZhk(dSNh<Q?5#Ea=M`g4Se*xe)}m!@;6Vu_~^276fJB
zFcq~Sdz0RH1blF5-_^-8iw~eCwEh21RU+K5rvyLQQvqzlQGh${iTysIIX&87UtYN~
zGN)}uzghvK^D%d2a8Em|h3o0jk#r{GDOGA>iNA<m%xOQNXgKw#1-gfWuZPS`NSnDo
z6x^SH3+umYk$Y^BQ*zvd<CFST{Y&6f9N^N@IR}#pOtIZM`<?zFoKxkQNVoS+kV8`7
z9Zvni8Nj&V<cGMq)@B|J1&=1E{0|55RWXtRvU6eQ)ELBvl3h`Hn=Gs_{fP_2hl^1>
z%8|k-cG&*w)F^(Q9YwPoHRdOb;?q#@Q&9~3!%<{;!9jOo%8!<%5W{>9jrT>dN#p@#
z+KC_dHtWtW4#w9%m}h<@Aju7;4}GvRn9oAN&k|3{U|0>Yz;c$PT9{xb%-8^rCju`a
zY*VxItea8eu1($S=8O*n$9b^Ve&9B}?h|Oy%VPSg45?|W=zwzm@>#QRk&;7Wh}{WW
zR%#p>wQ355{~(1a<rplFXN)jiKXNiZw$A)-W#jxE(%3kE;<7t3-*bemeNZFEW2jn2
ztutD28_M}L<n&p%ddi}`T<V^hpSY|yR3iH#evw&Kb|2=t51wcJ74bzkukne4W|wu+
z5-yE96Ph`rq^a#b&DeL07}}XaV^&E33kBq4pV&;xU9RYIlE_vAoN!LwkTV3Me>8C@
zW71z|uUWUV4cYS^=zS(2{@c|I0)O<a)-<}O-*3?`b~tSVN}K_hD<5igwkYW1K|-Jg
zJ9TBA^(rvHk1-@y?`joR!_;W02D*&Zy#;V*W8->-F?F9SzW54r)V`kSn4{lBug@Vs
zt>ya#^4%=jr<SOKOa8pXN!CRSHWciPPqepiG?!*DgZUtF3PrfJv&J|dLt0pF`zNC#
z%AkR!@i%GqsK{j<>81QSixdRd(yA6d?yMCEK@?x{L|-Ti2Hz^4=&Epf7}W-^Uv}O?
zdr%?IeG}r-Q?WN{9yL~b^Acz3bz2;oxJAb-08#&IpRkgtqAooNYd`4+>M%Hy`(LBe
zXB;VA)vZo%XTj9!F$f38=M#gfLx*oQN;g3vGkXW0>k<Q2hVXPLP(_T|_67@v0ZbVo
zM!3nj-<u~33E``wM<EEy|14x!?CCpvqW^oIO242I$kQhZj^VgHC5G7k3MsG3>?EkC
z!lMCt0P29u%C^&UgH(2Rvq`#8uYLN@q*!f7XY0U79LNKD-OFN0LYvcW&hSi(wqE5J
z;{Mc%6BN?ndo~bH2ooON4R3W`9t}s0RmZ@^0>XOTw|+9!tRo@}IRs6!?%qAf8lYAg
zv{|r}qPE%UR85?hJ(>QCfk6aE3s&FrC)D#_8>ripDUK%RA9H1fSabPA?c!28xBX{Q
zDPw%uqKL9U%~L_2$#JtkXP-b~FSO-#(b;~+i6>lCN*`%WBgiBWdVOF+0;{&~e*so1
zhU@<(7D1_py66V|);FHbT~%1UyVOlv=HC851Q1^*zyL>~y*d_rgV1@L4BE_gIE!7K
zCq^kC9zlNqf(il<oFPF4yt)cNknwSaE>Q=Db7l&iEWlxP1c3#nx6D7&{$Iou_=<BA
zrulPG1@^Ok;txD1s=&)+;pp}b4^UKV>Q*n954Z6mQ3YzOMNB;#RiGK}+KDQ#cyLsK
zg>oW__-lzRra1O5vCbEONmK!0D6IggWJ%^hYcwzLXj5ruAfy0|aT|e6g5!ITYfSi>
zE#cE`fHDwK;6)5*Xg5(|ZR0IWM1iw0gPgpjP?Z{IJwa}NK!M+>#3?d@i=>_tP@sD7
ziRVPdD2EoYl`8w4A0|5<57sXj1N2J#92_}0BJ;;1uA3MDeW4y#LCkzMPTbyVZ%y4C
ztd?T#X9-smoA_+Bt^?xeQ=va}ukN1Z?FqTHcoEmCZbEwLkHp+vv5IGi$>|&y=lvcc
z$QUN$aL73L@T`>twH)H5B$mN6Qk@9VI#}90=3(<=oXsBOOxh)T@M7jG5u6q)_f=r4
z^mY>0Dqy}8HoJsBdHQ=SIHU(y3_3!U-T=Xjdxw({9rEyC5_wkQzHD6f;U@s$3;zcB
zM;QBY+!<9W&O6>3{uBe(?<KLaT{YVD=WdIcr%giV>Z%Dow;W5j#y4FDYEnN%MQ?|;
zxFt7nfbe^z5<$`nJbZN3Z;P|IguC4UAx9m8U~-xDigjG%rCB9<-GQF=hoE>*p~viW
z4W$cpWFuaQ%+u3e9WS<irM^wzTjtFQyQdxJ)8zf$o_3$slq6G@$av$po^&T?m2m#^
zjX)4aS3VrT@09bz1=d-A6g*H47x59+7$>z*oGpgK4xceiQ9w5IR_i~Oai9~fh2FKM
z6wPyBz-17o25YN4Ix%OI+FiI+G=K2mm@pQZJFFkpQK~O<ozWd&1nJ9IbqN<X(Kvn_
z*H?1~KDNmBQ;|)HR_Mqx-N-XV8#9IMrRQH^o*{1_J{m*G9cX&;t;jc-6{JLK`bh8>
z<^{{6@|L{JDWcitFe5w>Ma|9DsjBPXF|BzsCAB9++r}DzfJ+8&!@2ixmVVHBqsK7%
zyvwf9p4c5-pO^hd@Umygu3k1??|s>LqcA=sR@Sa3eFVQDHdWNvcUiPOJtR@(BnnBm
z<0I?q>({Q8i!Y)#N{q!%#SVE`%Sf>a;&!#CLp#0NC58AeO02xoT(0HiQa*VVr{PsT
z>Q(dH!~grJ&%@$>l!sUKCH7=~koCvWI!5YR2Q~O{s_?Q$QmPV9OA-g<r!TSVKtoZf
zD?OLR`24;LNbousJ-?-6T$FVYc>yjreKO#M@qFCSngjtJuhyDH%lUXdhksXq$RcU(
z28h;?$E$-{h1RO2atolFArxlZVDGfVV<T+N#47tb9~@#|A=eHwy*VAIT2_Qd7jd^9
zO57|J4kE|P!7)`5@2JFaE)q%XA;D8mU3k2gx4J!g`w@?|k=(Gk2MTt2&7FH|WA4*l
z%M@ZMvStrV+nO2P(ubx#l<;U9?kOp5T&;qcBu=F_Z`{wQh&ks%08rjTTDUza<J9cg
zUhN5GT9?!^qlBL|_W5w!8alJYxZNw^Nd}$t4vWJXKeyC}A+~oOA%q<bO6WT0fUec+
z+6jBo8QBL?+Q|iP%Ly>XI*j=QKAe@-v%EN)J-r#deud4^)$$wOf}Z0@J(}?d?`V&4
z0Kq%$tro%_w%Z=#T|zZ|_fX(&<c>RgYS)CPcppc(xP-EeN9bquy`!xk(J~z@RUOE|
zk-nMFVe>ul$i0-;$FbMANLq(RJ{w-MWJ)DEM9M|-KM3u@$o{GA;g-7=V&XFjJRWX#
z^zM2*FaEgk*72BmFtae5e&pFqD2Uzu^gR%aCWv6n3CMb?)r*NlHeyJT8Ust^O7DXu
zf!n}rTw-JGL}XxEMNBJZ?wMsasVPBr%d2w<g6oA^hY6B|%fa_16k4t|vGSpzOSnY(
zClWH9Z}SYbjL6jq5i~C3ekGc^HZPJ|*c)yMmk*6JeGtDjSAYhpXdr$S7H%~y!*bcw
z(d~^?>60o|p$24$^K&1mbBWX$N1ZVPb({)^s48_X$t??(<*#Cr2s<}LY4C0T=@4ka
z{1#xW*Ufts&!(1Dyi+K+OZ(0@c|}E<_Z?UP_nUOuC#x%yZqS-8<RhcW*P6bIxWsxD
zhZ-&&CTf;)Z$ZY>u&CU7BwDu#1y7CnVbr}vPev>itbnMfsF3BZQWQl~$7)UQ%ljpp
z;>F6a6a`Uw8#(ZAmTq@(Gq8MgG!@B{0AslBY|hU-$i+bV*A!u9YDh9O*t}Yqn&a?E
zBiT6yTh!?>%=WKmN#M`ws~&hYehc$D``flXcv5<NY{LV!!{VohTPEgOUK6Qp2~QcC
z2}XmjC5FrAglCI;Sf&hwae7kG0Dr<=kbI=o=b8y)qREc;bn!}C7|X_jcUjs)MQno%
zyJP^4)egM!GeZRyYWiXGtw`Cs4G%2DTIpFJE1Iq*x$DMuv&Y?#@X}oR&rDw3G-Nd6
zaKY-)jBeRU6tFjHPq?R7{?)bgDgp?-tvxY(y7m;7NTitg$yN^r5}mGdsBLVu(+OI&
z+lWB!6^A$Xp3H*5W7F{$vpZVAYvXYKs*!8lIhaUpcuJLV*q!)7?j_Pv*`CbFz^C_>
zEQIQITld`oRz=>9nRm?zmA&??g=uY#xkb3rirwlj8Av31^t#8IgdXe@Hk$kYW-4`A
zjSO0b`wWN^?BH4!q4cgM+rA<TNP<3fM%-^FSC#AOf2B<G?hUdz<HZ=|pYjh8a-l-V
z+XfJli&hu+yx`>dWY&j*o8nv+yOAgJ1@qFvuYi{eVOEX{VvYqd`J)NG#85sLr2m6%
z1vmfBGY73KZtih#6Nn=lZqCml=g*lTa~)y(Ph;Y8eey#JfS?X@0}eGApGVT5nq7U>
zygfwq=1*~~i9n^CeITg1Ci3#2WL0iOTjrKul8Ffx`}*rA@Uc2Mb1_S$cW#uk00QW?
zcH9nb2>|JR2)(PGPRSJI@(w<vVv$W0pn%s4wTFbc$xO)gB=n&luZyrF2c!-N9n@w4
z1r2I~pT)gV__Lq<lI1;e9M#9GSle80`$rmb;Cd3LS~D@ya84p?zIugHyV4<av_{`u
zi30QW%>RHNx9}-_E}7^U##$AmIAe+is{R-g2RS2+O||_OdN<vejh72sfGR=`%7If7
zsXrvg+xvRmA;Xrl@im&L*o%|%|L~GM8?n7`RqU0s@loD_)870@&PGIIP~g3o*((7I
zW2tFxk&TlWyujPF#4_w<L&gGL<Bh!d9sC`S#y&Y3wI8;D1*5DLv`!~;R3~yiX0C(H
z_&a-Nt*Y7+4xkqqiNQX%X?z(?Z2}+ot?~WCvMN*?>=(Yzf-H$GtolyF@@E{f@ND8W
z%Q!$boxgrC5N_A;7k9X@jjEE2#+vO^%DBzYX@HY!p3mzAqv9Zc0BtUT_LT4RwN4`s
zP%{?>Y$)%HYO1iIC+QfJ6G)a*=|#&sl^NqvFJWEfZ+}Qsv(0+&$nqj<n$({l5P3@Z
zw|{}*Y2N){?922^#6V;~<}1}}h)0a&`is?Tw%c2+s_VhA%g_ci?_K>~wy}P#ah8Qr
zbIaLWtG`W``a@|sxXxA7E+NSL9f1xWa@X421!WNJx$==-D%{s%G!+ewlQeX05r(Wh
zYWw}8W2ENu|6FU_FVO1DZ_D{dKPGly=UTJK$TGisp3eD4KO$x)k+p;Tqc_06ilUMj
zmesH=^Hw8gH2)SrDOptpoAUd1PzKH8WEj2p#8_P$1<$3RSSlO)ka-SyYVK^St#LPX
z%K@K}$hs66N|8`cHPK?vmfGW`_81j&cB2HERX0BpZ1xB3iY=H<#MpDKA28PJu+QMt
zaqB*D*dgNox*4{3ipi~+;6Z0(4SUY<>{h-(S>JAaO9@yb93igVp(kB{otsdB-D2_R
z{vBWBf@t5=+7%~7wWl_*yT0q)cM_p+zu?NvrymS+AwxKh+zTB??yDGxIB<UpR#2W3
zvd=fN`P;J3HQ8sJ9>tM+qV!CMM&Basd&^n;oI7?%YpNuvoVZ_L9gIGlxaCgJ=);M7
zoO-z?9#;<BFRE0|fg6`-3gN*02dbsTaXIV2E%#ao9FFhynfPntTlLQH<tP0Z$FjLp
za*5k^y2s7Y3Es_3@8=DF?e#kyEco-+Xzm5_LcN=nv$lu&9}LG+8&^=XQ)$?cHN?G>
z5<UQ+HQ{s#6E4oesskNo;bl&9={M={b1e<jjGu+S)|GuQV{LLpt=E_xmN+qsYa+Ht
zv?oRdF8-R(n#=o0>5^)RP<TOGx{@)Hw^H&#4cw9#+pFaR_bK8HH=f1ka~R0G((_3e
zefUeesbuus{@`w-?+%BRRDRNbqL9&dk7Fk+KGJo{N4n6Kvm@ce^)&icYRw%q)Or@B
zGjr@N)G`uAADs;J7%%9p`m={J0RSNYxPxuPuF4FvyTU}<FGPN()WNc?oF01me%i@7
zN`KJrD80yWl!nv4Z+^j5cqh#%52da;h@1IUnb|q#=nw9zjttMhV>*6-R@eDifPo5P
zozk;8FxVYhK`^~k78C$E?$GAk(pc6J+Da4(eiSY5_lG`TEv>XdEX~dRPSB$rCupC_
z8{`D7(u4h<KfwRlQvT2H6fOIL|MNTeKXU~*`v|AVBFFz(e4_{apJV?Q{?F0^7a@-S
zGrL`nG-tFXB5c4U;qw$M*P4_|04y&bx46sGM_9syFVt}K_QVXq5<wz7!JVN=Q;qho
z$$Ie20oUinZ$cg&*JoB!+@3RDsVe0hx92SgA_{ogQ%4<-=T_T4<$h)dZO7ADXX(pP
z1`-B#3$K%T4dcAPYk(51;`Mwi>-9Wd`TK^I<MVfD*7m2rCG8MQL+l{bz;iy&H>>a6
zgTFTf&r|Ns9|-?1w0$o~0>rD?Sppvki!fhnzJY10^_wC%;9XuQD0d!i>OGtD;yy`~
zDaUmH63dJvH$Se51Tq%)HnFe@drq@U!)1$TwCp{K<b0o*Bc?uo4p?hpJ2-|OQ?A0Y
z&FAnbr&m7fYBd6Hyo9O+S-0tI)pBc|a4g(UD`3ox-_BiO9p+v{)h7PK!)=TnxION8
z3fMd4Z_!xax-GjK5*L{B9!Jnbkxk#69C*fI1%nTwss|JT*6*%z3fqZ4WC#_~E6(TD
z5?nAlT4$i9^T#Hw`<>DPMjW8ekO9X}9cbB^?XP+nvIA(E`I8W1O&p%z{GmFr#o3t|
zh1F5UHeBeOQk<XND=4srU<Pk%%`>_E!FN?1gf(ji`>qP(Aci^S4+N+`D-E!(@m&=L
zV}M&-&;fo#<CXj_j-So%5)rqLu1Nesk@CzVp@zyOiD4X#k}k@$KpA|QhxiSskXWHL
za%Oy>O}!}L4>hdJa~!3`xB3GuT?<W|TH$<foTTN$XPQ!#PF<umT`UD4t{2D?l6sar
zp`oYCb0ynSp2Q>3c*+U1P_R0rJ+Vz4N7nbtV2yeJ8>(9Te;v2zHQTKJnaxbeSsY$7
z0hNW~nbdhN+x*0$YbcssgY>_^)G+sR5-<!ZjD&1%IUm-_2a^$yPNU+rmAmv)oBG|Q
z<<EBZyG!4iYv$Cfw>0=uiv*U8$_HaRw+$H$B&$`<(X`??N7ts$b}9zqAx1GVK84@1
z_ym5><EEnFXt~xbA-rk9n?8<EB2A?~b6)b&5~xj}UYLH<$;wYlU^W5NO8HTa(Y5jx
zi(rV5osEKH`cD+JzWzi%f7Sj!{8hlp#3SjSb00ZycbU7`b7F&Swa!@pG*Ms@khzx{
z4*w79pSc<WhQ){ZqB5B|bp;^qlX6(?{8Iwri9wbSTTtDmUWO}!tzyFfKlv6dI-%h8
z>|gh3SmgB{bMB&1apxQ|vhsn_L*}%Qa;J)P6*k|@N>?RT1I-%&msQ(8y!7`V!Oh((
zmj|brZ=#OAQ#W6anIA>lk0DZBxRxxmt2)|M#G(%os7jPT6+z_r(|ku*`miU=ErF7i
z*v5Pie|u!5Q>=skodbeZ=ydD|OXGnPV#%r2#}ts^bPp7~R<ay5Ypq-;IicQfzA5Ju
zf(1Y|cSZ8&0KVnJhb3gY=&7p|O|JZf1A+}DJO<$o^KEnq%9rH-NnX*`W#tv(2OzIJ
z%+~r}$t!5=`+dE0b}caRCDkJ2EJPX#n-im^WgaB#WV|S9tW?9z8=0BG-8zFJcFMXM
zB-l<Jd(9ozIQkWR1$`&{M(`X={)l0a{chR7l!z1CB!s3LRfP0GM@w=RF9NCTAJh~4
z{Jbo6V!Wwap8%_rEcL&MH-&TcKH0HKo|5ZLkqMUYf7sgoefCMwe<|wB@!smlQ%C;N
zzj0c4{i=9V^U-`r1OgFCvhk*N6SF8{J|l#leOc{<n>vGX$Rur;ucWTLKAgJgjA$;>
z6iU>-p-^uEC=8A?wdS9kJne}SB296jT|_*XcCK*HYu!d6eAbKdLhb1SxmjEsG7fpU
zX_5xbZZ0CVrYo`{N)34;vh-!szs)|^W}lJl^DIYnX`YiERDbNLlk$btzmNk*#h%&*
z*;Qf-+Cp9sTSUdE#Fjs+7h+Gfv-nDM5q4K%Pt8`br+%isBf3oBB@6<D`(rgN(V7>C
ztfXQ!U4Q}y@+YyHdXR4<R@3}`ekASZ>*r%uRpsQKa@C?#9=`k(WT0^Bp67o|NPKui
zCumjX`x3DVswvbmEY=U>)@_tU+G_oAlHv-uut?twLJy7yg$1Ynl`*TXVK!h-HfGfw
zsx=Ws{%H)Y5VuNe^6`?3UG+P*yCdfiA7RTt?5Y>j@5_PkB|)e{>cUWkrcpCd!9OHo
z(bo|W7Qt<(I8?WNE)LZqSS0?Y(}Zkq_YIf2O9p~aMa*OA2k7zh5vWvb0nGg1m=^5f
z&wp@aiWD^vg-TC9N?J)(mDJBgq3Z09LM1G>lCCy^2K`Z}ex-0?Y5W!?Vf|iea(t)&
zRiX&(k3#hsjY||Ne4_R`GZ(4q)OHbDSw_y5e-w!7_ndw?`6?TT%8{+u^Glx+#Xux=
zhcH|Bt&%uYXhxTm&KFrrz<X2X&YZCI_I+2W(&6Fnq7NM$i0Y~{vJlmp8o*f2{^~)&
zs0s;2Rfu%31Q@u|YuPjcN=N!q4Tk<!&KLNZoFMl9O+>1p5|Ju+T$_Dd!Wb?6vVc@4
z2xJ5|_>zEBc&TS2Qaz`F{^<Q7sU$R*3P}}iei!^lJ{2Y*Tv<lU01{k6fcfE;vh-)%
z`eox$U6zeU^&{3W*yn_!(q{Lu`}NO7qk7?aVP&$Rg%(p>iDeRvN*@%B>Vl^ovCIkA
zH8>j8!*{V`|L>wv9YmpP`|;|hfv=24wOJLqU~nNtm%b2<YN~@wM54-g99k$;G5tP%
zbdbWqQK{yq4?CHIqf*UxqEf|FRH|5O0L+r*RI1u9i%O*gtQW0+MOJ}q3`C_Oj8(s6
z_IEzg_m@Pa%GO>?0WnJas*qF*PY6kM$#}J0J|B{5q2lkYx8X?#LQ)A!xH5B|dT<dc
z$7lv_Av;jjJyyS2sq8`-2G$l7YTmu_W)+s|dL`<u7dT`G`y?GG)TF2rY)UH7rbuX7
z(=`wTk<z9n9f6Zla)5JOOR;QpstYMJD5h1WUC!)(7^-R{H8_Lz4^J2JCQ+Z907xU`
z^p_7s=?@_gkOp7+9bP0<)gH;<llGONs-B?4SB9$kF&_tos#+t-JAi`|eCmEl-qW8H
z>U3hLs+-A4g#u3Lt4YY9o%oV+P%1N~m5xm2gsM`S6RY$ywFv1QkaH(Y72>oKx737l
zVX83Y(~?K&-aO7dimnVWPK;8er?Gp0cTrKQ^z>FW)US+Er6e%Xe*!@#N>y!Iu2=d6
zF`{4P1hEDw_WveI)pa!L&0Hl-XD;VAFH<e+Qiz&JqEuDnLR2jgz~qFmH=UU|OodMf
z5jdm_z=Tayz!(To)hAHH7<C9-TVZ0_7o$~e)CZzf{g^w<e-N$8iay@YvA+0kvKn8E
zkcxTffA-(O^z;3QSaamh9&r!ziu#*JZTy9;wzLJj<Thrk^%2cwmGrB4ZH0+ho$gkj
z`K!B8=Td6L9#QRJ=lHC3KR4xKJXRjU*ohWq>Sad=D{?wlr6>HgVQn3MWah*_)hoAz
znCt!@_Ra)8>grnjce0Qn3zGoRu*rZRQ3N7H4F+sR5}atFVH32diCG{uBr%y0P|!ev
zC5(BcYFlfyrE0D9)s|;n0IP;Yh>8$gQEN%9+Fy)I+#o74|L?i?H<J*8weP*Y_j#Xx
z2Yxx{?)RR%pL_1P@+>cc+H8b;JN1)p&EvOroS)6(iGf{P9LTQGdQxSN;I@9w)l2xQ
z<E-3pF0(S&Qn(uCl24H#%(Blv+Gk+FNvw7jec*6|Y}Sh2?Z{4q_RTEFrmFz`Q^@~u
zHw&4<?5PQlGl%$>8G0PJFHDaLP)!egz9n)f-So&C{{rnTil>Kr7n?_zdl!3K=rv-y
z*iVOwZ6fCMtUa5)#eFr`W5`R%%P=qaKl38a#oe`Fi%0_sJvg7_o}ZRS6rss12DK4x
zvTolr^>bAL>r{65C1c#o5zlk=OYS5FlOHO@S25ave9I70(og7E2a(m2%~F<dv5N8n
zD0qBcd@~b6{cJgbzn)+?o+Fi?#X;O-@bi$VJ&B4$0#B~D`v1*bRrLye3n-4(Yb~5O
zT7JCfVh6Xj*E8@w-SLW)Bftq6rx!=PV@GAcDH!3~B(uodXor+-+6Xq;?OSMwka)Vh
zxF)Oj*Mv+>3uo|XdL*sL|JSDT9r|fwL_w`FQX+0`G)50)YL;Sg1#rYk#0oF}WZxW#
z;C30qP}$#9?eI<X7JsN|Au{EE+b!gXkx+1Ox3lGyDI@82E&n`AZcHH!?`;}BL*nv3
zOvFz=CZvDPdS^8~qH*k_7<pW1SM(Pzn!BZjGFd(Lz>FBeG7uTq?t6iGjntO4@E#FL
z4I~sk!P)AqCdRqo?FY%QUH?7z^TIj_Ca<P~(9=el$#!1Z)R7#bO7oeT;y)BZJ{-Rb
zD{rwSrCfy=oq3bmmy{Pk9Sl=#i}f?6Z=TDbX#|tUNmG&X%dHD4HA6a07P;=NlL3|u
ztd#v1;9W%GF7*bYBloeyXD(FrL0<LBYS;wnc`qgN3;&3NS%q93w0?tkeHDSVoOP#!
zMXlgT#Is&-c|zsvV%_DD(Mbk_OA~<}tG(8aT$!E^h=?6Wlp;_E^Xb-B2^9aV$kv^=
zGkb^=X)9kmRdN~B6t<S!Bh&@a+1Gpr_R&t^KM4U5c^3s<DORlbht2cW-O~Bl8>{wJ
z{DJFKnmHnwRBA65k$&zX>x2BUL$Rv=8(gR00&co}2G=P=bDhp6?Q<x}da*s2odMS=
z4y#?%A&b8O*6MKl9Mj_PD1MPaA7(Y;AQ>nMd$2zIr7nZyUpf{#zI*VPc<hPuW#4G7
zj5tNdcW$C}MO`q6lJ7$-wJ9}H7L79!5q_1R=qr)&&Kq#7%FqwKjIUpo66GHo$Z}72
zqbl8(Jbjda0n<kdh?%ake#!+3tAn$!-9%=N_e~t=XkerbCLb!&huq>MbnV?Xxk$!s
z<8%Hfa~1b0_R~O-4r9sT4Xob)X_330I+c5$O{<&5#CtAsnezRRnO8rfaOZJld11@d
zAd8i}fX4|d1})DRkbI5yC*(EeI#FA9Sc@QI<?!qKo^r(M4gCB45_97p1k^8&a=PSl
znA(yiwt@N$0=QO<((;Hd@2W4GF|YXBs;Mwtngfq-#N>DFsux(#*ZwR1teUzW$B^|Z
zvBo#n2zoU8<BjhIY&x!6HTBjWc5B40Y}M4J9(Jq6ZuY9Fa5uwYZxXw6S53X8huu1{
zJ8jj}M<TlY5f41YRZ}0vjyY2@;mY3DsB;^*Rr0Lwwew_6qb>=j_z(&Oir9D?HC@_Y
zqD_W+N3U+)M}4N%PoKV*c>U4VD=<nK{hoS=`bR9|4gWA1s2|30T6mbgU@*jOS{UhA
z7l}f}zx5oXZ`>6cq)QncWZY^dwrhy3E>rmmWI&B4bX|`jn%bnsp0~0ks2QSbyNBrO
zM(Y9N!q5;Mxu1yqj}hr`B9-{ER}!v%Y&=G)d>lFvF4=RuA==DfdIIepqOB+IGNbcD
zjPcgzD|B?f0$1%yuS5En(?V~vit61$l;d-q&{NOYng_Ex@S10rC}*JfFZg2e8WAYl
z;hge8UFK+i5{&i_vK}4nx~-Y5b--dh8qC2TFJ7#RTpQyJ?s7dkMO^k+MHfrKIcVtR
z0oSaCgT7(x-X6@VJL2~B<8OceFC~)xJI{w54NvO1DF-2wtKqNYqArs&<+{xNejcOS
z-tn=vm$kXvz~S|(X=5aNo?t&)p8>OaaC>lTUFJd`ag6q#)$pu;1mZcI+RZ>Rb2QN~
zY{!X`1mrSqYYueoYwt)xSe*3x?TlGS86?ZB9Xq6X_%7ysSm!ji@BC@~eKR1)*{&yB
ztcHt(IzdXoBUJ0i@OE8z324)yBMv7BvR&*n4G@OBRI0<IgOH?7r+qMXQj};epN+vM
zI;@XoP21CQ_|aB9Pv|@IdaZ>%4bEVt>AwN9m^)GnSzQ=?1~Rn0x-<GB7GdxU4qq<q
zZN!=Q_BKwx?-41%8$ww);v8D&*U<Fdm6H~&sYWletS5xEQ7n@z2L$>z(wq5l?Lu!c
zvIJgKJJrtO`GJqUnfq#3W<6^?u^s<r%FoDait6l+S5N2m&Uq2BX6u4BPVb<1dZ_Z|
z?8XsqfOkaFWzEE*840@4AAfC@6-*vN(O8<9WL*uvp}bTwOCjV4WLd8lMF+#!`?9FX
zK=@N&ns?t<dL^38`#@;Oz$#TQdbm%{2@NX~Dsq-|@V{=8l6A_U;L$PY;1Z0jfnJ+d
zgx97&At(#LIJqQUyj%pBKGW-$MG_@@AskrET#Ctza*Qk$hG$YJcOw@wsb$GsB$>OU
zn%&$X9JZ3MP16Sh`qtla^jabu?$Z@I-1~rU6VBXrWW99#U4&z-NmJgZCf|Kv!cRFJ
z<%LeRFNYYXqf2n+jZE2j1(SDu7dJ^inEWs(w+eEnyn%j|9{6qI1>YGV$Lq0>y;?>d
zi$vMU@WbZh{oYMe?Bwz?59GPBsizSi-pQ<b=tZ#i!Au`9tG@cN3A?Cp*@oyJ`;^V*
zp+=`KQZ$kjd#7<^F{OFcRQ)z%{1)>z<E#{VKX;k(iapcxUh9RtNMWmF4Q7|TpdSi&
zRSFMqvHqJCk4CndSSI+$ZD?Gpae2@kT)#CnC-b?Qw<HC$=!H_JowAn63vA_By=H+_
z{4>_~C>V`qbpCj*X|;+CBKx9R(&q|fjoE6AJk(m>=CE)6im0O5Pvx=A;mVWTj0hb`
znu`%=A*R4nf}Tg}c%y->^R65#1)J=qMUKXm`?J=rT;Oe7*_qSuywBOVvdi;WVn<AN
zV`*3RI>v|m{nmMT(l}jfPUW~oi{h;5^d}zLsj^}iMyBTM_eJK!ejV6jbd|^=x!H5_
zGbsFJEcShuD-9mL49mynqcMZCLhAyskjUgKKVdNmMeZEaf`7yV>Hs~(1F{319YeAX
z?sWQ`B&kU90}msX%IZK~r!$aW$Wvd<o+l!(s&7y9O^`n)%by|g$5sDDmcJn<vy&T^
zw{1f%B(M)nz=4-LVmLePhzPtI*twZFRpY!JCvPRoOk=*89-c&>I$ap=zSE|wNWe+c
zRTSX#=_(qKI$iYx3}DMYqJ0cilM{HSW02>MxG4lu{)krwrJTTDHrIhQ=I{2b>GYkj
zF8VaqG6!2n=PbUzuF12?mED39CCl=i;M&qY6o$=*iS^G$krnKvRIV-W#@F`q#M%Cs
z`tUcbBbG3Uz8LV~c(fLOhcqJPczcwU2sI6j-~F+y{iT+zH$VfbUG|DF5wo%bIXlqs
zRj^A6i|9IyXT_K_+77Cn^DSNgkRgrT*y#(XkH(xfeIaa30Kc30nmvJ?CvWA{cZR-T
znAOnfn@Sv^NGZg@k$pxe1qvp=I=?$oKO*&U9D4t3yL8a4J?^Nn-`FYV?ni>jf1XDk
zTdet%!5Sz9$!Px>^wpcIfkeijd7+7B?l(pA6CI7{^CAvP-xf^16D!txzp)<Y2zr-F
zpl}^`dNQB(_w&^4&Fbhc>NKK2o!-E_wm_U!m`Soa!|!biW!Sz3fW$yfY?tI(9*@sn
zy8;y)#SGbflqsXmvu@WI@7kPJ*P42g%xQql_$!*4r{Qy-KM<FL@{wnQR?Gn^GN(mq
zb%=Ei8C;bizJ2**<ou733YQCdfjId2FPS`)HLiTg`U`i-AjpYj^($W*>QCh2OAG#o
z&7^Cvr`<v9GF4j-{F%KN7Jo27brwdGg)P#fH>)h@@`*nokhA~fZT_gZk2@mbI;r$+
zH1`?PWu@sml`R!uG^PmM9kKv&nK4S~?N*fXkH}t|v!LU|&GK%e-C|<7;k2M5N`@QL
zlMw=>33_;7F*~rbxp8HSYt1jj0?AFv+I;d>VpLhK1`!_>w9Z$Zxz)8s7{mJRNR1$w
z?_8VcsXrWb?F9Ztb0mwU>&g5D+`W<`<YbH@)jAWnE2kxRgjMbUa7}4wvE^*)l96?H
zh&aCy3#j92koOTaiBaK8DU`LEn^oFH-bbXRaGRetQnYGi%SZ6s{0Y2bc0`J;buDu{
zpk?|ICMf?<>fqLoXuq>>4Uc<)ui9TC7t<v_{*gLuMkOopO*@5TQV??KEm<gQpZrO?
zc1)-AzGal$b<;pbA1S@-`$u$cX+9L{owIbITn(QZOI_=&VoCP>=eCP>F^D0#_B<g)
z3&iCX?;tEUJfmB3#_zB)Pt|RPO|C4wBHMB@-@ozo4)n&aY_{8caa{JgQci88jeF|e
zzA<#a)b6_(b=l4mCl4N@!0sra>OlO?0G&H2<HoI4Vsl%JGdn3GD`RD=->nDvp?!Cp
zJg3ub4?nwP_;IcI5!v=Mbdp05)1#k7=&i?C6dr~cln(JsNWR4(rwF0Z!d?v~=fRED
z^f;4u5+r1c^)d1ldBwwWxxOGQ8M?LbVx&ap)s>_;k5G}Z88o08xDvW#&uVe;FHjVO
zxOgCbkGC-@78&pfUuZ^w?rkip8DHI2?t0mDh1O?TdYvR|xfSqmIcoS(GaWa@nnVsl
zQ{&@=2yE8^L-j7%-NHH$Z@$-fk7^k@WIczr-be+@M5|bv;PRBdvYjpb&TQm50$XJb
zEh{eTb&j3_@-{{~fzz1E@IA^~jJ)4gU2{#zgPB!j3}yuLBKxGr-+;^d3k8;2e>Jo;
zve7P!6SLT6$*J|HaR1#C*eVAHg}i;5$MS-?gvQP6fwX9LfGLB6*yprN4eM076A$CV
zpTbJW^_WAr=L5?!Bhc(F7sl%~ciI0gF0RL7$Foq9^-=v7NBjxaKnP;^SsmxW%$k^)
z;C%vS7K%N1(JWc`i$@Q+QViFV*-oxyXLSs;Ui?8QxK#)WL51C;>x5-f#Td8ENXud^
z`}<pnOhk6F$E1k}6!$({kA3V~vxaiXt_9I0)<zT7-^Bv7Y3yr%G$ZVptkSJJagqxK
zFsSxgKhR9vy`dYlbr^fxpv{jQ{-=(}yuh2>p3N9@<20@u%2+1>FVV3CeLBkAo>5La
zI?4&(93>Z3h3hO)M%q!LL}#yc5C*a2a*P<-g<A|Sve?}7eH~-K5*=9Rzsij~{Z9vT
z<X&W>#KRTvG18*k2)6F=Y?399_0T!2F5jRYV_B8cJ;dYGg=5?|oa=3>7&C@TzROPF
zvaj3&<f3wn>ro_qn_+!)3}B!pYp+^fu7m_yMDOnt$N&eQ&Ls4TU9QJ=c4T>rFBY-&
zBaIh3sq<5ar>yY|-nlP6AM55L`iAo|nsH27W16=<23ES>Exk(itj!)NIn7_hP@`zM
z(r~L~>$J>ln1lxz?vt`-y73pty2omQ#j#J6ZM(kVMUMCSJM@l)keYc6d%F=1nlz(l
z9Nwu3V_4nM3t7wB{F83I^7Cx{A?!KL9U`sq=LO#&k;NL24U=K4oG?To+A&JT1pQF0
zPfmCk9rBP|mh7SpmDPBgoLW77wVYaA-j*}9c(DIu*_QWnJqiILvolJ&^hKIZ`yfd#
z(mEb=J?dhq&}Ow!GT}M?M3*qXEj!Q{PlMx3&v8SVC-dVK<Atq80qF5RYL*kM{`i!&
zp-_oM;n{2jWU!_G4)hkUlE7YGq2{T(MGl`kpe-a5u7<PpI1yGP+kOgWtKeqof~OJZ
zF*y~sTLgYc-Dr(9c|gv^Nj`KI0xU))8v$=rF!{j?by3#zCrrnE?19*mwbwBmYJD4_
z_bseDbgj#H=z5f+g|)0()Oj3rT{>3Pv7%VP!zku_EiH7u#;^v5+1A?;iib(H;6ELc
z?DdY)e}IYu?{C<3D4(lr{W_HXG&j89yYl`R|EIZ|f=Bf4hFso+(Z5wFYe(w=joq0S
z`K<TQ3%OJF<(~Ya&q8B+7vW~X9XsE<^}R&!so;}rd=&VJ#yYm)pno%r6$hP*zen`n
zul3)<`tMiz@0a@T7y574_AIUWM&AzO)Kz+NmbdY8KEIdUA`FP=b#QLIQ@D<t;|yG0
zI3);QFbAo{dCV6#oR%GUF*mT)6MQx+BLfNto8@urPPr`3>^gp1uqAVQ(*nneh`|2r
zK<To;A=Whh7<l^Gfx@UmcTqRW+@u}$0uLt0DPH|saOGFf2)6~3H|8?#3a3RM|H>0u
zxtls^2>e_;BX$M+sHXGUau4yyMps15#TPc^O-S^j0D_&v($l<69v7Mim%@&x@3wVX
z*FDb2FuqM5*U1ug+i!Qp?1t;rG057e>s+5l#qLsXzDape4kdng4NmU)Y9=BX6qzjg
zh-5E$5Sf!smPfX-1AaA14uJXN_Q+%C9Aoa%>kl8NC8!}0pCVhx=9Apztm*P`ZM9lX
z38Zsne(d@ID!1r!Ig6Q1Q^VnjOY_^<rx8zk8}y>!i%h}2hhSb&aFjddot2oI*|L;}
z=S`twy<tM>vfr@9F1s)hWuE^rG3|;BmA_oZOgZlG4G5Kgdm@~NH)PPM?3tVJF?TTe
z4hSGBQ+?9{Io0HdjKjp?Kpg%QgE6%hCuPyggN_8dYcJNtft11Ib%cj+)^uU#s;NSA
zf3$UR85wE1xZC1fECOg%%XfOGJa46zNIq$t0UBq3#@SSw7-AxX^+E{`R6p8NEouSx
z$t+gDtxlxLEuX~JFh*8V*{~v-f!aBn;U<d=X5c6X5uj;aa5;p@Gg3XN7&l-Pb#SlX
z?$&yD8CVwE152Sju;`bnQKFcLQqmNZlFHiYs6Lh@eJrh4A3J3oS<!t=1^kPrz-nmE
z7a8*}VKc+}bp)!T4qaXy*dsk;7^J2J(ov+3+|0HwuUJNE5s`S7EZ(pvT=^)TYFoO1
ze!(%k-7n5KUK9B)v%2mca)wH^|3|oa{BTjYdANEs56vFN<J$bd4yvDy64`7;)6i%y
zp+18e8R4AT(@I;8G+$pby0HpbFzQ!Q;CFf`0<7Vl4PhoV9pLbsbp!RDcGW*p?}g!d
z&oa+lTPui7DqQN5db}MV^`0g5u2~{d*-Y}(uDplMg#ul}IZQLu@B+Jr3qn(eSzVaN
z<qM^LyMNu|e;zk!$M18k{yE*6Lq2Cs(ZQ`TzOzKVP~5sGZo0JS$HoqBjbL^NU{P;H
z*st6i+#2OeFji6e-J2*;hqJXk+CR%6k?^l^7lkmkN*taFZHtlRHaF6@YkfGRp%V}d
zIiHFp3UcJ<8reWWkuK=gm*Zx2eV#<f>))}m3UhlKJ#BfSCMS>`+bOnPT5pc06U#3D
zOC&b3{TfE$p7E{cJW?K}t9fJ-5h_<oRIDo{J2uO^YHJ;4vhhBTbcl~lS(x(z@g}`I
z*Y^H=GXLkrCQ4!{7;_WFE=BCzVwXy`vc$ek>@Bf38AHJaww+?z<$oY|l_e=40VKdx
zFPSu&dNxy;$Ce+RLF;oPQ9N{X1$l$dgz89Fkhi`)qDLj^3c@ZbTuGq{D(J4D`gW(#
zR1?nO4_8o(sUQw|!byC~`pJ&%5=wNEuvAbAb&)6)1mOmoWIQ~ToaBF5S5K{}p6>eA
z^~3DB)YK1kA=MJDCR0CKd(=;!ou1IQOXv&1^I{?W+*qlETubcQ#BRUXwURGgLsEUS
zsK`8%GgCoMER(*eezs6Q`qcbww(j~ta9KSEa-G&Wh0^;k<oybRq*$p2aa$t|l4_k`
zkTfenBXL%=vB<IxU#UZTtxpY7V7+IM1=e2-QfTcr$YN`+K{BkJ2C255Fvv3NVT}ZY
zX4d@%Un}^X2464udV|aOVl^0igW$^yF2j#iVepND7aCmVBWtd~n+5k8yhZS725%KS
z&EWe5A7k(~!BY%w2_A3oPQjJIy9EF23ZX+lxWSfXaHrsZGPr2?w^|LJBKQu2y9M85
zaM|r!zcqN8;2R8{A^2?umxZ^r*5F>jR~WoN@M?os3tnRIWr8m-c%9&R245?9mciEx
zo^J5l1y42jV!?+S{C>d`4ZczED1&bjyz6pZ_GZD~H+YNSZ3b@@{3U~L5WL0U`vw1_
z!P^AiXmCsLdkx+x`0WPo68vU^%dvu0XK;BU-SQbcQSikEPZ4~f!QFxv7(7+*Y=fr>
zo?-9|!B00htXT9W8r&=RV1pM3?lkxU!4EIgWiJ%G)8LB*f7{^Ig6}u@GQoEnyiV|D
zgRd3*VS}$1{C<PqF8G}W-yryUgWoTBgTXfnzRcj81g{XBy|rw<WH(&a-PikjGZS*?
zNIVlWQ-`>aCo~c=jZM0-LE<Li3}Z9e*et+ik+DfMHYnapxZKzr`EDpRJ+>%ns5`yf
z6g<BF1D)W@;xTZc8=JR`&30pxip_pw^B=~B*BTS{7@J=hn+$Ar7@H<zlZDL|V{^T+
z@nW;l*pwTa#n?P)Y~~xAYHS`hHaW&-88#0Xn<?5RP)BFR@-Aa}lChML2+Q@xvcIu}
z0%BQjEI+#}M2V2DN}+y&2y=*ll7D#iT8H(M72SNvlfhZa>#9PbW&ZdUF5%8t8|C1V
zE&>q9Q#|YcfZ+ZCYm=-iB;aTg?06a_HqV9^MBVER7DIV~XJrjEY@Or0b%Xn#v(0}A
z8VHDLzW2~p*(UqnUEjSOzMyGv|FTtY1zlyUzU*=>eU3#i3NvXU+x$=EZV7Fl^CDmH
z)_2mN&<r?bTke|ezFi$I?=Uue`-9uzJjyDE4f8lQ$tT+z=3%m7ws9ADoY_1_v3U;2
zsjVH@6yd1+>s7*NDZ*g(^Nw?(V*RHZ9fa8VKeVTQ|43o?xQshHVy&a_V=jzuN9`TC
zTF*)@!gn_1@n#akcTw#}GiMt2=V>i}po#wJptR2H*cAUnS&)g^!{=pQ53MhL779O1
zmmTL1WeLcwF-Q^q0`cfHZ1K9DVIyo(57$iZ@=2!srjoiVLCQMPR2K!I#^$q}^j$=q
zT@b3Xzx1l8eLX7bX`Q!v%h_FF*P_L-Gf1`B)wQ)FUPu$7`nRvEwGxa%2;bO><LC^o
zPph<e;jjhwbtvoHNtg`p7eC&ngndDN$>U*TBBxLx@&ejb&eao2#n_loX22o?76Wt|
zfrNQt6C8VRD#C@Dmzb#aF7?#8loogm^@C`zo^mj-ul_x_yib!K5Z_huCtv<7sDCfg
zH>du+DBr~T_xkxx2tMmO(;Bs0*kvc++4|iw*j!ogn&12x=>-yA0kq4}2Uf2es}}(s
zD==>}=EuccVKs2-WW-R6IH8=Hb&D<L6-S>v7k2HXQSxf-RyL>2-mPs>-pFkt!Dt<2
ztc@0L5y+W06*=<*r;q7ylUlY(Z8{)y;jxf+e==kxZ{?!PTkk&)lhu4=xMDp``H|Lb
zKjkn4E{YTN#oqhS?_B?t)0b5LRh%!r{;Md2$Y6Y?cATCUcv6-|d9u0n*54;MZ`3;d
zgR%pUZUo<Tll&DbbVSP~qC#<;8c4X5qn*G$cnt19^ephmmdt%CPvZegtrh#G4Fo_?
zrNzlBm)wVN2NF{8)bXOV<cA1gG)9dfXEEgLclUBJ&xz;E1009`SkemYMIUoVbbza1
zFJ~U$kub8{pDer9q|k)&8g+g%54bd2GP_advi<8LQUmg)l`XL^YRvWX3Htn`G2zrZ
z<n2crYW}5Li-9*?kfL=caoP<RCYanPXOoT5*WIVV)dD!dj&4HZd_U13u8%add@TD{
zr{;GEM<Ddh2x38bfsd`=ZAPK?6v79SrxRyhpp7OqOq(Z28i?a$?r^Q9O2NBw#~;pX
zs&Z17PS@)1V<#^MOg&xPI&(9huAQgf9cKXcy3T9$Mz*42u_j6Uyz_HWE(Z6=KUDLK
znl5pBGheC66}M+_6TZ?k?^dpkHx2L7NBX~(L(0bJ+kYjApl|pm+KfA|+a<3vj<wqH
z&l02c9m-<McV`K8y}~j#0><I@DP$bzkSY-UqKEbeTTJiHniCe2VW<#(=9Xn7ZVr9C
zo&ft9xk_#=kh7vUyi-Tqdb_5EYt73-mZpSS4h@6J37TFa<>hL)Rk~JF@&!2P(#(<!
zi^Fxg&mj-K>rCw<Mf-q*7kw^~29s08qsWW@+PJqBh*{iE(eBQW`}d9ehOqkp?QV&+
zgkJ=La!&$AOKzd>XfkxE@g7WW4*C0zAdS)ce?q%wuNb{okO3e&LGl74b^%0o>nbFw
zd`OEE^<W(~;X!c;bn^a=PO42*nN5>~&JMmJ0QM?8K97EJPcC0&Xf_{g{LhKS6MP9T
zF$cM)fkZaiB9b}a2_$%QYI}X@!Q|hin{1zoY_DNFj>JQ%?O{+bxykmx9$H>{!%raL
ziysRSYi*ZAu71E~LXn*ILOW@eLm;ml0tGLo9dMQsQgd+mckOq4<QAQl&PMQ)l}~?J
z`HbK^Cds;!4Rh#7HWfUy^g&24iTAzb(2@nu$Fkt*SC-S5)bV^SD<aops_eW*)<pXL
zi@hpp7f*@e$(kv#>UGimtcxCGzB2uO${YECR#7oWHuRqt{BAt(QphtbPRQ9naYVi0
zkPb_)&cLiMIGhb-aSeDVi?Etdc$Uk#ntyoy_}9r)MA?kSs6n}$vdX#ZB;f(IcckWx
z-#3FZk)gc)8<{KekGKgV3L#V04{vLYceo8BLD!l}209&OTv_A7Sw|39FX&h=xu}&~
zNRit8c+vAOCwA`oFCuP8sQ)6;e?lO7@fw=hs6ccfurc8>F%7aZ31`o8E!S`=sTCTA
z<?uuAa+n)mLX=oJfIVRj^Wpb|o-x+s0`P_2`Y+p-&Y(5i3d>Y>cQQD7MH*0~E#cM%
zlgp>*wo5bhSMm1C4_V;T@1L{IKq!bJkN4Jp)pqR@VlxsO>uz#ml<Jy8xilGJGH5=W
z|5<Br)PwT0Gnf`ytO=NTfAeLlBIIzgaTu%}M2PcobJiH<L%ZdL8t$=4+wqMM*8TZy
z-b0_}W;WNltg!?OCEhU|_1JLXpYb`Zt*1yC7%h2wZjbe<o?2w|@tq+01e3huk<5*c
zkpgeGe#itSO2C<Wdgk4%Q{3U<4=KT>-;Qa02T_8wVXQU2$F&V%_y(fyuO%@V5!bkf
ziUc7NcPNh>g&G<zo8&;o7<mMsAD*a)k=75ZgTYZ5*7pE*g&wNX723WPKY0NJXa9;S
zhzB?|&)s^MdoO<*DUXSWTx>x;w@*Cle69?c?F+La4ra9;LDD-y%X@SG2Dvk>6ZsC$
z!E6^=%M-Xq`<&KVerOOC@SOG10jWe+!?SEANhF6vE(k=m;XOu9um6Cxb$Fc~%Q?he
z$f~eekK@t9@HzF;!IBeXI9#sVwg;0hrtT!Nm4t$m&F!Cqt_Il>bKZgz6hPkNO_;$8
zbC3#e$j3#ztZAU#twUJ6?u%H?f^p9yD_dA1%4;f~`V}V@D4*N2F8jp1wRvNTJhJgs
zYqL?UR9}LVoURvkpzZG&>xRGTCYhc~^^M=28_9~97w!J-K|RC3p*BHj1y&S3wN%nW
z;)clka9cu$79zZC>#uLw9)2hu5Io7yf729$;zG^?#}t}Nvic^|lov#LBU&iKVWDul
zd7qZ`GD=B=9v4Xzgky>=8RHf@oAqdXi->}A-b4X}h&h2B!Q`t5CxPU6i?@`<e;rA~
z$(~v=W`XPGXzY+g$)i<J`DR5Nj<b=42O7N!6Ljl1Dq>T%U~)e@?w#b6cosNZH_L?x
zbf#tV?)Y`I9EWZ>5&o07T*twCS$$V*8Rg+(>}@+lv|G*}@?_lz=;8ew*JDDoAD;{-
zJQMH!MfJNPMBr+at=c)Tn`xm0FSTJWBq<5&qR8py)1J(owWqYd_jNFcuzyqXX4ZGX
zT@>am&)RHP9?kMC&#vs40%)M<n|bYD=$7>fORB*B_V+Pp+YS&Yd_AFs5W3;hl8<05
z)5JTv#mUtM-3CX%9&MVFAQ}a-y-km}>2W;5$!WUD&N$Dys4=<09n)g{acfU7Iy~6A
z@qcYUlzMOq6r>;3?D39TC@S98NO;t-W{+p`%%;A18}z4A_wie`8Y)?#>zbB&_oCrU
z{0Eb(CYUOp#0)@f<Det*j_>pqqsz^kxzlxXJozVITSVg0WX`pECjQ$$g&xx7U2FD-
z3MCvY?eTcUn#`m|x$1XBNCo>54mrU?g^7MOJvB2umo>6D#<=Q>BT~Zc$1h>hw<uu~
zl_ZTipON=?B|MFS^e$nhlrRYgU0K!QW0O!o`Y4B_-4!+I=n}=#+T=7xi$;lflzkS&
zq00S`yk=+59xc7OdOUp*ApLkADInh7{<Ts+9gp(aeO<ic5vmi@xkpeQbU8?oWVtVI
zUrBYF?p?gc+jLukRBaB2ZcPcDdhr*JSeYI*q~-(h&g}6!gUNoR{h5X0B3XoIXCAq6
zQ-?E{>^@Cev>21Q2Wtw<IN(8x$LdH3qFWKtZ)+rJ#@U7SUq$;bv`*#N-PY!NE@)#)
z`=&4OoxJZ<iLT=r8DYGP!E8UtLXKYR@m@HINiqI#m=zFhZ^|1T_cAXGCx-TAgb%gj
z@wyOETlLJ4<%{#wtyJj6o{Sgk_Z)cdl6NBDbA#5qRr_@8$J3|e)UipXL0LyWmLu`q
zIc6>MB|_^mZHD)BS0Jdv{;MzDU~*l`XkJdSN=*FLG@WFBlI)=ytcn$FFWq21td6G}
z?6$;Xbc6BGCz4%*x}b&V276_3n4}$`6wK%bi%5c`q8sdGV{1Lw?eQG3>QgtEluxUc
z?!J4f^+_jMmEqu8y8&_xYgy%?MEb5DQKFS{afrvT%)QgQv9e2qjHTQ=HQLTZHS{)D
z_}-~#I~$KxCRTbUvV~^A+Jj5A&Es@~U?)i9Nw$(m9A(h&aV%{sgVV~QPl7s>ageny
z>|k918ooBfitecUsD0=>8ymd9xh%mOh**m#ScL1*tsPF8rho8LqCuuMs()k;6=<P#
zURZCzKcuhhTz2y4D@*sR>!GfUgYF=z|Lf6KHc+&cao?Ht`0{^z$MWKWs<M6GLRFd0
zS8rWqN9%olv|JjvtoY<0MAp51>3#l!vEv)`K98k$SS83*u&eSm=4=oy#p%`@EbL`r
zTdBB-)`z1ND2ou-8*qF*Xri$7K3_hzr{3r9$cnZpImL&c%$>f}9(teC@tFI~dY_Z<
z64v{?^IPhDzLUJ#**+DtuWYk6Z68CnrMQ8)@OfCz??U(EQF@<qP(6*F7Oe;JZAR2?
zz0V;Pk)rqcaa?-oeSY+2=f>eZ^*-B*)tb4bG}HBHL;qG>JzFibs_B(v7fMiMKJ^4z
zSfaZcipiOX!ru%lOJKSUKeg@uY{NTk*gzIUWPXff<)5zzIwrS%ms2({lR^s7zP%#o
zjeeoybJqR)8RPp>1U-_erl%t4UEin(y4*z9ry}TZNUaF^Vx&@fD1zR|&_v}^h@%ui
zpZ|YN5p*H_3VQxC6+wSTs@r<%B|SLkRR_~G`f0heTh@3ss>se};qnhCg4WHaW1_^W
zW9e1|eSTMmD1rur6+weX<pj>>0XCFH|No!}`pUJ8m&a8Ejl5;T6E$qcg?K#`L8p$Q
z9sHLRLEk{M!Q?i##M74|=u5PFb5HkU6hXg0BZ1?RMbBbn`yW*V{e9t12XZ#(3(m4c
zFX*9e>?9Udw4mcCg3cqTUVb)DMaTTNQUrZXoIQMe8%59?j1n<kn$(J*4`w6Qczi|B
zHO9A)@%W0Me|lG#&=h*348};*w^*-D)4epL2->JLmZg7K6ZBIf5TIK(T5EznlZ7%9
zjxW|z-xY)Ud8qWwilJ-HF^lMLQVcyE#lwqz6Zsob485M~JRih$G}fI{!JU!dHZjJx
zFO>-o)zIz2o&<5XGgk-K8AZ@2haOyao#=*^4U`0MwaW~NZfLPbHMDJyYUqh#U&6x%
z0?S<uCkaF~^a%n{4Lv|0s-gP{L^ZVByAl;zh0@NuRYPC94^C4bs-f@rT*}NE;qR-4
zuEML`{M%QN3N+BFq4fv~lT53ImJ2{UcrJ|~yS)ZOZ`IIOXb)OPS$6xZP&BB9)&nQ~
zN-HK4t(c<E`FN_KQ%t~bPz`+$W(P4i+dnW!RQuZoakRf72t<!*-)F2M+FL+`YJIAP
zHl-2gx$VEeqcvn<cnNkNA`DtJ^z{dO-luZIk3^7HG;L?F9!P{20>ca~jn<n4Fq;7{
zt4p4p!H4XRr-_n#IoCMMZVxhKh<DBxmavth5%;J0zeUgvbRr;Pu$@Kcr)!C{59QFZ
zugo~=YKS=p=KN9X<_YP}&@b=w*#8kb+c0ZdID_rCuv3C%er@LTD$=U0JW4mT539cR
ze{zB6HrOQckdCbzdZ2zsC!`x1E_KI=*2{=_*n8^tKuOtac7SrhnF4kUw_Y&z)&t#M
z&juB`N%2J4(=qy?gV8INNch+E!+zFBtMHGi9vMOscu~{2YsMIn9PAi`AqtfmZY;<w
zhfjEt2Q+yd+bdUWj9wpeZW-P;aWLnGMGj3CWhQ+0`_SY{_Rn0rS_IBUQnVJamlVxK
z)WYW!X<AIspIJZs-Gy9K^^b*Pegc=z<2c0_viUQ5Y)AZNdR4F^dNa)jj>1yezw3~V
z!{KGKQGW2!FrBu6LMOZUaM1hKA0>Ckv|PEHd|s28@Q0hoXSsfWc*0ZQ=vvaZ34`SG
z4aw)%yfi19+8nZ*67-#0KmBZ--Elp#JFJiFPI)1iyi*tu5{0)uK9W0Z<oK%v;T$LS
zm19V2-_z6g=#s7X2tc{4ZQ+0&9PunWBQv3ky?X7b-eQE~6QXq1d*0ndYIW<u>_l>o
z<atygEoOrq)3R_(Ry3$?F(N|I$6YATCAw0JIhp#a90G6w{0>qLx9s$HwG=`9iYf8R
zpWbwFe{0-LA|Rm6Lz#-FB--ys*QV$v&|f(D%V74Dc=OcsR}E~2d8O{cK>WM-9g-MK
ze*Z*v|Lm2+XCO?@S;DIIn)a;aICO~zl8>Wrt4fK9CXp*TV}DCL!uROwTs_OEPJB0K
z$_GtXh{~>j<b&f8Hin`C6Puznl!61Frs#i1&YIzSOnorR)fB)rulUdff#DqDaQ)(A
z-8aZ9OyW*&v|?qzYq75SXRtpw!^zWm{|;7vJ;a%2itLn#wZ$lo$wS1sgxr#Wxa_9I
z4t+VLBQiL{CekbQGEslvN8R#;5a_uROw`=c(dO-#QDw{)Ts(beC#iZHr|@RlC-pr3
zHlB=bx+gGki*<KkqW4e-EG?=rDmSphyVd$mUSwNf*VeXZt_*860v)1Hg@I#_6#OB=
zw~wUTWoN$YTJuB75!}@-C-YktfHz&xVx`?6!-rh5VEm}{7QafWD+q;9Mr(carC@G&
zf2~N48^Ua@9lA4129UI!S^Z<{3*+e)%?or49j|QtTQp>5W?-Dxmt5`Jt?-(fcXBJ#
z!NB=lrWZCL*{Br$n|R&~y_NOIYME5gl5o^TJeo_EIXBk)JtvG=BuqF(Gq?NThI1;%
z&63yTFw9)-lOwx`QD{MG=S-4AvS)me_5Fjk8p>;vt*m+72e-TDGTm?QC_&vomR$6+
z4ooq({5<v74_2-<4-o^G$}{x4?5LZ(_5wM2A1IfR67&(LoCp4b^}h8UF_~L-)&bDE
zm0c>J<XT|(HlDC9>m*0@I|{E9ekCzM^PvA!>p?;^T{#*yS|%7bv$@MBOQ{~A+sSp1
zQv-Nz{dPstfO#RZOL5m;d&>#kJ#3H0Twj_BEBr!+{v0lQ$V91cKIb*%WSDDytnEd*
zhxH35P3x2O<U6Q-Why16{D_FW;rk`$s&@sGUxa&K-*ug9%`k0$Oxf@GK4t%qb76f5
zO#!Y0H#xhPM#joEoU_}+T>rk#3<Kc=ZRBQhc)VJS6jybMw{e+U>()!lEtc2c(7+z}
zi#(Z)qy)FyTC6Dgo`@iDwy{_wPYSt%1)W=EPPSwSc*EzWB@d_Isrm}Z&cMrDak4Lp
zMNry~6UXn@+69`tM_k^mTHhe!KsGFPxsk<`1B=}UL!Q`W0v2tH=KMB=wN7HsGhEb8
zPWd44B_ck7H)(1-GyIp?(h%s*%Bloy{}L=OFbefiMpf39=~##`&a^aXY8JhY^HcGZ
z*=982mrY$9;SHR5`_*ztz%#YC?eb=xc?%|g6&KqBAJVZz-&MzDoUk~#)H`*6|MOsT
zSchfdbwVGy1%n$`P@25`t*2{sRnQrleZ#!tKazdM8aPs-3XN?jBQCNI&3<dj2j0d>
z6ndGr@ysD4NIIeC-=e?x9?c}^%au5?t=~ULjE&Jzr4;k(-%5X8zTCQlXVG!3w%(i-
zqJf^r!|lFX28;HeLu^q@rUxYHlbgIw>y+g>(jSnLq(YBRg%0br@u1(WHPTrQ<LNrv
z)6b2ktHl`jQ2Nx(-ax<n@$Y*BM{@UlEf0ZK=NBUy+w9AEQb?aKIxA7|v)jsifb9ZT
z=KMqCCi8hy(-*rMeu)pzcu-jX^i`pbsPyzRo1Gagsf<4&(o=^HFz;}Rvi4@Fx~WU(
zimN3+@ga_CKUda3PUED6WqDI8K3BdG%xIqzl>;TDA`{vu3#Z^t?dZ1{bVJIOf@tn)
zb=AwN6h^^qaE3jbs3~RrNXktquJ5QJC)W$h*yN<0%0&vU<a3qZII)AXagKJrBE*{D
z@`ytRn$C~N+~vC2M{nb)zV1}=GMioXvQIJXhG8t-B!Dt!>6yiQ^BTvrK)x0y(Nfj@
zNilmWx43<NA>J*&2?n3ki^`_>e!RB$9-BdFb>wiKxYyv$RW!Nb-ZZ$M6*ohghJO~z
zD7g$Smgh5;pXQBxg$(Dqa$XK5{{n^{eg?2awtj}pkQq*;TR%O)5R+Htc3Yb;kR`M<
z+|5MNtzu8A+HGBO5nB}T_Cw>X{SG{Z&IW9`mMjqf(RUHup1>Du5iASOlC@O1vFvGB
z5jny?lBSd_c5b8=vKVmn4d#<~if9vsjMmaFecfed3}NID?dr^3ECK`jJe#>?3a_%6
z+tSG0pp3Q8F^@fqQ6m<3Z%R<!k3Qdl<Y3b$W|&~B<SW1~LSBxymSQWLEg!PUZ=xkl
z)-nIKl~jVs-T}0kr(^@rG@lmN!YN`fc@CCdJ=plqu+D`>_QTavKm)k+Iqt~|o;<j+
zeT%ANIkm_7Gw~ynz^l)>nFlxs$#LcH!usSlnR3WVy!UpKlN*M0ykUKjk8MV@KhD|<
zW_0~{(OD|*=j^d=)mgoZqf)IywndiNzsA%tZ~5gAipcSF%g3gWMprWy4}K=q#Qw1Y
zuZQ+~haq2h04)Jt7FYhUR#`Y9>v~WvDKrqDven^0L$eWxTwXifW1Sg}{1EM()q()M
z*39Gil%^5OuamJtKWUk3KWT|Tz;oxV%XVaN0<h5GjA-_(`YV*-iIpc?J^Q}o#$6WD
zO$&h7`s4;4R~&q)0wa{qEf6g|-t+469L_q{n$Mx(L}jePtTG%OX}#=MYx{_f6nr_H
zH+Ce3+{pws8FeT=^T%l2U_5|$==EXEV^y<4Sr(a)3U$hyC9>8`OD9?v<b{T0>(vVp
zI+6*hBQ_9ySrzngKyleRg!)Ovn3T{VBa<(pU+f31jCC}XIVoJ9KDcc)8j`w*#y;`8
zFvYz|YoW-XpB&r<o7Z|>yN;Gr+NJ~#ZgcpCG+ysKxGmAuuntST4SnkfyU@ltDS;U&
zxYf6PRNoTOI3wjZatYf%$+~iaRDUx!JoftrShI|&5EE~;@3Ag@T#qQUaP%j427`xY
zu)SlorghT<#(M*E631Vi$dz<nM~)247{iTDblI-?;D#aDfu{-o{9h<eSI7MNXWe9>
z9j;rDSH4hVcI1ffB#{F}2&gH!b{Xp*6tuvC&`Me&<F|Fhuu+S<l!AH?i8@ibqZWx;
z@sVU#lo-7)Es1?L1Dv~KxK@)ULOMiB(pa($vM$oeXMXKk^CZ3zKhP`RELnUQQCh95
zS1(Q4`&H;MLu6`$twhc66T4ZjFcciGgVFhy)4+I*Q4dL5Sm0!Nn!FKK@O<7*iG<kJ
zPp_6S&~6JutaC32w}t0&CDXR_pVnQI&~g=LkX+>0k;(?_)BYl2zq?HMDthr2NU+#9
zdqp`+ytP@^WWp=PCP-_PR?solNHW+`Dsx3}ike|)YGS2N=3jF?md!e=UaO@EwK;oi
zPSb1oXMA~9+C5B85t2fa*THJW3XT)9>M3TTmzVFg0@oI6BUQ(=fy&Tb9VsT|?n%L#
z$x*E+AT}c$auOtqhH=V7aWIsin1??snDvT~s$D-;#_DIbkTQ3Y8UKUHKZ+$6jnN-|
zS4zIaYxLtVJ-?|f(4Z181o8C?CO<B#D(OnWv8j+QIQBICH{FntRLw7I9;v&%ya^r1
z&$3QBU4+A78E|c0yFdhSDYT+&m$Z<J9fo_8<9mg%UDB-9-Yyc`X3iOvHOp@T^@<Ma
z?h81rrT6s_r4~@LQtW`?97<}N8CsR~wXd&G@#6GWpH4c|t{zUBBw>nZA!h5>J>0`i
z^-t6hExRhS60GmbkGD9Vys?r`?z)z$2n>GKit9m;V=BOuFQd<>0tsU-k!E`e#5<~f
zr1Vm8Q|a;{hfvH%mxdMJlxJ3DL@U+ox@~KKf4%FuekGcrrmz96u3wpsMmKLUvbK8b
z%s%|HS~L8hA4+!6Mn6=nwe`b3>al)hq0*N-u4X|P%2k+lR%1yYwx}eue0F3<*DWnx
zS)=-j$#6jW^>8}6$YwkLE(@JdCZy8-_3KH2+s}{zQK|cExXFe)ZP;eRPi)w4vhhFM
zh8Z@TYr`@duCU=PHvF9pci3>h4J{jX*)Va6iGQ>Wcb{#{TWt7%4cFUnh3#*x4R5pI
zZ*924hOgMrvf*JHrlgzr&$8hKHoU@y%WQbF4ezkwHXFWR!?$eMWy5}Fns^7>&~3xh
zY<QLpy*9kWh9x$vwBZdlyv>FiZ1|83ciQj;8@_GBPiz=<mdVF(8;-GIx(%~zINOF5
zHoVD(ciQkF8}7E@pKSPv4dd<l7;3}QY?xs~uMID=VWkaku;G3ihT7&_yME5KVWAB}
z?#F}cM~iYwrS@N9;QD6_?E1NZy~8yhGWOLc_wC->znE8!`<iuzETvhP^KC%HdBZ?M
z=e9WxoqpY11B+F$V(3)!)Lb=FO;8!&@(Y>IP-m$;m18Wm{Y5HQ%}^JsY;EgRUUiOI
z!oPEfM`AL+5@r6KuH59o{BvtNu~}~all<kYN!osrwv*5W*vZdhL&39EDLE}AovZlE
z@x1-JNL8t8`>?+l-#*+zzUSbl8k^oRc$8l);;Y3?eiwjOkdx3)%$0-+{XE1{qssAP
ze)*~hbFo@%n`h$pDs24PzGpl|#M5nS%A=IYzk;5UU#@xUd`j6RU!nXMSczHElUPkY
zj9I8*(iMM_j>J<$e139LVu!$z-%OqRZo9eUTzu8`@;9G+l<1Nl?J^hNr9FJ-L*vRG
zVdvm}v{~{IN>|a!Bt4}}{9=~)q#P2D<XghC9`T;DWXU<T;RaR0?{s%QKer&u`QeLj
z`IAaYCK*Ek&BkMzj>;}AE?sg}X}F<WRCVo9=8KDcRpLCSwAvSP@c0+`Ysu^d{t6xW
z1^!B1@t*3Ma;fk9qMG7xJ(pfp<1eZSSMUWzmD)(UinJ8*OWcY$B|g4N!Y^0ECGn`4
zrB^A!s5wPGe@zJv{ASja+Zc3N?60W}o1j-|No8pdi@APd%CD-_zUKICSmcv<B)o)C
z_*3{%xJwes5fK>`-7m)3KQ=BtVSp<!Y2cv2$tRqcGGyqm;Ui8O=^i!u<S}DU8JBwM
zY2#0yFmY1a8Iz}^pLy2V8B@>6oHqU3?__z-n~|L}^L%ga1sCS!UvzQ7tl4ws!scCY
z>1E$tc=;7q78YGqTvA%LXmR=XuC7>8Syg>aO|8#=?b2n-ue*N5${TJ}GpcHGmX-So
zYO0D$rFNIlmWrwS8d^cAnn+8k(0xmKP$ey=93Q2O7}Do!v_H2lM}m@dm$aWe`pz8w
z_4E^RmG+cNA3Ogzt}?D%OxyElUwy?eoAEDAP2r!!Ie~aQ<jRaAGM>2ks`x7-h~zV0
zr<eyOr7F>OWjg0ewBN;)s1~e<zY;>mGZ}AWY?OXjPN^4Rs?`0rT#s!%;}Z9B(k#cl
zg1^_<{-pQB>fUAI7k?$V7i)Lvv67~n)MQ+7<5J1r<>XOP6}M{sNsJ~$IWCpdha1XB
zDNU?Pu$7V0t$kii{!QL}^lB-+)M70$R%ky}sth}cPwF&OG8vz`=`=ypX$fh|m?~qA
zTct816l1DUr(!B2zDmqeX33M-NJ|iUN{No8RHe?Nv>-DFNcp6N^$eM<^CY9G<ZGg?
zU1?9D`koxF?@Gc-iA(V()LKMY-K0=WSecO|Rug*#(3DneC0^sQ1fQYYcehMQtvkIl
z!s+$hz9hDz>s`_a(R~K_o{L%PN9w@17)lGxB%c%iDeWUvo)F#A!sQ6%DMY`%N>CD}
zyP-yi9+O#zg!-G*ev$4ard-n7`ije~+n}`LP@cN!J6W9_jxUs-Z&#m7NvrP^`>s<%
zhslf@q5OaQ^rUA=pZ(9IcV;-fYTBr21J@E)4ROk<qXMcO+mk|lvzua}{HKTG`}X<2
zlAOz0X&LGI=)*#xkV#r(s200Z3)S}-YHB#WzUsS*T9x`TBcb%~Dm_}rs9DMwDWg`Y
zjv>^JLeP}wj9%?YawRd!_+Z8y8Na0M^fd>B;_7ZsXY^=KlHX(FTLRT(6ckD<*7Z@O
z$2K!YTz%YhLizpAw4b9>k~N;tyeGB0>D}E=rB-Cr@G<Vnc)OS|GF!;XIYe_af(xaN
zjx7{lT95ks_U%PtH*Hkfjm+~h;~$-Zp+{Pe`uq0r%gS8V_Mw<-d&S*dpJ}Rlyf35P
zsx<9nl##iz8nfUs3&`vyGo_)J%syszFkz%M9!(?JgUPQj(d@V6gi`-(Gwe?N+u$<p
zW>v!;$To90rGK3Rj5`;i^l!aw9%!4hZ1W)7+?HVcBZZ`Y)wX$vZFbw{p|*Kryz!63
znf_(j=Ha%vGtRi5WSj4|%_D7dTdZ+++vaN9JjyoLIgLA~1o~HKn?noeEZcmY?e4bC
zhix-Q7JA<b*IfU)VvIRo_kCFp$e2*3>*x~fq@K*EH$#o*pPLy{daCqDv!cuclbxEh
z5|fKqdrc_`Ow|8)XN|g+*cWM^vgVN4$iyJ=U9DTdQvRN+^VK_*9KxA(>nLK6WpCRv
zwsVNj{8EWQMvMyjp!`xR{S_6U{p7zxaYz~2PxXsPjLON$iI(4)X~ZQS-5CW7Vw~#i
zw6ysJuwUJ7-Nc-QiwpTFwXAv>KPNtTNyg~}IQb{WfBm3<`<Q>JjDzOiv2MrOc&V9h
z`q!Y2{dctgRjT`+Lw&n{J!4p{y8lJM^Z7RaLgC&2Y6HjAzs!LD!!5wED*VrARsZ{c
zLp3OHwWIrAgyY-&3xz+nMgOBVf3F8fN`v_qN>NPRc%rRG{_mIA_~`Bb+m*K4SEB01
z4d!5U?f%uRT3z3;=BDqjZCn?)x#{12u>Oa)+<M!Oe*BZ$e|pEy?!4>gzu550yYIR8
zSNHw;{@*<C@4tQUcfa5G9}oTE;YS{QY}4i~kN@$BC!cEGx^4T8r+4mZdFI*Yc0a#o
zZ|lAnUVQ20S6<!!+Usxp>CHbMX#2}se|`I%cmHO!zt{2p2Ooaa`SB;8e)jpnLtS5d
z`PE@mas8JWG{<Mad@Bac|91KRx6}VG)Bo==$d2!>8D#(4<&Wn471@LEZv<wM$qM~`
z+{@gAx#wEq-+GyU(968Oml-+hqr%_P%Y17uvpmDwGd+2#x2IX8IAl%T%qK_d=a+_f
zjq}SZORAR6@fG>X;fG>BueP-2;;X(_TI|cMEUT(nq8;WFMt->G71jDY#lG@uOAD&1
z{ncT6V`rjM`EW6d7L}e?wakQ^2mddJwdNFd6cgbtqC&<5wEy<2tGlUgRUHeu$eZeJ
zT3t6dI+_*Tnl)=6d|FyvLET#ARH@@K3g*|bUSm;LP_UMu?$o-qb%atZ>lQCw>~zK~
ztFB&JU46`YPEKYn;*;~6G5DXUcQR%r+>?hY`x)Wl73o#6oL`8mtVhSPb`I@A2w&tY
zs&JRq)Kt~D%PZX#MgGd-#icdpxX0FNPc^Ke<u|jayrQ(k?W=NERhL$}OP7@v`+Y@M
zRcHn}?(-_eAns+<gS)8GT~v+762b^q9U@QE@pSvEDJ?2-m(^4)A%uzM<WX`q<e_9<
zXuJT3>INMOo_*C-<S$%}?rZ#|HOtE@7rD!H#*T5XE%o_&IICJ;3B@b%S67r5>xK{t
zXvdFxmEU)K54c05<Gb6@P%p=Fvx=d-a36#hA-hf4AqYQ1IK+mt9NLMFqjoB=9cR~+
z;O5s&|3#%f$Y1Vr7gv>(x~t0E)gfNH_?$?*%lJaSNz{KWDNdpuC6!6I$*w%~%UM=U
z2Qf8kYL0l9EGeQ6sXd_}WE(e;`W`1(?c&m_im<FGuPmjFRD`mpj)`aK;&NYUZFNy`
zsk^AmS6bs9H_2aHGwG`G%1Nb_*NzJX?rsk{_3m~hso}A_rmAvDX{9gZzdN1MnkD6x
zR3*8g>S%luuJKp-O5L=P9?kQ3nVxn`-?);Uz3|h{Rr+w%CeYj-$(Z<;mirb<Q>pb8
z)#%j!kz{-HBVAsbp2%7Ct_Mh_%V+v!PrB=z_4Hp-s+&SjKW=}m5N6)onG?*3Z%_X^
z<#8vEa~IjAkXF<)G$|bGf7CcgTTxN9R3etpy_$m|*fHUbuF+np^pQ?c%_6^4c&$6N
z^jb!m@-lbnl4{@bQ~!Q?SJBk$L8yp~($7o7jaeG3dr9e%D*H%pwB6H2>k(1<nOhxe
z2mfnM_MAY}2M--6S(|;=m!C#mdDZIG4vISCoP{#K)GoY)M!0+-=Up<<)Gn+oUs7FB
zdSz%FU070H>s#nMD}7>hi5W-@nU4Ec;!YamRD(+5)u8k^HE6c0HK94KI+bb^Uehg1
z*pKj~cbO=*fbZ#HP8u4ehE6`AI=OIgnuL+~HpA5Ut1x!#Fpk&=6+5|K+K>qeXO7(A
zQp0=$)QKetq!+JTQ(|lSwMDf?z<k(o4RaR39I;U<HXZIpO}}bKoI}M?635_JH8|a+
z22W1x9MBfu8r$rwjw$R{kTfJ#4cQT=hWLOb{nZfkeGHkM+#1TuCU_pANNK2@m!#p*
zYWR66%_hgNJM26!J58yx#&?&~F(O`#@WrVSC9!J6-2Q3=@s5~0r0vAk<mMz-lyarV
zDA!~|Cn>W`H&uKWh02@~t5Tq8%G@}WLRnH~4{jaUoLHSSxStwa;-oAwQWi~T37<S!
zsWE)v@cklGzu6JrSU#zrQ>U;t;ahB{y9fNQJ<Nud{e=G2edT-7nWzKg3#Hp%)4soo
zo!u{-x2Us}x`(fxGz2=(X%_EDQVw^#a+f42_uNF~P9LD$HN!iHwxzV5&^)->F+5%k
zFL9~ia|fv5)bsG!DV-;@*)(wVQ!eVt1x;PEyJ<LjI<o$-y?$wzWynP6Ua|w)Z&xE6
zPpSdU@zrs5J85Hm<KV5RD7%$AVj@(G<7c}42|e|f*iZ3vuu4n^PL6MO^p8;eCr76Z
zNsCh>)9+Iw9e1juTa#&ntt?Q7OzN*r@;#zXDtTC)l>P^Gl4GMvw9~F8?Ica77){qu
z8>*S5)H8g44CQ~MleF2J)^xX5Y2z8>@9(wS{qvM+xTHI-Bxw(mBf@=b#$`%f%J-_B
zmdTH)XUUJWjaY<a2lIVm`#BZ7fN$UzIPyyx6h$A5QG+JCbX`lBjZ8*w@`b{D1b)ip
z-C-O9qtw9k1U2xMxB`crCx`A2)G7TTX?U!uciO}7n(jIe(dZY2N<CPl)C4;ZLng$j
zVI{NFu(<_lSo+0knBxLvT8XKPEHdR79;b%;QfNyj(w0t8!yN-va@(NRq-NZt|NH3o
z^r<0pW9a|=)R4)^%?{oF=y&wp6xvzJ<Zo_!mETk9Exu6O)Ai$vCtk)D`Y&Tjr=%F7
z?P&;bRPxQT%keRnw!V*<=cV+|k?d5-KE9F|l}w(JCnq&K2Gj4Q?~~8L*h&AlX;_eS
ztpC;!%@$QE^(($RLvas_WeiP(Zj7bSdDtzwYz2;9{Yo;T`v^>Z$B9nH-2Upsxj^dt
z#L0uIwY&Hk-d_#BoAR|KwYr)Us^bge(qd`rNs<m@*f8dWVUthnG&DDDMfz9W4N5)4
zcjK256Y=Qu85b#=v;{{Bbf>&2ls5%C>Y!SellY)Vo0(~13q$36Frd@{zHoe+UIU<4
z0`!VkgKvRelE&Ov(qQ~x>@f9D9WhQ1p|0)mzd0$XpGu<Mk|xV+)}6-5KW8t-w<SbN
zod$CYVF#yEH?!?DsCO6PyVFP@4cY_axo!_Nv@tyfIQ1CNU&f;Iy62Pc|C%)T+DJ#B
zV@#|XlRiX^`DAEkO4|vogPR9dClw|Zn0{;Kx)2?n|GiS3d=WNXhm3NnfpcB-y8&uo
zjUELH!*iw7kv*plV@@3gooElHZ`MSlNj)*|=8W_Wq%M=F`$RQp#(-O5JDqL)TBDjn
z^R72se@T=(QMq1-tJd?i-Of%V?Lkup)btLQ77phk+yLczD6YF*4Tw+!CdY~wJs$Ul
zy=nHrPNhEPlROJdIx&_u%UXf)=ET{9IzufcM5i?^N)393TiQ0AOrPzs4w!6OY{>sX
z{QmJ-rOHEeJ&F0}mbkY5tuf8f)lr3!1rcdNSE0p_v*Og)^lKu=I?5vZnj_r9$e;At
z<Fw^xURCNVzEE2}UVHr6e%d@=s6Cpwsf4-dvOedg7RJMGO!pn7zUB+1Yx+xfpEUCh
z{lv$3$=GC%mu(>$-DmO80N?FL(R2WQY5%mXAvN7JmHFc7cBS6u`-APj0z9EZsTXat
zBbl*}_LTh4fa-+8_yRpHV`e?nIj}9U)wJf=g5#{WI%U1(h>lRv>6~N?lztFPKLAcP
zAszi4s{d8A8R>tkfqD$G`)&<w`1A-h)X`|xmNKtvbAN~KKTgc!W7JSzx?^bi6vt3U
znj^HnsP0c(@%>ahV?g|Dv(|Ksj8`LlNor(CBI}0%YGn8PX3E7F)MLJBll9(^vlG-Q
zzQgL2lCRV$>0hc-9G|K1tjHKE`B={}o6i4vj29E7^_ySX6u}*8nJtShw$<3(9?|W`
z`0W1sFZp&un}5l-8#?@7k#8UA=qbk8<bYo~!|;Xj*h$Y<<D=%33S+OJ$hUaDx&c#9
zE-TzR!+BNrs~Ir*e5JNPC`{CyIxc@r4V(Osn5Z*)eo?t^W>w7`m<tu9cGxBOtSqe|
z^o**?+Nz4u8NQl|9GC*g@SdPNwYBAoD(x8NR&^(-N*u%lyVvI3lIFXTrW9xfJhM=u
zYG?$u`Bf$Uiqe^|ATKIfLc!FpBWDS3u?Nq%JL>Yte1C<n{JiD9(z#Xh%S%dUEH0{1
zKeEdh_UBRRYKeP}ufz){O}Lv*F$>2zM_8@!HHBh5ie>!OsP|R2&7&-}gU(hnDynKj
zrVDdsUzC$KW%9(53RbrPCG?*STjN??ggG$t=BpgX9A6Fpb1BU^+6Pq!<4sC8$D23b
zQ;@5JzZ&5!EvlYbQ%e3`)VN33Ch8NFQwjTNMoqa7W@*J77#qS;SDBG{rA6149%El^
z%34F+&0StCsodPFy?E4~s1PTuoBnS_&8u9j=~I%ktQbLUQlTP9n)yrUb6n?$$lTiO
z(yRQ77M0c%)RfjrlQ<=6wy)xn@*1DNsA66vT&fbKMv7ftRn^u0>X|UMB>{>iET9x|
znNd`YbhflEU+FTR8Y^}tXwEX#5s_O70g5Whuj^f8Pi4uR>hj7NResX_5NZkkt)Qx0
zsHUD1+4LUfH#B9B?jK4$AT+xK29l=i%i53WDTs7v>J>-}RF#5zW-v3ID<Lk<$rn7H
z@?S#EN_2bXd_rC3m|0OPQ5IDo5&m5<k)$zQDkfdcbwbr1t?)UWlIe?c7Yj!|7pg4~
z|E4LZJV{l0jHjdoLf0yFlGvDDV_GQnogO`(#-f{`S|Mo|7egTRrKBP~Oj?Kfo`mO^
zhKj0|BF<MYK(UHadU>w~*Bmvcq7)hXNs)Oo@{6iz(X=p9+a5WaoJxdB`6M+#L*!SB
z98%PrZq~60S36(*Me@;?gBsFZCW%W%0{XB!I@HDIR)zb$`i&VM3QBAAX+&i)?T2<i
z&EFxh%q=gz+AjC59@Mo59mrd!%fGyqYYB79NvBp*22B0H9!JDtzVbxoRTY)wm0wlE
zH3Ulix^5%0OHIXW&~e+tA}!*f9%d>B%3Mw@`fC?UWas(I%4ljz-6quPF)EcHufL?a
zsHQYb+fwn-gGQGW)szcUb-pSxE+rS2NtEogr5tv#WE@fIPo|~QU${4IT7*5qk^STR
z>Z*;LSI9YJKI+syG30uDC~IFc!yeyHPZ#ko-@ktUqQJi>@SmqZsLxHl`@n>sj#ujW
z%iS-Oy(G#H%un1;;0yIPIlmX2t)EKai{?w<>&M3yk27&|uFqCbpYMxZJYOuIxW(~>
z+$3HJE6~L!@ybvkc1e7&+4Lv&qxi%g*1GoRvCT7VGef8jGuyVGV?!CaB>qeJByAR5
zI-Vs!Hy^{Eez1Whi_X84L;TnANuF2Pa5YfMQqL#u4SbTHAM%~b2MbJ_e+iWQ-peQH
z!K%{sj{&7jd-%ltRX%Y~fha;B`GhY2++X5xe<oe`aex2ZeEm<weth98lY`?6|NKwo
z@SmT~ahrfWOCPrhxc~Wi`(H@m|9F!q$T90LM?{n!KJI0JE?m8Q^(dQ^_Z=|EFMnm=
zs$aAn7A)(AIt}l~|JHk6zsGHykNLamh_TAD;UnMDzsL6fDE{}}{r25M)jM}vcXL?Q
z>lcpyhF|IsvzSn3y?({(Zgu7B-+O&>FW-#EFYf=doB^D1g9(Ysq2P=jzP$FmgKQgS
z*>IW-Gi;b{!!#SF+R$yo6dO8i*wxR_`F$I<+3-&`+;78|Y}jhU-8O8o;SL)%+whMz
z++@RtZMe~f_uKGx8{TZg1{;RrUtyblHmtB=p$!+<&}+jC8>ZRtbQ`*D=(J&1v?+Ig
zCVWQ^I(ORkmJQo%xZj4YHf*tBvkf=eaDxrk+i;l;3vF0n!wegy*)Y|HZX2f9Fwuri
z8!8)iMVb6}+R(CLn+^Bdu*HTOZMeaP>unf{zs@#S+py4vUK?iE&}~Df4G%|}e0*lZ
zHXClT;RYM_q;U^&|F@$J7nuAUFXI1gccH^K(V}y9-}x^bY}a>+fz?9|TyK}RAm5l7
zHuM^|<OE|5(LwCxS0{_Vf8wuq*?OCMC*9k<xA`CS|Br_MXUE?=KfTSp)Bl(G|0V_g
z-aV3tUcX5D7b<PnK+|6>8;1J(Rdzp4J!tgs{CB~LBrIQOylJz?on^%)AOBT&qy2l^
zj(3F}?>`EqzeqlN_Z!)3%1_ow@>3T^%NF;)@5ip8Ms^OIvm)A{-sS6@;7}IuVm7=B
zPj#pQ;136JR}(+C0ap%I>U8irU<Y3t{@({CCUZ`Xy})x%#0;JV%o_qv8(d(^aQ5ur
z0$<=0|D8Y=GL(rY6BhUZ-(c`g;Ea<9KhB{_fS>afVBZBib0oZH@C@K`KJl{xIKpjk
zH}I@caK?F!GXvPlCus@1X|yR9x}p?%pLAG(Kj9NUw*$Yj?GFPdj4^&T0q;3QsTHJq
zFYqJ2dnG@>q2rJh10N2Y14CgG_*~#ue68SzfkRG1h2>cM052F1&Bs6!;6r>;mWP40
zr<*+ZfTz(QQt@*-uz@cdT;R_qaZa9!&MDvrX~;Ta-w7OWhKWBBxQ%ZGes%!QWf@+F
zpDf^4d{U=}fk&p0XY5rv=Vg3C!wTTLe4W@^z>8qm90o4{?m7#e3;AyWzRoAK`V;V!
z4DyD($V`kqhj;`BMo%Yi;7;I`=TZjn#lSy&N2%X}KMZ__PvWtF^Rs9J)Yk&wwR}RW
zW?&ni_z}qU1dR)v$tQU(1UB&P$NzfZ{d{fU8-f49_qN0X+{$Nx?*RVjJmfUMZwKz>
zI}F|m+>sA&>=gU}hhAjT8V-DvPiV3Un0>LKt-$nI)Div#e#qwq?*!J(CN0V$@bkIw
zt+4L`zH$jqK7*s5Oq4X~vZO6g>NhaBq+WgtjJ(X0D+;)rZxjC40w3fPI&1`%vK8Bp
z{bJzze3CbTi3?3wfio_LF9m(Fflu=Zty+M0UBUhld;{<`KC%B3@Dm%4zmmSsC-w!v
zdcL{f4ZtV(B&}v(RiVMFfx#m7t@z2fN~tUOB<#(=_7dbdz~2W>;#@-Vp8>p@PyEP9
z#<`1?dKf$l_#|H|cr$QDxxur6&)E2G;N0&)Tl@$-!l!8GTohN!`GkfmfGvCyzrcqp
z@PeOaU^a}y#oz*;<C8w}Ht^X>@&>*em{?`XCGa4h^tCQv)-~jZ_yu0UC+)KkxSdbZ
z64{l%@JSip26}2ZlOb#!a1UQ6cq{O7AEMyk)xgXAq(__!fxo-f<bNaZ#g&YK*uMn)
z=my4H@J`?fH=6iUfWP3A@@@cr%vS;a8F0fozSFS>o)s{DGJq%EOuNKS3h-h+$#Vhl
zmwXcTUf{V+hPGM2J8n09;ZER=pVDXXBXGeTCJ#Q~)Sn@5jr}y>HFp~N_<&#V32hGp
zH{E6EDe(HA6F>e}0RO-zd3YH3IiJuCJ$)+i7X}yDw!y?BF!63a`jo%}_n5J<4fx8v
z45irb2k!or8S@23-DlDjIL*cde#Dn2eG}&HR=x$`JAf6x=j<0;;JF)Vx8Pa88a}D(
z4Zt9u<Wv0z_(QZU{HQ-bXFll{1;D2th7Q=b0+Syx<3I}VN*k{RraX#&{0Mw&lTx37
zzYV-@GyLrF&<FVX7U~`RPr%C_r`>~B1Mhv3HViKCmTlx4{5GK4Zsrkzu{(@?Ja7r0
z(76tn_B3V0e-<!iC+z{;4SbnzE%<)mS9~{v9|jKDWy+feyx|$z0QTrqR4?*LoG$_Y
z{4DJp`!?VqK3$JM^*rMb?NHzvKJmX6IDe197XWXU4|)o`dar4#6~Iqy{4?NOnC+>=
zBXG)o!h)v*<6fgI;PJrOd=md$U^}0T5AOpXf7|qhKLTgHW9n!w@a%VK(}c|c2KXfG
z&A_RDGwp2}@Lj%6{8+$+mdU3;M>}O>&2u_1y#tzp3+#HI^#r)U_zz5*5%>_Fj2jOF
zt3HP2_^AeV@X6W<fe&^2r+nZ7%RZxBfiDLBgiq54IPM_wn%JiUeSBgs@If2j2<(4|
zwD1!TT*W8jPXq8NzWvxY1K;A4uyP+o?t!ewk3hN8azAZY;6=8*K)FjHegw*$2k|3N
zWW&W?pvd?OE>L9f1s5oC^MVUZ_`={KZ!hxhVlPl+#swF++{Q(2T;#jOUZBW>3NG+P
z8y7yJ$OMbMK#_Zuya^PUR<Rc-vY&zr6gf`81&WNO-~#v9xX5XKXyerK|2MxVUD8Mu
z2~4Gl4ggjIQ-EuM0R1!mV)Q;`1NITvZURcUR-m}kMe3q~c&h6MNCCzG5x%Yi=%0zl
zp>Ilh`>>~Vs=_|(CGawFw11&^#JKi2_O~C${{G|GYaQ`@#NTop|ND<)Z}nj>eAq7R
zop&>?K)kn20aWL`teLS7nN#j_sQaDW=H}ng{~&6}J@sMS$99`rU&EZ(ZC>^s{)s!}
zzwJZJlqqEPe&j%AsoR{2o0~6-56NNv9{)FS;zV`+`RA+o^XIGb@^a<(`&FHIudCyK
zox1(@+tsgs{cE*(^JdlD+^k-G^;LD`$Pp#mSMjAiW9Sr9y!yfJI_|ygTDp{>9^>BN
zM~Ca;4=-K1Vug74D7gFZ-r(*-IPb#j#DK2zAm*h@#cb_G>9;mx8&ppId=xxfrrnpW
z=ybkM;NVW%ymYU#OTw3x5x@Ly6#u*TmX+-#eQnn9mzD9*K@dMTO8kd$mmhw#e+e(Y
zibI$Wlm6bF+Dsx6{{cx~{|=EpZ#(QIf5cW+Ciy$O_lpCV4vGhz|J8@r?LNHwpu{2O
zBeNIg;^A-w@nequ<1>R#y>s_oiclu>aqfR`)gU1NKZaE0{Cdsgq`cjG@o_WWiT^iu
zoRMKXXmi)|d+#0n+uho)xD)Pu&$M6{!Q-|6y}S3^Gk15_;k|XuVun7!ujf70byz!#
zf9TtOXID@=Yx+wRmT?yUTIu?J<E-P?d6UQ`zP0wRSsT^ik<B-@Mb>?%4&lHaUnIDL
zPdAO@Kyep;J;O;neSJ4#AFNXjzDT|pJ{RA}ptSQuJ~!XrYv<|d>FB>j<LI0@>bmQ$
z(|HTE@%8K1s|Ox<Kt25M!@7;X^2#gfop;^|xASTd57@{Uy793XY3bKjUmtw5>?w8Q
zQy)E5c6F7ykt!;CDj2-+sg5gY30L3v;pbOA3UcGm-{D2jugX?F^Ul0^^PVcpOaFJ^
zl~-SI&BejsBUc7*XdL&{cjsNHZVcY@)Fbo$UwdZ)US*N&{YFI=l|^(2xa1JFK!kvZ
ztRV>rO9D}F?l7o$W5CEF1V{j3lua2|2FZ-0C?X_rK@t#L5JlPCP_N3S;tDD%qDWLk
zT<iXSo%4o642U@2_k7>;*iSlr-le*$s;jE2tKRb-`g?p9{ZBR9{q46)otNUP<f}zT
zTb*jr=8g?l(Jt0iUW0qMpIW<&Pw*(o^GSy2Fr{hJrY<fnPVZM};}Q}QTynDB_nMaG
zdDp*xe>Y&j0C(Yq7rIL>xx`Jmtfw0~bf_CKVuTwtYLv^()q6x`KPFF}><Y#wy5hej
zxQC~7an}y*;bvZu;%*(C?B?bsxs}s9yT#Me+?~@0yT|5?anIe-$89LO!o{vKch)*{
zZJ#rj_>8&sFPiK6in&2An@icEaM@et`foFrr}~!<%w7D6xgp!l4gTER^y$;xjW^!t
z^7HfE?YH0V?zrO)ch_BaxdjUrxO?xt*U#_LrAytTk3Q;c*^^H`={7&T)LrwXxkpRQ
zJ^Spl?u8d#a4*07vfH?Equa7&i+k&>x7@q$zU%gUwAF3?%G~?!zwhPZ(@#Hjd-v>e
zAAV=9w6xTH`|Y=0R$%Kf@!G5O(=#{{n(DLVyDydSNZD(ZN>1%$mtbw(#n#_VvaxQC
z<-131ncHF;1AFRD5qwNPt*>L8OPDQRcB!715&Y0nt(8{S-6Z(C1iwV^YXrYZ@H-;l
zn+ZOtpY|AI<X6siZq`!8BLu&$RNoaA{8qugC-@Hq|Eb{j2!3A#e0(#-<&q`q7t5a-
zr<l?##Z(@U@2q`@ZK~^RYg=dU_IIXDvF*xtR=UjDzK!Mh$Dbnj7{Rv@d^f>o2wr`a
z4j25Sy3THD>ug?sXAh2bwl-gVE_3$L#slzjKKdOe_~Qj%L+~{PFZ)v}C&of2JL}fg
z*`WT;{x;Ux?fK4@FLSnK;{kYAOYgm?FMp?zo2_@*E!EpaUzOyS>fO9n_abL)$2jYM
zoilB4E&m~B%ho&FxGe%cB=~a$-&gR11wT>nvjl&S;2#$JD#1T5c#WC=j^IBMd}%rS
zS$Zo(AN4R?JzTFI?o|)ZsE7B}Lup-eU$r&2x4*f4W6gb=Z|=Kg=6={{<?yEozLnq;
z1%H9yhX{Ux;BOH89d%8=?O^Va{^r(=HTP=1xp$VC`)uO@`09d(1E&i9G{H9#d^5qH
zCHQW2%?)g8Zft*ZGsmj0d~>UpnR{#F0r-PWLuOftJeiWxJ-K^wsz24YWo*+XF)_`0
zmEVxuJv}WgH8njYF)=wcvsG;K=1rUQ>eV<id_!uQF6%E%A5v2@<63Y-uU?_>_4JIC
z9_fkdzDG)OV)x|Cv$&yY)0jr#>uDKD$?3@{sVRa7v({(D#dQng$Svs^=|SmvT2%ea
z*1CZnn#42;H5QU-^q-!dmYAM-M!g16x~>~y!#6a`6ntVb9i*gZo>s43gR<)$$0ji$
zA(>X*f99#D)T`Gg!FLenscfX{!ao)G<aAv>rQR8R!npNq2?~PGOia!=FFn0SdS*j9
zXb@Gu{+~`f@x;^nf+N>?X?uo7$!vJg4Vkck>nS}l($dp2dSpZ&bc3!pZ|VE*o{^f~
zBO^7V=a~&p4G*CaGF!y9>MQ!`KgACba4oZIlu+PE{PX>{?UErDXY@$V@I-hV1O5yD
z%+$6?ppc%Ck=d|k&wBOhiHP#+ndcs#nH1kcL!77UXZGyrsXV>>dP?o8wL8{o(<41K
zLtO3|?WsJYXIMNEJ0~ZfeQfQjZ4xsxGBeV8WRzhk6H->vQqJj~5`SEkn&*Wtz^k-W
znXB;i%uexjY8+psO5NVV5EL`g6D3Fot|xbB-=<xSW2>K>ri&@vCClfWlag}adS+(#
z<nz1Ks#f(}jgXQ_?`f$A#?MSa?#}OW(lOPNxSo<IaZL}v#XtBX0ZTfeZmsh(Q!)~}
zNY=_P>v~Xn*QwhnBUyY*i?|H`Q~ez}-=SSf7pY3*W#7N%H$7E?nAW3x=L(l2`qxCK
zC3ij;TKaKt$vCKU*;iXLb${(?iQDB|tWlj-R)3E_H&uO9tX7#XH_ath@aGQirv(1o
z1s7c4{gElzy~=%$`zLmDHw^FL=H#ZhN3QANmfktVbyzQ-LUykA8|DVccfe<usP?wo
zZgX?z&UN$V&2t3>1@4}E?(x3D!w)~~{lO=mc*5Z;ytd|kH&_0~QuzwcJoAiu<&{^w
zZ?NNoZSI2)K5#pB>~Nob_L=+q^UvK^U+(d~!8hN0<9_<-Czt=Nxn=SdHvSM{XX6`b
zq3fW9PI@_eh!(m@TIg=kLU*65Ymd0Lw#xOl^=_<fcKP;>TV@|={XVeHxOgpy{h|b~
z#dh{tf<IUANrF!o{KbMFEBNaLKTq%v3H}AaZ!2GC{_s=8zCZkw|1bTNhOVqMY}imr
zq_}ni{x^(j8Xq6ul24(A4Wk-1Y8hRpR;@GT4>yR3ZQ8VX)A+h|YPUE^#|;}bZr)t?
z)~ypA9~U3zPLF9B8-GU4_`15G)=4Lwd3vL!vGFI=j6E}aA{2^k8DG8niLrudadNGb
z8b;M`8Gl0c>NRUrt$JdM+O-=VcYMQ^XPi*ICMV+SM4wu%O0^i>8y|m0jjHtjr>JA<
z>F9*UHEYy}(>|b4)6<SUT~`HihK@CU-07z@ZyXmNAJ<&?Yy6gRaZTdl8pV0~PFLYc
z;6{!7p_^J;Igo0)QNFUTRn%5iI3L`@{epARJ|^hop1Vs`tGJN<|E_Y3pyjdquN}y1
z_ia_RjQoG29E$qGjSaphsGb@f9o<MRwTWu88Z~NY2jpZK;FMfwrS4QuQVlq+kN=SZ
zf9O}cn<FalwvH;|ADTaZ{$I83tlYC_&&OYU@x>=vdp_8`d-q3bx9#1#caQd^JKlNc
zon_BI|NPB*&L^&G*RGO$Pm>l6-;Z`ze%^iy|CnnQ=98N>Yt~pTydu1OBqi$Ni!V+*
zS4B6Ura0m)+DF^!)vN83Pd+iNr>3|I0V><JZJTNTZCn=(rakz(J9qB<RJ6XoY15{=
z*REYVwR`vO?bHwRbh>JN)w-(S!o1cDS3bjIuKh{%4AuIIRkYi`f4?#V+7=x-{td+M
zSEYmJ&_{<39h!lk@bdV-_~MJE7^w+ATd`t=$6GNZ`}pIJZNr8QrkH}i4;c9foZlgs
z`OB6qoBY^gk4=`_*W=o2uRVXvm@%odX3gp+zZ%?HsK(W=U%#DV8yB5@_Sx_*Dm67V
zmVWj5H{t*F*I%1_nf%6$8@Cq^XYJax%M{Zs=ku$tzG`p2`KHHH^W$-6ZnkgVZg0Q+
zwm*iZpvvd*pCxm9zx?vc{gS&M)aTCczyIF8`s%B%UwiGf$3Oh=!)+StJ77fTzoc*N
zg~Kdhe=Gj-r%Yp&SMU!id<`md5>)VqSG2)rj;R41wBQp|;cP+GoLf+Xb3uDF_&@#h
z(=#=XF_MWH(6VmbI!^=gp?H%q2Z}R!c>zasLOSf*&6_tH72RMyXweUJ2bh;$ddbtk
z97_L<c~GpL5N>(V@eexxBiE(FXN!g-)!zpD_U$t*Ltg$ncI?;;Ii@lPiksQWl`Bni
zZt|JE4l@VLiQ;O$g8TaQ>kVDmx^=7n3=P--<PAMxj=*iXem^w(EwjW|%+7hiEdE)u
zxV2`j*O*=KqS>O4%)Z&TZ?kj-{Xdf8@n5xSReqBuP1?(cpCx-~nh#F{HitQYuh7F>
zfIFX=|M%W|&sRRfbNCIu$O5#0H~dFN3qLnYecdc+lUWyq;5#U1&~CkGc*d-yXlVA7
zS<Dk=v))l|;76XSIHKb5m#w#;f`3qhxd_^$(G&CldHL&mX1%uRyBx2H|Ina0IQJ#9
zvqeMB8_IY5sCc)2Bf8BhFII{y9#LtaI4QC`vt7G(F_MKD(4l$o^aOO!!b{``{#Ql^
ze23@E5psk4V|TS@^9Y?U{QJCJMniXff3ll!?JOD;Pqs0l3;c&~Hf!=^nOYnX_HrY&
zW>{eVk$<g6Mh)hJ7W@M_NB)@)<O<mcXhFx3GvprK2wL=l@@M^u_j#frUGm>k{Dy`E
z{X}=Cm&<5qBVACO++tVz+p(iZQat{$#rcZyx7R$(LeH=*mC=E`N6twgSG4e->#PgF
zVrL@DfF06NXn5BwO*Hfn4NG@N-f_s!U+T)8hajfGci(+yT4xTb&=Aysj>_gFpe2%y
zAAb13Ha<Sj?!7wQ?i`zFw~bEnh+Xut*<U_1>%ZMB0~+28>$7C0YoO2AB<V9YshRWu
zeQqUrLZ^RLo~;rZJpP*RnTlP+$ga<T7VIHyKm#puk6c%zBakm-9a-A;Kabe`S9Z0c
z@d<W!UN=tz1YGi|*@a;m`fW4oE1Y_ZhH`y|hOj=j#wN+8HkD0kBpRYul-X8wGra;0
z9{-q_m~#8CHJ)|;7xRJsvK|EUfj)2?=n44C?%A5#FSFuFUG2Ur6Rc1)%o7ciEZNUN
zqG6zH{C|C51`UBeLqnj?*rc}4i|<dHwSWfkKlHfS`La_guT+M=?7f$N>Dny(A#^UF
zBcO#jU_FSOlYkal@W)O*Iz8EzT-C)EiH3VcL&3N*{PXshUHX}5*lG4x(SSZ<lhS3A
z0)2*tK%b!@&}VE?>`ITnp6ofOG(gW-U*u<%S7-=oMLGgqiKK(i&_H=?YA1W>>dv<0
zZ(ZzxiK1abf_+oE%ifSWLqn!$P>#+18llhFB=k91x`0jUD4WFk9N47htIZmh;a|}%
zdHm(y&urhmeT;mR8PI`Uq(x?+1D}T$S~$mA8~9~hW4*;^pgb|HlP#ap$(D(R#iC)M
zXn69D(YAMwgy#s#r=oL|=A<L*vuFr>jOMG#fDhun>_7G*kpIq|J2zu4f{MO^H@Ja&
zKnu1Xd(XZGyUAL`+D2J*O-FlNG(0+`vn{>4i<O9miu(L-*`)kY$u{$f?smiQ6uWk4
zicP&N)ovbtk-hiE27`u3AH(ajY!an1{AKUG{0pC1;0|82-~`_21AGqV1REdeAL9=}
zBl7?B4c+W1(Xc`^JTh4{NEgs&Xh5H_Nq5MuLc?rm7}4FXA0`?uPqitR_3$)+Cq4%2
zbKqmN*ZQXN3;D-pum<BtP!}#-XvM|FhF==gU_NLMrzeWb+J?KcZ0)rj?8)h(LAvm;
zXm~KJ&)B4b@!f1*Za14VCed!qNwQl;Cfm)T;X2W9jcAxG8YmTgjQ^HysQkkIfWKtH
z%fIA$2DDsv-E~${QsU_eXrMh59ngeq0lRbK!?tcl2U{Z=R*D9%&!PdF6zKB;*`&L2
z6YcgfN%k+%FiSMtBpUuMIhvlG>Jh~zB}e!e4@>V=eqsN?Kal?}UAi;_2k_KWA>}kM
zFOhT{j+UQ(`qAEBd#61+GsRY4+tF5r^%<KK=<_|YNzgDiOv67VN3*U-wi}0+(Ey^}
z$B@6>S9PB3)z4-xRgirS8!+cufAjSmLwZh5&WqrRKB5CtrcCiPM9No1S}M*7$JhjP
z;n&I=&nzkTG0^9Kg!Q=s++qD6@MrFO_wLO+*aHtd;C(NA8pQ`}!h{LsG#rkO!_5i!
zV3QufCjFW|iv~(1ysqq21Nfw8ZPv<mTJz@3Ei*II^lXOV*X8Bq*|>4zZ05|FUauAM
z@pcDas4`mMJ!=ED3SS6+l>Gn&eSY=6@%H2Q+HVw1@auD=k8wv>pJz)KD3u`_oKvi#
zwtW5n(y_<CRjXF#>d~GY{lxZX@}vDc6c!fR`RAW+dbY^^@sEF)a!PjVt+#r7*x$o%
zXkaa1oj|Ur>|vk*dx{*g7Q&-vZcepL_k;gFd-0wL2Yd|a0zL-%j7_?8Vg~5{>i$cy
zzZ;bbosRrS*7LRRZ?ETIN~FW4Yo_14GwFnJ+^0_;@Av3=7;itp9bB0sXb39j;5V|z
zJ_p~9xj-M#X|K<k2iE66pRq}i`usnS&BqU%8}RyYZKqD1Zq+kAJ`TdzVO=&oqiA|2
z$rRJF7A;zsd~1&jc;GKZR%i%nKnE@TQIV;jZ*1$!^9I|Ke^1i-T;^l2J{M0;vB&;3
z)ZTt+x$XPro6VZ<BaT1lSxTERW5(BdM#-+Z=9+IVy67SsIdY`uyY`h{mY@N>AnpTh
z&{2^VVi2su$UQz1x<Wi+wf2*o!$)GBfR;*%Sn%C@%-3&?|In9ocY$J*+pfCms-MAA
z&yD(uP6sr!Y}wNE?3$kk)(m7G-zT60e8C@?hfekewCDpmf<6RuLW>OIn*?hQdvEs7
zl9%5U|3tTtf5}pTo)_DKo+=}5S6_X#p9g5bt}3={0|yTD=a~a&2r4uL`(E~x_}Iuj
zc+w(6&=$xS=kclVxn)cKso2xGdd~0`_7F#dKXOk+mWVe)6Sxs`*0XnBe^XLYEGa3;
z^mK}!2d)DX&_El=RWK)ko}eG#9<<02dj{kRKajZ#;v2%BblZulM^e1~6x}nG0*Db0
zXQ0ndJ@u5Q0sas-lzw;`va+(QZ{NONwv?0i_`_>>4lUq~9$<es&mIB!!Pj0bJwON0
z3Hrqb3-_PZ&y1+3s3gsMq2f+Eg)})I@;XOSy#El$ApTFlSMb@kZJWnOb8GS~c&gaz
zgXY^LZ(asiqu?|5Q#pnP>?l0N{y+54L$+ke62AsM_~3&cju?UXv{Sb260MO}3-@(8
zcfF7%?{TF0n+D*E|AYOPKF;D8eWL{z<{i5rIrYAT@+982O4t4RhOI%qkvZ^3570~I
z1UX?2h-Yy<D14@0=7{-VJr}+A3UBNtdBP(t9{)g2X(MGA8iERL(1i@43)f$Ny~$=7
z>vUuRx1a)poxv7SkRSF$RB(r``Sa%!V_cxG#s5~^q0!?X`2XVf3}^`KVn9nk11<c<
zHfinl`vhc)wKkH!;L0)hGdF<`L0$*BN0#6@IwYGhM|d0!?&bJL%0D(Day}}X6X+tw
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

literal 0
HcmV?d00001

diff --git a/venv/Scripts/pip.exe b/venv/Scripts/pip.exe
new file mode 100644
index 0000000000000000000000000000000000000000..13a9b7333b770f3e6622b033c7b419f6a5a6df13
GIT binary patch
literal 106381
zcmeFadwf*owfH^BWXJ#sdr(FK3XTvIjhE0=O&rh+%*Y;@2r6h)P&62^qEeU<tSE^)
zX*2B3DLtpQ_F`*q=h)Mp)5|$W0=AkEAc<VX8;VuD?{QEOH3`@K`>totB*9DH^Zx#M
z|9Sc7?EO6ZxvpnD>sf0(YpvAWu-4^vxm*SOZ`&?cD^K}Xt$zRUkHzN^r*9bH`tPCJ
z&uGnyZ9ik~;yacHmM**J_GP!+6{x%A?z``a2X4JBuq<(R;EuZk;n~*&?z(5uZRZyk
z4=c?!{p(8>-uvE-BPQkkkNbZ(>0Q!CxBPa}7WMqir0=We+DRYs{BYu<liuX{-i_L%
z^(z0dZ22E#pZ}tsSKm>$SlZ0ZU{1v4TJ-H9t_RLKHb0klz%{`&Jb#$WwV#~-baJ~c
z;^|ZG)p_!e_k5SjBR~AhJzYN104>p+5B#bdbCt4nDd{wldq~}Ej=Z`aJ3r4gRlVf7
zelv%cwRx`7hD%27U%qPz11NWspUe7RJ@Z_x&QQO!^!f4IR>t}A;rsl^fMo8n_=Elh
zT&{)ZFI#j={1%tXx>!CikV+m0<bB{@HE43aQ_R&w!X*$J#d9*xLI0{<uD0`+ItA4n
znX9Xa0#m<GuKN6C%a_&hNx|eXzF$p3|FUwoExCt+R|xXT+Q=M!@`ZBK<?H|d@2eru
z+?}{9X1*FtUgN7t&M2u#&I;&_`*klsH$DGWk>}DYHtETx(sFWQ<}(`v&e7D2l5lFe
zt*2t8<$5w)8nAvF097haqD(4GUP@o6r~Lbh@?4f(>~gJ_b+P?xKXSRYb!^-A6@Ah&
zeO3(WlbnChXX8Tp+%)pUKK~$n&KT3*=V{qK_2m3gubzyT`mWQB{Q=YSU(=bJd000;
zuGkwhyJM;8N42MRMa^!j`DE#~OK)zAk25`{Dz_sP%!_K_m!o!jw2Z>xs-u}*x*0F6
z)XfgvoX?z%O@W&`w)OW@q9<3C2Iht4hUSH?4PB?3`{}njW~O5)&shu-_$<9z9yOJb
zinn9Q+bXSv?1_-Mt+|bFMHJC~&~EKIZri#^8Q_{<vD@+iXh~c5Ko#UAR(Bwjdg>^}
zn(dILAB|MBnJ-!C(`61)ZB=RBQw6|3WWE$Nw};IwmZyXzG`H*KF6&*@`W~6;>5OEb
z^fF35%=;a!*V)msW4ilD`a3M&laPx7bF1}J&FPm;AqYpB8Qp<_e!rRRH*9u9&6jj@
zhxMb;QhtXtx{}_QAG5o1I5TIS<{s_gc5DAJ=1A|l`CO<~=!f;<<Ene9S9Y8cST%q~
zO~Z^FP~fO&b4T{;Wqr)`*m!5IF>?!jGBax;eL5W#I~_?c-=>$4wl3nT4|+}_JK?D@
z-^tWVYpEY8`0ZvM&jUZ}_g`r7*;8^YJ~?dg(5KMom8tn<c1`f_%f@Q!Jgt1L4^_G2
z!)nT2Cv*A1jJw8sOD);TGXz)XmsUs3O;Pj4@~F9-*ZcLT`Bv!W&`qHQq4^8g9u5x8
zyH*gjyaM=soVxCO!KQ`QKXX{=sq<zE;;?4th1Sb{WXQVtVnw%<nXD(5lm=}7*P-jp
zZCX<k;Cx!PU*-W2Z@dgXHMexJY~5Px2=mlUNtz_hJ=SaN;O4!Ft5rHv>NFoSzu5c>
z8EHN-wnFwo=|YzDxuI;lTV=7y-;(jDPE|YBS{XHaWKQqv`l)UD#LeuL@|$lOm}~#O
ztk%s}bn}qyPtm?^OmuZZP2@CtN~WL&(iJne>gG%A<jKaO(g0+oo3iE}dM&d3|G~S_
zH$)4+CY!U?*_(6duUht|v41kO=OnXu$n|-y=I*$+Vz=%88dX}Qc}h+0kp1fuK$gtY
zQ-3IJ=mj+!_csic8F+rgp{?j)^HN114^`~0=(hcnX(5)1><g`5E6tdDbYL=P19eDj
zRRq%Zf5L&wl8tO!RXRtCB?=W)%;d9fDgUEhp!fD++it8m;3^;7T&@}0e+Mm4^q(ne
zc3JBvT(Mi$aVfNTvGwblpm{yEZ3D8Ui|N4jKcXtkYtt$I1KH^*f5NH!Eh?}7jKa2m
zxl^c13f<!rTIv*<Cxt#$g|2i8LGik*E1W`iI)%z9q^F91N#+ItVrS$J!Y$bTGO7r&
z*T#UTE)ZE75flxVR_iQWCE#9ETJGX!vV*`cRdh4-fHY$Jo6`!vBDQ}oZ%$E2#8L+%
z!)9B>?r<_D*d8kltQSVc_TNXz7-g7dPhlR|(pk}Mop#8!&9Gqj+|pWBBk37-T^@zQ
z(kxiN(Dr{n`&w%}13XU6rDUJXVIGoB`H#{flMhLAG0E?+ILxwpRrVZ66E7{f4tjsB
z95A~1KD9oimcr-rKoQ7%=qd1q97S=%+PYcZdeE?}-Z(TNJ}G3rXsze$0h7m2_b*a6
zHOp)J4+!*Coy0c1d2f7p)D3#~rgutPDgTct7-|)MN;h{}bwhKM>X+m<w*dw@M_T%1
zomP}+>qbbIBc-z#ohc-wN4G;S|A#u%u&$Tl#+LkS@ggZc&KaAfo3GV}tImv%(bf%@
ze2<eqOgB36`7kl@UiQO&p(br{Z+$p9Q9jCX5IB-M10It3sqt}w2!Vcwy;g5rHX(6#
zy%C(?j3-4QhA%_fBA;_D8J+nuJZAr2lnAwQD5=@s27Ku<P;aarKOsJ5prQYkh8|W8
zJwQW@P{5#I9&v^_MjFp(%t%|;WtBUbMKW$}ox2_oy`v`=&<XTgH<y6Y<`$tbLR<n6
z@A)^w2f!-T!euN48CI4Ioc*cCE5RG+$YX^vOwa6da&%<v5W(El??R*}FopW6%D5*r
z`*@~MTenj;+6uIF&&r<r2~@tKC!DJH3UwVCOP#lvGd(jgmRg*jIXPrLFGGF+R*1Qe
zh#H&oor8|DZvi6j6#^n*0)$%KN@w*|(>{rU(7WQab)m&;W;icz@S+><1J=}1`0Dyl
z^6S@b@w8Osx#n0Cff~ng%D-WVTDR=kT@K07Q-(CIo5zLR1@|l;-B48=*BYvZ#fRy3
zyB_RX_F=}&KA=AQLdyR=nvfO$1QJx;a<L+pWk+IW2QyipKIU?T&7IJK$*NW1FKz!{
z-+{>QP^?j-44|%08u$wh)F<Ps=IHP_bLy*DjyNdJB0g{34N(9bLv?VazUtzH1#V4L
zGgvC!vnS%zmIYVPyUZ!hf_Jjug=)d6afYgKcecj#!8MA%q=pa;&|{|%gKFz_kX_ZU
zmmv$T?~_p<g{a2NRi)MDjv57z71BH(-r~cP3YAmEdzrlAqMo<bdSoVvRUF{cbQ(&f
z76R@K0v&5A%v?6Z_U~kAQ`ejf|1r08eBzuaheIHB!-v+59HD9)mr{pu)PSg_0^m34
zu|9dRUe}?g9+p;Vs{v%INfm@`|95CFminz^RJ28nZaZoogF{Zu$*({7$Ea!Rz0bx{
zA#%G_`Y37L?vA<Jb2-O9mqRj|n(r+HPpl0L3S4;7qlUzIs<nr=Kp|fH1n59eD`UX0
zJeDecmJ;9w+#!IC36B#?a`IbM!vyDcT2W|~I@_)LkMj0q|LW_t(}feFLa_MRGhzNl
z>h0~m`rdZiPUL^mp|^MY(%X?56z?@a%I66Srb}-TbDtwEL@GWAnVa?IZtdYV7G<>c
zt%;m^F8D*2Rmf{aTe^{VRc5y;6MvNigz+3FwZmEqlPvTc%$_6rx!Af$wZT%lGEY<T
z{KN!nVt=y$$sz8nru7H1*RHK-%bbpg5|MROT=oJb4fF|IZx|x2cM756z>CA2!EFg|
z2?w-oTlF<^Iz>%z@fqEGnRz7q);eg<lQM&3i8X_Fvjg6*wSf%Sb`gn`oRD-g*mwbb
z7h26y3R<x#aAU`|%+UJa#`s9xXlLi-$<FzRj6{KMws%yt!FLH=oC8#KZ!B3|5=-iV
zYZP}IfF{7Z=3wc!&ZpTdET23BPOi(&%#s3GK)$Z0*x}Yb@NuoIyc=Mcdt&Ae#R1P1
zn!M9GESU%iF9C}u1X_|AVGBX88Sl+EF=EbbsQ<+Z7BRD3H;d<AlIId`@DFdOy*AqV
zHT|<lw*LllAi=Xp0|95oIXJ?-RI@|iX{?>+JB!NfPpu*&?za|76M$^EbuDkO4b@4n
zh>It-!76MCl~8bZVzqVsRH`Ir_;hn^n}9!gvTnAts<&BQJ?K9M2O2-cZ0I7Z+4D5#
zNWyDPy+levU_JkNHk+wxhBtnyZqD$TEvi`YBT{Ur6`7*iW(YHUJ*tKL#3)0R$=@=g
zB#%SKm;Z^jI&bh8`_Ht+tlv_E+LeLOTu`VQZYFA4&YlRFn`%VZct!>aMvb*@3-mAK
zL9o3QE^>AH_v-WR_#48tf`iXmhhZCIAZj2|RW~YenO@ebtvl_~dgDlF*)V=@SW!@K
zbOeMP8+|IPPi3_Qgi7o7_IPzY{7|qyxF^0P^L3aNp}zs^BcRABpc2};J=W_2Rbdyh
zwT4M8kJQ@6!Ktn5C~FT_!jr~}ge5FDekpJ}rbHGw>a*JjioKY%s}9WvfdIke3O3R1
znE7&*=kiJ*yaE`+zm=Uolg=XYL4+(df9fJ%G&BEL*()=&bwww`_o-POQnP9gaB81a
zZyZ*6hgIIjK-AcnAGN#UjJaFJ{7ih4wr-=guDh%Y#FZvttF3v$l&khn)N{xdHxBJv
zvC0w0n!9x^atL(4>tdn0-HCwp-gKBihUl^$sOHU<w+?}qS*%k?xM;S;qpwNM0ijms
zR(al=1{RJGV)GfbnRRjI_tr8R=~QYx>-PRvn54`})=o-USNCU%xGEYGr9P1@Dez2r
zzBw+>)#1=5)ARO%JlB(=3!ulsR#EU}Ji!hv)}hyRZGg#hB|YsFv5rO<Skm)wjXFgV
zrKvgK_txaN-^j<;osTQC9}8Q@QZaL{lDORTrYA?`>BdHMH|<{C-U_c^dS+2L^R5t-
zl>f+Sd9FxGcSp^xSjzt~Y!rl3Z}0OMZ=4=A3pVO^cGt$tQF&40unkvk96lcR)Uc0-
zbmp@jcGPZ@)}wZJ;%~I4w!Pqu6^y!E4bv80l;?8AJ=XTi6|{H97!XUCz6Gu!OQ&V|
zQpL3lLl3^Z>{5XA>gn>nXT{g#IBfm>zpH=e=w;99z3=Poham#b=<VstQn8UfYyTB&
zgAI3<XxXk)vy_(VM%|wD!mFHh4y+NmjYFdzIN50TSsOlI<BI+ozm^)ZPX6vwWeCqK
zyO813sNr<2I9uEBP5LQ&X3&^=)1Mnq`bOprtjig|e43MPi?t2QN;LXTUn(C{bZAey
z%;`(^Q&Hu}IBV0+7D#*=?cJjk2<;u)s^^JbO$d>mS|VD=1^l0=)RPZXqf66S$oI!H
z%!<u=GJ@pQQzNwMVD`j2#oB!8z=?Mi@9BG33#+1rAq2N98-gfMk$EL*MqH*oihVaX
z1oHzAvO#3qu;?CyISE+5ioqb&?E^<IvzAGd=Llw&SoOS{t~Bcg9daw;Rm|@VD<EWT
zfqFSdl&n;d*ayGx8I_{uwrKFv<tIze)>+cj1ai|0K%?fi2X7ZifBHVX_ha4Y%U@PI
z3j*rX8xOfS30F+fQz)*2?JI`qtp`M0N4(LEeFv<^7@c0WPk7^U81MMmorT-Bu>nrD
zUIfM9xa4rsI$eMNyDUqmF9V_<r(nWo{g$2LZ07U@v?q|rf&hSIp|D8AZ*-j2&t@qi
za1yivJ(Q4ze?{qQ?#UEc3uq?`6g@TjKx38kmGD>(z_STUSHlu*w{909!ej+aR?uVx
zO;#{<n@@CNXo-|gRkUH%@C%|La*mH()|0d%r*FXF4XyXk#x<-$xA0|z9Lf!$VPmKN
zz>Ls&D_ys-zY=x!<Y;onfv8buxhxan!hWd~nglHkpoi<%;leqI0@wUl)DDZ;YBlDe
z8et3%>dCpKO9fxY)_^Yln&zIwS=K@r%IqQV0lb|<_EySf%&GfC38tHWEp1?}Wraqt
z&M-aE-cMt}u6xhcjpKIQhhDQ{x2QGSWIauhq2j+DRIqQw!%;N&+8<x<omqm~m@=98
zkgz$sG&2N!2~vuvN*1Cy(3)!boGlgF02o%sZ;I8e@J5<@;&ZeXQNBcjABMH*pGC|a
zv0%6Mo%b18%!FY_4rR{P+t<?E*(<yub4v{Ry;v`^^gKR`8j7EVG4}zztSkLXRgLcv
zvppKLmMx9|mH^WTzJD)DgN+gMV5s-w3<P&`*!(QodmvnPFf&YEgYQSQnFncJF!~<F
z-_vCz+g;Rr5nk-nd4h0`a?|Lu<99-p%dGUhOh_s;0Vm1k+-6w9>75m7Q2>Euh}v6_
zQ4~aE4=<Lbq|68D*VPdUz>E6<J{!cgeu7T3lbb?z<AoG4W|su?vcCg=RNTFvrYAdj
zzRdekvok%Gl*8{1=mBEMg@KTgB%<cWiVhu)nQsWPEEHt9Q4T{{ox}uP&XHj;b0doW
z=OD$_c-6OX=GO1|&0HXx>kV`XYZY$7`PLwdh|+tTbtT9zdzup0iBit&M7P)`jaSP_
z3rR#oj+u*KXOuvo^q~k@uwpfwZ{|iF{g+iOFm%xWEBJQB{!JFny@%#=ynBhYi~(k`
z-S#WqJ^eZZmohmyD3)4;68j7pf6vU4YOVR(6p$6GpX;pHIY!^{_$0k<mpaA{d60PT
zpONP>-aK8ub9ZgjJ*tc2a7-yD^hjQOynvV#x|Tvc(<@geCds;wl~(*P3J4(C(^^jI
zsJp1GCsf%GKiS&C0JCGgM#j3sX2YH%Bl#1vF!$7$LMXC2!=2VvhL;m5>R6JsQu3gX
zFcB#xBU&k;q8?a!l}rJ@CzSt{`e0W=1g1!<92}&U`#70=XCdyd>(<s4=$SK>0xkwc
z;~<+`S{^prZU4*{fLk{R;?dUeL0i|Zt=l?LxIGcK6z>_S*jr=nLWl#85~HopV3o2H
zdWctu-1h~vFq>}+n|EQ<M03=gI4|=8Y<GR6YD~N&BC=XIh{6aaB_CyEetm?t_9K6e
zg?<hQbKDfQXUaZbFYn9hB~(3H7?aqU5xw6SX@{L0O%97{VG(^MXXQcJAA@Cz>~S8*
z9?>P%gn=pj5e*|`F?|C-v@W@t#Qk15cONJ)>b!_;=nBz+=UKPkB<s}NwsN<5O-b)Y
zG}Nxdu(IV|b4waN#bpLTm9h|euaC;^^!03X$EV7%i*(x0(zOYq^n|_M1`r52DKo60
za#$kY-mJsR1>MU&22V~kH>Y<2-KO0uKekpeGzakM8`wHM8}qcLKk`vVm?*6HApI*6
zW%v7P%>6ayr|$c`(e~q>knzsxv&@16HFthc8|n#r=xtSQ7WvjM7r0!(Es2RrgxjgR
zyK;l*RD)<=_Hplw5?26nFasntUu5>yUDSahw!8@aQQUH{Z^g)-871EMa48I%VD`n`
z=KZDcY-d;Jxvrph)pJ2S-|j5yO@%LHD-EbNMXw3H5K<w^O|%Eu^AITzBv*H+tkfU^
z;J3bs$~23E$5BO!@IKc1IvO*!%T}w9kvY^!E*>2HM5Q#3-n3t4aV}ouymjtN=LnYX
z<II&KHdV7H%uy|8;UW0FUDlt3y@y>Xv3lq)+qL0zo&GoAUeo+`+@o{0z1A7Arjr4S
zxR3vLMH|r+*_Yirv@^1Ym(`iV8L5KOWCUG8jUF>2?8Ta0(AALrf^bPa@%bQC)UMgH
z5_vqbtEEJKWi^tKU71mOYThnnu*Mlo8uD|7e3Y^UEhQOW_T!@L#{$T*R<&SH{q*Gg
z`s3Q89jO_|<(gy;7lMey%O`Uo$i?7Wxy!&TYzE&isG|fmRMbpIg(}I783&2h^s$<9
zTf#3}eT<OZ=GVxA7|1Cuq`GN`dfBZtZRRB!+;#69YXb~IEOmJv1oZ;2$YgHe(v>lD
zyXdE&^IY7Bl1bFC*41*@^&L+vwVJ49R8G*Eze_{by`+*Q=>~cK2Jf`>)_h?cxNv4i
ztM*vtFSI9O5>#Tz&BvwHvBK}Lnv<Qj6JNK+^A=79GUqh6-FG$xFOXv6tU|J#BRMnN
zI*h_JyY}DV6|@sXo-;^rAFTg^i>#CZEp$eM0w>_Ie#9_9#T?HEW$K4F<pXA@BxLp}
z>EUq$=D4N5N5S!L82dh|_#jCcqc0CN%Xm@x9)k@6>3?3u_{|$jB29bm8x}I&IvP&i
zSdtkV>gmXfkK)%G9}&_vyftiDVdsoe5pt!{^++LMvr}<84_~iv3f1W5R76dzTqed8
z&@Vf?$Kg}ims~#$Y|fCmM+SVNdTr;3eo)QlRYrdvnvh|}k-WIaIFg_EyVdkD`xU*j
z@bNpX4`tKtk+*__yuqu^|B}9eSI(}&nD)#xD6MXetK*R4>RM|uKnme*D)g#xmy#Jz
zSV!(4E9seY1~U4(#X`C68*06KySyZ@lo)rG)Ma3^Wb0in*GB)rN5$L>2aV$u)}xXR
zcHTQiH;307Q}3IW&>ZQ*`lw!-i4Q@-@@97GrkmS^mH9bV2<VB;h9Wy(&8I1zUQ9#Q
z7YauICdiRrv6tyL_c&VLldUEsoSe$k$9v{pJvm-DbGM#6-Ryw!INIJ9g*AH#Fvbu-
z8P{yN&Uu|N#!%vm3S1;V>pwFfU~-74S4LT9(_B`OGM-lxgn`S8n$JsBSX+V8DXObj
z@+@bB`Dg%9+WHk&h(3sOL9V8)-NO~L^3^P0RtFHNK#$cepdBGR!%$%=#<AZ<T0biq
znCE2PbLz`zSr^(W7i6pe^+#JiT3<-5{Y)ZF0|{S!gt}tSqQuzDMtGpk0XZ&U>;#vU
z@_CeX38k|8x0B%x@624@6Dl#{mskrgl11NY_F20HVb~g%!W07p+rb$R&14|RvnI>P
zhgp-~mu*}(*=5v~xSSJ4sV|g%i8JQJvx~}uj;~SHU+6qLj>~w3PM^s*s^de9TS{D+
z1J*Y_%${Tya$-0q*+*n$*eJ3o9F%hI50vFbYt0RE(dPLHx5{YE_hu^fI!`wVh~u~A
z;cjoN6tl#{TkD5|2=!HZNn%gMUZb^%H6C&A(5grJc+np2VCdD>Xe3BhWr8s+fMO#b
zz0r9WpszcPB38$_InCYBvq>&FD_8V0lw49YUy4FBUDhN0MPHjtvilwo#H!;ndvMr#
z^bRiT42szPt<M1Rr047C#jQWyt==D@HS70xWy>NbyR6U3q|I++vxZ96n`9}b)>_D5
zK#M|FY&)4T({t%WG>S>jWju7#AK+mYpTe&-?OlPXoH0-esjx^IUcpahwAp8@Dy>G*
zP4@NVY_sm+cdfI)I)E={fuYlrtvi_w>B;GP*>FM^VO6+wZDCjd{re1``+S*~=~*S(
zA^NKoJ|D(=p~#B0)(dSiQ@NL+&pEDmNar51lKM0dMuy@O)@`Wwo#P|rnM$Mb9*9vN
z@ro8jY*@(VGiWO_K{uO9)c}$nuk@M9CXF`8rsrX)ZhAgct$1!0MIYtYN`FbuLUKDj
z7m+!%z}432Dd!F1Diw;6^QGIxybsO3FSY#_b&F#3G0HhBFam(co$o2+1A&{j%F5=E
zFs6NrLU6}Uxp!G$+h5Yft)g@Vp|SnDN$HK7WbE*M%0}=;Z!~#lNi?}UAohZT^&-_Z
z=6&88bBY-%h?@6R)|B<um~X_efiTmL*K5rm&`7lIn|d@ks|z#3U8seF7i&hN92IWh
zKfklcoY5Bx9?%|ooTBE8qw;S2jCbSy0+-hG&+-<`i;od{j*32Nz7TbH+Pj43P4ex*
zc;f@Ey5)E6OH9^{Y4@VIcE!gtW6^V4k1#v%aKr`&c-w9NwPc&K3PQ^6N42%nddMrZ
zn58wZDTvjfm;$_TWAfvEDJBG1aYO;^F*?CbgW{+Xj1Hg7WF2EjS3wwHw*JI>jTs75
zd;pVHQ`Y%-AResPT{Ze%6sEJiW{A19Eh{whc-&iLBX+m@f}@w0WZpppcek0bP9N;s
z5OYaqQN|sH#{+JdTm&y(K2Nu~seG$IcfW4VKtpt3S(O8|<x?WfAH+T3U|D>Myaew&
z8lP+gT`+;*;!2piKj(#*jvfZGHSW%ky(>5LW&fjKkTpvao3uNtVM7PoqzU<SXt(f1
z@EB-52d{m(dEt2OolvsEkw#JvI(Mb7z_p`9ikL4(l)cC$iJXB*Fy4bw)PcRxcT2q7
z=vx+_X!Na!kG9Sm(ocjpcoge81Jd|(o|~;y95RoGh9AgypB~CW8aueo>BtY6yBzZj
zt*L`tc;2Q@fj`$e#-VFg-xvQzsBEX!^ekCMdU$-M-5tNwNSDOVGSb81V~j%uiSI^)
zPyROwM9f{rPG9=BQhmcmg=xXQ>Yh&26oO&K&g%3URccRW71{ZTdyV&w8}A-9cIImv
zJ}k^ErJ=;FG!hzaXX=df-1uxGJt97pF3*v^M;nKRXw756k={;M8+-2}dKr<aLNk^q
zi<n*7hMp0bGD(e7sSihF#$`(uQBuoj+J^UvmU}Qz$rO-*sGT!S(V7crHX;hXrx;?U
zKt3Ub18MfaeV}Wo6$nB&p0ifRWix2a-&Z_u$B@B=F_)R9HLq~K^f%zIRt>NmG_cjm
ze@9f(YBh&3jFU1~awl+}D#DgfMP7fqzle__BQs?bnV^akW{dn)715f9Ih~E5nD2z4
zgsUpFX2&uVy<-Fk-|S?kiiubQ3vC(8oq4>B+ROHQb_yFBa+pk%BqOJVlL>B`6O3gu
z4<G*{$B2>*)_JLLfGg$H=vTrH!tX2}TVAm@H7n2h{S;yRY*BItr(Hb*txambjK8iI
zvO7Txm5r$fTybnj3l8*Dml%n8z11bI2G%x~nt9CV^R4iuX8WvF<!Y!+LKryq(q9uQ
zKk6V{^|v_oV&=G)$l*Te6KO+K*Sq-iI-fEgZlE)(?9TLkOmclK^)2%pX`~C|T*mNo
zX)0NSh}s=TENm~|@R%l){MrubF)^M?y!%yeMTe|mZ>YZRl)jA8Bd$y-4J>fJ_DNma
z|MW&VrN`+~#60bYuu;N>k89+GS&6a*{>sPCM0tVHnsu7(oFEOb5OQw}n5!LiWA<E5
z7N^H@uP2<TBcsfNcIc@;l=|cjqH+HL@QQ&<6*CYqHE)*NeI;(0FB^w!n3w2cx?WVe
zloKpg8b?pk`U3&PUoI3TdOi!9iXdgzu*_m;2${n=FQR7hThRc?=?+N~g`U;ZN}8kK
z;;acG)UjGxT_~&q2Rkf)Sbme3EG^cE;R5<m4)Z6dnK?~2o4qpLWV6$9F7>!tS(So1
zE(KxYdNR^r`+wUm2e8>^`~QVE=|H#r4ZN~CK2#S)#t|C^X{)v9c0QXanY>=H&6@Xj
z7Ay6$Qh^Sd0nVZ2N-Hq`X1Nc6*Kx?_hS8kXp_HCy{fvFYy0>wHOP*i|j1YHe!|7}=
z{dN{Xai|>5AjlPCunsd{jtWbA5dMhrVRLKlE@!)d>x`JNG%@Zt0yby2TH+<5QFhGV
z;J^As>VS0<15r9kc;ZE+0nUYfabyLb7?#M{*!A4v#^j<6y<#|3?F|l#m)UJm_b#LF
zyk!Sdp%09{kt>F@BLBEL8r#EEY(+E6l_3K2<!v4MBOx=~UXbPce!(r1$WBAiZY{^e
zNeD@sPXK_%5x#Kspzqh^zK>Ghv-iy}TQ?3WQ_)|ByS(Xq;P&@a@&pzIvD6$N3l?NZ
zp(JOJqmu>1gZ>S&H)`C!hc&IKXshAcSuBZS!dF<!o?yt0o8+62AO2yY6edsctU$UX
zOgUe)vpwMXmoXV{w#?dr!cBm~shrgjtt#~?-FyJi${ICINlJfHtdG|8BZ^v&>=W>}
zm2-crw9+SA-*$2qO3n(!2-u!~ADQPuX9!d2O4P+tlfE{ZiP!Z-jj2ani86JcWDPkJ
zv`iKp6`+^ssTl!fvyyZx&!gmw(&P+pW=zy9Ix1=nA4mEOuRQeREYNRw<E)Z=v~;S!
zL4r9KcLGhNYQ#q*{xzja@10(vs+zCF*?!MhvnIP-&?6hs%cv{Oks_f<Y9Ry`C4=wm
zpfmxLeNY;;w@lA&cxZ>x?BYy>`$rH3=qvT)yaqP?+Nim!#{5|BMdq*q@vym%$9yH6
z$dU+wS<3&l*0fh`+gio(gY?X9ZxtoSxz?RzWW~rn`bAG4u3YeVe7J5#9y1>6VjYg5
zcS(;QCZsmfAlE=!QN>RVnFqrxdv(M-9Kxz3Iqy%X<3G@v-W&?t%muBA`g5HJI}}b`
z-z7443=)GzqUC9dAdGLW50!P)b8F`3&@bKT<Y`aEy!(tdv<wEm&**g<^*YSW<r>A4
zPYLa*QTgqM3+Q)=`Hb*Rr+PU)&=XFiNqO$brqO1rbba<YHv8;@U!z>}+1VkiU&I81
z?b`Rej8khW1;SYFXiZzdCZlhL)}*VKh}QJq>Sd<Z^n3Mkjn>pcRim#~Yr31dT$aNz
z_1&U1{ZM_c)0&`DE~R*nnnR+-7EX8}Kfo`jo7^UFP<`#`^JoK&+S|jImuOFm_dqR`
zTt6<`_-tR;>`Tiw2y0JQ3Z!e(Nm6K=?kEN!*wMEvg$EQxNMGizQ12%3cuKe<!{0&@
z408iMo=Y8jwH9V4Wc!XZy`?oN8K!wJ%cg7LapP25pETPKo*Aw@C4PqX1SU!I)>^mS
zquOS$Zr$DzvOD<=2klj_h#pUkI*iTcQmy%32!5z%Q?=F<fi%ceyqZzOYdwd`LS@Cn
zi=Hl%uY(53`YWL1rmTQd51uY!l<|vOl&Bb48*Z6fdPl6TL3TH`@@wUATnyIlvS!?s
z9pQZ=Xk)2>EmKgBep^p1*cDP8r>_A5osky#Rv&R^)^lcI7O;&Ylp^NG&9;`jnzai(
z4OXDH1#anw)mq-BeRni<RfS;tgIm|%K>^UDi6elezFTW*Cu2Q8Qn^3pY4k0P-(>VH
z*P2#ww5?BMKfNgBRyv914!)#9f6PQ!{M^K46@D>XR<t8iWbcFv_F+K6ZsD}$YPv&r
zFrkI2PeYOf#QU{YVM_s4JfyTFp})yCi!{A`-@Tz!6l3zXt5R3(mg~KR0@7PEb)ofO
zhbnPpw(#(GGSR4cX+LsUuiTjhsMhoztWG3#LqL|ogSl-cKY4Ku$muog5dmUoJtV>9
zw8n9(x4IetV)H(<aSpy`sstU1mSL!{#VbvXQHw0t5-+ULp1!;<a~hO{hhOClsj1_=
zAYxwLH&Cz`f^(l2LmHX4m*x}0oL1ctv#r^_uTZUYW_ZYWyEha(7Sd)P14ZLv_mp~c
zC#$9R?m4x4;xoVkwXnUjxqCGxPq>fCwM<(S>eBl$embe?NOe^Y=DWAFfbd&0&kLUG
zsb*<G@Pc))JJ^wt=6AHFqtMCbw$^f{ANN+ewWf>^Y<nx)q{W?njYMK3H<jr`D2s=`
zgvN$~heA*PS|Fy)J|s<sg7$-FHFhqLG1l$0>Q3jGjQj}#p*1a~0<5&z8|G3gEMheq
zdI-$V-w-AHmn@_`bxg18p;nvipD3)N>=0&JZq~G5lFpm3g>BdeAV~>+!w!YaqmA#e
zQm*)^5m4+D8f~Ca+y5py0onVI7JHY%d^Lx$*+SQ-LVp`vNYR1n%3#8)7DuFg$kH?5
zkw6d9BqZ#4aEay3i)*cD!5|CVWu)JBGV|jnw+3>Vsg-XqLOnB-DeEdbOf&Oi=91Et
zk+R-!Suf2LB~DUz&t?}YW^v}2I-OCQiPr3mG#JkZx&9Gzr{#R466U4+79{+t(0W<7
zZ0+MAIZ-ixtxa%x*$>{Ln@2(>(o$rtLv3QEi?Y;*J0*LEwSBSLB(XXRE2l|HTOn88
ziyWKU6*L!hA7kdtJ*zjUk!Q|U4{q!kQ8iZ3u+%7@82d{A%Ngc2s!>OP*4(plf{ZnO
znln~`PIjzUQz{Erv1FMOdQv_zR0m}uPyo1S>$&I9OoB9WGH@t6rP5`5l_S^ai^k^|
zeT(BW)-R!UusvR)4r;U+TJsoHXv6;DX^l6m^1bR?VuT#tvcyH{o;=zyw)xT@@WNS>
z-X|GClIlZ7<wc28c&yC-x~fv3^3zXILOxbxKYp$M<EL8smwaqp#7O9k^Y@=6DYVu}
z8j=(u>m=in6vCR)-*R$pCnpsOI0?CJ=gq4%&EZXs%q41p)Y>rl?KzTb?YyiXl<B<?
zR)%-%oW$87ha9R&D+(mrR1OKzVxoSRWLmT}siLO^n5k9zE|s^JypVZVx(ugxsPRgJ
z=Y||YIH*B5Gxm4#k5a+dR?xeL?Jz(67)i7N^HW6)s@*W{O1>e*=qMEIKn>J4G5)pn
zvWHl;iR*=P;ANCT=U}_DQa8}3H-q)xwt`HQ-@MEWS%kvOR1*1_i<m?>Ij=<qx>SDV
z%a0y0-;`;{du`?<K_2M&65;k7{!O(lJfGt5nx|m>7OtG9c*L5=vc|_kVp77OiZnQL
zr;x9om6nU_*|<qb$XSO`WkH6FgLJz=_+;for(7m&|H}WOc+%4-ry(TzY}<bmIa7x$
z9}AJXlU!NJ^3Zx%31$0U$yddcE6FIU^Akxi5S2^7!=hyv2d|s8L=1K=*Q{0C3p$ro
zT=6W>wLczmTEMRbRtfIfu=lMfp}!-;@?03_B3Ih}*?(bRhz{o&(|(Gy;fkZD+-dy|
z0gueB!pZ%m(_O@<GXE}#Ax=UB&lB!*P@tc1PphY{M?_$Q&?LkFUuW#7%t=BF_Ufqz
ze4*5=AuNAKIJuxGmRwL!|H<$5)U+#lC|!1JO~L7MRB<ltNPL1947zuhGIU&1P}Pzr
zZcJQmed3G(5?U$3Z?y;=BK)Ezs711I?Bj79eS9SZ8Ihww7R>bA43aw{$5LR;y`mW{
z5Y7ul#jAhjj!gE098*(y%5?-5X)SqJ7ufB=j%A;%371~G1(qxzhMd=C&eoo|E-$P-
z(H0JFTyaXMj1#Esid3vX+(7gG60m+!N*5TquPJP5OFU;@UW620sg_#AmU8p*0>pdX
zILexrLYI_QTx8QQ6u$c#?94@_)h>#e*A|giiF#!zLRGmGm@HHjL%)uSZnCg{g?xXZ
zc(X8%C)Nllo0M#&yQsv$xHLxpl+?>!jHMoxk?5%_$HmIFgnHb0@u3YveQUzQ-pY(1
znIHEx3=M?VguQRIGzzdXg<I6qC6>YHI$;(PU75=SH?JHA9DWf>RR@f|F)O?@lbRmL
z6mdB}X2l3v0eL^y1}b;}{oFE)S5s<z*l{mxb@VT?faqUJ(7&(=?ne*v78aXK&Iu!6
z{SKaud+D5~#rcOo=96`!wGHHTi9Puvuo14zlJ&(rtQ*Iv>)2mNo-~3aKJG{_1*Z#|
zpL)O^4*!tyw0<Iuib5*bh5qZR?XvqlyD6wAzoY7!o=qyndLFPTOH)n{hq%F`t%Nr<
zD`3?^53)KrC0UCiU+Ful#jITPTDz^4G;U0~tq`CZM~){Zb$YJlofI6*9LTC;PJ4|S
zPL?!fBF2$piIX}#=k}KzPsz;l#*w25q6dISogQEIn^|3ud9vRom+@w0U{r+|<ld-Y
znUmL{G}TOW%Et^_RDptg=0Pip<iPEFAGD!ZYyt9M2-By4FStQ&XY+FGo0%vqz+Yw9
zRh3#34qmR1dt21KU(_AOA<wdOqir1%iBtrRMq7LgwI)EwMZr$nf6sq9`|n*@7xrZU
z&elIYo4HwKUU`}*9)+@4RcC<S4;CbEDhgLEDh+7g{;nz!E<Lkye(9O<^D1le;*+%}
zDzzu{yx^e~{<594dGR;~)G(|d>V7_2wk`3QNF<ddiRbjx<>S{Mr-25qH|pM`zL{4R
zG^T$8?U!qcg7~RM8gELj5eg7##<mtfLNX_}o+OW=)&k^^jHh)ZspREF;bgrx<4)e>
z)l(1ppmgg+5QEGqOU$Zqt5LFQ&8?i!qJqH4P`2E_#1;kwrgQJ&XWWv{K>YSM3;ssK
zuGy*ZIX;{qLX{=)DV5jf#n08A7^yuG$_wsVF$R+GwQ->}?vVTWkT*|qYuwwgECTlJ
z`IQ&~!tHo#+^<H<_9vbMZjB$w)MTVw`g~M?l>bq2e7L<cG4@GkYEL>-d(xTOlQOkf
z*^7Xi!TM&UR-N<d2ALM-lUjWe|Bd$iXxa0~cA&;G3|~c~69aSD#afqhZZ=R{&`o*4
zW#bMgn#~E~`05VW=$eN@#&+A<MHe`{SUwR&%%97y<A{2S6bhl>i~_AG0WPc$fQD8d
zhHpq0glZ5Xek=L9`9o))c7<A15l=nqgP!6!G1l`Ujf71&Uamh>;eV3CsM?<Xh>#lg
zP@EG@l@$$cll|Y#5Rz&L2W)rGx4S5uuQea$(c^iNqb1L|V0}tx3_$p-L~h4t6eK;r
z2HVXU-lXT}>ZK^@`LVpbgc)SPzuPwaNx(Slc>q({XS8+USw0+ooAi~}BfV_Qyh)4&
zzBe8goPXeCimVBbIc<7NQ{K{<s(?rrfks<s#RI1xajj_@BWI?RXh6$jcV=)>_nZbT
zJ79ZdO2t0johdyi3zHmYAC!-7#vB?A8kb=`mpBtRtou+3zKYzA{Bt#BE&uyDty;!Y
z0q{N&|4K&@9se@ZW~C!Hrp*(bQDW430B&1D!TV0nWn_^l=d9?557@Z7HTuXA7Rjxs
zX=C8TWXXxi^1;bes5aCp=*SJ%*M)9Z%{d^-KA+gp&>RZlm3_(|0mr2NthRvovtWSK
zSW9CE?1qIrFfT&m_9NO7SBnGTJdTh4krj{z9Q{MfrE_D;rE`OG(t}6$Lx8PD#|4ub
zofP3tR)z;%b%vMCbH;~*s58EBUW*J6J77hx*)=(PFG@^SUohrri{FRh@u%P=2EXyU
zbkoRz^%kSjm6)%arUTgS_$fveF1Xf;EwZ^xX~9|!=fS%(pZ*f_29<aRL5332s5Na+
z{uK3Y<YqooI-5?xN*P#VT8OJv?34#DT~9a2YL)G@4sBMw&yivz-*=MIjP;uHE{nr?
zyjTt-j^eS#dI5us{EpkmGEFI9{aFg9?yr5yK?BcuQoL&Bf%r+fsVU1OnXSi4N;zXS
z;KpWYHrRm8lJn&r^`$c)yysIQ#wt!12GcpV)3f=`1wg;QmLO6{>Q9ZCBV)nc@eA}M
z8|)eDd=MQ6v^d^r&shIKB4k`5zRoGnB5*Sn+yyzggl!<oF>wxneZ`>MY1jI@%oZhy
z@(67%zV!eHP)R>8Gs60t`u<285Xh9R7xvs*GfEhmlqq@KYzm)iUCUmh8K=M<C-Wi4
zk947B6Mn?$b=x+WPJ7aS{i}07g$!dBpGgC9=~qm=6!MMYQDn%K(d6`xAhN(f-E}CL
zM7f^A$9R56?|QQFF~(rr;&XL|#InWJ*(h{U-nKM~pgUtrW3N1@Q2V~BAVk;UnmQOI
zdKyD=pa4$hf6}2diQlNt$tT<REcV8DK6>K7Q%@Qy%T)8X{tVB*)~T_Ky3Qgp*8%$p
zHE!GQ{VjC5_!3%>i^0RBfEW8GLENmo4PA1iOoEm>nehs<Sd-4oUAF&4Rdy>|?G$*o
z1FWR&e?{^P;)EpKIA)i2C}s)%WrHfKZe+7kQ+A!d=`4_R=uPQ9YYKSVzbuLdoeiJ{
zm|VFaF{71&ZysyYMp@lix|4dsN!2>3$DPz-C-oC2wbV&{*Ga8(QV*(>*`NR_&EDl?
zJSG__&r477P`vLv@}E}c+D>a6KxLIoStX^FleSKi^KvwG42#?x(>%mFjf!hIu`PID
zXH8xksjBBzF<vGzXHq<6g46z$EgK(8E7L%FJ=hl?VO)mGw3HY=u&O^({Pb3<ji>>#
zx;dsg3s>16))Gxv$@oGj;h)v=%=ir_zo&){#5P=4%e$VEE-N%#Ml1^-pJEo53DuA_
zKKN_Z!gz!kPQM~Ky8J!lW!Jb>>ax&VVMY3Pu(L0G$^j*3I<I_Ca5>SM{#`+}W}k&`
z2?JlS&$xe-D{+>#ZXUAH)A%Kh5kKpVfrba5O`Kgd2eO<#j>eg#+PWH_5`^(RUOq`l
zi`Gd<4WQ2u!fE+3)1(BuM~JKTM1ePRt~m>v_(&k6=BeWJ5FQEnIE=`651R?jhl+8c
zn?%0YsX%ryTYip;59PpC<dxznzZ0RvEua8oV>oa%a+IywyT5WW2~frbb&kH|>RRi7
zAz%F3FBJ_@y8HAFR%+We=Y8V{dC#unZ6dpKe@;BC5o&8}wJv&HvbI{+szYk4b$Ryr
zin_Jms(MU|jq)}eW0#-z1tNvj8bi*Pv320a|N62I22+QD;w-3yq<dLf84Z9rD3rl-
zzWr>jW_obV6X>Ba?QS_6&6lCtsp2}`t)I_Sxa5_|Uo9EM*8nKuBMH1x#hpB?2LTRU
z-9Y-22<c~JZmDrURYj)#j7J87_r(bq(+Z_K2^?2^T%+wNPG_1JA9sfc5@P$`C12(=
zptw<URs2I3bWrh<ocMUie#F=?UkRIs)S6i5vnFeeY10v@^Ry=6LOVSoU-RM$w@jMI
zD+W)^&kJ&!#f#|4_TT-OBn}9sl>>3D31pG4m#VLG)Ym?RhcOd9zxeTDmaPO$<0IG_
zI9fe;eA!a#7JSt7s=`Em=3U9SnUmc1`&9isR#-kJ3+?A<dH)FMx91nq4LY*o=T-V$
z(y`zt2~R9&#s3;JKapuq)}3d0f1j9K$ezgjge5V4NfW8!MLeu^Y<jX9oUCt3)^EsK
z8^NDNbD-nn{3V$<v(q!K&jE__p%<zWf^Ky{A9&jSu|F5IWC@n$ET5_eSw6{P?M~N2
zs<w%R49k|6t|cYr<DyVX&r+YZWwk_Mb7Q(na{BkyzvY8+TdisUO??$VKpL@5cIqK&
zT#q0vb{@O1@fd+t%h>2M`c7H)F`+^9N3eLr#<I;Tb`1g~sKg02hA7eI&;uv#*f)5H
zTA-=4TKYU>JqG4h^f)9`Yx*z`Me>zy>!CY^)Pgc1ph?Cz$pFENjcGgfDO{S*herD-
zBi5RPoa(9b-a(HL`s*mSh+&>b{wN)8mmora-$fUA;%UvJD2T%0Ln)|YDb*)0Oapmr
z(ro{TN6AGy_a6P6Lknlpf)k4HXEeap_YYXX2-*d#%2xrRIQ2ev5uFKC`ljAHQ!+M^
zK@)p{T4+53VtBF0U*Wx@Wt+LYB<3MkC)PHY;V)}<-(K3K`dX?hmx1lp7*#Y8!hb!R
zQ|RPy;Q3FJZd!dX=FHf7x1K9@_y(3TXSCxCH!012J~KWz(<yh0WMzZKjlqC2>tv2?
z8i(I(6HQ;Zw0h0(P>Z*|sv<tp-l$?EbmTW4{uKBwdq>n#)zvNkU0T5sTRZ0nD3oQ^
zT$HWmPKf|0;IsV&KwLM!t588i{ZfuQF_;o$aSW#J#9(T9W!9C-;lbcB6-2F@001}=
zAMGS(JMb81O#8!YU<d-EAcwVtJ?8|(xK%c!h>PH8@f%1u**F!7H7edk2Iuxq84*ju
zQOF_0OQCaA5AfMp+NX5Z1Q>MO%0ck8&LYdSBEW1zE$P%Zx>%3#tUq?O@CCG-@QT*v
zPT37f&mu1?=5evv&F#tJOC=TDwLHS+BH+~(y>@-)blWv7oLuJS?E=@ZEz_q+YG$})
z*$g(*B&lF*tR>(=uhWb~>Dp`-e~R9YJM(zyty<I9Wp9X8r6Q%GREyOGo^+vcBJNm0
zjr*Od5-nB|+^VI%qh>JeB`T}Y3ohL%0|g9=P5&>**HbMrTIi<xg`{8Nx*;Vl59z5n
z&VU<ky`bTQL6;93G~mK74z}C$&y-e-PH*tJRV|qz=D3SVV<g<X_rX<|E0x;u#qu~F
zza`WYaplEtkcXG+GP9@@`}Uux9Td^)KGIXgqo}HkCv|f(-kIVNs^guhyU!(<RRLB%
z5m#tUgjv-1S|Y^c`}D_BTWh)lGG|AM?9QmYIcjY329K<2ikR<4O_U$go*p9On;Ntw
zIMUSM@%XTYSkT*$ZU$T-c7oV|cpH27v~mMvpW1D-e+Eg{!WiHG{Sg7ZrM69tKv7qG
z&Uk0cLA3vR^4uV?AQFYrWOZhk(dSNh<Q?5#Ea=M`g4Se*xe)}m!@;6Vu_~^276fJB
zFcq~Sdz0RH1blF5-_^-8iw~eCwEh21RU+K5rvyLQQvqzlQGh${iTysIIX&87UtYN~
zGN)}uzghvK^D%d2a8Em|h3o0jk#r{GDOGA>iNA<m%xOQNXgKw#1-gfWuZPS`NSnDo
z6x^SH3+umYk$Y^BQ*zvd<CFST{Y&6f9N^N@IR}#pOtIZM`<?zFoKxkQNVoS+kV8`7
z9Zvni8Nj&V<cGMq)@B|J1&=1E{0|55RWXtRvU6eQ)ELBvl3h`Hn=Gs_{fP_2hl^1>
z%8|k-cG&*w)F^(Q9YwPoHRdOb;?q#@Q&9~3!%<{;!9jOo%8!<%5W{>9jrT>dN#p@#
z+KC_dHtWtW4#w9%m}h<@Aju7;4}GvRn9oAN&k|3{U|0>Yz;c$PT9{xb%-8^rCju`a
zY*VxItea8eu1($S=8O*n$9b^Ve&9B}?h|Oy%VPSg45?|W=zwzm@>#QRk&;7Wh}{WW
zR%#p>wQ355{~(1a<rplFXN)jiKXNiZw$A)-W#jxE(%3kE;<7t3-*bemeNZFEW2jn2
ztutD28_M}L<n&p%ddi}`T<V^hpSY|yR3iH#evw&Kb|2=t51wcJ74bzkukne4W|wu+
z5-yE96Ph`rq^a#b&DeL07}}XaV^&E33kBq4pV&;xU9RYIlE_vAoN!LwkTV3Me>8C@
zW71z|uUWUV4cYS^=zS(2{@c|I0)O<a)-<}O-*3?`b~tSVN}K_hD<5igwkYW1K|-Jg
zJ9TBA^(rvHk1-@y?`joR!_;W02D*&Zy#;V*W8->-F?F9SzW54r)V`kSn4{lBug@Vs
zt>ya#^4%=jr<SOKOa8pXN!CRSHWciPPqepiG?!*DgZUtF3PrfJv&J|dLt0pF`zNC#
z%AkR!@i%GqsK{j<>81QSixdRd(yA6d?yMCEK@?x{L|-Ti2Hz^4=&Epf7}W-^Uv}O?
zdr%?IeG}r-Q?WN{9yL~b^Acz3bz2;oxJAb-08#&IpRkgtqAooNYd`4+>M%Hy`(LBe
zXB;VA)vZo%XTj9!F$f38=M#gfLx*oQN;g3vGkXW0>k<Q2hVXPLP(_T|_67@v0ZbVo
zM!3nj-<u~33E``wM<EEy|14x!?CCpvqW^oIO242I$kQhZj^VgHC5G7k3MsG3>?EkC
z!lMCt0P29u%C^&UgH(2Rvq`#8uYLN@q*!f7XY0U79LNKD-OFN0LYvcW&hSi(wqE5J
z;{Mc%6BN?ndo~bH2ooON4R3W`9t}s0RmZ@^0>XOTw|+9!tRo@}IRs6!?%qAf8lYAg
zv{|r}qPE%UR85?hJ(>QCfk6aE3s&FrC)D#_8>ripDUK%RA9H1fSabPA?c!28xBX{Q
zDPw%uqKL9U%~L_2$#JtkXP-b~FSO-#(b;~+i6>lCN*`%WBgiBWdVOF+0;{&~e*so1
zhU@<(7D1_py66V|);FHbT~%1UyVOlv=HC851Q1^*zyL>~y*d_rgV1@L4BE_gIE!7K
zCq^kC9zlNqf(il<oFPF4yt)cNknwSaE>Q=Db7l&iEWlxP1c3#nx6D7&{$Iou_=<BA
zrulPG1@^Ok;txD1s=&)+;pp}b4^UKV>Q*n954Z6mQ3YzOMNB;#RiGK}+KDQ#cyLsK
zg>oW__-lzRra1O5vCbEONmK!0D6IggWJ%^hYcwzLXj5ruAfy0|aT|e6g5!ITYfSi>
zE#cE`fHDwK;6)5*Xg5(|ZR0IWM1iw0gPgpjP?Z{IJwa}NK!M+>#3?d@i=>_tP@sD7
ziRVPdD2EoYl`8w4A0|5<57sXj1N2J#92_}0BJ;;1uA3MDeW4y#LCkzMPTbyVZ%y4C
ztd?T#X9-smoA_+Bt^?xeQ=va}ukN1Z?FqTHcoEmCZbEwLkHp+vv5IGi$>|&y=lvcc
z$QUN$aL73L@T`>twH)H5B$mN6Qk@9VI#}90=3(<=oXsBOOxh)T@M7jG5u6q)_f=r4
z^mY>0Dqy}8HoJsBdHQ=SIHU(y3_3!U-T=Xjdxw({9rEyC5_wkQzHD6f;U@s$3;zcB
zM;QBY+!<9W&O6>3{uBe(?<KLaT{YVD=WdIcr%giV>Z%Dow;W5j#y4FDYEnN%MQ?|;
zxFt7nfbe^z5<$`nJbZN3Z;P|IguC4UAx9m8U~-xDigjG%rCB9<-GQF=hoE>*p~viW
z4W$cpWFuaQ%+u3e9WS<irM^wzTjtFQyQdxJ)8zf$o_3$slq6G@$av$po^&T?m2m#^
zjX)4aS3VrT@09bz1=d-A6g*H47x59+7$>z*oGpgK4xceiQ9w5IR_i~Oai9~fh2FKM
z6wPyBz-17o25YN4Ix%OI+FiI+G=K2mm@pQZJFFkpQK~O<ozWd&1nJ9IbqN<X(Kvn_
z*H?1~KDNmBQ;|)HR_Mqx-N-XV8#9IMrRQH^o*{1_J{m*G9cX&;t;jc-6{JLK`bh8>
z<^{{6@|L{JDWcitFe5w>Ma|9DsjBPXF|BzsCAB9++r}DzfJ+8&!@2ixmVVHBqsK7%
zyvwf9p4c5-pO^hd@Umygu3k1??|s>LqcA=sR@Sa3eFVQDHdWNvcUiPOJtR@(BnnBm
z<0I?q>({Q8i!Y)#N{q!%#SVE`%Sf>a;&!#CLp#0NC58AeO02xoT(0HiQa*VVr{PsT
z>Q(dH!~grJ&%@$>l!sUKCH7=~koCvWI!5YR2Q~O{s_?Q$QmPV9OA-g<r!TSVKtoZf
zD?OLR`24;LNbousJ-?-6T$FVYc>yjreKO#M@qFCSngjtJuhyDH%lUXdhksXq$RcU(
z28h;?$E$-{h1RO2atolFArxlZVDGfVV<T+N#47tb9~@#|A=eHwy*VAIT2_Qd7jd^9
zO57|J4kE|P!7)`5@2JFaE)q%XA;D8mU3k2gx4J!g`w@?|k=(Gk2MTt2&7FH|WA4*l
z%M@ZMvStrV+nO2P(ubx#l<;U9?kOp5T&;qcBu=F_Z`{wQh&ks%08rjTTDUza<J9cg
zUhN5GT9?!^qlBL|_W5w!8alJYxZNw^Nd}$t4vWJXKeyC}A+~oOA%q<bO6WT0fUec+
z+6jBo8QBL?+Q|iP%Ly>XI*j=QKAe@-v%EN)J-r#deud4^)$$wOf}Z0@J(}?d?`V&4
z0Kq%$tro%_w%Z=#T|zZ|_fX(&<c>RgYS)CPcppc(xP-EeN9bquy`!xk(J~z@RUOE|
zk-nMFVe>ul$i0-;$FbMANLq(RJ{w-MWJ)DEM9M|-KM3u@$o{GA;g-7=V&XFjJRWX#
z^zM2*FaEgk*72BmFtae5e&pFqD2Uzu^gR%aCWv6n3CMb?)r*NlHeyJT8Ust^O7DXu
zf!n}rTw-JGL}XxEMNBJZ?wMsasVPBr%d2w<g6oA^hY6B|%fa_16k4t|vGSpzOSnY(
zClWH9Z}SYbjL6jq5i~C3ekGc^HZPJ|*c)yMmk*6JeGtDjSAYhpXdr$S7H%~y!*bcw
z(d~^?>60o|p$24$^K&1mbBWX$N1ZVPb({)^s48_X$t??(<*#Cr2s<}LY4C0T=@4ka
z{1#xW*Ufts&!(1Dyi+K+OZ(0@c|}E<_Z?UP_nUOuC#x%yZqS-8<RhcW*P6bIxWsxD
zhZ-&&CTf;)Z$ZY>u&CU7BwDu#1y7CnVbr}vPev>itbnMfsF3BZQWQl~$7)UQ%ljpp
z;>F6a6a`Uw8#(ZAmTq@(Gq8MgG!@B{0AslBY|hU-$i+bV*A!u9YDh9O*t}Yqn&a?E
zBiT6yTh!?>%=WKmN#M`ws~&hYehc$D``flXcv5<NY{LV!!{VohTPEgOUK6Qp2~QcC
z2}XmjC5FrAglCI;Sf&hwae7kG0Dr<=kbI=o=b8y)qREc;bn!}C7|X_jcUjs)MQno%
zyJP^4)egM!GeZRyYWiXGtw`Cs4G%2DTIpFJE1Iq*x$DMuv&Y?#@X}oR&rDw3G-Nd6
zaKY-)jBeRU6tFjHPq?R7{?)bgDgp?-tvxY(y7m;7NTitg$yN^r5}mGdsBLVu(+OI&
z+lWB!6^A$Xp3H*5W7F{$vpZVAYvXYKs*!8lIhaUpcuJLV*q!)7?j_Pv*`CbFz^C_>
zEQIQITld`oRz=>9nRm?zmA&??g=uY#xkb3rirwlj8Av31^t#8IgdXe@Hk$kYW-4`A
zjSO0b`wWN^?BH4!q4cgM+rA<TNP<3fM%-^FSC#AOf2B<G?hUdz<HZ=|pYjh8a-l-V
z+XfJli&hu+yx`>dWY&j*o8nv+yOAgJ1@qFvuYi{eVOEX{VvYqd`J)NG#85sLr2m6%
z1vmfBGY73KZtih#6Nn=lZqCml=g*lTa~)y(Ph;Y8eey#JfS?X@0}eGApGVT5nq7U>
zygfwq=1*~~i9n^CeITg1Ci3#2WL0iOTjrKul8Ffx`}*rA@Uc2Mb1_S$cW#uk00QW?
zcH9nb2>|JR2)(PGPRSJI@(w<vVv$W0pn%s4wTFbc$xO)gB=n&luZyrF2c!-N9n@w4
z1r2I~pT)gV__Lq<lI1;e9M#9GSle80`$rmb;Cd3LS~D@ya84p?zIugHyV4<av_{`u
zi30QW%>RHNx9}-_E}7^U##$AmIAe+is{R-g2RS2+O||_OdN<vejh72sfGR=`%7If7
zsXrvg+xvRmA;Xrl@im&L*o%|%|L~GM8?n7`RqU0s@loD_)870@&PGIIP~g3o*((7I
zW2tFxk&TlWyujPF#4_w<L&gGL<Bh!d9sC`S#y&Y3wI8;D1*5DLv`!~;R3~yiX0C(H
z_&a-Nt*Y7+4xkqqiNQX%X?z(?Z2}+ot?~WCvMN*?>=(Yzf-H$GtolyF@@E{f@ND8W
z%Q!$boxgrC5N_A;7k9X@jjEE2#+vO^%DBzYX@HY!p3mzAqv9Zc0BtUT_LT4RwN4`s
zP%{?>Y$)%HYO1iIC+QfJ6G)a*=|#&sl^NqvFJWEfZ+}Qsv(0+&$nqj<n$({l5P3@Z
zw|{}*Y2N){?922^#6V;~<}1}}h)0a&`is?Tw%c2+s_VhA%g_ci?_K>~wy}P#ah8Qr
zbIaLWtG`W``a@|sxXxA7E+NSL9f1xWa@X421!WNJx$==-D%{s%G!+ewlQeX05r(Wh
zYWw}8W2ENu|6FU_FVO1DZ_D{dKPGly=UTJK$TGisp3eD4KO$x)k+p;Tqc_06ilUMj
zmesH=^Hw8gH2)SrDOptpoAUd1PzKH8WEj2p#8_P$1<$3RSSlO)ka-SyYVK^St#LPX
z%K@K}$hs66N|8`cHPK?vmfGW`_81j&cB2HERX0BpZ1xB3iY=H<#MpDKA28PJu+QMt
zaqB*D*dgNox*4{3ipi~+;6Z0(4SUY<>{h-(S>JAaO9@yb93igVp(kB{otsdB-D2_R
z{vBWBf@t5=+7%~7wWl_*yT0q)cM_p+zu?NvrymS+AwxKh+zTB??yDGxIB<UpR#2W3
zvd=fN`P;J3HQ8sJ9>tM+qV!CMM&Basd&^n;oI7?%YpNuvoVZ_L9gIGlxaCgJ=);M7
zoO-z?9#;<BFRE0|fg6`-3gN*02dbsTaXIV2E%#ao9FFhynfPntTlLQH<tP0Z$FjLp
za*5k^y2s7Y3Es_3@8=DF?e#kyEco-+Xzm5_LcN=nv$lu&9}LG+8&^=XQ)$?cHN?G>
z5<UQ+HQ{s#6E4oesskNo;bl&9={M={b1e<jjGu+S)|GuQV{LLpt=E_xmN+qsYa+Ht
zv?oRdF8-R(n#=o0>5^)RP<TOGx{@)Hw^H&#4cw9#+pFaR_bK8HH=f1ka~R0G((_3e
zefUeesbuus{@`w-?+%BRRDRNbqL9&dk7Fk+KGJo{N4n6Kvm@ce^)&icYRw%q)Or@B
zGjr@N)G`uAADs;J7%%9p`m={J0RSNYxPxuPuF4FvyTU}<FGPN()WNc?oF01me%i@7
zN`KJrD80yWl!nv4Z+^j5cqh#%52da;h@1IUnb|q#=nw9zjttMhV>*6-R@eDifPo5P
zozk;8FxVYhK`^~k78C$E?$GAk(pc6J+Da4(eiSY5_lG`TEv>XdEX~dRPSB$rCupC_
z8{`D7(u4h<KfwRlQvT2H6fOIL|MNTeKXU~*`v|AVBFFz(e4_{apJV?Q{?F0^7a@-S
zGrL`nG-tFXB5c4U;qw$M*P4_|04y&bx46sGM_9syFVt}K_QVXq5<wz7!JVN=Q;qho
z$$Ie20oUinZ$cg&*JoB!+@3RDsVe0hx92SgA_{ogQ%4<-=T_T4<$h)dZO7ADXX(pP
z1`-B#3$K%T4dcAPYk(51;`Mwi>-9Wd`TK^I<MVfD*7m2rCG8MQL+l{bz;iy&H>>a6
zgTFTf&r|Ns9|-?1w0$o~0>rD?Sppvki!fhnzJY10^_wC%;9XuQD0d!i>OGtD;yy`~
zDaUmH63dJvH$Se51Tq%)HnFe@drq@U!)1$TwCp{K<b0o*Bc?uo4p?hpJ2-|OQ?A0Y
z&FAnbr&m7fYBd6Hyo9O+S-0tI)pBc|a4g(UD`3ox-_BiO9p+v{)h7PK!)=TnxION8
z3fMd4Z_!xax-GjK5*L{B9!Jnbkxk#69C*fI1%nTwss|JT*6*%z3fqZ4WC#_~E6(TD
z5?nAlT4$i9^T#Hw`<>DPMjW8ekO9X}9cbB^?XP+nvIA(E`I8W1O&p%z{GmFr#o3t|
zh1F5UHeBeOQk<XND=4srU<Pk%%`>_E!FN?1gf(ji`>qP(Aci^S4+N+`D-E!(@m&=L
zV}M&-&;fo#<CXj_j-So%5)rqLu1Nesk@CzVp@zyOiD4X#k}k@$KpA|QhxiSskXWHL
za%Oy>O}!}L4>hdJa~!3`xB3GuT?<W|TH$<foTTN$XPQ!#PF<umT`UD4t{2D?l6sar
zp`oYCb0ynSp2Q>3c*+U1P_R0rJ+Vz4N7nbtV2yeJ8>(9Te;v2zHQTKJnaxbeSsY$7
z0hNW~nbdhN+x*0$YbcssgY>_^)G+sR5-<!ZjD&1%IUm-_2a^$yPNU+rmAmv)oBG|Q
z<<EBZyG!4iYv$Cfw>0=uiv*U8$_HaRw+$H$B&$`<(X`??N7ts$b}9zqAx1GVK84@1
z_ym5><EEnFXt~xbA-rk9n?8<EB2A?~b6)b&5~xj}UYLH<$;wYlU^W5NO8HTa(Y5jx
zi(rV5osEKH`cD+JzWzi%f7Sj!{8hlp#3SjSb00ZycbU7`b7F&Swa!@pG*Ms@khzx{
z4*w79pSc<WhQ){ZqB5B|bp;^qlX6(?{8Iwri9wbSTTtDmUWO}!tzyFfKlv6dI-%h8
z>|gh3SmgB{bMB&1apxQ|vhsn_L*}%Qa;J)P6*k|@N>?RT1I-%&msQ(8y!7`V!Oh((
zmj|brZ=#OAQ#W6anIA>lk0DZBxRxxmt2)|M#G(%os7jPT6+z_r(|ku*`miU=ErF7i
z*v5Pie|u!5Q>=skodbeZ=ydD|OXGnPV#%r2#}ts^bPp7~R<ay5Ypq-;IicQfzA5Ju
zf(1Y|cSZ8&0KVnJhb3gY=&7p|O|JZf1A+}DJO<$o^KEnq%9rH-NnX*`W#tv(2OzIJ
z%+~r}$t!5=`+dE0b}caRCDkJ2EJPX#n-im^WgaB#WV|S9tW?9z8=0BG-8zFJcFMXM
zB-l<Jd(9ozIQkWR1$`&{M(`X={)l0a{chR7l!z1CB!s3LRfP0GM@w=RF9NCTAJh~4
z{Jbo6V!Wwap8%_rEcL&MH-&TcKH0HKo|5ZLkqMUYf7sgoefCMwe<|wB@!smlQ%C;N
zzj0c4{i=9V^U-`r1OgFCvhk*N6SF8{J|l#leOc{<n>vGX$Rur;ucWTLKAgJgjA$;>
z6iU>-p-^uEC=8A?wdS9kJne}SB296jT|_*XcCK*HYu!d6eAbKdLhb1SxmjEsG7fpU
zX_5xbZZ0CVrYo`{N)34;vh-!szs)|^W}lJl^DIYnX`YiERDbNLlk$btzmNk*#h%&*
z*;Qf-+Cp9sTSUdE#Fjs+7h+Gfv-nDM5q4K%Pt8`br+%isBf3oBB@6<D`(rgN(V7>C
ztfXQ!U4Q}y@+YyHdXR4<R@3}`ekASZ>*r%uRpsQKa@C?#9=`k(WT0^Bp67o|NPKui
zCumjX`x3DVswvbmEY=U>)@_tU+G_oAlHv-uut?twLJy7yg$1Ynl`*TXVK!h-HfGfw
zsx=Ws{%H)Y5VuNe^6`?3UG+P*yCdfiA7RTt?5Y>j@5_PkB|)e{>cUWkrcpCd!9OHo
z(bo|W7Qt<(I8?WNE)LZqSS0?Y(}Zkq_YIf2O9p~aMa*OA2k7zh5vWvb0nGg1m=^5f
z&wp@aiWD^vg-TC9N?J)(mDJBgq3Z09LM1G>lCCy^2K`Z}ex-0?Y5W!?Vf|iea(t)&
zRiX&(k3#hsjY||Ne4_R`GZ(4q)OHbDSw_y5e-w!7_ndw?`6?TT%8{+u^Glx+#Xux=
zhcH|Bt&%uYXhxTm&KFrrz<X2X&YZCI_I+2W(&6Fnq7NM$i0Y~{vJlmp8o*f2{^~)&
zs0s;2Rfu%31Q@u|YuPjcN=N!q4Tk<!&KLNZoFMl9O+>1p5|Ju+T$_Dd!Wb?6vVc@4
z2xJ5|_>zEBc&TS2Qaz`F{^<Q7sU$R*3P}}iei!^lJ{2Y*Tv<lU01{k6fcfE;vh-)%
z`eox$U6zeU^&{3W*yn_!(q{Lu`}NO7qk7?aVP&$Rg%(p>iDeRvN*@%B>Vl^ovCIkA
zH8>j8!*{V`|L>wv9YmpP`|;|hfv=24wOJLqU~nNtm%b2<YN~@wM54-g99k$;G5tP%
zbdbWqQK{yq4?CHIqf*UxqEf|FRH|5O0L+r*RI1u9i%O*gtQW0+MOJ}q3`C_Oj8(s6
z_IEzg_m@Pa%GO>?0WnJas*qF*PY6kM$#}J0J|B{5q2lkYx8X?#LQ)A!xH5B|dT<dc
z$7lv_Av;jjJyyS2sq8`-2G$l7YTmu_W)+s|dL`<u7dT`G`y?GG)TF2rY)UH7rbuX7
z(=`wTk<z9n9f6Zla)5JOOR;QpstYMJD5h1WUC!)(7^-R{H8_Lz4^J2JCQ+Z907xU`
z^p_7s=?@_gkOp7+9bP0<)gH;<llGONs-B?4SB9$kF&_tos#+t-JAi`|eCmEl-qW8H
z>U3hLs+-A4g#u3Lt4YY9o%oV+P%1N~m5xm2gsM`S6RY$ywFv1QkaH(Y72>oKx737l
zVX83Y(~?K&-aO7dimnVWPK;8er?Gp0cTrKQ^z>FW)US+Er6e%Xe*!@#N>y!Iu2=d6
zF`{4P1hEDw_WveI)pa!L&0Hl-XD;VAFH<e+Qiz&JqEuDnLR2jgz~qFmH=UU|OodMf
z5jdm_z=Tayz!(To)hAHH7<C9-TVZ0_7o$~e)CZzf{g^w<e-N$8iay@YvA+0kvKn8E
zkcxTffA-(O^z;3QSaamh9&r!ziu#*JZTy9;wzLJj<Thrk^%2cwmGrB4ZH0+ho$gkj
z`K!B8=Td6L9#QRJ=lHC3KR4xKJXRjU*ohWq>Sad=D{?wlr6>HgVQn3MWah*_)hoAz
znCt!@_Ra)8>grnjce0Qn3zGoRu*rZRQ3N7H4F+sR5}atFVH32diCG{uBr%y0P|!ev
zC5(BcYFlfyrE0D9)s|;n0IP;Yh>8$gQEN%9+Fy)I+#o74|L?i?H<J*8weP*Y_j#Xx
z2Yxx{?)RR%pL_1P@+>cc+H8b;JN1)p&EvOroS)6(iGf{P9LTQGdQxSN;I@9w)l2xQ
z<E-3pF0(S&Qn(uCl24H#%(Blv+Gk+FNvw7jec*6|Y}Sh2?Z{4q_RTEFrmFz`Q^@~u
zHw&4<?5PQlGl%$>8G0PJFHDaLP)!egz9n)f-So&C{{rnTil>Kr7n?_zdl!3K=rv-y
z*iVOwZ6fCMtUa5)#eFr`W5`R%%P=qaKl38a#oe`Fi%0_sJvg7_o}ZRS6rss12DK4x
zvTolr^>bAL>r{65C1c#o5zlk=OYS5FlOHO@S25ave9I70(og7E2a(m2%~F<dv5N8n
zD0qBcd@~b6{cJgbzn)+?o+Fi?#X;O-@bi$VJ&B4$0#B~D`v1*bRrLye3n-4(Yb~5O
zT7JCfVh6Xj*E8@w-SLW)Bftq6rx!=PV@GAcDH!3~B(uodXor+-+6Xq;?OSMwka)Vh
zxF)Oj*Mv+>3uo|XdL*sL|JSDT9r|fwL_w`FQX+0`G)50)YL;Sg1#rYk#0oF}WZxW#
z;C30qP}$#9?eI<X7JsN|Au{EE+b!gXkx+1Ox3lGyDI@82E&n`AZcHH!?`;}BL*nv3
zOvFz=CZvDPdS^8~qH*k_7<pW1SM(Pzn!BZjGFd(Lz>FBeG7uTq?t6iGjntO4@E#FL
z4I~sk!P)AqCdRqo?FY%QUH?7z^TIj_Ca<P~(9=el$#!1Z)R7#bO7oeT;y)BZJ{-Rb
zD{rwSrCfy=oq3bmmy{Pk9Sl=#i}f?6Z=TDbX#|tUNmG&X%dHD4HA6a07P;=NlL3|u
ztd#v1;9W%GF7*bYBloeyXD(FrL0<LBYS;wnc`qgN3;&3NS%q93w0?tkeHDSVoOP#!
zMXlgT#Is&-c|zsvV%_DD(Mbk_OA~<}tG(8aT$!E^h=?6Wlp;_E^Xb-B2^9aV$kv^=
zGkb^=X)9kmRdN~B6t<S!Bh&@a+1Gpr_R&t^KM4U5c^3s<DORlbht2cW-O~Bl8>{wJ
z{DJFKnmHnwRBA65k$&zX>x2BUL$Rv=8(gR00&co}2G=P=bDhp6?Q<x}da*s2odMS=
z4y#?%A&b8O*6MKl9Mj_PD1MPaA7(Y;AQ>nMd$2zIr7nZyUpf{#zI*VPc<hPuW#4G7
zj5tNdcW$C}MO`q6lJ7$-wJ9}H7L79!5q_1R=qr)&&Kq#7%FqwKjIUpo66GHo$Z}72
zqbl8(Jbjda0n<kdh?%ake#!+3tAn$!-9%=N_e~t=XkerbCLb!&huq>MbnV?Xxk$!s
z<8%Hfa~1b0_R~O-4r9sT4Xob)X_330I+c5$O{<&5#CtAsnezRRnO8rfaOZJld11@d
zAd8i}fX4|d1})DRkbI5yC*(EeI#FA9Sc@QI<?!qKo^r(M4gCB45_97p1k^8&a=PSl
znA(yiwt@N$0=QO<((;Hd@2W4GF|YXBs;Mwtngfq-#N>DFsux(#*ZwR1teUzW$B^|Z
zvBo#n2zoU8<BjhIY&x!6HTBjWc5B40Y}M4J9(Jq6ZuY9Fa5uwYZxXw6S53X8huu1{
zJ8jj}M<TlY5f41YRZ}0vjyY2@;mY3DsB;^*Rr0Lwwew_6qb>=j_z(&Oir9D?HC@_Y
zqD_W+N3U+)M}4N%PoKV*c>U4VD=<nK{hoS=`bR9|4gWA1s2|30T6mbgU@*jOS{UhA
z7l}f}zx5oXZ`>6cq)QncWZY^dwrhy3E>rmmWI&B4bX|`jn%bnsp0~0ks2QSbyNBrO
zM(Y9N!q5;Mxu1yqj}hr`B9-{ER}!v%Y&=G)d>lFvF4=RuA==DfdIIepqOB+IGNbcD
zjPcgzD|B?f0$1%yuS5En(?V~vit61$l;d-q&{NOYng_Ex@S10rC}*JfFZg2e8WAYl
z;hge8UFK+i5{&i_vK}4nx~-Y5b--dh8qC2TFJ7#RTpQyJ?s7dkMO^k+MHfrKIcVtR
z0oSaCgT7(x-X6@VJL2~B<8OceFC~)xJI{w54NvO1DF-2wtKqNYqArs&<+{xNejcOS
z-tn=vm$kXvz~S|(X=5aNo?t&)p8>OaaC>lTUFJd`ag6q#)$pu;1mZcI+RZ>Rb2QN~
zY{!X`1mrSqYYueoYwt)xSe*3x?TlGS86?ZB9Xq6X_%7ysSm!ji@BC@~eKR1)*{&yB
ztcHt(IzdXoBUJ0i@OE8z324)yBMv7BvR&*n4G@OBRI0<IgOH?7r+qMXQj};epN+vM
zI;@XoP21CQ_|aB9Pv|@IdaZ>%4bEVt>AwN9m^)GnSzQ=?1~Rn0x-<GB7GdxU4qq<q
zZN!=Q_BKwx?-41%8$ww);v8D&*U<Fdm6H~&sYWletS5xEQ7n@z2L$>z(wq5l?Lu!c
zvIJgKJJrtO`GJqUnfq#3W<6^?u^s<r%FoDait6l+S5N2m&Uq2BX6u4BPVb<1dZ_Z|
z?8XsqfOkaFWzEE*840@4AAfC@6-*vN(O8<9WL*uvp}bTwOCjV4WLd8lMF+#!`?9FX
zK=@N&ns?t<dL^38`#@;Oz$#TQdbm%{2@NX~Dsq-|@V{=8l6A_U;L$PY;1Z0jfnJ+d
zgx97&At(#LIJqQUyj%pBKGW-$MG_@@AskrET#Ctza*Qk$hG$YJcOw@wsb$GsB$>OU
zn%&$X9JZ3MP16Sh`qtla^jabu?$Z@I-1~rU6VBXrWW99#U4&z-NmJgZCf|Kv!cRFJ
z<%LeRFNYYXqf2n+jZE2j1(SDu7dJ^inEWs(w+eEnyn%j|9{6qI1>YGV$Lq0>y;?>d
zi$vMU@WbZh{oYMe?Bwz?59GPBsizSi-pQ<b=tZ#i!Au`9tG@cN3A?Cp*@oyJ`;^V*
zp+=`KQZ$kjd#7<^F{OFcRQ)z%{1)>z<E#{VKX;k(iapcxUh9RtNMWmF4Q7|TpdSi&
zRSFMqvHqJCk4CndSSI+$ZD?Gpae2@kT)#CnC-b?Qw<HC$=!H_JowAn63vA_By=H+_
z{4>_~C>V`qbpCj*X|;+CBKx9R(&q|fjoE6AJk(m>=CE)6im0O5Pvx=A;mVWTj0hb`
znu`%=A*R4nf}Tg}c%y->^R65#1)J=qMUKXm`?J=rT;Oe7*_qSuywBOVvdi;WVn<AN
zV`*3RI>v|m{nmMT(l}jfPUW~oi{h;5^d}zLsj^}iMyBTM_eJK!ejV6jbd|^=x!H5_
zGbsFJEcShuD-9mL49mynqcMZCLhAyskjUgKKVdNmMeZEaf`7yV>Hs~(1F{319YeAX
z?sWQ`B&kU90}msX%IZK~r!$aW$Wvd<o+l!(s&7y9O^`n)%by|g$5sDDmcJn<vy&T^
zw{1f%B(M)nz=4-LVmLePhzPtI*twZFRpY!JCvPRoOk=*89-c&>I$ap=zSE|wNWe+c
zRTSX#=_(qKI$iYx3}DMYqJ0cilM{HSW02>MxG4lu{)krwrJTTDHrIhQ=I{2b>GYkj
zF8VaqG6!2n=PbUzuF12?mED39CCl=i;M&qY6o$=*iS^G$krnKvRIV-W#@F`q#M%Cs
z`tUcbBbG3Uz8LV~c(fLOhcqJPczcwU2sI6j-~F+y{iT+zH$VfbUG|DF5wo%bIXlqs
zRj^A6i|9IyXT_K_+77Cn^DSNgkRgrT*y#(XkH(xfeIaa30Kc30nmvJ?CvWA{cZR-T
znAOnfn@Sv^NGZg@k$pxe1qvp=I=?$oKO*&U9D4t3yL8a4J?^Nn-`FYV?ni>jf1XDk
zTdet%!5Sz9$!Px>^wpcIfkeijd7+7B?l(pA6CI7{^CAvP-xf^16D!txzp)<Y2zr-F
zpl}^`dNQB(_w&^4&Fbhc>NKK2o!-E_wm_U!m`Soa!|!biW!Sz3fW$yfY?tI(9*@sn
zy8;y)#SGbflqsXmvu@WI@7kPJ*P42g%xQql_$!*4r{Qy-KM<FL@{wnQR?Gn^GN(mq
zb%=Ei8C;bizJ2**<ou733YQCdfjId2FPS`)HLiTg`U`i-AjpYj^($W*>QCh2OAG#o
z&7^Cvr`<v9GF4j-{F%KN7Jo27brwdGg)P#fH>)h@@`*nokhA~fZT_gZk2@mbI;r$+
zH1`?PWu@sml`R!uG^PmM9kKv&nK4S~?N*fXkH}t|v!LU|&GK%e-C|<7;k2M5N`@QL
zlMw=>33_;7F*~rbxp8HSYt1jj0?AFv+I;d>VpLhK1`!_>w9Z$Zxz)8s7{mJRNR1$w
z?_8VcsXrWb?F9Ztb0mwU>&g5D+`W<`<YbH@)jAWnE2kxRgjMbUa7}4wvE^*)l96?H
zh&aCy3#j92koOTaiBaK8DU`LEn^oFH-bbXRaGRetQnYGi%SZ6s{0Y2bc0`J;buDu{
zpk?|ICMf?<>fqLoXuq>>4Uc<)ui9TC7t<v_{*gLuMkOopO*@5TQV??KEm<gQpZrO?
zc1)-AzGal$b<;pbA1S@-`$u$cX+9L{owIbITn(QZOI_=&VoCP>=eCP>F^D0#_B<g)
z3&iCX?;tEUJfmB3#_zB)Pt|RPO|C4wBHMB@-@ozo4)n&aY_{8caa{JgQci88jeF|e
zzA<#a)b6_(b=l4mCl4N@!0sra>OlO?0G&H2<HoI4Vsl%JGdn3GD`RD=->nDvp?!Cp
zJg3ub4?nwP_;IcI5!v=Mbdp05)1#k7=&i?C6dr~cln(JsNWR4(rwF0Z!d?v~=fRED
z^f;4u5+r1c^)d1ldBwwWxxOGQ8M?LbVx&ap)s>_;k5G}Z88o08xDvW#&uVe;FHjVO
zxOgCbkGC-@78&pfUuZ^w?rkip8DHI2?t0mDh1O?TdYvR|xfSqmIcoS(GaWa@nnVsl
zQ{&@=2yE8^L-j7%-NHH$Z@$-fk7^k@WIczr-be+@M5|bv;PRBdvYjpb&TQm50$XJb
zEh{eTb&j3_@-{{~fzz1E@IA^~jJ)4gU2{#zgPB!j3}yuLBKxGr-+;^d3k8;2e>Jo;
zve7P!6SLT6$*J|HaR1#C*eVAHg}i;5$MS-?gvQP6fwX9LfGLB6*yprN4eM076A$CV
zpTbJW^_WAr=L5?!Bhc(F7sl%~ciI0gF0RL7$Foq9^-=v7NBjxaKnP;^SsmxW%$k^)
z;C%vS7K%N1(JWc`i$@Q+QViFV*-oxyXLSs;Ui?8QxK#)WL51C;>x5-f#Td8ENXud^
z`}<pnOhk6F$E1k}6!$({kA3V~vxaiXt_9I0)<zT7-^Bv7Y3yr%G$ZVptkSJJagqxK
zFsSxgKhR9vy`dYlbr^fxpv{jQ{-=(}yuh2>p3N9@<20@u%2+1>FVV3CeLBkAo>5La
zI?4&(93>Z3h3hO)M%q!LL}#yc5C*a2a*P<-g<A|Sve?}7eH~-K5*=9Rzsij~{Z9vT
z<X&W>#KRTvG18*k2)6F=Y?399_0T!2F5jRYV_B8cJ;dYGg=5?|oa=3>7&C@TzROPF
zvaj3&<f3wn>ro_qn_+!)3}B!pYp+^fu7m_yMDOnt$N&eQ&Ls4TU9QJ=c4T>rFBY-&
zBaIh3sq<5ar>yY|-nlP6AM55L`iAo|nsH27W16=<23ES>Exk(itj!)NIn7_hP@`zM
z(r~L~>$J>ln1lxz?vt`-y73pty2omQ#j#J6ZM(kVMUMCSJM@l)keYc6d%F=1nlz(l
z9Nwu3V_4nM3t7wB{F83I^7Cx{A?!KL9U`sq=LO#&k;NL24U=K4oG?To+A&JT1pQF0
zPfmCk9rBP|mh7SpmDPBgoLW77wVYaA-j*}9c(DIu*_QWnJqiILvolJ&^hKIZ`yfd#
z(mEb=J?dhq&}Ow!GT}M?M3*qXEj!Q{PlMx3&v8SVC-dVK<Atq80qF5RYL*kM{`i!&
zp-_oM;n{2jWU!_G4)hkUlE7YGq2{T(MGl`kpe-a5u7<PpI1yGP+kOgWtKeqof~OJZ
zF*y~sTLgYc-Dr(9c|gv^Nj`KI0xU))8v$=rF!{j?by3#zCrrnE?19*mwbwBmYJD4_
z_bseDbgj#H=z5f+g|)0()Oj3rT{>3Pv7%VP!zku_EiH7u#;^v5+1A?;iib(H;6ELc
z?DdY)e}IYu?{C<3D4(lr{W_HXG&j89yYl`R|EIZ|f=Bf4hFso+(Z5wFYe(w=joq0S
z`K<TQ3%OJF<(~Ya&q8B+7vW~X9XsE<^}R&!so;}rd=&VJ#yYm)pno%r6$hP*zen`n
zul3)<`tMiz@0a@T7y574_AIUWM&AzO)Kz+NmbdY8KEIdUA`FP=b#QLIQ@D<t;|yG0
zI3);QFbAo{dCV6#oR%GUF*mT)6MQx+BLfNto8@urPPr`3>^gp1uqAVQ(*nneh`|2r
zK<To;A=Whh7<l^Gfx@UmcTqRW+@u}$0uLt0DPH|saOGFf2)6~3H|8?#3a3RM|H>0u
zxtls^2>e_;BX$M+sHXGUau4yyMps15#TPc^O-S^j0D_&v($l<69v7Mim%@&x@3wVX
z*FDb2FuqM5*U1ug+i!Qp?1t;rG057e>s+5l#qLsXzDape4kdng4NmU)Y9=BX6qzjg
zh-5E$5Sf!smPfX-1AaA14uJXN_Q+%C9Aoa%>kl8NC8!}0pCVhx=9Apztm*P`ZM9lX
z38Zsne(d@ID!1r!Ig6Q1Q^VnjOY_^<rx8zk8}y>!i%h}2hhSb&aFjddot2oI*|L;}
z=S`twy<tM>vfr@9F1s)hWuE^rG3|;BmA_oZOgZlG4G5Kgdm@~NH)PPM?3tVJF?TTe
z4hSGBQ+?9{Io0HdjKjp?Kpg%QgE6%hCuPyggN_8dYcJNtft11Ib%cj+)^uU#s;NSA
zf3$UR85wE1xZC1fECOg%%XfOGJa46zNIq$t0UBq3#@SSw7-AxX^+E{`R6p8NEouSx
z$t+gDtxlxLEuX~JFh*8V*{~v-f!aBn;U<d=X5c6X5uj;aa5;p@Gg3XN7&l-Pb#SlX
z?$&yD8CVwE152Sju;`bnQKFcLQqmNZlFHiYs6Lh@eJrh4A3J3oS<!t=1^kPrz-nmE
z7a8*}VKc+}bp)!T4qaXy*dsk;7^J2J(ov+3+|0HwuUJNE5s`S7EZ(pvT=^)TYFoO1
ze!(%k-7n5KUK9B)v%2mca)wH^|3|oa{BTjYdANEs56vFN<J$bd4yvDy64`7;)6i%y
zp+18e8R4AT(@I;8G+$pby0HpbFzQ!Q;CFf`0<7Vl4PhoV9pLbsbp!RDcGW*p?}g!d
z&oa+lTPui7DqQN5db}MV^`0g5u2~{d*-Y}(uDplMg#ul}IZQLu@B+Jr3qn(eSzVaN
z<qM^LyMNu|e;zk!$M18k{yE*6Lq2Cs(ZQ`TzOzKVP~5sGZo0JS$HoqBjbL^NU{P;H
z*st6i+#2OeFji6e-J2*;hqJXk+CR%6k?^l^7lkmkN*taFZHtlRHaF6@YkfGRp%V}d
zIiHFp3UcJ<8reWWkuK=gm*Zx2eV#<f>))}m3UhlKJ#BfSCMS>`+bOnPT5pc06U#3D
zOC&b3{TfE$p7E{cJW?K}t9fJ-5h_<oRIDo{J2uO^YHJ;4vhhBTbcl~lS(x(z@g}`I
z*Y^H=GXLkrCQ4!{7;_WFE=BCzVwXy`vc$ek>@Bf38AHJaww+?z<$oY|l_e=40VKdx
zFPSu&dNxy;$Ce+RLF;oPQ9N{X1$l$dgz89Fkhi`)qDLj^3c@ZbTuGq{D(J4D`gW(#
zR1?nO4_8o(sUQw|!byC~`pJ&%5=wNEuvAbAb&)6)1mOmoWIQ~ToaBF5S5K{}p6>eA
z^~3DB)YK1kA=MJDCR0CKd(=;!ou1IQOXv&1^I{?W+*qlETubcQ#BRUXwURGgLsEUS
zsK`8%GgCoMER(*eezs6Q`qcbww(j~ta9KSEa-G&Wh0^;k<oybRq*$p2aa$t|l4_k`
zkTfenBXL%=vB<IxU#UZTtxpY7V7+IM1=e2-QfTcr$YN`+K{BkJ2C255Fvv3NVT}ZY
zX4d@%Un}^X2464udV|aOVl^0igW$^yF2j#iVepND7aCmVBWtd~n+5k8yhZS725%KS
z&EWe5A7k(~!BY%w2_A3oPQjJIy9EF23ZX+lxWSfXaHrsZGPr2?w^|LJBKQu2y9M85
zaM|r!zcqN8;2R8{A^2?umxZ^r*5F>jR~WoN@M?os3tnRIWr8m-c%9&R245?9mciEx
zo^J5l1y42jV!?+S{C>d`4ZczED1&bjyz6pZ_GZD~H+YNSZ3b@@{3U~L5WL0U`vw1_
z!P^AiXmCsLdkx+x`0WPo68vU^%dvu0XK;BU-SQbcQSikEPZ4~f!QFxv7(7+*Y=fr>
zo?-9|!B00htXT9W8r&=RV1pM3?lkxU!4EIgWiJ%G)8LB*f7{^Ig6}u@GQoEnyiV|D
zgRd3*VS}$1{C<PqF8G}W-yryUgWoTBgTXfnzRcj81g{XBy|rw<WH(&a-PikjGZS*?
zNIVlWQ-`>aCo~c=jZM0-LE<Li3}Z9e*et+ik+DfMHYnapxZKzr`EDpRJ+>%ns5`yf
z6g<BF1D)W@;xTZc8=JR`&30pxip_pw^B=~B*BTS{7@J=hn+$Ar7@H<zlZDL|V{^T+
z@nW;l*pwTa#n?P)Y~~xAYHS`hHaW&-88#0Xn<?5RP)BFR@-Aa}lChML2+Q@xvcIu}
z0%BQjEI+#}M2V2DN}+y&2y=*ll7D#iT8H(M72SNvlfhZa>#9PbW&ZdUF5%8t8|C1V
zE&>q9Q#|YcfZ+ZCYm=-iB;aTg?06a_HqV9^MBVER7DIV~XJrjEY@Or0b%Xn#v(0}A
z8VHDLzW2~p*(UqnUEjSOzMyGv|FTtY1zlyUzU*=>eU3#i3NvXU+x$=EZV7Fl^CDmH
z)_2mN&<r?bTke|ezFi$I?=Uue`-9uzJjyDE4f8lQ$tT+z=3%m7ws9ADoY_1_v3U;2
zsjVH@6yd1+>s7*NDZ*g(^Nw?(V*RHZ9fa8VKeVTQ|43o?xQshHVy&a_V=jzuN9`TC
zTF*)@!gn_1@n#akcTw#}GiMt2=V>i}po#wJptR2H*cAUnS&)g^!{=pQ53MhL779O1
zmmTL1WeLcwF-Q^q0`cfHZ1K9DVIyo(57$iZ@=2!srjoiVLCQMPR2K!I#^$q}^j$=q
zT@b3Xzx1l8eLX7bX`Q!v%h_FF*P_L-Gf1`B)wQ)FUPu$7`nRvEwGxa%2;bO><LC^o
zPph<e;jjhwbtvoHNtg`p7eC&ngndDN$>U*TBBxLx@&ejb&eao2#n_loX22o?76Wt|
zfrNQt6C8VRD#C@Dmzb#aF7?#8loogm^@C`zo^mj-ul_x_yib!K5Z_huCtv<7sDCfg
zH>du+DBr~T_xkxx2tMmO(;Bs0*kvc++4|iw*j!ogn&12x=>-yA0kq4}2Uf2es}}(s
zD==>}=EuccVKs2-WW-R6IH8=Hb&D<L6-S>v7k2HXQSxf-RyL>2-mPs>-pFkt!Dt<2
ztc@0L5y+W06*=<*r;q7ylUlY(Z8{)y;jxf+e==kxZ{?!PTkk&)lhu4=xMDp``H|Lb
zKjkn4E{YTN#oqhS?_B?t)0b5LRh%!r{;Md2$Y6Y?cATCUcv6-|d9u0n*54;MZ`3;d
zgR%pUZUo<Tll&DbbVSP~qC#<;8c4X5qn*G$cnt19^ephmmdt%CPvZegtrh#G4Fo_?
zrNzlBm)wVN2NF{8)bXOV<cA1gG)9dfXEEgLclUBJ&xz;E1009`SkemYMIUoVbbza1
zFJ~U$kub8{pDer9q|k)&8g+g%54bd2GP_advi<8LQUmg)l`XL^YRvWX3Htn`G2zrZ
z<n2crYW}5Li-9*?kfL=caoP<RCYanPXOoT5*WIVV)dD!dj&4HZd_U13u8%add@TD{
zr{;GEM<Ddh2x38bfsd`=ZAPK?6v79SrxRyhpp7OqOq(Z28i?a$?r^Q9O2NBw#~;pX
zs&Z17PS@)1V<#^MOg&xPI&(9huAQgf9cKXcy3T9$Mz*42u_j6Uyz_HWE(Z6=KUDLK
znl5pBGheC66}M+_6TZ?k?^dpkHx2L7NBX~(L(0bJ+kYjApl|pm+KfA|+a<3vj<wqH
z&l02c9m-<McV`K8y}~j#0><I@DP$bzkSY-UqKEbeTTJiHniCe2VW<#(=9Xn7ZVr9C
zo&ft9xk_#=kh7vUyi-Tqdb_5EYt73-mZpSS4h@6J37TFa<>hL)Rk~JF@&!2P(#(<!
zi^Fxg&mj-K>rCw<Mf-q*7kw^~29s08qsWW@+PJqBh*{iE(eBQW`}d9ehOqkp?QV&+
zgkJ=La!&$AOKzd>XfkxE@g7WW4*C0zAdS)ce?q%wuNb{okO3e&LGl74b^%0o>nbFw
zd`OEE^<W(~;X!c;bn^a=PO42*nN5>~&JMmJ0QM?8K97EJPcC0&Xf_{g{LhKS6MP9T
zF$cM)fkZaiB9b}a2_$%QYI}X@!Q|hin{1zoY_DNFj>JQ%?O{+bxykmx9$H>{!%raL
ziysRSYi*ZAu71E~LXn*ILOW@eLm;ml0tGLo9dMQsQgd+mckOq4<QAQl&PMQ)l}~?J
z`HbK^Cds;!4Rh#7HWfUy^g&24iTAzb(2@nu$Fkt*SC-S5)bV^SD<aops_eW*)<pXL
zi@hpp7f*@e$(kv#>UGimtcxCGzB2uO${YECR#7oWHuRqt{BAt(QphtbPRQ9naYVi0
zkPb_)&cLiMIGhb-aSeDVi?Etdc$Uk#ntyoy_}9r)MA?kSs6n}$vdX#ZB;f(IcckWx
z-#3FZk)gc)8<{KekGKgV3L#V04{vLYceo8BLD!l}209&OTv_A7Sw|39FX&h=xu}&~
zNRit8c+vAOCwA`oFCuP8sQ)6;e?lO7@fw=hs6ccfurc8>F%7aZ31`o8E!S`=sTCTA
z<?uuAa+n)mLX=oJfIVRj^Wpb|o-x+s0`P_2`Y+p-&Y(5i3d>Y>cQQD7MH*0~E#cM%
zlgp>*wo5bhSMm1C4_V;T@1L{IKq!bJkN4Jp)pqR@VlxsO>uz#ml<Jy8xilGJGH5=W
z|5<Br)PwT0Gnf`ytO=NTfAeLlBIIzgaTu%}M2PcobJiH<L%ZdL8t$=4+wqMM*8TZy
z-b0_}W;WNltg!?OCEhU|_1JLXpYb`Zt*1yC7%h2wZjbe<o?2w|@tq+01e3huk<5*c
zkpgeGe#itSO2C<Wdgk4%Q{3U<4=KT>-;Qa02T_8wVXQU2$F&V%_y(fyuO%@V5!bkf
ziUc7NcPNh>g&G<zo8&;o7<mMsAD*a)k=75ZgTYZ5*7pE*g&wNX723WPKY0NJXa9;S
zhzB?|&)s^MdoO<*DUXSWTx>x;w@*Cle69?c?F+La4ra9;LDD-y%X@SG2Dvk>6ZsC$
z!E6^=%M-Xq`<&KVerOOC@SOG10jWe+!?SEANhF6vE(k=m;XOu9um6Cxb$Fc~%Q?he
z$f~eekK@t9@HzF;!IBeXI9#sVwg;0hrtT!Nm4t$m&F!Cqt_Il>bKZgz6hPkNO_;$8
zbC3#e$j3#ztZAU#twUJ6?u%H?f^p9yD_dA1%4;f~`V}V@D4*N2F8jp1wRvNTJhJgs
zYqL?UR9}LVoURvkpzZG&>xRGTCYhc~^^M=28_9~97w!J-K|RC3p*BHj1y&S3wN%nW
z;)clka9cu$79zZC>#uLw9)2hu5Io7yf729$;zG^?#}t}Nvic^|lov#LBU&iKVWDul
zd7qZ`GD=B=9v4Xzgky>=8RHf@oAqdXi->}A-b4X}h&h2B!Q`t5CxPU6i?@`<e;rA~
z$(~v=W`XPGXzY+g$)i<J`DR5Nj<b=42O7N!6Ljl1Dq>T%U~)e@?w#b6cosNZH_L?x
zbf#tV?)Y`I9EWZ>5&o07T*twCS$$V*8Rg+(>}@+lv|G*}@?_lz=;8ew*JDDoAD;{-
zJQMH!MfJNPMBr+at=c)Tn`xm0FSTJWBq<5&qR8py)1J(owWqYd_jNFcuzyqXX4ZGX
zT@>am&)RHP9?kMC&#vs40%)M<n|bYD=$7>fORB*B_V+Pp+YS&Yd_AFs5W3;hl8<05
z)5JTv#mUtM-3CX%9&MVFAQ}a-y-km}>2W;5$!WUD&N$Dys4=<09n)g{acfU7Iy~6A
z@qcYUlzMOq6r>;3?D39TC@S98NO;t-W{+p`%%;A18}z4A_wie`8Y)?#>zbB&_oCrU
z{0Eb(CYUOp#0)@f<Det*j_>pqqsz^kxzlxXJozVITSVg0WX`pECjQ$$g&xx7U2FD-
z3MCvY?eTcUn#`m|x$1XBNCo>54mrU?g^7MOJvB2umo>6D#<=Q>BT~Zc$1h>hw<uu~
zl_ZTipON=?B|MFS^e$nhlrRYgU0K!QW0O!o`Y4B_-4!+I=n}=#+T=7xi$;lflzkS&
zq00S`yk=+59xc7OdOUp*ApLkADInh7{<Ts+9gp(aeO<ic5vmi@xkpeQbU8?oWVtVI
zUrBYF?p?gc+jLukRBaB2ZcPcDdhr*JSeYI*q~-(h&g}6!gUNoR{h5X0B3XoIXCAq6
zQ-?E{>^@Cev>21Q2Wtw<IN(8x$LdH3qFWKtZ)+rJ#@U7SUq$;bv`*#N-PY!NE@)#)
z`=&4OoxJZ<iLT=r8DYGP!E8UtLXKYR@m@HINiqI#m=zFhZ^|1T_cAXGCx-TAgb%gj
z@wyOETlLJ4<%{#wtyJj6o{Sgk_Z)cdl6NBDbA#5qRr_@8$J3|e)UipXL0LyWmLu`q
zIc6>MB|_^mZHD)BS0Jdv{;MzDU~*l`XkJdSN=*FLG@WFBlI)=ytcn$FFWq21td6G}
z?6$;Xbc6BGCz4%*x}b&V276_3n4}$`6wK%bi%5c`q8sdGV{1Lw?eQG3>QgtEluxUc
z?!J4f^+_jMmEqu8y8&_xYgy%?MEb5DQKFS{afrvT%)QgQv9e2qjHTQ=HQLTZHS{)D
z_}-~#I~$KxCRTbUvV~^A+Jj5A&Es@~U?)i9Nw$(m9A(h&aV%{sgVV~QPl7s>ageny
z>|k918ooBfitecUsD0=>8ymd9xh%mOh**m#ScL1*tsPF8rho8LqCuuMs()k;6=<P#
zURZCzKcuhhTz2y4D@*sR>!GfUgYF=z|Lf6KHc+&cao?Ht`0{^z$MWKWs<M6GLRFd0
zS8rWqN9%olv|JjvtoY<0MAp51>3#l!vEv)`K98k$SS83*u&eSm=4=oy#p%`@EbL`r
zTdBB-)`z1ND2ou-8*qF*Xri$7K3_hzr{3r9$cnZpImL&c%$>f}9(teC@tFI~dY_Z<
z64v{?^IPhDzLUJ#**+DtuWYk6Z68CnrMQ8)@OfCz??U(EQF@<qP(6*F7Oe;JZAR2?
zz0V;Pk)rqcaa?-oeSY+2=f>eZ^*-B*)tb4bG}HBHL;qG>JzFibs_B(v7fMiMKJ^4z
zSfaZcipiOX!ru%lOJKSUKeg@uY{NTk*gzIUWPXff<)5zzIwrS%ms2({lR^s7zP%#o
zjeeoybJqR)8RPp>1U-_erl%t4UEin(y4*z9ry}TZNUaF^Vx&@fD1zR|&_v}^h@%ui
zpZ|YN5p*H_3VQxC6+wSTs@r<%B|SLkRR_~G`f0heTh@3ss>se};qnhCg4WHaW1_^W
zW9e1|eSTMmD1rur6+weX<pj>>0XCFH|No!}`pUJ8m&a8Ejl5;T6E$qcg?K#`L8p$Q
z9sHLRLEk{M!Q?i##M74|=u5PFb5HkU6hXg0BZ1?RMbBbn`yW*V{e9t12XZ#(3(m4c
zFX*9e>?9Udw4mcCg3cqTUVb)DMaTTNQUrZXoIQMe8%59?j1n<kn$(J*4`w6Qczi|B
zHO9A)@%W0Me|lG#&=h*348};*w^*-D)4epL2->JLmZg7K6ZBIf5TIK(T5EznlZ7%9
zjxW|z-xY)Ud8qWwilJ-HF^lMLQVcyE#lwqz6Zsob485M~JRih$G}fI{!JU!dHZjJx
zFO>-o)zIz2o&<5XGgk-K8AZ@2haOyao#=*^4U`0MwaW~NZfLPbHMDJyYUqh#U&6x%
z0?S<uCkaF~^a%n{4Lv|0s-gP{L^ZVByAl;zh0@NuRYPC94^C4bs-f@rT*}NE;qR-4
zuEML`{M%QN3N+BFq4fv~lT53ImJ2{UcrJ|~yS)ZOZ`IIOXb)OPS$6xZP&BB9)&nQ~
zN-HK4t(c<E`FN_KQ%t~bPz`+$W(P4i+dnW!RQuZoakRf72t<!*-)F2M+FL+`YJIAP
zHl-2gx$VEeqcvn<cnNkNA`DtJ^z{dO-luZIk3^7HG;L?F9!P{20>ca~jn<n4Fq;7{
zt4p4p!H4XRr-_n#IoCMMZVxhKh<DBxmavth5%;J0zeUgvbRr;Pu$@Kcr)!C{59QFZ
zugo~=YKS=p=KN9X<_YP}&@b=w*#8kb+c0ZdID_rCuv3C%er@LTD$=U0JW4mT539cR
ze{zB6HrOQckdCbzdZ2zsC!`x1E_KI=*2{=_*n8^tKuOtac7SrhnF4kUw_Y&z)&t#M
z&juB`N%2J4(=qy?gV8INNch+E!+zFBtMHGi9vMOscu~{2YsMIn9PAi`AqtfmZY;<w
zhfjEt2Q+yd+bdUWj9wpeZW-P;aWLnGMGj3CWhQ+0`_SY{_Rn0rS_IBUQnVJamlVxK
z)WYW!X<AIspIJZs-Gy9K^^b*Pegc=z<2c0_viUQ5Y)AZNdR4F^dNa)jj>1yezw3~V
z!{KGKQGW2!FrBu6LMOZUaM1hKA0>Ckv|PEHd|s28@Q0hoXSsfWc*0ZQ=vvaZ34`SG
z4aw)%yfi19+8nZ*67-#0KmBZ--Elp#JFJiFPI)1iyi*tu5{0)uK9W0Z<oK%v;T$LS
zm19V2-_z6g=#s7X2tc{4ZQ+0&9PunWBQv3ky?X7b-eQE~6QXq1d*0ndYIW<u>_l>o
z<atygEoOrq)3R_(Ry3$?F(N|I$6YATCAw0JIhp#a90G6w{0>qLx9s$HwG=`9iYf8R
zpWbwFe{0-LA|Rm6Lz#-FB--ys*QV$v&|f(D%V74Dc=OcsR}E~2d8O{cK>WM-9g-MK
ze*Z*v|Lm2+XCO?@S;DIIn)a;aICO~zl8>Wrt4fK9CXp*TV}DCL!uROwTs_OEPJB0K
z$_GtXh{~>j<b&f8Hin`C6Puznl!61Frs#i1&YIzSOnorR)fB)rulUdff#DqDaQ)(A
z-8aZ9OyW*&v|?qzYq75SXRtpw!^zWm{|;7vJ;a%2itLn#wZ$lo$wS1sgxr#Wxa_9I
z4t+VLBQiL{CekbQGEslvN8R#;5a_uROw`=c(dO-#QDw{)Ts(beC#iZHr|@RlC-pr3
zHlB=bx+gGki*<KkqW4e-EG?=rDmSphyVd$mUSwNf*VeXZt_*860v)1Hg@I#_6#OB=
zw~wUTWoN$YTJuB75!}@-C-YktfHz&xVx`?6!-rh5VEm}{7QafWD+q;9Mr(carC@G&
zf2~N48^Ua@9lA4129UI!S^Z<{3*+e)%?or49j|QtTQp>5W?-Dxmt5`Jt?-(fcXBJ#
z!NB=lrWZCL*{Br$n|R&~y_NOIYME5gl5o^TJeo_EIXBk)JtvG=BuqF(Gq?NThI1;%
z&63yTFw9)-lOwx`QD{MG=S-4AvS)me_5Fjk8p>;vt*m+72e-TDGTm?QC_&vomR$6+
z4ooq({5<v74_2-<4-o^G$}{x4?5LZ(_5wM2A1IfR67&(LoCp4b^}h8UF_~L-)&bDE
zm0c>J<XT|(HlDC9>m*0@I|{E9ekCzM^PvA!>p?;^T{#*yS|%7bv$@MBOQ{~A+sSp1
zQv-Nz{dPstfO#RZOL5m;d&>#kJ#3H0Twj_BEBr!+{v0lQ$V91cKIb*%WSDDytnEd*
zhxH35P3x2O<U6Q-Why16{D_FW;rk`$s&@sGUxa&K-*ug9%`k0$Oxf@GK4t%qb76f5
zO#!Y0H#xhPM#joEoU_}+T>rk#3<Kc=ZRBQhc)VJS6jybMw{e+U>()!lEtc2c(7+z}
zi#(Z)qy)FyTC6Dgo`@iDwy{_wPYSt%1)W=EPPSwSc*EzWB@d_Isrm}Z&cMrDak4Lp
zMNry~6UXn@+69`tM_k^mTHhe!KsGFPxsk<`1B=}UL!Q`W0v2tH=KMB=wN7HsGhEb8
zPWd44B_ck7H)(1-GyIp?(h%s*%Bloy{}L=OFbefiMpf39=~##`&a^aXY8JhY^HcGZ
z*=982mrY$9;SHR5`_*ztz%#YC?eb=xc?%|g6&KqBAJVZz-&MzDoUk~#)H`*6|MOsT
zSchfdbwVGy1%n$`P@25`t*2{sRnQrleZ#!tKazdM8aPs-3XN?jBQCNI&3<dj2j0d>
z6ndGr@ysD4NIIeC-=e?x9?c}^%au5?t=~ULjE&Jzr4;k(-%5X8zTCQlXVG!3w%(i-
zqJf^r!|lFX28;HeLu^q@rUxYHlbgIw>y+g>(jSnLq(YBRg%0br@u1(WHPTrQ<LNrv
z)6b2ktHl`jQ2Nx(-ax<n@$Y*BM{@UlEf0ZK=NBUy+w9AEQb?aKIxA7|v)jsifb9ZT
z=KMqCCi8hy(-*rMeu)pzcu-jX^i`pbsPyzRo1Gagsf<4&(o=^HFz;}Rvi4@Fx~WU(
zimN3+@ga_CKUda3PUED6WqDI8K3BdG%xIqzl>;TDA`{vu3#Z^t?dZ1{bVJIOf@tn)
zb=AwN6h^^qaE3jbs3~RrNXktquJ5QJC)W$h*yN<0%0&vU<a3qZII)AXagKJrBE*{D
z@`ytRn$C~N+~vC2M{nb)zV1}=GMioXvQIJXhG8t-B!Dt!>6yiQ^BTvrK)x0y(Nfj@
zNilmWx43<NA>J*&2?n3ki^`_>e!RB$9-BdFb>wiKxYyv$RW!Nb-ZZ$M6*ohghJO~z
zD7g$Smgh5;pXQBxg$(Dqa$XK5{{n^{eg?2awtj}pkQq*;TR%O)5R+Htc3Yb;kR`M<
z+|5MNtzu8A+HGBO5nB}T_Cw>X{SG{Z&IW9`mMjqf(RUHup1>Du5iASOlC@O1vFvGB
z5jny?lBSd_c5b8=vKVmn4d#<~if9vsjMmaFecfed3}NID?dr^3ECK`jJe#>?3a_%6
z+tSG0pp3Q8F^@fqQ6m<3Z%R<!k3Qdl<Y3b$W|&~B<SW1~LSBxymSQWLEg!PUZ=xkl
z)-nIKl~jVs-T}0kr(^@rG@lmN!YN`fc@CCdJ=plqu+D`>_QTavKm)k+Iqt~|o;<j+
zeT%ANIkm_7Gw~ynz^l)>nFlxs$#LcH!usSlnR3WVy!UpKlN*M0ykUKjk8MV@KhD|<
zW_0~{(OD|*=j^d=)mgoZqf)IywndiNzsA%tZ~5gAipcSF%g3gWMprWy4}K=q#Qw1Y
zuZQ+~haq2h04)Jt7FYhUR#`Y9>v~WvDKrqDven^0L$eWxTwXifW1Sg}{1EM()q()M
z*39Gil%^5OuamJtKWUk3KWT|Tz;oxV%XVaN0<h5GjA-_(`YV*-iIpc?J^Q}o#$6WD
zO$&h7`s4;4R~&q)0wa{qEf6g|-t+469L_q{n$Mx(L}jePtTG%OX}#=MYx{_f6nr_H
zH+Ce3+{pws8FeT=^T%l2U_5|$==EXEV^y<4Sr(a)3U$hyC9>8`OD9?v<b{T0>(vVp
zI+6*hBQ_9ySrzngKyleRg!)Ovn3T{VBa<(pU+f31jCC}XIVoJ9KDcc)8j`w*#y;`8
zFvYz|YoW-XpB&r<o7Z|>yN;Gr+NJ~#ZgcpCG+ysKxGmAuuntST4SnkfyU@ltDS;U&
zxYf6PRNoTOI3wjZatYf%$+~iaRDUx!JoftrShI|&5EE~;@3Ag@T#qQUaP%j427`xY
zu)SlorghT<#(M*E631Vi$dz<nM~)247{iTDblI-?;D#aDfu{-o{9h<eSI7MNXWe9>
z9j;rDSH4hVcI1ffB#{F}2&gH!b{Xp*6tuvC&`Me&<F|Fhuu+S<l!AH?i8@ibqZWx;
z@sVU#lo-7)Es1?L1Dv~KxK@)ULOMiB(pa($vM$oeXMXKk^CZ3zKhP`RELnUQQCh95
zS1(Q4`&H;MLu6`$twhc66T4ZjFcciGgVFhy)4+I*Q4dL5Sm0!Nn!FKK@O<7*iG<kJ
zPp_6S&~6JutaC32w}t0&CDXR_pVnQI&~g=LkX+>0k;(?_)BYl2zq?HMDthr2NU+#9
zdqp`+ytP@^WWp=PCP-_PR?solNHW+`Dsx3}ike|)YGS2N=3jF?md!e=UaO@EwK;oi
zPSb1oXMA~9+C5B85t2fa*THJW3XT)9>M3TTmzVFg0@oI6BUQ(=fy&Tb9VsT|?n%L#
z$x*E+AT}c$auOtqhH=V7aWIsin1??snDvT~s$D-;#_DIbkTQ3Y8UKUHKZ+$6jnN-|
zS4zIaYxLtVJ-?|f(4Z181o8C?CO<B#D(OnWv8j+QIQBICH{FntRLw7I9;v&%ya^r1
z&$3QBU4+A78E|c0yFdhSDYT+&m$Z<J9fo_8<9mg%UDB-9-Yyc`X3iOvHOp@T^@<Ma
z?h81rrT6s_r4~@LQtW`?97<}N8CsR~wXd&G@#6GWpH4c|t{zUBBw>nZA!h5>J>0`i
z^-t6hExRhS60GmbkGD9Vys?r`?z)z$2n>GKit9m;V=BOuFQd<>0tsU-k!E`e#5<~f
zr1Vm8Q|a;{hfvH%mxdMJlxJ3DL@U+ox@~KKf4%FuekGcrrmz96u3wpsMmKLUvbK8b
z%s%|HS~L8hA4+!6Mn6=nwe`b3>al)hq0*N-u4X|P%2k+lR%1yYwx}eue0F3<*DWnx
zS)=-j$#6jW^>8}6$YwkLE(@JdCZy8-_3KH2+s}{zQK|cExXFe)ZP;eRPi)w4vhhFM
zh8Z@TYr`@duCU=PHvF9pci3>h4J{jX*)Va6iGQ>Wcb{#{TWt7%4cFUnh3#*x4R5pI
zZ*924hOgMrvf*JHrlgzr&$8hKHoU@y%WQbF4ezkwHXFWR!?$eMWy5}Fns^7>&~3xh
zY<QLpy*9kWh9x$vwBZdlyv>FiZ1|83ciQj;8@_GBPiz=<mdVF(8;-GIx(%~zINOF5
zHoVD(ciQkF8}7E@pKSPv4dd<l7;3}QY?xs~uMID=VWkaku;G3ihT7&_yME5KVWAB}
z?#F}cM~iYwrS@N9;QD6_?E1NZy~8yhGWOLc_wC->znE8!`<iuzETvhP^KC%HdBZ?M
z=e9WxoqpY11B+F$V(3)!)Lb=FO;8!&@(Y>IP-m$;m18Wm{Y5HQ%}^JsY;EgRUUiOI
z!oPEfM`AL+5@r6KuH59o{BvtNu~}~all<kYN!osrwv*5W*vZdhL&39EDLE}AovZlE
z@x1-JNL8t8`>?+l-#*+zzUSbl8k^oRc$8l);;Y3?eiwjOkdx3)%$0-+{XE1{qssAP
ze)*~hbFo@%n`h$pDs24PzGpl|#M5nS%A=IYzk;5UU#@xUd`j6RU!nXMSczHElUPkY
zj9I8*(iMM_j>J<$e139LVu!$z-%OqRZo9eUTzu8`@;9G+l<1Nl?J^hNr9FJ-L*vRG
zVdvm}v{~{IN>|a!Bt4}}{9=~)q#P2D<XghC9`T;DWXU<T;RaR0?{s%QKer&u`QeLj
z`IAaYCK*Ek&BkMzj>;}AE?sg}X}F<WRCVo9=8KDcRpLCSwAvSP@c0+`Ysu^d{t6xW
z1^!B1@t*3Ma;fk9qMG7xJ(pfp<1eZSSMUWzmD)(UinJ8*OWcY$B|g4N!Y^0ECGn`4
zrB^A!s5wPGe@zJv{ASja+Zc3N?60W}o1j-|No8pdi@APd%CD-_zUKICSmcv<B)o)C
z_*3{%xJwes5fK>`-7m)3KQ=BtVSp<!Y2cv2$tRqcGGyqm;Ui8O=^i!u<S}DU8JBwM
zY2#0yFmY1a8Iz}^pLy2V8B@>6oHqU3?__z-n~|L}^L%ga1sCS!UvzQ7tl4ws!scCY
z>1E$tc=;7q78YGqTvA%LXmR=XuC7>8Syg>aO|8#=?b2n-ue*N5${TJ}GpcHGmX-So
zYO0D$rFNIlmWrwS8d^cAnn+8k(0xmKP$ey=93Q2O7}Do!v_H2lM}m@dm$aWe`pz8w
z_4E^RmG+cNA3Ogzt}?D%OxyElUwy?eoAEDAP2r!!Ie~aQ<jRaAGM>2ks`x7-h~zV0
zr<eyOr7F>OWjg0ewBN;)s1~e<zY;>mGZ}AWY?OXjPN^4Rs?`0rT#s!%;}Z9B(k#cl
zg1^_<{-pQB>fUAI7k?$V7i)Lvv67~n)MQ+7<5J1r<>XOP6}M{sNsJ~$IWCpdha1XB
zDNU?Pu$7V0t$kii{!QL}^lB-+)M70$R%ky}sth}cPwF&OG8vz`=`=ypX$fh|m?~qA
zTct816l1DUr(!B2zDmqeX33M-NJ|iUN{No8RHe?Nv>-DFNcp6N^$eM<^CY9G<ZGg?
zU1?9D`koxF?@Gc-iA(V()LKMY-K0=WSecO|Rug*#(3DneC0^sQ1fQYYcehMQtvkIl
z!s+$hz9hDz>s`_a(R~K_o{L%PN9w@17)lGxB%c%iDeWUvo)F#A!sQ6%DMY`%N>CD}
zyP-yi9+O#zg!-G*ev$4ard-n7`ije~+n}`LP@cN!J6W9_jxUs-Z&#m7NvrP^`>s<%
zhslf@q5OaQ^rUA=pZ(9IcV;-fYTBr21J@E)4ROk<qXMcO+mk|lvzua}{HKTG`}X<2
zlAOz0X&LGI=)*#xkV#r(s200Z3)S}-YHB#WzUsS*T9x`TBcb%~Dm_}rs9DMwDWg`Y
zjv>^JLeP}wj9%?YawRd!_+Z8y8Na0M^fd>B;_7ZsXY^=KlHX(FTLRT(6ckD<*7Z@O
z$2K!YTz%YhLizpAw4b9>k~N;tyeGB0>D}E=rB-Cr@G<Vnc)OS|GF!;XIYe_af(xaN
zjx7{lT95ks_U%PtH*Hkfjm+~h;~$-Zp+{Pe`uq0r%gS8V_Mw<-d&S*dpJ}Rlyf35P
zsx<9nl##iz8nfUs3&`vyGo_)J%syszFkz%M9!(?JgUPQj(d@V6gi`-(Gwe?N+u$<p
zW>v!;$To90rGK3Rj5`;i^l!aw9%!4hZ1W)7+?HVcBZZ`Y)wX$vZFbw{p|*Kryz!63
znf_(j=Ha%vGtRi5WSj4|%_D7dTdZ+++vaN9JjyoLIgLA~1o~HKn?noeEZcmY?e4bC
zhix-Q7JA<b*IfU)VvIRo_kCFp$e2*3>*x~fq@K*EH$#o*pPLy{daCqDv!cuclbxEh
z5|fKqdrc_`Ow|8)XN|g+*cWM^vgVN4$iyJ=U9DTdQvRN+^VK_*9KxA(>nLK6WpCRv
zwsVNj{8EWQMvMyjp!`xR{S_6U{p7zxaYz~2PxXsPjLON$iI(4)X~ZQS-5CW7Vw~#i
zw6ysJuwUJ7-Nc-QiwpTFwXAv>KPNtTNyg~}IQb{WfBm3<`<Q>JjDzOiv2MrOc&V9h
z`q!Y2{dctgRjT`+Lw&n{J!4p{y8lJM^Z7RaLgC&2Y6HjAzs!LD!!5wED*VrARsZ{c
zLp3OHwWIrAgyY-&3xz+nMgOBVf3F8fN`v_qN>NPRc%rRG{_mIA_~`Bb+m*K4SEB01
z4d!5U?f%uRT3z3;=BDqjZCn?)x#{12u>Oa)+<M!Oe*BZ$e|pEy?!4>gzu550yYIR8
zSNHw;{@*<C@4tQUcfa5G9}oTE;YS{QY}4i~kN@$BC!cEGx^4T8r+4mZdFI*Yc0a#o
zZ|lAnUVQ20S6<!!+Usxp>CHbMX#2}se|`I%cmHO!zt{2p2Ooaa`SB;8e)jpnLtS5d
z`PE@mas8JWG{<Mad@Bac|91KRx6}VG)Bo==$d2!>8D#(4<&Wn471@LEZv<wM$qM~`
z+{@gAx#wEq-+GyU(968Oml-+hqr%_P%Y17uvpmDwGd+2#x2IX8IAl%T%qK_d=a+_f
zjq}SZORAR6@fG>X;fG>BueP-2;;X(_TI|cMEUT(nq8;WFMt->G71jDY#lG@uOAD&1
z{ncT6V`rjM`EW6d7L}e?wakQ^2mddJwdNFd6cgbtqC&<5wEy<2tGlUgRUHeu$eZeJ
zT3t6dI+_*Tnl)=6d|FyvLET#ARH@@K3g*|bUSm;LP_UMu?$o-qb%atZ>lQCw>~zK~
ztFB&JU46`YPEKYn;*;~6G5DXUcQR%r+>?hY`x)Wl73o#6oL`8mtVhSPb`I@A2w&tY
zs&JRq)Kt~D%PZX#MgGd-#icdpxX0FNPc^Ke<u|jayrQ(k?W=NERhL$}OP7@v`+Y@M
zRcHn}?(-_eAns+<gS)8GT~v+762b^q9U@QE@pSvEDJ?2-m(^4)A%uzM<WX`q<e_9<
zXuJT3>INMOo_*C-<S$%}?rZ#|HOtE@7rD!H#*T5XE%o_&IICJ;3B@b%S67r5>xK{t
zXvdFxmEU)K54c05<Gb6@P%p=Fvx=d-a36#hA-hf4AqYQ1IK+mt9NLMFqjoB=9cR~+
z;O5s&|3#%f$Y1Vr7gv>(x~t0E)gfNH_?$?*%lJaSNz{KWDNdpuC6!6I$*w%~%UM=U
z2Qf8kYL0l9EGeQ6sXd_}WE(e;`W`1(?c&m_im<FGuPmjFRD`mpj)`aK;&NYUZFNy`
zsk^AmS6bs9H_2aHGwG`G%1Nb_*NzJX?rsk{_3m~hso}A_rmAvDX{9gZzdN1MnkD6x
zR3*8g>S%luuJKp-O5L=P9?kQ3nVxn`-?);Uz3|h{Rr+w%CeYj-$(Z<;mirb<Q>pb8
z)#%j!kz{-HBVAsbp2%7Ct_Mh_%V+v!PrB=z_4Hp-s+&SjKW=}m5N6)onG?*3Z%_X^
z<#8vEa~IjAkXF<)G$|bGf7CcgTTxN9R3etpy_$m|*fHUbuF+np^pQ?c%_6^4c&$6N
z^jb!m@-lbnl4{@bQ~!Q?SJBk$L8yp~($7o7jaeG3dr9e%D*H%pwB6H2>k(1<nOhxe
z2mfnM_MAY}2M--6S(|;=m!C#mdDZIG4vISCoP{#K)GoY)M!0+-=Up<<)Gn+oUs7FB
zdSz%FU070H>s#nMD}7>hi5W-@nU4Ec;!YamRD(+5)u8k^HE6c0HK94KI+bb^Uehg1
z*pKj~cbO=*fbZ#HP8u4ehE6`AI=OIgnuL+~HpA5Ut1x!#Fpk&=6+5|K+K>qeXO7(A
zQp0=$)QKetq!+JTQ(|lSwMDf?z<k(o4RaR39I;U<HXZIpO}}bKoI}M?635_JH8|a+
z22W1x9MBfu8r$rwjw$R{kTfJ#4cQT=hWLOb{nZfkeGHkM+#1TuCU_pANNK2@m!#p*
zYWR66%_hgNJM26!J58yx#&?&~F(O`#@WrVSC9!J6-2Q3=@s5~0r0vAk<mMz-lyarV
zDA!~|Cn>W`H&uKWh02@~t5Tq8%G@}WLRnH~4{jaUoLHSSxStwa;-oAwQWi~T37<S!
zsWE)v@cklGzu6JrSU#zrQ>U;t;ahB{y9fNQJ<Nud{e=G2edT-7nWzKg3#Hp%)4soo
zo!u{-x2Us}x`(fxGz2=(X%_EDQVw^#a+f42_uNF~P9LD$HN!iHwxzV5&^)->F+5%k
zFL9~ia|fv5)bsG!DV-;@*)(wVQ!eVt1x;PEyJ<LjI<o$-y?$wzWynP6Ua|w)Z&xE6
zPpSdU@zrs5J85Hm<KV5RD7%$AVj@(G<7c}42|e|f*iZ3vuu4n^PL6MO^p8;eCr76Z
zNsCh>)9+Iw9e1juTa#&ntt?Q7OzN*r@;#zXDtTC)l>P^Gl4GMvw9~F8?Ica77){qu
z8>*S5)H8g44CQ~MleF2J)^xX5Y2z8>@9(wS{qvM+xTHI-Bxw(mBf@=b#$`%f%J-_B
zmdTH)XUUJWjaY<a2lIVm`#BZ7fN$UzIPyyx6h$A5QG+JCbX`lBjZ8*w@`b{D1b)ip
z-C-O9qtw9k1U2xMxB`crCx`A2)G7TTX?U!uciO}7n(jIe(dZY2N<CPl)C4;ZLng$j
zVI{NFu(<_lSo+0knBxLvT8XKPEHdR79;b%;QfNyj(w0t8!yN-va@(NRq-NZt|NH3o
z^r<0pW9a|=)R4)^%?{oF=y&wp6xvzJ<Zo_!mETk9Exu6O)Ai$vCtk)D`Y&Tjr=%F7
z?P&;bRPxQT%keRnw!V*<=cV+|k?d5-KE9F|l}w(JCnq&K2Gj4Q?~~8L*h&AlX;_eS
ztpC;!%@$QE^(($RLvas_WeiP(Zj7bSdDtzwYz2;9{Yo;T`v^>Z$B9nH-2Upsxj^dt
z#L0uIwY&Hk-d_#BoAR|KwYr)Us^bge(qd`rNs<m@*f8dWVUthnG&DDDMfz9W4N5)4
zcjK256Y=Qu85b#=v;{{Bbf>&2ls5%C>Y!SellY)Vo0(~13q$36Frd@{zHoe+UIU<4
z0`!VkgKvRelE&Ov(qQ~x>@f9D9WhQ1p|0)mzd0$XpGu<Mk|xV+)}6-5KW8t-w<SbN
zod$CYVF#yEH?!?DsCO6PyVFP@4cY_axo!_Nv@tyfIQ1CNU&f;Iy62Pc|C%)T+DJ#B
zV@#|XlRiX^`DAEkO4|vogPR9dClw|Zn0{;Kx)2?n|GiS3d=WNXhm3NnfpcB-y8&uo
zjUELH!*iw7kv*plV@@3gooElHZ`MSlNj)*|=8W_Wq%M=F`$RQp#(-O5JDqL)TBDjn
z^R72se@T=(QMq1-tJd?i-Of%V?Lkup)btLQ77phk+yLczD6YF*4Tw+!CdY~wJs$Ul
zy=nHrPNhEPlROJdIx&_u%UXf)=ET{9IzufcM5i?^N)393TiQ0AOrPzs4w!6OY{>sX
z{QmJ-rOHEeJ&F0}mbkY5tuf8f)lr3!1rcdNSE0p_v*Og)^lKu=I?5vZnj_r9$e;At
z<Fw^xURCNVzEE2}UVHr6e%d@=s6Cpwsf4-dvOedg7RJMGO!pn7zUB+1Yx+xfpEUCh
z{lv$3$=GC%mu(>$-DmO80N?FL(R2WQY5%mXAvN7JmHFc7cBS6u`-APj0z9EZsTXat
zBbl*}_LTh4fa-+8_yRpHV`e?nIj}9U)wJf=g5#{WI%U1(h>lRv>6~N?lztFPKLAcP
zAszi4s{d8A8R>tkfqD$G`)&<w`1A-h)X`|xmNKtvbAN~KKTgc!W7JSzx?^bi6vt3U
znj^HnsP0c(@%>ahV?g|Dv(|Ksj8`LlNor(CBI}0%YGn8PX3E7F)MLJBll9(^vlG-Q
zzQgL2lCRV$>0hc-9G|K1tjHKE`B={}o6i4vj29E7^_ySX6u}*8nJtShw$<3(9?|W`
z`0W1sFZp&un}5l-8#?@7k#8UA=qbk8<bYo~!|;Xj*h$Y<<D=%33S+OJ$hUaDx&c#9
zE-TzR!+BNrs~Ir*e5JNPC`{CyIxc@r4V(Osn5Z*)eo?t^W>w7`m<tu9cGxBOtSqe|
z^o**?+Nz4u8NQl|9GC*g@SdPNwYBAoD(x8NR&^(-N*u%lyVvI3lIFXTrW9xfJhM=u
zYG?$u`Bf$Uiqe^|ATKIfLc!FpBWDS3u?Nq%JL>Yte1C<n{JiD9(z#Xh%S%dUEH0{1
zKeEdh_UBRRYKeP}ufz){O}Lv*F$>2zM_8@!HHBh5ie>!OsP|R2&7&-}gU(hnDynKj
zrVDdsUzC$KW%9(53RbrPCG?*STjN??ggG$t=BpgX9A6Fpb1BU^+6Pq!<4sC8$D23b
zQ;@5JzZ&5!EvlYbQ%e3`)VN33Ch8NFQwjTNMoqa7W@*J77#qS;SDBG{rA6149%El^
z%34F+&0StCsodPFy?E4~s1PTuoBnS_&8u9j=~I%ktQbLUQlTP9n)yrUb6n?$$lTiO
z(yRQ77M0c%)RfjrlQ<=6wy)xn@*1DNsA66vT&fbKMv7ftRn^u0>X|UMB>{>iET9x|
znNd`YbhflEU+FTR8Y^}tXwEX#5s_O70g5Whuj^f8Pi4uR>hj7NResX_5NZkkt)Qx0
zsHUD1+4LUfH#B9B?jK4$AT+xK29l=i%i53WDTs7v>J>-}RF#5zW-v3ID<Lk<$rn7H
z@?S#EN_2bXd_rC3m|0OPQ5IDo5&m5<k)$zQDkfdcbwbr1t?)UWlIe?c7Yj!|7pg4~
z|E4LZJV{l0jHjdoLf0yFlGvDDV_GQnogO`(#-f{`S|Mo|7egTRrKBP~Oj?Kfo`mO^
zhKj0|BF<MYK(UHadU>w~*Bmvcq7)hXNs)Oo@{6iz(X=p9+a5WaoJxdB`6M+#L*!SB
z98%PrZq~60S36(*Me@;?gBsFZCW%W%0{XB!I@HDIR)zb$`i&VM3QBAAX+&i)?T2<i
z&EFxh%q=gz+AjC59@Mo59mrd!%fGyqYYB79NvBp*22B0H9!JDtzVbxoRTY)wm0wlE
zH3Ulix^5%0OHIXW&~e+tA}!*f9%d>B%3Mw@`fC?UWas(I%4ljz-6quPF)EcHufL?a
zsHQYb+fwn-gGQGW)szcUb-pSxE+rS2NtEogr5tv#WE@fIPo|~QU${4IT7*5qk^STR
z>Z*;LSI9YJKI+syG30uDC~IFc!yeyHPZ#ko-@ktUqQJi>@SmqZsLxHl`@n>sj#ujW
z%iS-Oy(G#H%un1;;0yIPIlmX2t)EKai{?w<>&M3yk27&|uFqCbpYMxZJYOuIxW(~>
z+$3HJE6~L!@ybvkc1e7&+4Lv&qxi%g*1GoRvCT7VGef8jGuyVGV?!CaB>qeJByAR5
zI-Vs!Hy^{Eez1Whi_X84L;TnANuF2Pa5YfMQqL#u4SbTHAM%~b2MbJ_e+iWQ-peQH
z!K%{sj{&7jd-%ltRX%Y~fha;B`GhY2++X5xe<oe`aex2ZeEm<weth98lY`?6|NKwo
z@SmT~ahrfWOCPrhxc~Wi`(H@m|9F!q$T90LM?{n!KJI0JE?m8Q^(dQ^_Z=|EFMnm=
zs$aAn7A)(AIt}l~|JHk6zsGHykNLamh_TAD;UnMDzsL6fDE{}}{r25M)jM}vcXL?Q
z>lcpyhF|IsvzSn3y?({(Zgu7B-+O&>FW-#EFYf=doB^D1g9(Ysq2P=jzP$FmgKQgS
z*>IW-Gi;b{!!#SF+R$yo6dO8i*wxR_`F$I<+3-&`+;78|Y}jhU-8O8o;SL)%+whMz
z++@RtZMe~f_uKGx8{TZg1{;RrUtyblHmtB=p$!+<&}+jC8>ZRtbQ`*D=(J&1v?+Ig
zCVWQ^I(ORkmJQo%xZj4YHf*tBvkf=eaDxrk+i;l;3vF0n!wegy*)Y|HZX2f9Fwuri
z8!8)iMVb6}+R(CLn+^Bdu*HTOZMeaP>unf{zs@#S+py4vUK?iE&}~Df4G%|}e0*lZ
zHXClT;RYM_q;U^&|F@$J7nuAUFXI1gccH^K(V}y9-}x^bY}a>+fz?9|TyK}RAm5l7
zHuM^|<OE|5(LwCxS0{_Vf8wuq*?OCMC*9k<xA`CS|Br_MXUE?=KfTSp)Bl(G|0V_g
z-aV3tUcX5D7b<PnK+|6>8;1J(Rdzp4J!tgs{CB~LBrIQOylJz?on^%)AOBT&qy2l^
zj(3F}?>`EqzeqlN_Z!)3%1_ow@>3T^%NF;)@5ip8Ms^OIvm)A{-sS6@;7}IuVm7=B
zPj#pQ;136JR}(+C0ap%I>U8irU<Y3t{@({CCUZ`Xy})x%#0;JV%o_qv8(d(^aQ5ur
z0$<=0|D8Y=GL(rY6BhUZ-(c`g;Ea<9KhB{_fS>afVBZBib0oZH@C@K`KJl{xIKpjk
zH}I@caK?F!GXvPlCus@1X|yR9x}p?%pLAG(Kj9NUw*$Yj?GFPdj4^&T0q;3QsTHJq
zFYqJ2dnG@>q2rJh10N2Y14CgG_*~#ue68SzfkRG1h2>cM052F1&Bs6!;6r>;mWP40
zr<*+ZfTz(QQt@*-uz@cdT;R_qaZa9!&MDvrX~;Ta-w7OWhKWBBxQ%ZGes%!QWf@+F
zpDf^4d{U=}fk&p0XY5rv=Vg3C!wTTLe4W@^z>8qm90o4{?m7#e3;AyWzRoAK`V;V!
z4DyD($V`kqhj;`BMo%Yi;7;I`=TZjn#lSy&N2%X}KMZ__PvWtF^Rs9J)Yk&wwR}RW
zW?&ni_z}qU1dR)v$tQU(1UB&P$NzfZ{d{fU8-f49_qN0X+{$Nx?*RVjJmfUMZwKz>
zI}F|m+>sA&>=gU}hhAjT8V-DvPiV3Un0>LKt-$nI)Div#e#qwq?*!J(CN0V$@bkIw
zt+4L`zH$jqK7*s5Oq4X~vZO6g>NhaBq+WgtjJ(X0D+;)rZxjC40w3fPI&1`%vK8Bp
z{bJzze3CbTi3?3wfio_LF9m(Fflu=Zty+M0UBUhld;{<`KC%B3@Dm%4zmmSsC-w!v
zdcL{f4ZtV(B&}v(RiVMFfx#m7t@z2fN~tUOB<#(=_7dbdz~2W>;#@-Vp8>p@PyEP9
z#<`1?dKf$l_#|H|cr$QDxxur6&)E2G;N0&)Tl@$-!l!8GTohN!`GkfmfGvCyzrcqp
z@PeOaU^a}y#oz*;<C8w}Ht^X>@&>*em{?`XCGa4h^tCQv)-~jZ_yu0UC+)KkxSdbZ
z64{l%@JSip26}2ZlOb#!a1UQ6cq{O7AEMyk)xgXAq(__!fxo-f<bNaZ#g&YK*uMn)
z=my4H@J`?fH=6iUfWP3A@@@cr%vS;a8F0fozSFS>o)s{DGJq%EOuNKS3h-h+$#Vhl
zmwXcTUf{V+hPGM2J8n09;ZER=pVDXXBXGeTCJ#Q~)Sn@5jr}y>HFp~N_<&#V32hGp
zH{E6EDe(HA6F>e}0RO-zd3YH3IiJuCJ$)+i7X}yDw!y?BF!63a`jo%}_n5J<4fx8v
z45irb2k!or8S@23-DlDjIL*cde#Dn2eG}&HR=x$`JAf6x=j<0;;JF)Vx8Pa88a}D(
z4Zt9u<Wv0z_(QZU{HQ-bXFll{1;D2th7Q=b0+Syx<3I}VN*k{RraX#&{0Mw&lTx37
zzYV-@GyLrF&<FVX7U~`RPr%C_r`>~B1Mhv3HViKCmTlx4{5GK4Zsrkzu{(@?Ja7r0
z(76tn_B3V0e-<!iC+z{;4SbnzE%<)mS9~{v9|jKDWy+feyx|$z0QTrqR4?*LoG$_Y
z{4DJp`!?VqK3$JM^*rMb?NHzvKJmX6IDe197XWXU4|)o`dar4#6~Iqy{4?NOnC+>=
zBXG)o!h)v*<6fgI;PJrOd=md$U^}0T5AOpXf7|qhKLTgHW9n!w@a%VK(}c|c2KXfG
z&A_RDGwp2}@Lj%6{8+$+mdU3;M>}O>&2u_1y#tzp3+#HI^#r)U_zz5*5%>_Fj2jOF
zt3HP2_^AeV@X6W<fe&^2r+nZ7%RZxBfiDLBgiq54IPM_wn%JiUeSBgs@If2j2<(4|
zwD1!TT*W8jPXq8NzWvxY1K;A4uyP+o?t!ewk3hN8azAZY;6=8*K)FjHegw*$2k|3N
zWW&W?pvd?OE>L9f1s5oC^MVUZ_`={KZ!hxhVlPl+#swF++{Q(2T;#jOUZBW>3NG+P
z8y7yJ$OMbMK#_Zuya^PUR<Rc-vY&zr6gf`81&WNO-~#v9xX5XKXyerK|2MxVUD8Mu
z2~4Gl4ggjIQ-EuM0R1!mV)Q;`1NITvZURcUR-m}kMe3q~c&h6MNCCzG5x%Yi=%0zl
zp>Ilh`>>~Vs=_|(CGawFw11&^#JKi2_O~C${{G|GYaQ`@#NTop|ND<)Z}nj>eAq7R
zop&>?K)kn20aWL`teLS7nN#j_sQaDW=H}ng{~&6}J@sMS$99`rU&EZ(ZC>^s{)s!}
zzwJZJlqqEPe&j%AsoR{2o0~6-56NNv9{)FS;zV`+`RA+o^XIGb@^a<(`&FHIudCyK
zox1(@+tsgs{cE*(^JdlD+^k-G^;LD`$Pp#mSMjAiW9Sr9y!yfJI_|ygTDp{>9^>BN
zM~Ca;4=-K1Vug74D7gFZ-r(*-IPb#j#DK2zAm*h@#cb_G>9;mx8&ppId=xxfrrnpW
z=ybkM;NVW%ymYU#OTw3x5x@Ly6#u*TmX+-#eQnn9mzD9*K@dMTO8kd$mmhw#e+e(Y
zibI$Wlm6bF+Dsx6{{cx~{|=EpZ#(QIf5cW+Ciy$O_lpCV4vGhz|J8@r?LNHwpu{2O
zBeNIg;^A-w@nequ<1>R#y>s_oiclu>aqfR`)gU1NKZaE0{Cdsgq`cjG@o_WWiT^iu
zoRMKXXmi)|d+#0n+uho)xD)Pu&$M6{!Q-|6y}S3^Gk15_;k|XuVun7!ujf70byz!#
zf9TtOXID@=Yx+wRmT?yUTIu?J<E-P?d6UQ`zP0wRSsT^ik<B-@Mb>?%4&lHaUnIDL
zPdAO@Kyep;J;O;neSJ4#AFNXjzDT|pJ{RA}ptSQuJ~!XrYv<|d>FB>j<LI0@>bmQ$
z(|HTE@%8K1s|Ox<Kt25M!@7;X^2#gfop;^|xASTd57@{Uy793XY3bKjUmtw5>?w8Q
zQy)E5c6F7ykt!;CDj2-+sg5gY30L3v;pbOA3UcGm-{D2jugX?F^Ul0^^PVcpOaFJ^
zl~-SI&BejsBUc7*XdL&{cjsNHZVcY@)Fbo$UwdZ)US*N&{YFI=l|^(2xa1JFK!kvZ
z>?9#!NgxW&9R?L|3>aC25E4KbWmCqLK{Degf(S`mkOTx5L{T<3#H+HYxPpp`D1wTJ
zYu*2^bKY=>0TJi>p6`1e`$?zIyHs~obyanB)qCDUe^1Py|H)>%zx{TJ^HO|`e6{Fk
zt5qf1-0|Tm+QqtxYj6+uQ)`y;2_7YSKFJUrp)_vX*u}-g>HP|=T$e6gTvC$W_nMmO
zdDpLBKi9v1e|Pc47rV<YyUb0xqK6wYWQZF+e7GAqa-_@6)q6x`KPFC`=nBRrxZ=Nc
zagR*u<gOpm-A%tL+1)-W$<4`4bStKIbc?2>y4h0)xyNVaxaV){?KTu$<ziQwJ7=xA
z*3X+uc-CCo_2xRiVs7Be=90H4T=tf^e%s9Dss7~ybC-T%Zt!+<gFZJmb?Q`i^UXKA
z{QP`(=bd-DyY9Nn-F^4nZvOoF?!No(^Ygo8$rAV2V~=@T_S92Pxy{ckao2rm?y<e*
zo_p>&_u`8$x|d&m*=^jo(QVnX#l7{`TkhR=-*tOF+UhocW$yj=-}iFy>8GE%eS3Df
z55F_Fckf>J?YG~0S%Iy`#cQw9SI^)`XsXVX@4iIBBW16#S8{5nx-Qn*U26T@1RL#U
zS-yMBmbxvrF|eoZG{ML8)%u#_T$h>hWtZrA8Nm<PtF_W<yITZ*x8N5Gezo8?34TWe
zd=tSZ_SGIEM}Fl@=VmNXJVNkm_v*XCg5N6m_XPi;;6D}o9>MRAfRAsYxLlHC{Zjc;
zV-!=Gp_s~p@}0F0u}!s|ZEfxB-G0urDYjkt&h{>Kwtr(8{_&>?K1T4Z1m9Kg>4H~Z
zdxr^rLTzWaw01VPpR<QXJ6n^lK9@TCXyZY6IUjvb5d4XPuO|5Ff|vc-D<{T6r#kD}
z+S$N<&i*#q*`4{$mMwL*W#d73S3~c;s4IV`ft#s!*)7rAMPHTV@723`t@b6(TIV?H
zcY`x+a4r8~XG_;P+qf+PJ|y__1>Z;Tg9JZb@G}H|uizgM{7S*UAb5?L|Bm2468zpW
z_;d7Dh~Da9n0mNTJ=~`ro>dR;tB1X{&3)C{+`fM1_K!CAZN9nhmYVxvqm{v*A@~-8
zPZ0b?f*&mSae}`|@ORZV{kDU-NBfyuJKEf<`R3kPYVNa*2jQy<9uAx?_%j6GK=4fj
ze~#e0);2ewwYky#%uOGyzVgkjT59gCjR)ZmH4Pc1CGuo)a<`;zNh$tRpXRZR8^y#l
z=~;F|Qn$3!)RdI8<b;Hzl#CX!O`A4u)U#*9jPMO9sk*GcRDDQE$%t#l4Ly5?!q?N%
zle?!SsQd28NeSJOGS1<K#*Jedgs-QjCnlvOC8s0{9?V*v6BpMtj3c+CrKbg@#~D#|
zGg|5fdT12WAk<JurqX{}T53XC##wdhMd`Y3hz;M+Bt!5CNpz5$mT^X%I`vAgdmJ0Z
zgoI>jS^pWQpH`<%?=HTBI8S8*T^If-z$c~Y`e}8}>K(?dPjgTZd`3c2`UPoe-P1Da
z(?Pwcx^@3_^2sNk*#{iC&P&_VHA+VPLvF}`4O~y|o}QYPmfk%*`j8uRy=imbf4B6M
zwC?FC={?S_e|mTbjgZkSwnZP&Pyfk&h=6Muouh;TN8+FFzjdc{u{gbZTDm8~;~4N?
z_-CZFP6UOt^z@ASJ$lrsQ%6LUUC%iG#EiuF?i%6(T|c`=4^QQpW!IByR<7B;Myu{=
zDe2;Jk7!TjSv|tyk<c+I>D=RMR&JG$k)DyB+C9A#OPP?;lA3&8x8(Q}DpkKAd;wmi
zrpR1{uV-|KuT|~DN|kE&5{96do|Yg%I(R*)UE5Y|svTeT)Kpze?j~72@4V#XgV!@M
zx+PuMsYaE`=WB%I40=yZIXHesGIDoer&ErrlF0Ss1c_@}051N)9|>6ENwsTSn30^G
z&`GjZc3Ibh(yLbO4(UnaV`{`@_@CnM(D`<4k~>LNA}{;?HNR;o62#Q*Z9A5`9MQif
zIyI@|q0rKgLreN0oy)%3>d6OcPD$7<=VG<$l+yZp{JF{MqkOfBe7Pwup`1T=WIrYF
z=PtVFBJYn(%IaC>dpt0{tGj7fcQ-3H**$t)ceiBrB-d`8d<xmQUT>J|FW&*5VZ7Qq
z?zqFvnKQ@DojcbR6co67@4eUi3XeSUi1!DdeDX<$ukhOH2izR_8%yLXJp1gk?v+<w
z@xH;154O1vKKQ`x*s;TX_St9d^UptbUwyg9`v%{9^NsuIr=MK@x8|10SJ?PNgq@9V
zpoOlT7CPzW%)wgdCTO9%O$*)quC_huTH8w3&(^uow%O&|J8r3cr1ksYI^*KCAoh(C
zycXM;=Lr6M!6ynnP4Jfrezf3k6#QJlKP>nc1;4Fqo%zF05&Qn|Q~tm7Q|i0YQonwE
zDUssZ_4r>us&RaLd~-g9>er8|-=KMPtr|7XmOorCCbn_orj6rk*Q(j<6dl)Z(6DJ!
z-CMg>bbMTVoI5k7d2IYy)#GdHh8m}wa`u@G8pp<;R6X|W@QF|;wt0Njswc+^rrD`A
zPN^SNw|V?YRjXF7R=M)Y&1%-Hf5M6No1b-3)#{vxuN8fIl}c4&bZ>n8S=B1j|DU3c
ztD~cn8dk4XEl&G@293`+{!CpJ$XPnp_;F{R*0f<<e0*F};ji(V$Hg^@i)#?)={r+}
zCxII@@P}@4P31tU=tlX<zE)COQQ>@W5BCesMf;eblY8ziSFPki`v1Giae|h|?!R^*
zuidwm)iUz`jdD2Zk2E&;o}_wubaZqBwbVwcO{!I^rX7%zWq?z1p_RH*Jw-L(xIX?z
z3jCp8?QV{$z}s4?h<|9_ym^1sy0c=>o;@Fb@x>RPXzlr6_wL;vsol13-@ZNCm+pAy
zop+YL@WKnX>N%gd&Ye3;@;yyjG<-kWUHN(YE&OAyS(s04(xgd4weX7Y^3jy2OE0}N
z;d~X{e1_tPw`m`3t5&VDPd@p?w4R#cE(EA-+qP|{{kL&lG?@0_@9x~W^Hb6K{-#Zv
z?pd>D&E#&~y0uY1%+r~wbyaJtf(!FnJzV(=kGb|I)w5LVDpt|vz<~qG3}{<)^!V2k
zzh9LOo<|?;+O=x}e!|P+zkdCCQ;gJvpDka$+~chnl70N~$F^a^22)JI-v^9*1kUde
z%)F&bmri{A@y931?dyL1_19mRlarG&W5$fW@~gqEnQC0!x^>$qwsFb1=bj7iqEb>)
zV(C|(e-r*+fBm(|m&tF~uwh&AaK^4(yG$|NGCsfh>Z|tVn{RqNH9sDA=4Si$?e_ND
zZ~J3t3aWe_|5-A(@5?X0JRrIIL4EH0{`>FktFONL`nA_yd*Z_nKisCVz5_;d{!9AS
zRyfQ6_P63Mf66pgSq1-~!q=cOCqV^&ctsn0=9n7LK?^=X70wn^&AA0NI2W|Xg8wtm
zJTqPM7$cdO1}$sXuJtq^ABr~_bD%hrmltqEC#1u^-Mo3TQPB<NgBJZjcYt~6rI$Pn
z%%Sw(m<Pq`3E`F%9si*7KXP3<e6DCXTK%oJfB$~dGUVmIef#!JkYg%yptzZ>Sh2!1
z=O&-o>o9Y`oG7m5E4Z&)x6aU&ty{PH&(MGkK;F<3<_O%D>Gwmk-ZD#g#q7Kn&ElUk
zi(6yXa<$n->&+H^WcJPe{hOsL=>O3akN?V*EAtyQYSdOf{0!Mk(|mXuusO^De1#t7
z0^Iq`{J;0!d%p4+p2KhOMHZk1yx~7GTKKtH%Iju{o6I^X1m8|MgEs3#!?R}1MMIOP
z&0?N3oAHiv13&Uq#ZeWHzihn)75sx5%tg>1i=Lnd$je{fGwZok-{p8s{D%h3!TB$l
zohur$-%!5eN5#AK8_}&+da+Vu@u*5Y#YvIn>22DyiIFT!gAUDurzfC;7G5Gp@V_ED
z;5$5Lj*uJVAG@nPn@8wE;otl1QX0DH`;%RTYe&(bc(Ub)F7O|=*{so1rD}0h*vpO7
znqh(cNB*@Q88w&>TJR6#9QkKHkSk;(pamUA&X9X_BWTeJ%AfTs-WQ05G|7Jt@f#Yt
z=qI{6yj)5{E9rvb<QBWi-;NzUn&R=7EzVbrzpdtB26~2VsfZ5bJ#tP0xuS*tTxVSX
z7CRGJ`tOjALc_aesiL8~Xjrm4@{YrP{!&+FABLEE-+lL;X`MNwLPJmkIx3ozfR;!)
ze)!=B+xWy>yYJdGn>{+g?iiKm5xeALv%h?3)^EF6IyAf))@R8~=RlvaNz!L*QWNO`
z`rJbDgiimgJX-}cc>Fcr(-pgjkzJn#E!acafCgIR9=R@0M<8FwI<mCwe;&05uI_9_
zW4qWrd0jmX5OCS2W*3KP=)29Vk8tWG8p`w;8p8VA5}PEO+E_NJfoO<cUTRy_&D3%<
zc>H5xV#@5l)_B(WU(5&k%X$#Z2l~KqpeNujyJxHKyuyknbhi7i?qY?aVXkPPWXgUH
z6b%Dp<NxaeGiV6(85#n8#wN9XL41G4tQj<j|Dh+$E|i^8d8H!!W$(TGOV?)L5214b
z9RV%O0qa5JoCLJcf<Jchv8hS6_?k|(P&C{p8Vbgg;-9z2?DEe<!%nlmiU#x<o0KM-
z6zDTF1o{jOfj(oCVpn+l^<>W>r5<|5`XWE8tU^Oj%hM6)N+cb8h6c*xlRMbM*LJkU
zf9qrqju#E%y4W{+ci9_KXK2U}4a%|EUnBGxn}j|mNf)q5?PZf#p97oJbd_1dQvA!?
zC6B-S`{`}lwvCaGG7UPgi?qlLbl~&QLJQ|uYXiTGYpl2U43sCQbg*TUI@nUtut+p4
z5Dib=HOltwk?<Tv`BZd{)SR?ueHIOYkI{5xDexiOm;J|H1oGdpW5*`UMNrXK@CG+<
z4`{*mWAEA5U^iK-SlcKouWN5lh=#`|b+jedcCr%DP+p(^Et`}-GRdZ2)y-}imTcD#
zNw&#Xq}Z)vFR}OD*kI5Q>0@|(mQA8mgum>)mw(|i1Kh!j7M#EveSpuwoM7W4{bT$g
zXhi;>xv8r?EgF`KhDRrg2I&I&3=QZrHt8<eRcM$A4a2+HjYCDll_@sqite5U@WjVp
zeGYt#wp!m*ej)$Z4Ax-$2<n0b3#_=f*zik(8q5dnk@Q4yS=(?=rmeZYojo;GG)Na7
z5e*N8^%<K~Ft)4B&FyNlauV$J>_oe5M3UVq8g38`*NKLSqJdK0$M|pQhRQGO5BN(K
zy!=b9r$NgNH{4()B_*DofCk#b(E&}!7O*=vK4NR9wX@ZtVTEY$`Yal-Nr67kmrc4m
zH^J`ANwj~7h8d#a7SZr`$<frT6ptu2DJjCoctm=y@(cS9{(<~=>eQ(TIDn^~3Mr$3
zd5NUsNVNR)(~tK4n%VZ;^kiFgeS2FG)@N)|pwIWpCPBlTFb)5d9L=~Y$!;E2N&|>`
zA4C3jAJw_CS3jG*R8ICetjC;d{ms{N3~AZf+3Ud-eMAQ)O`7Csh?KALw3MF{j<E^o
z!mpJ#o?Tq#W1!Ff2<vk>xFh;M;LqIm>eY*Rum>M}(EDEaG>Q+{xN+mkXgCrbN17Ax
z!6rS5P5L!`77dgNcwNz{dhkil+N_c7w5Cm)T1G~O>Ddg!uglBJvoT}F*!1bsy<RKi
z<LwT<P(`%Bd)5YQ6}}MuDEk2l`uytsW9`T9wcjWj=hx>*ALFjDKF^dcP%1(;IHy=e
zP5Ju&rDKnOixw@;*P}hz`ibq&<VX8?C@d_r3opFT^lXv+;~)Pp<&^C9+i&;yu)l}j
z(7;;2I)PkK*~35s_7pi}ErdtU-kM^Y9svLSw*KC62Yn3b0zL-%j7^$7J{|Obb^oQ<
z-_1&ePDOqs>-pOEx7BknCDLKjHPdh2nRLQ9?%lh$_j~j_jJKcQ4zA1*Gz67%@Eh4<
zpM!75T%Zr=wAW|N1M733&)B3$eg2=v=ivv=33z>^wnK*wx9gc69|vLVur8aPQ8Yc1
zWQu87vu4dqzO}~%Jn)wyD>MW(po5nFsK`{%H@5ZVxr6Mfzb9&aF7+{3pNl6Z+vEQl
zVsF2+%=Ult&1TK_QO6(jETv7GHtlOYqh!}zcilIaTylwx7%{^0UHeKeOVEH`5cdH$
z=qOJMF$mUS<Q^XhT_GN^O8ZI9;Ulq5KuZNhEcos{=Igh{f9OlPJ6|!%ZP#3L&ClSe
z=SF=+rvn<AH*aowcFoTNYX&lp?-S4gzTl6{LnnI!TJ!-OK_7xSp+yGqO@g(Dy*K-3
z$;)qwf1+E+zhtRE&x>tAPn8k3Yp=c5&jU1IR~1{f0Rsm3^UMJ>1Qi;BeJ^`Td~D<%
zJZX_3Xba?v^Y~Qw+_EMARP5<|J!g0udx&GfAGxO@OT?R@3EYS|>)AW6zsbqTmYA4m
zdOF3=1J{8GXrK+`DwvZ%PtXr=4_f4iJp*!uAIRJV@eScmy6t4uqbc5gitg!30mO)h
z)6nOqpMKiY0Dp)ZN<TaenVFf^r%xX*Tgu6M{NXh`hZgWg53oO+XODpV;A^jv9-ss0
z1pQ)zh5OIyXIfNLRHEj+P;sZ7LYkZpd7Yyv-hT*W5dSCOEBI{Nw$0<Cxi$F~JXP%V
zLGx{rH!lOMQSh1jsT@NCb`+js{~vz%VOzX-v0nopdgvh!M~pyx+9}(1nbyc_h5K5a
zyHQA!_c+@8O+E0%|H1xCA7^lkzR`jU^NwARoO)kEc@l41rR#ou!`2|*$Q<~i2k0ep
zf}Ai1#Iv{_6h6~0bHseGo{Qf5gg17RJmJw6kAEPiw2?9l4M7Dr=t73jg&S|Y(PXoX
zbvm+uTTp?)&R~lu$ParWD!4<}ym|A8G0xZ5;(sgd(CG0G{D1L#8Z-oUF`y-&ffjya
zo3wWOeF8GYS{un<aOD{MnVZ0eAg_bmBTMic9g@wMB|MG=_cHt=<sTanIUg0x33L%-
zA2@KJ>A74l-vQ4fTkb=akaf<p27r5zAJHC3-#9#G+&%t`5$u1p_RK&oS%aVh9fVKV
z4{ROlQRJM!+hxm^+3eY~y*$J3ph7pYgYMurag5B+A8UbZ<^y_l!m;ul+$lc(5V<ab
ze^8+zs7IO;Xwoy$e!W7*fPpsfMYdMSc0x;lyZqDpk5S%Bu|D|U$A6?>e*dfWdm6OB
zf7*Z!+JFvPc#3^N7pTk)=a>g<Cwj`9VT;Hmkb{C2_^vUI#m*eW_|Q)t|3LobD>Q*m
z)FaIa{yqK=bdi^%B3rc2KmWY9yYK*gMc%<5J&-)!tKomI%tTU94}J#mPuYpG_zyI&
zcH+Na|BwULBi2rM%$^h8GY|Lz!8~w`&BxYa$F!&Lc@5G0pT-?Jy!=PXMtM08jsv}o
zY>{=2xrezx=HW9mBI}Z)pXDR$)LgNy@{GlAS)0J`*UG87foBl@Pgcg@*$1A}_}#^(
zXmMF}_0>PRD)w{2)mLxV_jC4^w)*6c|8wo};r=RxTYdXQ<Ei}4Hs~+tKLYP5bg$#p
z;dcA)X(xyAw9>XxxII4HRtdK?!)<i9O$fJ>!>yIJm1tvyPe?UU^%$SiIzgcLw^Zc$
zu)d;ZdaA0T;I>~ivT#gBrF=Y4-Bnl^D@uF8R$BAZva+)J$=^>=%s)xzTdCr6pRQUa
zr}X{q0kd(+_4InZG{;6Pn4H47%IyqPZ20xBJW5Bx0b0+jT)A>P?d?WOrw?Gy<a2%_
zd;6)@g3o1_-jaV_s5seh`M@c<zqM+N{Ea<Bl;a>zMl3W@@mq4<<cqg_ZT707a{4|J
z<qO?^xN??kc#+0Dfc?ZqvR?uRYLLSS`}{x4u6`|>yIFSgNjfHHO1_ai7x@)p;^c>3
z+h?{xv>!#THyS&wxI(64PyN9G--*2^>mzoZwFp~{FN>eTH9k`=Rj!JhC%HCqJUqWZ
zj*9#ad4F<jl*19P^U>@9v<J=BeqlK4FY6lnT*k$Zh9_bAz3)`oW9fhLWtS*+OTLd>
z*`s?SuU7b(Bvzz6`0?2f;v-POfr@>n!V}i7-5<SW4_x2h=Ou`TQwHr;zH3)$-t^DH
zfxIuzKoHv}=Nrf)`Cjsjoz=c}s7yw)rfC0~DL=PAcm%jG|M<Y*!uqq~u8}^bP0pE^
zd@w#Z{I_r*?@9jL%cF20*G7&9c_c?gu9H0B#nKU#b>TUQW*t}DC0pOW8_wEH4RFBc
zfG7CYizg-fTp#%v;)oQ+rjmOle@xCVQXYAhg&YmJK5|URW8Bjobbl~Deo&BKWL?Ei
z3;eeL7a)i$6ALU-Jd>QSzDs9QrDKseAdmga$)ld%_d3C|G{|GQJY6*7E1#07xI+I(
zJQy1}r=^f@BS%8MkUZ70J9B<DXSnNov)paUc?t)f=RqgP*-`@f@hc`wn2<er^5o(8
zpws{l;wJEdLVTTE6FClYW#pO2Z;&S=$3$*}92xngYX_IsJFXjM;Nay^dDkHKO@EQ&
zV*{x8Hq=Nwz=io=b7O*$?|N7`5Yr?!PL2h6B+o^Dg<PZ0afQd9ctsC}@;VX7V;Av3
zrELE3&6J18)b}p?V++{t<DWw}xWEJ2O+~|e-jIA1xm$9E<euk+^M&XH`4Mu3Q<S3$
zc)(zhHk#b6N}2qlTl#Kqw(S3KbP>D5zJR?QJi+$Bk9|AewDte$>+=M}r;$f;_{63I
zogmLdu8%y~<S-5l)^}TJ9)F<5e&<`xl-ZzY{7YmIJ;djy1rI9xpn?Z{VjhlEHm`li
z=S<1fO%o2}OUspC*gwX<_10T6@44rm{^W-6$H4=hv#(}PP23bb;05-GYZUUgJO>cy
zL`Cw*ePLOvsENkMR=grx@s^SB;kMgu^L7ur%le1?M;71*vdGxrLP00K_+X3e{@``#
zL^*ksP9TqziUtnkpZz#-4r03SnEjP>(eJm=O>he4Cvt9>i|6wD+TI;oY|n?UACyPw
z1o>;^an7WR8NR~xU$zy0JDTy8i+DdF0k7_ApPSY@73`K<Zt?p&aKbL42jBq@m>+oa
z_0G5Km4d76iR+X6vjBlS7Eb745C1#IKHDMZ<e;n_!iKJ0yS7ohcLH=Mk2z}4pg}L_
z``dQaRaf~qu%40hv5R2u1JB_H{AYiMEWi)&FJI_W_id7FMXt4njL(7cVt<j|`+Xp5
zJ$V^&OY*Z!&wYEkgZ&qHP~iu7l%E^$W8K1burF2j=d0r19jQdK2bKS^i(Ddk34PDh
zh`)lv=+UD+-?0a*gY+H90Apbn0$tTQ@uTuGLnO<2@{xYlpgi;RYkR6_cqQJ?96EI9
z^W=Dl(d!HU#$1qJ)4J@(!5@I{j8DZU!$%8RtySNPpVz3bdCFJp*4S(Xeyw=<LkH;#
z-wu8g%S8r>rIXh{Kfp7HT`>pP1>nF1USPMenc%r<)vDVxaE)IZT-Uw+D}S4*@6q*V
zZ2DxL!9ni{Fuhm6F1X+Vj~h5pxd$EKKI8^J346hFiHe06s9*L9M^n80#s26y`r-7q
zO)+`ad~6Q61--Mt=a|t8@T0(oAjXToOil&AT{PUSL63H9@blvb@(f?8;6Y_P)+4<m
z!P^F&RfTqBj`@Pu(2Y%2?B)L7IJO_3ab#<}{jUg*zz5cM4ou&7^s!?6LSjzH<L?;T
zj}N`U`im?<FMU$6dFULv4V}ms&+qW;g}xWy?ZYwB&DfM^=r7OrNd7YiRBSJ{k9pQR
zA&|e_iih2-K8T+jYvH>lwT`i(U%zJG4vW{1(fZDArLynqMo$qhR4b{vqo~{$z(fm#
znxJz*ovhDPn^M6$Sf>2qd%GcbxT0sZ=)1xqc}$)+Z{DNI(d?Iv`a;iz{PX_%??1%u
zC<m}deT-VTaG^i1drl}SDoRy6d*z}<i~M{BYZ&t^oBn#_VC2*E{4;UZAJoTo$=^Qo
zki9YTx>$RVKg+M<xyA(Tt>$PSsPcHw2lpb=_;7(g6X+DSEJOPy_DsYOHp#6yPtSF#
z1pcujf52Gi8g_|_yaG$f)b@lu@Z+T}nLii)_l??R*e3J{T=5-{?F~=eYx$!}eZ#@w
z{Tus7_OI*}*sHYCUg<93MXr@SIk+SLjQilERPW<_tv%Qr;Y=Uw#o2oii(uc!zO%jd
zoy4f|slXe%MPU!a9_o>Qk2d;<ET75564N1$z@82MF;A>P_(7BvH+1*@7W)tO9_)Sa
zb=hx}+<mjr2mA0|!h`wKyJvi!8yf~6wm(~7%cgYk`$>Fv{C4&Y?42fN_4H%>d7Ie+
z?Q8WtZ<{=MvVTT|yc%<fyafFBH|yVqHA}qTKT&(1aDmvz;Gfn7Z@0+F@%#X=fy^zP
z)YW!v-|YFx9_sJI{P_C<`9b!u_1GQeQr}(oJjGTsm+!4Dw1=<j>7VDGJHEHAfARr_
z*Bd5Fi@v+!eKqVCa)aH*=VCsvr;)hunYBECrRDx${^4EVcWu);$@r{C>=Wo4yR5Z;
zawI%<8ocQTUg)~lC)RA@Nx-ttX6;rk<`7u=nN+1Dsg|lcK3tvJ!`0v(?x)t|-bxB&
zhC;Q}p5WiOruT=|Dm~(TYscvt_f++7TRUFYN{@Kg+6j825l12arnSo9J9VUcP7L1}
z@^4wI;yP#M<z<Z=G-5(%{Kyg6d0k@0=4N-y8$2{?WM*EAk;4Y(j>;Q#<(L+OM~&>5
znK!cKxYjYDk(t@UuFT2{euc72OzW1dV!EDEJrwFZCU<O}|2@~E?5#~HoFMbE29MRx
zI8N~Wgj71`W{n=JQL?V+n>%cremQVRR$ke~$jjZw3zT2z?2|PvYeZ-S|GUIw=A~wj
z8+BDyZcJ$Gu%y9*^%Im`Vy?^_k(U+IwR3z~--iO1^&fG^FGlYie+aIf<I9K^c<1<l
zpI!SV^-W4iNxh)wfC1qTe;ohk_<?-$<=zd2TMM`A7k*q()uO&d1BzTNy$4k1*UjHL
zf9L!I^Q#s_6~q>_FX&Y;pkQdh_=1}XW)&<bSYEKMU~9q7f&&Fr3!@5obN?2>xcRl_
zPkC_W!dVOFFI=#2$-?CeS1(+*aKpl_3%4)axp42o0}EYo)#6&kQN^L+*y2{j?TZtO
zdlmOB9#DLF@zCO&;_<~(if<~OSv;$Fe({3hCB@5&R~N4<-cY=?czf}IVpmeNq*h5(
zNvI^Yq*Y1#lEji;C4EZ<lw4jiv?Qlwe94rOn@VPu%qp2*vY=#1$?}rbCF@Eylx!{8
zUb3@fZ^?lYx2Wo(T8p9<g%-swYPG2SqQphL7A;@2b<u%EQH$Fz9=~|z;#rI5FJ7>C
z$>P<EMN413qg_o-;rPNSg*O$>ESyz1zi>g}lEUSMs|(i^!nd7;dkYVE&ebZ4Dhd_F
z7PTsBU)0O<@$#afML9*|i>4I8m_N!N9Qc2W0}UGt?l^F4o_?KnVD2dWM)kn#QF#-x
z2VbF|Y#ym!b<P@?H)?F|;H*)D@~$2@X5^T`1NHOY;|Asp&K;IBCU0QQgfT-$Ww*>4
zpH=;o>V113f5K^=y4m;E={K?WxmDNeh{`S}BV%Odux!15D`!H(P>bd*Li&wn{hV;e
z(AY6owrJ0p>cd9njLIDo%FPNs<xR+|er4{ck)fPnIW05%&pT&lj%Yb}#ITlh777FK
zx%#jxLm3&_`r+V=j8K;@p{BujO*?8q4TaQI%go#%<1TG=S*VMKXqh*5P;73~*cPRv
z3=~>dUpo*=nk6)9dQPaRY6MKPvQDz}E9S9`7~8CwNUn6;Y5rvodRux0M0;-N-xPTo
Whp?b;_-8yS$^3TECB5}o<$nR-VGrs6

literal 0
HcmV?d00001

diff --git a/venv/Scripts/pip3.8.exe b/venv/Scripts/pip3.8.exe
new file mode 100644
index 0000000000000000000000000000000000000000..13a9b7333b770f3e6622b033c7b419f6a5a6df13
GIT binary patch
literal 106381
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
Whp?b;_-8yS$^3TECB5}o<$nR-VGrs6

literal 0
HcmV?d00001

diff --git a/venv/Scripts/pip3.exe b/venv/Scripts/pip3.exe
new file mode 100644
index 0000000000000000000000000000000000000000..13a9b7333b770f3e6622b033c7b419f6a5a6df13
GIT binary patch
literal 106381
zcmeFadwf*owfH^BWXJ#sdr(FK3XTvIjhE0=O&rh+%*Y;@2r6h)P&62^qEeU<tSE^)
zX*2B3DLtpQ_F`*q=h)Mp)5|$W0=AkEAc<VX8;VuD?{QEOH3`@K`>totB*9DH^Zx#M
z|9Sc7?EO6ZxvpnD>sf0(YpvAWu-4^vxm*SOZ`&?cD^K}Xt$zRUkHzN^r*9bH`tPCJ
z&uGnyZ9ik~;yacHmM**J_GP!+6{x%A?z``a2X4JBuq<(R;EuZk;n~*&?z(5uZRZyk
z4=c?!{p(8>-uvE-BPQkkkNbZ(>0Q!CxBPa}7WMqir0=We+DRYs{BYu<liuX{-i_L%
z^(z0dZ22E#pZ}tsSKm>$SlZ0ZU{1v4TJ-H9t_RLKHb0klz%{`&Jb#$WwV#~-baJ~c
z;^|ZG)p_!e_k5SjBR~AhJzYN104>p+5B#bdbCt4nDd{wldq~}Ej=Z`aJ3r4gRlVf7
zelv%cwRx`7hD%27U%qPz11NWspUe7RJ@Z_x&QQO!^!f4IR>t}A;rsl^fMo8n_=Elh
zT&{)ZFI#j={1%tXx>!CikV+m0<bB{@HE43aQ_R&w!X*$J#d9*xLI0{<uD0`+ItA4n
znX9Xa0#m<GuKN6C%a_&hNx|eXzF$p3|FUwoExCt+R|xXT+Q=M!@`ZBK<?H|d@2eru
z+?}{9X1*FtUgN7t&M2u#&I;&_`*klsH$DGWk>}DYHtETx(sFWQ<}(`v&e7D2l5lFe
zt*2t8<$5w)8nAvF097haqD(4GUP@o6r~Lbh@?4f(>~gJ_b+P?xKXSRYb!^-A6@Ah&
zeO3(WlbnChXX8Tp+%)pUKK~$n&KT3*=V{qK_2m3gubzyT`mWQB{Q=YSU(=bJd000;
zuGkwhyJM;8N42MRMa^!j`DE#~OK)zAk25`{Dz_sP%!_K_m!o!jw2Z>xs-u}*x*0F6
z)XfgvoX?z%O@W&`w)OW@q9<3C2Iht4hUSH?4PB?3`{}njW~O5)&shu-_$<9z9yOJb
zinn9Q+bXSv?1_-Mt+|bFMHJC~&~EKIZri#^8Q_{<vD@+iXh~c5Ko#UAR(Bwjdg>^}
zn(dILAB|MBnJ-!C(`61)ZB=RBQw6|3WWE$Nw};IwmZyXzG`H*KF6&*@`W~6;>5OEb
z^fF35%=;a!*V)msW4ilD`a3M&laPx7bF1}J&FPm;AqYpB8Qp<_e!rRRH*9u9&6jj@
zhxMb;QhtXtx{}_QAG5o1I5TIS<{s_gc5DAJ=1A|l`CO<~=!f;<<Ene9S9Y8cST%q~
zO~Z^FP~fO&b4T{;Wqr)`*m!5IF>?!jGBax;eL5W#I~_?c-=>$4wl3nT4|+}_JK?D@
z-^tWVYpEY8`0ZvM&jUZ}_g`r7*;8^YJ~?dg(5KMom8tn<c1`f_%f@Q!Jgt1L4^_G2
z!)nT2Cv*A1jJw8sOD);TGXz)XmsUs3O;Pj4@~F9-*ZcLT`Bv!W&`qHQq4^8g9u5x8
zyH*gjyaM=soVxCO!KQ`QKXX{=sq<zE;;?4th1Sb{WXQVtVnw%<nXD(5lm=}7*P-jp
zZCX<k;Cx!PU*-W2Z@dgXHMexJY~5Px2=mlUNtz_hJ=SaN;O4!Ft5rHv>NFoSzu5c>
z8EHN-wnFwo=|YzDxuI;lTV=7y-;(jDPE|YBS{XHaWKQqv`l)UD#LeuL@|$lOm}~#O
ztk%s}bn}qyPtm?^OmuZZP2@CtN~WL&(iJne>gG%A<jKaO(g0+oo3iE}dM&d3|G~S_
zH$)4+CY!U?*_(6duUht|v41kO=OnXu$n|-y=I*$+Vz=%88dX}Qc}h+0kp1fuK$gtY
zQ-3IJ=mj+!_csic8F+rgp{?j)^HN114^`~0=(hcnX(5)1><g`5E6tdDbYL=P19eDj
zRRq%Zf5L&wl8tO!RXRtCB?=W)%;d9fDgUEhp!fD++it8m;3^;7T&@}0e+Mm4^q(ne
zc3JBvT(Mi$aVfNTvGwblpm{yEZ3D8Ui|N4jKcXtkYtt$I1KH^*f5NH!Eh?}7jKa2m
zxl^c13f<!rTIv*<Cxt#$g|2i8LGik*E1W`iI)%z9q^F91N#+ItVrS$J!Y$bTGO7r&
z*T#UTE)ZE75flxVR_iQWCE#9ETJGX!vV*`cRdh4-fHY$Jo6`!vBDQ}oZ%$E2#8L+%
z!)9B>?r<_D*d8kltQSVc_TNXz7-g7dPhlR|(pk}Mop#8!&9Gqj+|pWBBk37-T^@zQ
z(kxiN(Dr{n`&w%}13XU6rDUJXVIGoB`H#{flMhLAG0E?+ILxwpRrVZ66E7{f4tjsB
z95A~1KD9oimcr-rKoQ7%=qd1q97S=%+PYcZdeE?}-Z(TNJ}G3rXsze$0h7m2_b*a6
zHOp)J4+!*Coy0c1d2f7p)D3#~rgutPDgTct7-|)MN;h{}bwhKM>X+m<w*dw@M_T%1
zomP}+>qbbIBc-z#ohc-wN4G;S|A#u%u&$Tl#+LkS@ggZc&KaAfo3GV}tImv%(bf%@
ze2<eqOgB36`7kl@UiQO&p(br{Z+$p9Q9jCX5IB-M10It3sqt}w2!Vcwy;g5rHX(6#
zy%C(?j3-4QhA%_fBA;_D8J+nuJZAr2lnAwQD5=@s27Ku<P;aarKOsJ5prQYkh8|W8
zJwQW@P{5#I9&v^_MjFp(%t%|;WtBUbMKW$}ox2_oy`v`=&<XTgH<y6Y<`$tbLR<n6
z@A)^w2f!-T!euN48CI4Ioc*cCE5RG+$YX^vOwa6da&%<v5W(El??R*}FopW6%D5*r
z`*@~MTenj;+6uIF&&r<r2~@tKC!DJH3UwVCOP#lvGd(jgmRg*jIXPrLFGGF+R*1Qe
zh#H&oor8|DZvi6j6#^n*0)$%KN@w*|(>{rU(7WQab)m&;W;icz@S+><1J=}1`0Dyl
z^6S@b@w8Osx#n0Cff~ng%D-WVTDR=kT@K07Q-(CIo5zLR1@|l;-B48=*BYvZ#fRy3
zyB_RX_F=}&KA=AQLdyR=nvfO$1QJx;a<L+pWk+IW2QyipKIU?T&7IJK$*NW1FKz!{
z-+{>QP^?j-44|%08u$wh)F<Ps=IHP_bLy*DjyNdJB0g{34N(9bLv?VazUtzH1#V4L
zGgvC!vnS%zmIYVPyUZ!hf_Jjug=)d6afYgKcecj#!8MA%q=pa;&|{|%gKFz_kX_ZU
zmmv$T?~_p<g{a2NRi)MDjv57z71BH(-r~cP3YAmEdzrlAqMo<bdSoVvRUF{cbQ(&f
z76R@K0v&5A%v?6Z_U~kAQ`ejf|1r08eBzuaheIHB!-v+59HD9)mr{pu)PSg_0^m34
zu|9dRUe}?g9+p;Vs{v%INfm@`|95CFminz^RJ28nZaZoogF{Zu$*({7$Ea!Rz0bx{
zA#%G_`Y37L?vA<Jb2-O9mqRj|n(r+HPpl0L3S4;7qlUzIs<nr=Kp|fH1n59eD`UX0
zJeDecmJ;9w+#!IC36B#?a`IbM!vyDcT2W|~I@_)LkMj0q|LW_t(}feFLa_MRGhzNl
z>h0~m`rdZiPUL^mp|^MY(%X?56z?@a%I66Srb}-TbDtwEL@GWAnVa?IZtdYV7G<>c
zt%;m^F8D*2Rmf{aTe^{VRc5y;6MvNigz+3FwZmEqlPvTc%$_6rx!Af$wZT%lGEY<T
z{KN!nVt=y$$sz8nru7H1*RHK-%bbpg5|MROT=oJb4fF|IZx|x2cM756z>CA2!EFg|
z2?w-oTlF<^Iz>%z@fqEGnRz7q);eg<lQM&3i8X_Fvjg6*wSf%Sb`gn`oRD-g*mwbb
z7h26y3R<x#aAU`|%+UJa#`s9xXlLi-$<FzRj6{KMws%yt!FLH=oC8#KZ!B3|5=-iV
zYZP}IfF{7Z=3wc!&ZpTdET23BPOi(&%#s3GK)$Z0*x}Yb@NuoIyc=Mcdt&Ae#R1P1
zn!M9GESU%iF9C}u1X_|AVGBX88Sl+EF=EbbsQ<+Z7BRD3H;d<AlIId`@DFdOy*AqV
zHT|<lw*LllAi=Xp0|95oIXJ?-RI@|iX{?>+JB!NfPpu*&?za|76M$^EbuDkO4b@4n
zh>It-!76MCl~8bZVzqVsRH`Ir_;hn^n}9!gvTnAts<&BQJ?K9M2O2-cZ0I7Z+4D5#
zNWyDPy+levU_JkNHk+wxhBtnyZqD$TEvi`YBT{Ur6`7*iW(YHUJ*tKL#3)0R$=@=g
zB#%SKm;Z^jI&bh8`_Ht+tlv_E+LeLOTu`VQZYFA4&YlRFn`%VZct!>aMvb*@3-mAK
zL9o3QE^>AH_v-WR_#48tf`iXmhhZCIAZj2|RW~YenO@ebtvl_~dgDlF*)V=@SW!@K
zbOeMP8+|IPPi3_Qgi7o7_IPzY{7|qyxF^0P^L3aNp}zs^BcRABpc2};J=W_2Rbdyh
zwT4M8kJQ@6!Ktn5C~FT_!jr~}ge5FDekpJ}rbHGw>a*JjioKY%s}9WvfdIke3O3R1
znE7&*=kiJ*yaE`+zm=Uolg=XYL4+(df9fJ%G&BEL*()=&bwww`_o-POQnP9gaB81a
zZyZ*6hgIIjK-AcnAGN#UjJaFJ{7ih4wr-=guDh%Y#FZvttF3v$l&khn)N{xdHxBJv
zvC0w0n!9x^atL(4>tdn0-HCwp-gKBihUl^$sOHU<w+?}qS*%k?xM;S;qpwNM0ijms
zR(al=1{RJGV)GfbnRRjI_tr8R=~QYx>-PRvn54`})=o-USNCU%xGEYGr9P1@Dez2r
zzBw+>)#1=5)ARO%JlB(=3!ulsR#EU}Ji!hv)}hyRZGg#hB|YsFv5rO<Skm)wjXFgV
zrKvgK_txaN-^j<;osTQC9}8Q@QZaL{lDORTrYA?`>BdHMH|<{C-U_c^dS+2L^R5t-
zl>f+Sd9FxGcSp^xSjzt~Y!rl3Z}0OMZ=4=A3pVO^cGt$tQF&40unkvk96lcR)Uc0-
zbmp@jcGPZ@)}wZJ;%~I4w!Pqu6^y!E4bv80l;?8AJ=XTi6|{H97!XUCz6Gu!OQ&V|
zQpL3lLl3^Z>{5XA>gn>nXT{g#IBfm>zpH=e=w;99z3=Poham#b=<VstQn8UfYyTB&
zgAI3<XxXk)vy_(VM%|wD!mFHh4y+NmjYFdzIN50TSsOlI<BI+ozm^)ZPX6vwWeCqK
zyO813sNr<2I9uEBP5LQ&X3&^=)1Mnq`bOprtjig|e43MPi?t2QN;LXTUn(C{bZAey
z%;`(^Q&Hu}IBV0+7D#*=?cJjk2<;u)s^^JbO$d>mS|VD=1^l0=)RPZXqf66S$oI!H
z%!<u=GJ@pQQzNwMVD`j2#oB!8z=?Mi@9BG33#+1rAq2N98-gfMk$EL*MqH*oihVaX
z1oHzAvO#3qu;?CyISE+5ioqb&?E^<IvzAGd=Llw&SoOS{t~Bcg9daw;Rm|@VD<EWT
zfqFSdl&n;d*ayGx8I_{uwrKFv<tIze)>+cj1ai|0K%?fi2X7ZifBHVX_ha4Y%U@PI
z3j*rX8xOfS30F+fQz)*2?JI`qtp`M0N4(LEeFv<^7@c0WPk7^U81MMmorT-Bu>nrD
zUIfM9xa4rsI$eMNyDUqmF9V_<r(nWo{g$2LZ07U@v?q|rf&hSIp|D8AZ*-j2&t@qi
za1yivJ(Q4ze?{qQ?#UEc3uq?`6g@TjKx38kmGD>(z_STUSHlu*w{909!ej+aR?uVx
zO;#{<n@@CNXo-|gRkUH%@C%|La*mH()|0d%r*FXF4XyXk#x<-$xA0|z9Lf!$VPmKN
zz>Ls&D_ys-zY=x!<Y;onfv8buxhxan!hWd~nglHkpoi<%;leqI0@wUl)DDZ;YBlDe
z8et3%>dCpKO9fxY)_^Yln&zIwS=K@r%IqQV0lb|<_EySf%&GfC38tHWEp1?}Wraqt
z&M-aE-cMt}u6xhcjpKIQhhDQ{x2QGSWIauhq2j+DRIqQw!%;N&+8<x<omqm~m@=98
zkgz$sG&2N!2~vuvN*1Cy(3)!boGlgF02o%sZ;I8e@J5<@;&ZeXQNBcjABMH*pGC|a
zv0%6Mo%b18%!FY_4rR{P+t<?E*(<yub4v{Ry;v`^^gKR`8j7EVG4}zztSkLXRgLcv
zvppKLmMx9|mH^WTzJD)DgN+gMV5s-w3<P&`*!(QodmvnPFf&YEgYQSQnFncJF!~<F
z-_vCz+g;Rr5nk-nd4h0`a?|Lu<99-p%dGUhOh_s;0Vm1k+-6w9>75m7Q2>Euh}v6_
zQ4~aE4=<Lbq|68D*VPdUz>E6<J{!cgeu7T3lbb?z<AoG4W|su?vcCg=RNTFvrYAdj
zzRdekvok%Gl*8{1=mBEMg@KTgB%<cWiVhu)nQsWPEEHt9Q4T{{ox}uP&XHj;b0doW
z=OD$_c-6OX=GO1|&0HXx>kV`XYZY$7`PLwdh|+tTbtT9zdzup0iBit&M7P)`jaSP_
z3rR#oj+u*KXOuvo^q~k@uwpfwZ{|iF{g+iOFm%xWEBJQB{!JFny@%#=ynBhYi~(k`
z-S#WqJ^eZZmohmyD3)4;68j7pf6vU4YOVR(6p$6GpX;pHIY!^{_$0k<mpaA{d60PT
zpONP>-aK8ub9ZgjJ*tc2a7-yD^hjQOynvV#x|Tvc(<@geCds;wl~(*P3J4(C(^^jI
zsJp1GCsf%GKiS&C0JCGgM#j3sX2YH%Bl#1vF!$7$LMXC2!=2VvhL;m5>R6JsQu3gX
zFcB#xBU&k;q8?a!l}rJ@CzSt{`e0W=1g1!<92}&U`#70=XCdyd>(<s4=$SK>0xkwc
z;~<+`S{^prZU4*{fLk{R;?dUeL0i|Zt=l?LxIGcK6z>_S*jr=nLWl#85~HopV3o2H
zdWctu-1h~vFq>}+n|EQ<M03=gI4|=8Y<GR6YD~N&BC=XIh{6aaB_CyEetm?t_9K6e
zg?<hQbKDfQXUaZbFYn9hB~(3H7?aqU5xw6SX@{L0O%97{VG(^MXXQcJAA@Cz>~S8*
z9?>P%gn=pj5e*|`F?|C-v@W@t#Qk15cONJ)>b!_;=nBz+=UKPkB<s}NwsN<5O-b)Y
zG}Nxdu(IV|b4waN#bpLTm9h|euaC;^^!03X$EV7%i*(x0(zOYq^n|_M1`r52DKo60
za#$kY-mJsR1>MU&22V~kH>Y<2-KO0uKekpeGzakM8`wHM8}qcLKk`vVm?*6HApI*6
zW%v7P%>6ayr|$c`(e~q>knzsxv&@16HFthc8|n#r=xtSQ7WvjM7r0!(Es2RrgxjgR
zyK;l*RD)<=_Hplw5?26nFasntUu5>yUDSahw!8@aQQUH{Z^g)-871EMa48I%VD`n`
z=KZDcY-d;Jxvrph)pJ2S-|j5yO@%LHD-EbNMXw3H5K<w^O|%Eu^AITzBv*H+tkfU^
z;J3bs$~23E$5BO!@IKc1IvO*!%T}w9kvY^!E*>2HM5Q#3-n3t4aV}ouymjtN=LnYX
z<II&KHdV7H%uy|8;UW0FUDlt3y@y>Xv3lq)+qL0zo&GoAUeo+`+@o{0z1A7Arjr4S
zxR3vLMH|r+*_Yirv@^1Ym(`iV8L5KOWCUG8jUF>2?8Ta0(AALrf^bPa@%bQC)UMgH
z5_vqbtEEJKWi^tKU71mOYThnnu*Mlo8uD|7e3Y^UEhQOW_T!@L#{$T*R<&SH{q*Gg
z`s3Q89jO_|<(gy;7lMey%O`Uo$i?7Wxy!&TYzE&isG|fmRMbpIg(}I783&2h^s$<9
zTf#3}eT<OZ=GVxA7|1Cuq`GN`dfBZtZRRB!+;#69YXb~IEOmJv1oZ;2$YgHe(v>lD
zyXdE&^IY7Bl1bFC*41*@^&L+vwVJ49R8G*Eze_{by`+*Q=>~cK2Jf`>)_h?cxNv4i
ztM*vtFSI9O5>#Tz&BvwHvBK}Lnv<Qj6JNK+^A=79GUqh6-FG$xFOXv6tU|J#BRMnN
zI*h_JyY}DV6|@sXo-;^rAFTg^i>#CZEp$eM0w>_Ie#9_9#T?HEW$K4F<pXA@BxLp}
z>EUq$=D4N5N5S!L82dh|_#jCcqc0CN%Xm@x9)k@6>3?3u_{|$jB29bm8x}I&IvP&i
zSdtkV>gmXfkK)%G9}&_vyftiDVdsoe5pt!{^++LMvr}<84_~iv3f1W5R76dzTqed8
z&@Vf?$Kg}ims~#$Y|fCmM+SVNdTr;3eo)QlRYrdvnvh|}k-WIaIFg_EyVdkD`xU*j
z@bNpX4`tKtk+*__yuqu^|B}9eSI(}&nD)#xD6MXetK*R4>RM|uKnme*D)g#xmy#Jz
zSV!(4E9seY1~U4(#X`C68*06KySyZ@lo)rG)Ma3^Wb0in*GB)rN5$L>2aV$u)}xXR
zcHTQiH;307Q}3IW&>ZQ*`lw!-i4Q@-@@97GrkmS^mH9bV2<VB;h9Wy(&8I1zUQ9#Q
z7YauICdiRrv6tyL_c&VLldUEsoSe$k$9v{pJvm-DbGM#6-Ryw!INIJ9g*AH#Fvbu-
z8P{yN&Uu|N#!%vm3S1;V>pwFfU~-74S4LT9(_B`OGM-lxgn`S8n$JsBSX+V8DXObj
z@+@bB`Dg%9+WHk&h(3sOL9V8)-NO~L^3^P0RtFHNK#$cepdBGR!%$%=#<AZ<T0biq
znCE2PbLz`zSr^(W7i6pe^+#JiT3<-5{Y)ZF0|{S!gt}tSqQuzDMtGpk0XZ&U>;#vU
z@_CeX38k|8x0B%x@624@6Dl#{mskrgl11NY_F20HVb~g%!W07p+rb$R&14|RvnI>P
zhgp-~mu*}(*=5v~xSSJ4sV|g%i8JQJvx~}uj;~SHU+6qLj>~w3PM^s*s^de9TS{D+
z1J*Y_%${Tya$-0q*+*n$*eJ3o9F%hI50vFbYt0RE(dPLHx5{YE_hu^fI!`wVh~u~A
z;cjoN6tl#{TkD5|2=!HZNn%gMUZb^%H6C&A(5grJc+np2VCdD>Xe3BhWr8s+fMO#b
zz0r9WpszcPB38$_InCYBvq>&FD_8V0lw49YUy4FBUDhN0MPHjtvilwo#H!;ndvMr#
z^bRiT42szPt<M1Rr047C#jQWyt==D@HS70xWy>NbyR6U3q|I++vxZ96n`9}b)>_D5
zK#M|FY&)4T({t%WG>S>jWju7#AK+mYpTe&-?OlPXoH0-esjx^IUcpahwAp8@Dy>G*
zP4@NVY_sm+cdfI)I)E={fuYlrtvi_w>B;GP*>FM^VO6+wZDCjd{re1``+S*~=~*S(
zA^NKoJ|D(=p~#B0)(dSiQ@NL+&pEDmNar51lKM0dMuy@O)@`Wwo#P|rnM$Mb9*9vN
z@ro8jY*@(VGiWO_K{uO9)c}$nuk@M9CXF`8rsrX)ZhAgct$1!0MIYtYN`FbuLUKDj
z7m+!%z}432Dd!F1Diw;6^QGIxybsO3FSY#_b&F#3G0HhBFam(co$o2+1A&{j%F5=E
zFs6NrLU6}Uxp!G$+h5Yft)g@Vp|SnDN$HK7WbE*M%0}=;Z!~#lNi?}UAohZT^&-_Z
z=6&88bBY-%h?@6R)|B<um~X_efiTmL*K5rm&`7lIn|d@ks|z#3U8seF7i&hN92IWh
zKfklcoY5Bx9?%|ooTBE8qw;S2jCbSy0+-hG&+-<`i;od{j*32Nz7TbH+Pj43P4ex*
zc;f@Ey5)E6OH9^{Y4@VIcE!gtW6^V4k1#v%aKr`&c-w9NwPc&K3PQ^6N42%nddMrZ
zn58wZDTvjfm;$_TWAfvEDJBG1aYO;^F*?CbgW{+Xj1Hg7WF2EjS3wwHw*JI>jTs75
zd;pVHQ`Y%-AResPT{Ze%6sEJiW{A19Eh{whc-&iLBX+m@f}@w0WZpppcek0bP9N;s
z5OYaqQN|sH#{+JdTm&y(K2Nu~seG$IcfW4VKtpt3S(O8|<x?WfAH+T3U|D>Myaew&
z8lP+gT`+;*;!2piKj(#*jvfZGHSW%ky(>5LW&fjKkTpvao3uNtVM7PoqzU<SXt(f1
z@EB-52d{m(dEt2OolvsEkw#JvI(Mb7z_p`9ikL4(l)cC$iJXB*Fy4bw)PcRxcT2q7
z=vx+_X!Na!kG9Sm(ocjpcoge81Jd|(o|~;y95RoGh9AgypB~CW8aueo>BtY6yBzZj
zt*L`tc;2Q@fj`$e#-VFg-xvQzsBEX!^ekCMdU$-M-5tNwNSDOVGSb81V~j%uiSI^)
zPyROwM9f{rPG9=BQhmcmg=xXQ>Yh&26oO&K&g%3URccRW71{ZTdyV&w8}A-9cIImv
zJ}k^ErJ=;FG!hzaXX=df-1uxGJt97pF3*v^M;nKRXw756k={;M8+-2}dKr<aLNk^q
zi<n*7hMp0bGD(e7sSihF#$`(uQBuoj+J^UvmU}Qz$rO-*sGT!S(V7crHX;hXrx;?U
zKt3Ub18MfaeV}Wo6$nB&p0ifRWix2a-&Z_u$B@B=F_)R9HLq~K^f%zIRt>NmG_cjm
ze@9f(YBh&3jFU1~awl+}D#DgfMP7fqzle__BQs?bnV^akW{dn)715f9Ih~E5nD2z4
zgsUpFX2&uVy<-Fk-|S?kiiubQ3vC(8oq4>B+ROHQb_yFBa+pk%BqOJVlL>B`6O3gu
z4<G*{$B2>*)_JLLfGg$H=vTrH!tX2}TVAm@H7n2h{S;yRY*BItr(Hb*txambjK8iI
zvO7Txm5r$fTybnj3l8*Dml%n8z11bI2G%x~nt9CV^R4iuX8WvF<!Y!+LKryq(q9uQ
zKk6V{^|v_oV&=G)$l*Te6KO+K*Sq-iI-fEgZlE)(?9TLkOmclK^)2%pX`~C|T*mNo
zX)0NSh}s=TENm~|@R%l){MrubF)^M?y!%yeMTe|mZ>YZRl)jA8Bd$y-4J>fJ_DNma
z|MW&VrN`+~#60bYuu;N>k89+GS&6a*{>sPCM0tVHnsu7(oFEOb5OQw}n5!LiWA<E5
z7N^H@uP2<TBcsfNcIc@;l=|cjqH+HL@QQ&<6*CYqHE)*NeI;(0FB^w!n3w2cx?WVe
zloKpg8b?pk`U3&PUoI3TdOi!9iXdgzu*_m;2${n=FQR7hThRc?=?+N~g`U;ZN}8kK
z;;acG)UjGxT_~&q2Rkf)Sbme3EG^cE;R5<m4)Z6dnK?~2o4qpLWV6$9F7>!tS(So1
zE(KxYdNR^r`+wUm2e8>^`~QVE=|H#r4ZN~CK2#S)#t|C^X{)v9c0QXanY>=H&6@Xj
z7Ay6$Qh^Sd0nVZ2N-Hq`X1Nc6*Kx?_hS8kXp_HCy{fvFYy0>wHOP*i|j1YHe!|7}=
z{dN{Xai|>5AjlPCunsd{jtWbA5dMhrVRLKlE@!)d>x`JNG%@Zt0yby2TH+<5QFhGV
z;J^As>VS0<15r9kc;ZE+0nUYfabyLb7?#M{*!A4v#^j<6y<#|3?F|l#m)UJm_b#LF
zyk!Sdp%09{kt>F@BLBEL8r#EEY(+E6l_3K2<!v4MBOx=~UXbPce!(r1$WBAiZY{^e
zNeD@sPXK_%5x#Kspzqh^zK>Ghv-iy}TQ?3WQ_)|ByS(Xq;P&@a@&pzIvD6$N3l?NZ
zp(JOJqmu>1gZ>S&H)`C!hc&IKXshAcSuBZS!dF<!o?yt0o8+62AO2yY6edsctU$UX
zOgUe)vpwMXmoXV{w#?dr!cBm~shrgjtt#~?-FyJi${ICINlJfHtdG|8BZ^v&>=W>}
zm2-crw9+SA-*$2qO3n(!2-u!~ADQPuX9!d2O4P+tlfE{ZiP!Z-jj2ani86JcWDPkJ
zv`iKp6`+^ssTl!fvyyZx&!gmw(&P+pW=zy9Ix1=nA4mEOuRQeREYNRw<E)Z=v~;S!
zL4r9KcLGhNYQ#q*{xzja@10(vs+zCF*?!MhvnIP-&?6hs%cv{Oks_f<Y9Ry`C4=wm
zpfmxLeNY;;w@lA&cxZ>x?BYy>`$rH3=qvT)yaqP?+Nim!#{5|BMdq*q@vym%$9yH6
z$dU+wS<3&l*0fh`+gio(gY?X9ZxtoSxz?RzWW~rn`bAG4u3YeVe7J5#9y1>6VjYg5
zcS(;QCZsmfAlE=!QN>RVnFqrxdv(M-9Kxz3Iqy%X<3G@v-W&?t%muBA`g5HJI}}b`
z-z7443=)GzqUC9dAdGLW50!P)b8F`3&@bKT<Y`aEy!(tdv<wEm&**g<^*YSW<r>A4
zPYLa*QTgqM3+Q)=`Hb*Rr+PU)&=XFiNqO$brqO1rbba<YHv8;@U!z>}+1VkiU&I81
z?b`Rej8khW1;SYFXiZzdCZlhL)}*VKh}QJq>Sd<Z^n3Mkjn>pcRim#~Yr31dT$aNz
z_1&U1{ZM_c)0&`DE~R*nnnR+-7EX8}Kfo`jo7^UFP<`#`^JoK&+S|jImuOFm_dqR`
zTt6<`_-tR;>`Tiw2y0JQ3Z!e(Nm6K=?kEN!*wMEvg$EQxNMGizQ12%3cuKe<!{0&@
z408iMo=Y8jwH9V4Wc!XZy`?oN8K!wJ%cg7LapP25pETPKo*Aw@C4PqX1SU!I)>^mS
zquOS$Zr$DzvOD<=2klj_h#pUkI*iTcQmy%32!5z%Q?=F<fi%ceyqZzOYdwd`LS@Cn
zi=Hl%uY(53`YWL1rmTQd51uY!l<|vOl&Bb48*Z6fdPl6TL3TH`@@wUATnyIlvS!?s
z9pQZ=Xk)2>EmKgBep^p1*cDP8r>_A5osky#Rv&R^)^lcI7O;&Ylp^NG&9;`jnzai(
z4OXDH1#anw)mq-BeRni<RfS;tgIm|%K>^UDi6elezFTW*Cu2Q8Qn^3pY4k0P-(>VH
z*P2#ww5?BMKfNgBRyv914!)#9f6PQ!{M^K46@D>XR<t8iWbcFv_F+K6ZsD}$YPv&r
zFrkI2PeYOf#QU{YVM_s4JfyTFp})yCi!{A`-@Tz!6l3zXt5R3(mg~KR0@7PEb)ofO
zhbnPpw(#(GGSR4cX+LsUuiTjhsMhoztWG3#LqL|ogSl-cKY4Ku$muog5dmUoJtV>9
zw8n9(x4IetV)H(<aSpy`sstU1mSL!{#VbvXQHw0t5-+ULp1!;<a~hO{hhOClsj1_=
zAYxwLH&Cz`f^(l2LmHX4m*x}0oL1ctv#r^_uTZUYW_ZYWyEha(7Sd)P14ZLv_mp~c
zC#$9R?m4x4;xoVkwXnUjxqCGxPq>fCwM<(S>eBl$embe?NOe^Y=DWAFfbd&0&kLUG
zsb*<G@Pc))JJ^wt=6AHFqtMCbw$^f{ANN+ewWf>^Y<nx)q{W?njYMK3H<jr`D2s=`
zgvN$~heA*PS|Fy)J|s<sg7$-FHFhqLG1l$0>Q3jGjQj}#p*1a~0<5&z8|G3gEMheq
zdI-$V-w-AHmn@_`bxg18p;nvipD3)N>=0&JZq~G5lFpm3g>BdeAV~>+!w!YaqmA#e
zQm*)^5m4+D8f~Ca+y5py0onVI7JHY%d^Lx$*+SQ-LVp`vNYR1n%3#8)7DuFg$kH?5
zkw6d9BqZ#4aEay3i)*cD!5|CVWu)JBGV|jnw+3>Vsg-XqLOnB-DeEdbOf&Oi=91Et
zk+R-!Suf2LB~DUz&t?}YW^v}2I-OCQiPr3mG#JkZx&9Gzr{#R466U4+79{+t(0W<7
zZ0+MAIZ-ixtxa%x*$>{Ln@2(>(o$rtLv3QEi?Y;*J0*LEwSBSLB(XXRE2l|HTOn88
ziyWKU6*L!hA7kdtJ*zjUk!Q|U4{q!kQ8iZ3u+%7@82d{A%Ngc2s!>OP*4(plf{ZnO
znln~`PIjzUQz{Erv1FMOdQv_zR0m}uPyo1S>$&I9OoB9WGH@t6rP5`5l_S^ai^k^|
zeT(BW)-R!UusvR)4r;U+TJsoHXv6;DX^l6m^1bR?VuT#tvcyH{o;=zyw)xT@@WNS>
z-X|GClIlZ7<wc28c&yC-x~fv3^3zXILOxbxKYp$M<EL8smwaqp#7O9k^Y@=6DYVu}
z8j=(u>m=in6vCR)-*R$pCnpsOI0?CJ=gq4%&EZXs%q41p)Y>rl?KzTb?YyiXl<B<?
zR)%-%oW$87ha9R&D+(mrR1OKzVxoSRWLmT}siLO^n5k9zE|s^JypVZVx(ugxsPRgJ
z=Y||YIH*B5Gxm4#k5a+dR?xeL?Jz(67)i7N^HW6)s@*W{O1>e*=qMEIKn>J4G5)pn
zvWHl;iR*=P;ANCT=U}_DQa8}3H-q)xwt`HQ-@MEWS%kvOR1*1_i<m?>Ij=<qx>SDV
z%a0y0-;`;{du`?<K_2M&65;k7{!O(lJfGt5nx|m>7OtG9c*L5=vc|_kVp77OiZnQL
zr;x9om6nU_*|<qb$XSO`WkH6FgLJz=_+;for(7m&|H}WOc+%4-ry(TzY}<bmIa7x$
z9}AJXlU!NJ^3Zx%31$0U$yddcE6FIU^Akxi5S2^7!=hyv2d|s8L=1K=*Q{0C3p$ro
zT=6W>wLczmTEMRbRtfIfu=lMfp}!-;@?03_B3Ih}*?(bRhz{o&(|(Gy;fkZD+-dy|
z0gueB!pZ%m(_O@<GXE}#Ax=UB&lB!*P@tc1PphY{M?_$Q&?LkFUuW#7%t=BF_Ufqz
ze4*5=AuNAKIJuxGmRwL!|H<$5)U+#lC|!1JO~L7MRB<ltNPL1947zuhGIU&1P}Pzr
zZcJQmed3G(5?U$3Z?y;=BK)Ezs711I?Bj79eS9SZ8Ihww7R>bA43aw{$5LR;y`mW{
z5Y7ul#jAhjj!gE098*(y%5?-5X)SqJ7ufB=j%A;%371~G1(qxzhMd=C&eoo|E-$P-
z(H0JFTyaXMj1#Esid3vX+(7gG60m+!N*5TquPJP5OFU;@UW620sg_#AmU8p*0>pdX
zILexrLYI_QTx8QQ6u$c#?94@_)h>#e*A|giiF#!zLRGmGm@HHjL%)uSZnCg{g?xXZ
zc(X8%C)Nllo0M#&yQsv$xHLxpl+?>!jHMoxk?5%_$HmIFgnHb0@u3YveQUzQ-pY(1
znIHEx3=M?VguQRIGzzdXg<I6qC6>YHI$;(PU75=SH?JHA9DWf>RR@f|F)O?@lbRmL
z6mdB}X2l3v0eL^y1}b;}{oFE)S5s<z*l{mxb@VT?faqUJ(7&(=?ne*v78aXK&Iu!6
z{SKaud+D5~#rcOo=96`!wGHHTi9Puvuo14zlJ&(rtQ*Iv>)2mNo-~3aKJG{_1*Z#|
zpL)O^4*!tyw0<Iuib5*bh5qZR?XvqlyD6wAzoY7!o=qyndLFPTOH)n{hq%F`t%Nr<
zD`3?^53)KrC0UCiU+Ful#jITPTDz^4G;U0~tq`CZM~){Zb$YJlofI6*9LTC;PJ4|S
zPL?!fBF2$piIX}#=k}KzPsz;l#*w25q6dISogQEIn^|3ud9vRom+@w0U{r+|<ld-Y
znUmL{G}TOW%Et^_RDptg=0Pip<iPEFAGD!ZYyt9M2-By4FStQ&XY+FGo0%vqz+Yw9
zRh3#34qmR1dt21KU(_AOA<wdOqir1%iBtrRMq7LgwI)EwMZr$nf6sq9`|n*@7xrZU
z&elIYo4HwKUU`}*9)+@4RcC<S4;CbEDhgLEDh+7g{;nz!E<Lkye(9O<^D1le;*+%}
zDzzu{yx^e~{<594dGR;~)G(|d>V7_2wk`3QNF<ddiRbjx<>S{Mr-25qH|pM`zL{4R
zG^T$8?U!qcg7~RM8gELj5eg7##<mtfLNX_}o+OW=)&k^^jHh)ZspREF;bgrx<4)e>
z)l(1ppmgg+5QEGqOU$Zqt5LFQ&8?i!qJqH4P`2E_#1;kwrgQJ&XWWv{K>YSM3;ssK
zuGy*ZIX;{qLX{=)DV5jf#n08A7^yuG$_wsVF$R+GwQ->}?vVTWkT*|qYuwwgECTlJ
z`IQ&~!tHo#+^<H<_9vbMZjB$w)MTVw`g~M?l>bq2e7L<cG4@GkYEL>-d(xTOlQOkf
z*^7Xi!TM&UR-N<d2ALM-lUjWe|Bd$iXxa0~cA&;G3|~c~69aSD#afqhZZ=R{&`o*4
zW#bMgn#~E~`05VW=$eN@#&+A<MHe`{SUwR&%%97y<A{2S6bhl>i~_AG0WPc$fQD8d
zhHpq0glZ5Xek=L9`9o))c7<A15l=nqgP!6!G1l`Ujf71&Uamh>;eV3CsM?<Xh>#lg
zP@EG@l@$$cll|Y#5Rz&L2W)rGx4S5uuQea$(c^iNqb1L|V0}tx3_$p-L~h4t6eK;r
z2HVXU-lXT}>ZK^@`LVpbgc)SPzuPwaNx(Slc>q({XS8+USw0+ooAi~}BfV_Qyh)4&
zzBe8goPXeCimVBbIc<7NQ{K{<s(?rrfks<s#RI1xajj_@BWI?RXh6$jcV=)>_nZbT
zJ79ZdO2t0johdyi3zHmYAC!-7#vB?A8kb=`mpBtRtou+3zKYzA{Bt#BE&uyDty;!Y
z0q{N&|4K&@9se@ZW~C!Hrp*(bQDW430B&1D!TV0nWn_^l=d9?557@Z7HTuXA7Rjxs
zX=C8TWXXxi^1;bes5aCp=*SJ%*M)9Z%{d^-KA+gp&>RZlm3_(|0mr2NthRvovtWSK
zSW9CE?1qIrFfT&m_9NO7SBnGTJdTh4krj{z9Q{MfrE_D;rE`OG(t}6$Lx8PD#|4ub
zofP3tR)z;%b%vMCbH;~*s58EBUW*J6J77hx*)=(PFG@^SUohrri{FRh@u%P=2EXyU
zbkoRz^%kSjm6)%arUTgS_$fveF1Xf;EwZ^xX~9|!=fS%(pZ*f_29<aRL5332s5Na+
z{uK3Y<YqooI-5?xN*P#VT8OJv?34#DT~9a2YL)G@4sBMw&yivz-*=MIjP;uHE{nr?
zyjTt-j^eS#dI5us{EpkmGEFI9{aFg9?yr5yK?BcuQoL&Bf%r+fsVU1OnXSi4N;zXS
z;KpWYHrRm8lJn&r^`$c)yysIQ#wt!12GcpV)3f=`1wg;QmLO6{>Q9ZCBV)nc@eA}M
z8|)eDd=MQ6v^d^r&shIKB4k`5zRoGnB5*Sn+yyzggl!<oF>wxneZ`>MY1jI@%oZhy
z@(67%zV!eHP)R>8Gs60t`u<285Xh9R7xvs*GfEhmlqq@KYzm)iUCUmh8K=M<C-Wi4
zk947B6Mn?$b=x+WPJ7aS{i}07g$!dBpGgC9=~qm=6!MMYQDn%K(d6`xAhN(f-E}CL
zM7f^A$9R56?|QQFF~(rr;&XL|#InWJ*(h{U-nKM~pgUtrW3N1@Q2V~BAVk;UnmQOI
zdKyD=pa4$hf6}2diQlNt$tT<REcV8DK6>K7Q%@Qy%T)8X{tVB*)~T_Ky3Qgp*8%$p
zHE!GQ{VjC5_!3%>i^0RBfEW8GLENmo4PA1iOoEm>nehs<Sd-4oUAF&4Rdy>|?G$*o
z1FWR&e?{^P;)EpKIA)i2C}s)%WrHfKZe+7kQ+A!d=`4_R=uPQ9YYKSVzbuLdoeiJ{
zm|VFaF{71&ZysyYMp@lix|4dsN!2>3$DPz-C-oC2wbV&{*Ga8(QV*(>*`NR_&EDl?
zJSG__&r477P`vLv@}E}c+D>a6KxLIoStX^FleSKi^KvwG42#?x(>%mFjf!hIu`PID
zXH8xksjBBzF<vGzXHq<6g46z$EgK(8E7L%FJ=hl?VO)mGw3HY=u&O^({Pb3<ji>>#
zx;dsg3s>16))Gxv$@oGj;h)v=%=ir_zo&){#5P=4%e$VEE-N%#Ml1^-pJEo53DuA_
zKKN_Z!gz!kPQM~Ky8J!lW!Jb>>ax&VVMY3Pu(L0G$^j*3I<I_Ca5>SM{#`+}W}k&`
z2?JlS&$xe-D{+>#ZXUAH)A%Kh5kKpVfrba5O`Kgd2eO<#j>eg#+PWH_5`^(RUOq`l
zi`Gd<4WQ2u!fE+3)1(BuM~JKTM1ePRt~m>v_(&k6=BeWJ5FQEnIE=`651R?jhl+8c
zn?%0YsX%ryTYip;59PpC<dxznzZ0RvEua8oV>oa%a+IywyT5WW2~frbb&kH|>RRi7
zAz%F3FBJ_@y8HAFR%+We=Y8V{dC#unZ6dpKe@;BC5o&8}wJv&HvbI{+szYk4b$Ryr
zin_Jms(MU|jq)}eW0#-z1tNvj8bi*Pv320a|N62I22+QD;w-3yq<dLf84Z9rD3rl-
zzWr>jW_obV6X>Ba?QS_6&6lCtsp2}`t)I_Sxa5_|Uo9EM*8nKuBMH1x#hpB?2LTRU
z-9Y-22<c~JZmDrURYj)#j7J87_r(bq(+Z_K2^?2^T%+wNPG_1JA9sfc5@P$`C12(=
zptw<URs2I3bWrh<ocMUie#F=?UkRIs)S6i5vnFeeY10v@^Ry=6LOVSoU-RM$w@jMI
zD+W)^&kJ&!#f#|4_TT-OBn}9sl>>3D31pG4m#VLG)Ym?RhcOd9zxeTDmaPO$<0IG_
zI9fe;eA!a#7JSt7s=`Em=3U9SnUmc1`&9isR#-kJ3+?A<dH)FMx91nq4LY*o=T-V$
z(y`zt2~R9&#s3;JKapuq)}3d0f1j9K$ezgjge5V4NfW8!MLeu^Y<jX9oUCt3)^EsK
z8^NDNbD-nn{3V$<v(q!K&jE__p%<zWf^Ky{A9&jSu|F5IWC@n$ET5_eSw6{P?M~N2
zs<w%R49k|6t|cYr<DyVX&r+YZWwk_Mb7Q(na{BkyzvY8+TdisUO??$VKpL@5cIqK&
zT#q0vb{@O1@fd+t%h>2M`c7H)F`+^9N3eLr#<I;Tb`1g~sKg02hA7eI&;uv#*f)5H
zTA-=4TKYU>JqG4h^f)9`Yx*z`Me>zy>!CY^)Pgc1ph?Cz$pFENjcGgfDO{S*herD-
zBi5RPoa(9b-a(HL`s*mSh+&>b{wN)8mmora-$fUA;%UvJD2T%0Ln)|YDb*)0Oapmr
z(ro{TN6AGy_a6P6Lknlpf)k4HXEeap_YYXX2-*d#%2xrRIQ2ev5uFKC`ljAHQ!+M^
zK@)p{T4+53VtBF0U*Wx@Wt+LYB<3MkC)PHY;V)}<-(K3K`dX?hmx1lp7*#Y8!hb!R
zQ|RPy;Q3FJZd!dX=FHf7x1K9@_y(3TXSCxCH!012J~KWz(<yh0WMzZKjlqC2>tv2?
z8i(I(6HQ;Zw0h0(P>Z*|sv<tp-l$?EbmTW4{uKBwdq>n#)zvNkU0T5sTRZ0nD3oQ^
zT$HWmPKf|0;IsV&KwLM!t588i{ZfuQF_;o$aSW#J#9(T9W!9C-;lbcB6-2F@001}=
zAMGS(JMb81O#8!YU<d-EAcwVtJ?8|(xK%c!h>PH8@f%1u**F!7H7edk2Iuxq84*ju
zQOF_0OQCaA5AfMp+NX5Z1Q>MO%0ck8&LYdSBEW1zE$P%Zx>%3#tUq?O@CCG-@QT*v
zPT37f&mu1?=5evv&F#tJOC=TDwLHS+BH+~(y>@-)blWv7oLuJS?E=@ZEz_q+YG$})
z*$g(*B&lF*tR>(=uhWb~>Dp`-e~R9YJM(zyty<I9Wp9X8r6Q%GREyOGo^+vcBJNm0
zjr*Od5-nB|+^VI%qh>JeB`T}Y3ohL%0|g9=P5&>**HbMrTIi<xg`{8Nx*;Vl59z5n
z&VU<ky`bTQL6;93G~mK74z}C$&y-e-PH*tJRV|qz=D3SVV<g<X_rX<|E0x;u#qu~F
zza`WYaplEtkcXG+GP9@@`}Uux9Td^)KGIXgqo}HkCv|f(-kIVNs^guhyU!(<RRLB%
z5m#tUgjv-1S|Y^c`}D_BTWh)lGG|AM?9QmYIcjY329K<2ikR<4O_U$go*p9On;Ntw
zIMUSM@%XTYSkT*$ZU$T-c7oV|cpH27v~mMvpW1D-e+Eg{!WiHG{Sg7ZrM69tKv7qG
z&Uk0cLA3vR^4uV?AQFYrWOZhk(dSNh<Q?5#Ea=M`g4Se*xe)}m!@;6Vu_~^276fJB
zFcq~Sdz0RH1blF5-_^-8iw~eCwEh21RU+K5rvyLQQvqzlQGh${iTysIIX&87UtYN~
zGN)}uzghvK^D%d2a8Em|h3o0jk#r{GDOGA>iNA<m%xOQNXgKw#1-gfWuZPS`NSnDo
z6x^SH3+umYk$Y^BQ*zvd<CFST{Y&6f9N^N@IR}#pOtIZM`<?zFoKxkQNVoS+kV8`7
z9Zvni8Nj&V<cGMq)@B|J1&=1E{0|55RWXtRvU6eQ)ELBvl3h`Hn=Gs_{fP_2hl^1>
z%8|k-cG&*w)F^(Q9YwPoHRdOb;?q#@Q&9~3!%<{;!9jOo%8!<%5W{>9jrT>dN#p@#
z+KC_dHtWtW4#w9%m}h<@Aju7;4}GvRn9oAN&k|3{U|0>Yz;c$PT9{xb%-8^rCju`a
zY*VxItea8eu1($S=8O*n$9b^Ve&9B}?h|Oy%VPSg45?|W=zwzm@>#QRk&;7Wh}{WW
zR%#p>wQ355{~(1a<rplFXN)jiKXNiZw$A)-W#jxE(%3kE;<7t3-*bemeNZFEW2jn2
ztutD28_M}L<n&p%ddi}`T<V^hpSY|yR3iH#evw&Kb|2=t51wcJ74bzkukne4W|wu+
z5-yE96Ph`rq^a#b&DeL07}}XaV^&E33kBq4pV&;xU9RYIlE_vAoN!LwkTV3Me>8C@
zW71z|uUWUV4cYS^=zS(2{@c|I0)O<a)-<}O-*3?`b~tSVN}K_hD<5igwkYW1K|-Jg
zJ9TBA^(rvHk1-@y?`joR!_;W02D*&Zy#;V*W8->-F?F9SzW54r)V`kSn4{lBug@Vs
zt>ya#^4%=jr<SOKOa8pXN!CRSHWciPPqepiG?!*DgZUtF3PrfJv&J|dLt0pF`zNC#
z%AkR!@i%GqsK{j<>81QSixdRd(yA6d?yMCEK@?x{L|-Ti2Hz^4=&Epf7}W-^Uv}O?
zdr%?IeG}r-Q?WN{9yL~b^Acz3bz2;oxJAb-08#&IpRkgtqAooNYd`4+>M%Hy`(LBe
zXB;VA)vZo%XTj9!F$f38=M#gfLx*oQN;g3vGkXW0>k<Q2hVXPLP(_T|_67@v0ZbVo
zM!3nj-<u~33E``wM<EEy|14x!?CCpvqW^oIO242I$kQhZj^VgHC5G7k3MsG3>?EkC
z!lMCt0P29u%C^&UgH(2Rvq`#8uYLN@q*!f7XY0U79LNKD-OFN0LYvcW&hSi(wqE5J
z;{Mc%6BN?ndo~bH2ooON4R3W`9t}s0RmZ@^0>XOTw|+9!tRo@}IRs6!?%qAf8lYAg
zv{|r}qPE%UR85?hJ(>QCfk6aE3s&FrC)D#_8>ripDUK%RA9H1fSabPA?c!28xBX{Q
zDPw%uqKL9U%~L_2$#JtkXP-b~FSO-#(b;~+i6>lCN*`%WBgiBWdVOF+0;{&~e*so1
zhU@<(7D1_py66V|);FHbT~%1UyVOlv=HC851Q1^*zyL>~y*d_rgV1@L4BE_gIE!7K
zCq^kC9zlNqf(il<oFPF4yt)cNknwSaE>Q=Db7l&iEWlxP1c3#nx6D7&{$Iou_=<BA
zrulPG1@^Ok;txD1s=&)+;pp}b4^UKV>Q*n954Z6mQ3YzOMNB;#RiGK}+KDQ#cyLsK
zg>oW__-lzRra1O5vCbEONmK!0D6IggWJ%^hYcwzLXj5ruAfy0|aT|e6g5!ITYfSi>
zE#cE`fHDwK;6)5*Xg5(|ZR0IWM1iw0gPgpjP?Z{IJwa}NK!M+>#3?d@i=>_tP@sD7
ziRVPdD2EoYl`8w4A0|5<57sXj1N2J#92_}0BJ;;1uA3MDeW4y#LCkzMPTbyVZ%y4C
ztd?T#X9-smoA_+Bt^?xeQ=va}ukN1Z?FqTHcoEmCZbEwLkHp+vv5IGi$>|&y=lvcc
z$QUN$aL73L@T`>twH)H5B$mN6Qk@9VI#}90=3(<=oXsBOOxh)T@M7jG5u6q)_f=r4
z^mY>0Dqy}8HoJsBdHQ=SIHU(y3_3!U-T=Xjdxw({9rEyC5_wkQzHD6f;U@s$3;zcB
zM;QBY+!<9W&O6>3{uBe(?<KLaT{YVD=WdIcr%giV>Z%Dow;W5j#y4FDYEnN%MQ?|;
zxFt7nfbe^z5<$`nJbZN3Z;P|IguC4UAx9m8U~-xDigjG%rCB9<-GQF=hoE>*p~viW
z4W$cpWFuaQ%+u3e9WS<irM^wzTjtFQyQdxJ)8zf$o_3$slq6G@$av$po^&T?m2m#^
zjX)4aS3VrT@09bz1=d-A6g*H47x59+7$>z*oGpgK4xceiQ9w5IR_i~Oai9~fh2FKM
z6wPyBz-17o25YN4Ix%OI+FiI+G=K2mm@pQZJFFkpQK~O<ozWd&1nJ9IbqN<X(Kvn_
z*H?1~KDNmBQ;|)HR_Mqx-N-XV8#9IMrRQH^o*{1_J{m*G9cX&;t;jc-6{JLK`bh8>
z<^{{6@|L{JDWcitFe5w>Ma|9DsjBPXF|BzsCAB9++r}DzfJ+8&!@2ixmVVHBqsK7%
zyvwf9p4c5-pO^hd@Umygu3k1??|s>LqcA=sR@Sa3eFVQDHdWNvcUiPOJtR@(BnnBm
z<0I?q>({Q8i!Y)#N{q!%#SVE`%Sf>a;&!#CLp#0NC58AeO02xoT(0HiQa*VVr{PsT
z>Q(dH!~grJ&%@$>l!sUKCH7=~koCvWI!5YR2Q~O{s_?Q$QmPV9OA-g<r!TSVKtoZf
zD?OLR`24;LNbousJ-?-6T$FVYc>yjreKO#M@qFCSngjtJuhyDH%lUXdhksXq$RcU(
z28h;?$E$-{h1RO2atolFArxlZVDGfVV<T+N#47tb9~@#|A=eHwy*VAIT2_Qd7jd^9
zO57|J4kE|P!7)`5@2JFaE)q%XA;D8mU3k2gx4J!g`w@?|k=(Gk2MTt2&7FH|WA4*l
z%M@ZMvStrV+nO2P(ubx#l<;U9?kOp5T&;qcBu=F_Z`{wQh&ks%08rjTTDUza<J9cg
zUhN5GT9?!^qlBL|_W5w!8alJYxZNw^Nd}$t4vWJXKeyC}A+~oOA%q<bO6WT0fUec+
z+6jBo8QBL?+Q|iP%Ly>XI*j=QKAe@-v%EN)J-r#deud4^)$$wOf}Z0@J(}?d?`V&4
z0Kq%$tro%_w%Z=#T|zZ|_fX(&<c>RgYS)CPcppc(xP-EeN9bquy`!xk(J~z@RUOE|
zk-nMFVe>ul$i0-;$FbMANLq(RJ{w-MWJ)DEM9M|-KM3u@$o{GA;g-7=V&XFjJRWX#
z^zM2*FaEgk*72BmFtae5e&pFqD2Uzu^gR%aCWv6n3CMb?)r*NlHeyJT8Ust^O7DXu
zf!n}rTw-JGL}XxEMNBJZ?wMsasVPBr%d2w<g6oA^hY6B|%fa_16k4t|vGSpzOSnY(
zClWH9Z}SYbjL6jq5i~C3ekGc^HZPJ|*c)yMmk*6JeGtDjSAYhpXdr$S7H%~y!*bcw
z(d~^?>60o|p$24$^K&1mbBWX$N1ZVPb({)^s48_X$t??(<*#Cr2s<}LY4C0T=@4ka
z{1#xW*Ufts&!(1Dyi+K+OZ(0@c|}E<_Z?UP_nUOuC#x%yZqS-8<RhcW*P6bIxWsxD
zhZ-&&CTf;)Z$ZY>u&CU7BwDu#1y7CnVbr}vPev>itbnMfsF3BZQWQl~$7)UQ%ljpp
z;>F6a6a`Uw8#(ZAmTq@(Gq8MgG!@B{0AslBY|hU-$i+bV*A!u9YDh9O*t}Yqn&a?E
zBiT6yTh!?>%=WKmN#M`ws~&hYehc$D``flXcv5<NY{LV!!{VohTPEgOUK6Qp2~QcC
z2}XmjC5FrAglCI;Sf&hwae7kG0Dr<=kbI=o=b8y)qREc;bn!}C7|X_jcUjs)MQno%
zyJP^4)egM!GeZRyYWiXGtw`Cs4G%2DTIpFJE1Iq*x$DMuv&Y?#@X}oR&rDw3G-Nd6
zaKY-)jBeRU6tFjHPq?R7{?)bgDgp?-tvxY(y7m;7NTitg$yN^r5}mGdsBLVu(+OI&
z+lWB!6^A$Xp3H*5W7F{$vpZVAYvXYKs*!8lIhaUpcuJLV*q!)7?j_Pv*`CbFz^C_>
zEQIQITld`oRz=>9nRm?zmA&??g=uY#xkb3rirwlj8Av31^t#8IgdXe@Hk$kYW-4`A
zjSO0b`wWN^?BH4!q4cgM+rA<TNP<3fM%-^FSC#AOf2B<G?hUdz<HZ=|pYjh8a-l-V
z+XfJli&hu+yx`>dWY&j*o8nv+yOAgJ1@qFvuYi{eVOEX{VvYqd`J)NG#85sLr2m6%
z1vmfBGY73KZtih#6Nn=lZqCml=g*lTa~)y(Ph;Y8eey#JfS?X@0}eGApGVT5nq7U>
zygfwq=1*~~i9n^CeITg1Ci3#2WL0iOTjrKul8Ffx`}*rA@Uc2Mb1_S$cW#uk00QW?
zcH9nb2>|JR2)(PGPRSJI@(w<vVv$W0pn%s4wTFbc$xO)gB=n&luZyrF2c!-N9n@w4
z1r2I~pT)gV__Lq<lI1;e9M#9GSle80`$rmb;Cd3LS~D@ya84p?zIugHyV4<av_{`u
zi30QW%>RHNx9}-_E}7^U##$AmIAe+is{R-g2RS2+O||_OdN<vejh72sfGR=`%7If7
zsXrvg+xvRmA;Xrl@im&L*o%|%|L~GM8?n7`RqU0s@loD_)870@&PGIIP~g3o*((7I
zW2tFxk&TlWyujPF#4_w<L&gGL<Bh!d9sC`S#y&Y3wI8;D1*5DLv`!~;R3~yiX0C(H
z_&a-Nt*Y7+4xkqqiNQX%X?z(?Z2}+ot?~WCvMN*?>=(Yzf-H$GtolyF@@E{f@ND8W
z%Q!$boxgrC5N_A;7k9X@jjEE2#+vO^%DBzYX@HY!p3mzAqv9Zc0BtUT_LT4RwN4`s
zP%{?>Y$)%HYO1iIC+QfJ6G)a*=|#&sl^NqvFJWEfZ+}Qsv(0+&$nqj<n$({l5P3@Z
zw|{}*Y2N){?922^#6V;~<}1}}h)0a&`is?Tw%c2+s_VhA%g_ci?_K>~wy}P#ah8Qr
zbIaLWtG`W``a@|sxXxA7E+NSL9f1xWa@X421!WNJx$==-D%{s%G!+ewlQeX05r(Wh
zYWw}8W2ENu|6FU_FVO1DZ_D{dKPGly=UTJK$TGisp3eD4KO$x)k+p;Tqc_06ilUMj
zmesH=^Hw8gH2)SrDOptpoAUd1PzKH8WEj2p#8_P$1<$3RSSlO)ka-SyYVK^St#LPX
z%K@K}$hs66N|8`cHPK?vmfGW`_81j&cB2HERX0BpZ1xB3iY=H<#MpDKA28PJu+QMt
zaqB*D*dgNox*4{3ipi~+;6Z0(4SUY<>{h-(S>JAaO9@yb93igVp(kB{otsdB-D2_R
z{vBWBf@t5=+7%~7wWl_*yT0q)cM_p+zu?NvrymS+AwxKh+zTB??yDGxIB<UpR#2W3
zvd=fN`P;J3HQ8sJ9>tM+qV!CMM&Basd&^n;oI7?%YpNuvoVZ_L9gIGlxaCgJ=);M7
zoO-z?9#;<BFRE0|fg6`-3gN*02dbsTaXIV2E%#ao9FFhynfPntTlLQH<tP0Z$FjLp
za*5k^y2s7Y3Es_3@8=DF?e#kyEco-+Xzm5_LcN=nv$lu&9}LG+8&^=XQ)$?cHN?G>
z5<UQ+HQ{s#6E4oesskNo;bl&9={M={b1e<jjGu+S)|GuQV{LLpt=E_xmN+qsYa+Ht
zv?oRdF8-R(n#=o0>5^)RP<TOGx{@)Hw^H&#4cw9#+pFaR_bK8HH=f1ka~R0G((_3e
zefUeesbuus{@`w-?+%BRRDRNbqL9&dk7Fk+KGJo{N4n6Kvm@ce^)&icYRw%q)Or@B
zGjr@N)G`uAADs;J7%%9p`m={J0RSNYxPxuPuF4FvyTU}<FGPN()WNc?oF01me%i@7
zN`KJrD80yWl!nv4Z+^j5cqh#%52da;h@1IUnb|q#=nw9zjttMhV>*6-R@eDifPo5P
zozk;8FxVYhK`^~k78C$E?$GAk(pc6J+Da4(eiSY5_lG`TEv>XdEX~dRPSB$rCupC_
z8{`D7(u4h<KfwRlQvT2H6fOIL|MNTeKXU~*`v|AVBFFz(e4_{apJV?Q{?F0^7a@-S
zGrL`nG-tFXB5c4U;qw$M*P4_|04y&bx46sGM_9syFVt}K_QVXq5<wz7!JVN=Q;qho
z$$Ie20oUinZ$cg&*JoB!+@3RDsVe0hx92SgA_{ogQ%4<-=T_T4<$h)dZO7ADXX(pP
z1`-B#3$K%T4dcAPYk(51;`Mwi>-9Wd`TK^I<MVfD*7m2rCG8MQL+l{bz;iy&H>>a6
zgTFTf&r|Ns9|-?1w0$o~0>rD?Sppvki!fhnzJY10^_wC%;9XuQD0d!i>OGtD;yy`~
zDaUmH63dJvH$Se51Tq%)HnFe@drq@U!)1$TwCp{K<b0o*Bc?uo4p?hpJ2-|OQ?A0Y
z&FAnbr&m7fYBd6Hyo9O+S-0tI)pBc|a4g(UD`3ox-_BiO9p+v{)h7PK!)=TnxION8
z3fMd4Z_!xax-GjK5*L{B9!Jnbkxk#69C*fI1%nTwss|JT*6*%z3fqZ4WC#_~E6(TD
z5?nAlT4$i9^T#Hw`<>DPMjW8ekO9X}9cbB^?XP+nvIA(E`I8W1O&p%z{GmFr#o3t|
zh1F5UHeBeOQk<XND=4srU<Pk%%`>_E!FN?1gf(ji`>qP(Aci^S4+N+`D-E!(@m&=L
zV}M&-&;fo#<CXj_j-So%5)rqLu1Nesk@CzVp@zyOiD4X#k}k@$KpA|QhxiSskXWHL
za%Oy>O}!}L4>hdJa~!3`xB3GuT?<W|TH$<foTTN$XPQ!#PF<umT`UD4t{2D?l6sar
zp`oYCb0ynSp2Q>3c*+U1P_R0rJ+Vz4N7nbtV2yeJ8>(9Te;v2zHQTKJnaxbeSsY$7
z0hNW~nbdhN+x*0$YbcssgY>_^)G+sR5-<!ZjD&1%IUm-_2a^$yPNU+rmAmv)oBG|Q
z<<EBZyG!4iYv$Cfw>0=uiv*U8$_HaRw+$H$B&$`<(X`??N7ts$b}9zqAx1GVK84@1
z_ym5><EEnFXt~xbA-rk9n?8<EB2A?~b6)b&5~xj}UYLH<$;wYlU^W5NO8HTa(Y5jx
zi(rV5osEKH`cD+JzWzi%f7Sj!{8hlp#3SjSb00ZycbU7`b7F&Swa!@pG*Ms@khzx{
z4*w79pSc<WhQ){ZqB5B|bp;^qlX6(?{8Iwri9wbSTTtDmUWO}!tzyFfKlv6dI-%h8
z>|gh3SmgB{bMB&1apxQ|vhsn_L*}%Qa;J)P6*k|@N>?RT1I-%&msQ(8y!7`V!Oh((
zmj|brZ=#OAQ#W6anIA>lk0DZBxRxxmt2)|M#G(%os7jPT6+z_r(|ku*`miU=ErF7i
z*v5Pie|u!5Q>=skodbeZ=ydD|OXGnPV#%r2#}ts^bPp7~R<ay5Ypq-;IicQfzA5Ju
zf(1Y|cSZ8&0KVnJhb3gY=&7p|O|JZf1A+}DJO<$o^KEnq%9rH-NnX*`W#tv(2OzIJ
z%+~r}$t!5=`+dE0b}caRCDkJ2EJPX#n-im^WgaB#WV|S9tW?9z8=0BG-8zFJcFMXM
zB-l<Jd(9ozIQkWR1$`&{M(`X={)l0a{chR7l!z1CB!s3LRfP0GM@w=RF9NCTAJh~4
z{Jbo6V!Wwap8%_rEcL&MH-&TcKH0HKo|5ZLkqMUYf7sgoefCMwe<|wB@!smlQ%C;N
zzj0c4{i=9V^U-`r1OgFCvhk*N6SF8{J|l#leOc{<n>vGX$Rur;ucWTLKAgJgjA$;>
z6iU>-p-^uEC=8A?wdS9kJne}SB296jT|_*XcCK*HYu!d6eAbKdLhb1SxmjEsG7fpU
zX_5xbZZ0CVrYo`{N)34;vh-!szs)|^W}lJl^DIYnX`YiERDbNLlk$btzmNk*#h%&*
z*;Qf-+Cp9sTSUdE#Fjs+7h+Gfv-nDM5q4K%Pt8`br+%isBf3oBB@6<D`(rgN(V7>C
ztfXQ!U4Q}y@+YyHdXR4<R@3}`ekASZ>*r%uRpsQKa@C?#9=`k(WT0^Bp67o|NPKui
zCumjX`x3DVswvbmEY=U>)@_tU+G_oAlHv-uut?twLJy7yg$1Ynl`*TXVK!h-HfGfw
zsx=Ws{%H)Y5VuNe^6`?3UG+P*yCdfiA7RTt?5Y>j@5_PkB|)e{>cUWkrcpCd!9OHo
z(bo|W7Qt<(I8?WNE)LZqSS0?Y(}Zkq_YIf2O9p~aMa*OA2k7zh5vWvb0nGg1m=^5f
z&wp@aiWD^vg-TC9N?J)(mDJBgq3Z09LM1G>lCCy^2K`Z}ex-0?Y5W!?Vf|iea(t)&
zRiX&(k3#hsjY||Ne4_R`GZ(4q)OHbDSw_y5e-w!7_ndw?`6?TT%8{+u^Glx+#Xux=
zhcH|Bt&%uYXhxTm&KFrrz<X2X&YZCI_I+2W(&6Fnq7NM$i0Y~{vJlmp8o*f2{^~)&
zs0s;2Rfu%31Q@u|YuPjcN=N!q4Tk<!&KLNZoFMl9O+>1p5|Ju+T$_Dd!Wb?6vVc@4
z2xJ5|_>zEBc&TS2Qaz`F{^<Q7sU$R*3P}}iei!^lJ{2Y*Tv<lU01{k6fcfE;vh-)%
z`eox$U6zeU^&{3W*yn_!(q{Lu`}NO7qk7?aVP&$Rg%(p>iDeRvN*@%B>Vl^ovCIkA
zH8>j8!*{V`|L>wv9YmpP`|;|hfv=24wOJLqU~nNtm%b2<YN~@wM54-g99k$;G5tP%
zbdbWqQK{yq4?CHIqf*UxqEf|FRH|5O0L+r*RI1u9i%O*gtQW0+MOJ}q3`C_Oj8(s6
z_IEzg_m@Pa%GO>?0WnJas*qF*PY6kM$#}J0J|B{5q2lkYx8X?#LQ)A!xH5B|dT<dc
z$7lv_Av;jjJyyS2sq8`-2G$l7YTmu_W)+s|dL`<u7dT`G`y?GG)TF2rY)UH7rbuX7
z(=`wTk<z9n9f6Zla)5JOOR;QpstYMJD5h1WUC!)(7^-R{H8_Lz4^J2JCQ+Z907xU`
z^p_7s=?@_gkOp7+9bP0<)gH;<llGONs-B?4SB9$kF&_tos#+t-JAi`|eCmEl-qW8H
z>U3hLs+-A4g#u3Lt4YY9o%oV+P%1N~m5xm2gsM`S6RY$ywFv1QkaH(Y72>oKx737l
zVX83Y(~?K&-aO7dimnVWPK;8er?Gp0cTrKQ^z>FW)US+Er6e%Xe*!@#N>y!Iu2=d6
zF`{4P1hEDw_WveI)pa!L&0Hl-XD;VAFH<e+Qiz&JqEuDnLR2jgz~qFmH=UU|OodMf
z5jdm_z=Tayz!(To)hAHH7<C9-TVZ0_7o$~e)CZzf{g^w<e-N$8iay@YvA+0kvKn8E
zkcxTffA-(O^z;3QSaamh9&r!ziu#*JZTy9;wzLJj<Thrk^%2cwmGrB4ZH0+ho$gkj
z`K!B8=Td6L9#QRJ=lHC3KR4xKJXRjU*ohWq>Sad=D{?wlr6>HgVQn3MWah*_)hoAz
znCt!@_Ra)8>grnjce0Qn3zGoRu*rZRQ3N7H4F+sR5}atFVH32diCG{uBr%y0P|!ev
zC5(BcYFlfyrE0D9)s|;n0IP;Yh>8$gQEN%9+Fy)I+#o74|L?i?H<J*8weP*Y_j#Xx
z2Yxx{?)RR%pL_1P@+>cc+H8b;JN1)p&EvOroS)6(iGf{P9LTQGdQxSN;I@9w)l2xQ
z<E-3pF0(S&Qn(uCl24H#%(Blv+Gk+FNvw7jec*6|Y}Sh2?Z{4q_RTEFrmFz`Q^@~u
zHw&4<?5PQlGl%$>8G0PJFHDaLP)!egz9n)f-So&C{{rnTil>Kr7n?_zdl!3K=rv-y
z*iVOwZ6fCMtUa5)#eFr`W5`R%%P=qaKl38a#oe`Fi%0_sJvg7_o}ZRS6rss12DK4x
zvTolr^>bAL>r{65C1c#o5zlk=OYS5FlOHO@S25ave9I70(og7E2a(m2%~F<dv5N8n
zD0qBcd@~b6{cJgbzn)+?o+Fi?#X;O-@bi$VJ&B4$0#B~D`v1*bRrLye3n-4(Yb~5O
zT7JCfVh6Xj*E8@w-SLW)Bftq6rx!=PV@GAcDH!3~B(uodXor+-+6Xq;?OSMwka)Vh
zxF)Oj*Mv+>3uo|XdL*sL|JSDT9r|fwL_w`FQX+0`G)50)YL;Sg1#rYk#0oF}WZxW#
z;C30qP}$#9?eI<X7JsN|Au{EE+b!gXkx+1Ox3lGyDI@82E&n`AZcHH!?`;}BL*nv3
zOvFz=CZvDPdS^8~qH*k_7<pW1SM(Pzn!BZjGFd(Lz>FBeG7uTq?t6iGjntO4@E#FL
z4I~sk!P)AqCdRqo?FY%QUH?7z^TIj_Ca<P~(9=el$#!1Z)R7#bO7oeT;y)BZJ{-Rb
zD{rwSrCfy=oq3bmmy{Pk9Sl=#i}f?6Z=TDbX#|tUNmG&X%dHD4HA6a07P;=NlL3|u
ztd#v1;9W%GF7*bYBloeyXD(FrL0<LBYS;wnc`qgN3;&3NS%q93w0?tkeHDSVoOP#!
zMXlgT#Is&-c|zsvV%_DD(Mbk_OA~<}tG(8aT$!E^h=?6Wlp;_E^Xb-B2^9aV$kv^=
zGkb^=X)9kmRdN~B6t<S!Bh&@a+1Gpr_R&t^KM4U5c^3s<DORlbht2cW-O~Bl8>{wJ
z{DJFKnmHnwRBA65k$&zX>x2BUL$Rv=8(gR00&co}2G=P=bDhp6?Q<x}da*s2odMS=
z4y#?%A&b8O*6MKl9Mj_PD1MPaA7(Y;AQ>nMd$2zIr7nZyUpf{#zI*VPc<hPuW#4G7
zj5tNdcW$C}MO`q6lJ7$-wJ9}H7L79!5q_1R=qr)&&Kq#7%FqwKjIUpo66GHo$Z}72
zqbl8(Jbjda0n<kdh?%ake#!+3tAn$!-9%=N_e~t=XkerbCLb!&huq>MbnV?Xxk$!s
z<8%Hfa~1b0_R~O-4r9sT4Xob)X_330I+c5$O{<&5#CtAsnezRRnO8rfaOZJld11@d
zAd8i}fX4|d1})DRkbI5yC*(EeI#FA9Sc@QI<?!qKo^r(M4gCB45_97p1k^8&a=PSl
znA(yiwt@N$0=QO<((;Hd@2W4GF|YXBs;Mwtngfq-#N>DFsux(#*ZwR1teUzW$B^|Z
zvBo#n2zoU8<BjhIY&x!6HTBjWc5B40Y}M4J9(Jq6ZuY9Fa5uwYZxXw6S53X8huu1{
zJ8jj}M<TlY5f41YRZ}0vjyY2@;mY3DsB;^*Rr0Lwwew_6qb>=j_z(&Oir9D?HC@_Y
zqD_W+N3U+)M}4N%PoKV*c>U4VD=<nK{hoS=`bR9|4gWA1s2|30T6mbgU@*jOS{UhA
z7l}f}zx5oXZ`>6cq)QncWZY^dwrhy3E>rmmWI&B4bX|`jn%bnsp0~0ks2QSbyNBrO
zM(Y9N!q5;Mxu1yqj}hr`B9-{ER}!v%Y&=G)d>lFvF4=RuA==DfdIIepqOB+IGNbcD
zjPcgzD|B?f0$1%yuS5En(?V~vit61$l;d-q&{NOYng_Ex@S10rC}*JfFZg2e8WAYl
z;hge8UFK+i5{&i_vK}4nx~-Y5b--dh8qC2TFJ7#RTpQyJ?s7dkMO^k+MHfrKIcVtR
z0oSaCgT7(x-X6@VJL2~B<8OceFC~)xJI{w54NvO1DF-2wtKqNYqArs&<+{xNejcOS
z-tn=vm$kXvz~S|(X=5aNo?t&)p8>OaaC>lTUFJd`ag6q#)$pu;1mZcI+RZ>Rb2QN~
zY{!X`1mrSqYYueoYwt)xSe*3x?TlGS86?ZB9Xq6X_%7ysSm!ji@BC@~eKR1)*{&yB
ztcHt(IzdXoBUJ0i@OE8z324)yBMv7BvR&*n4G@OBRI0<IgOH?7r+qMXQj};epN+vM
zI;@XoP21CQ_|aB9Pv|@IdaZ>%4bEVt>AwN9m^)GnSzQ=?1~Rn0x-<GB7GdxU4qq<q
zZN!=Q_BKwx?-41%8$ww);v8D&*U<Fdm6H~&sYWletS5xEQ7n@z2L$>z(wq5l?Lu!c
zvIJgKJJrtO`GJqUnfq#3W<6^?u^s<r%FoDait6l+S5N2m&Uq2BX6u4BPVb<1dZ_Z|
z?8XsqfOkaFWzEE*840@4AAfC@6-*vN(O8<9WL*uvp}bTwOCjV4WLd8lMF+#!`?9FX
zK=@N&ns?t<dL^38`#@;Oz$#TQdbm%{2@NX~Dsq-|@V{=8l6A_U;L$PY;1Z0jfnJ+d
zgx97&At(#LIJqQUyj%pBKGW-$MG_@@AskrET#Ctza*Qk$hG$YJcOw@wsb$GsB$>OU
zn%&$X9JZ3MP16Sh`qtla^jabu?$Z@I-1~rU6VBXrWW99#U4&z-NmJgZCf|Kv!cRFJ
z<%LeRFNYYXqf2n+jZE2j1(SDu7dJ^inEWs(w+eEnyn%j|9{6qI1>YGV$Lq0>y;?>d
zi$vMU@WbZh{oYMe?Bwz?59GPBsizSi-pQ<b=tZ#i!Au`9tG@cN3A?Cp*@oyJ`;^V*
zp+=`KQZ$kjd#7<^F{OFcRQ)z%{1)>z<E#{VKX;k(iapcxUh9RtNMWmF4Q7|TpdSi&
zRSFMqvHqJCk4CndSSI+$ZD?Gpae2@kT)#CnC-b?Qw<HC$=!H_JowAn63vA_By=H+_
z{4>_~C>V`qbpCj*X|;+CBKx9R(&q|fjoE6AJk(m>=CE)6im0O5Pvx=A;mVWTj0hb`
znu`%=A*R4nf}Tg}c%y->^R65#1)J=qMUKXm`?J=rT;Oe7*_qSuywBOVvdi;WVn<AN
zV`*3RI>v|m{nmMT(l}jfPUW~oi{h;5^d}zLsj^}iMyBTM_eJK!ejV6jbd|^=x!H5_
zGbsFJEcShuD-9mL49mynqcMZCLhAyskjUgKKVdNmMeZEaf`7yV>Hs~(1F{319YeAX
z?sWQ`B&kU90}msX%IZK~r!$aW$Wvd<o+l!(s&7y9O^`n)%by|g$5sDDmcJn<vy&T^
zw{1f%B(M)nz=4-LVmLePhzPtI*twZFRpY!JCvPRoOk=*89-c&>I$ap=zSE|wNWe+c
zRTSX#=_(qKI$iYx3}DMYqJ0cilM{HSW02>MxG4lu{)krwrJTTDHrIhQ=I{2b>GYkj
zF8VaqG6!2n=PbUzuF12?mED39CCl=i;M&qY6o$=*iS^G$krnKvRIV-W#@F`q#M%Cs
z`tUcbBbG3Uz8LV~c(fLOhcqJPczcwU2sI6j-~F+y{iT+zH$VfbUG|DF5wo%bIXlqs
zRj^A6i|9IyXT_K_+77Cn^DSNgkRgrT*y#(XkH(xfeIaa30Kc30nmvJ?CvWA{cZR-T
znAOnfn@Sv^NGZg@k$pxe1qvp=I=?$oKO*&U9D4t3yL8a4J?^Nn-`FYV?ni>jf1XDk
zTdet%!5Sz9$!Px>^wpcIfkeijd7+7B?l(pA6CI7{^CAvP-xf^16D!txzp)<Y2zr-F
zpl}^`dNQB(_w&^4&Fbhc>NKK2o!-E_wm_U!m`Soa!|!biW!Sz3fW$yfY?tI(9*@sn
zy8;y)#SGbflqsXmvu@WI@7kPJ*P42g%xQql_$!*4r{Qy-KM<FL@{wnQR?Gn^GN(mq
zb%=Ei8C;bizJ2**<ou733YQCdfjId2FPS`)HLiTg`U`i-AjpYj^($W*>QCh2OAG#o
z&7^Cvr`<v9GF4j-{F%KN7Jo27brwdGg)P#fH>)h@@`*nokhA~fZT_gZk2@mbI;r$+
zH1`?PWu@sml`R!uG^PmM9kKv&nK4S~?N*fXkH}t|v!LU|&GK%e-C|<7;k2M5N`@QL
zlMw=>33_;7F*~rbxp8HSYt1jj0?AFv+I;d>VpLhK1`!_>w9Z$Zxz)8s7{mJRNR1$w
z?_8VcsXrWb?F9Ztb0mwU>&g5D+`W<`<YbH@)jAWnE2kxRgjMbUa7}4wvE^*)l96?H
zh&aCy3#j92koOTaiBaK8DU`LEn^oFH-bbXRaGRetQnYGi%SZ6s{0Y2bc0`J;buDu{
zpk?|ICMf?<>fqLoXuq>>4Uc<)ui9TC7t<v_{*gLuMkOopO*@5TQV??KEm<gQpZrO?
zc1)-AzGal$b<;pbA1S@-`$u$cX+9L{owIbITn(QZOI_=&VoCP>=eCP>F^D0#_B<g)
z3&iCX?;tEUJfmB3#_zB)Pt|RPO|C4wBHMB@-@ozo4)n&aY_{8caa{JgQci88jeF|e
zzA<#a)b6_(b=l4mCl4N@!0sra>OlO?0G&H2<HoI4Vsl%JGdn3GD`RD=->nDvp?!Cp
zJg3ub4?nwP_;IcI5!v=Mbdp05)1#k7=&i?C6dr~cln(JsNWR4(rwF0Z!d?v~=fRED
z^f;4u5+r1c^)d1ldBwwWxxOGQ8M?LbVx&ap)s>_;k5G}Z88o08xDvW#&uVe;FHjVO
zxOgCbkGC-@78&pfUuZ^w?rkip8DHI2?t0mDh1O?TdYvR|xfSqmIcoS(GaWa@nnVsl
zQ{&@=2yE8^L-j7%-NHH$Z@$-fk7^k@WIczr-be+@M5|bv;PRBdvYjpb&TQm50$XJb
zEh{eTb&j3_@-{{~fzz1E@IA^~jJ)4gU2{#zgPB!j3}yuLBKxGr-+;^d3k8;2e>Jo;
zve7P!6SLT6$*J|HaR1#C*eVAHg}i;5$MS-?gvQP6fwX9LfGLB6*yprN4eM076A$CV
zpTbJW^_WAr=L5?!Bhc(F7sl%~ciI0gF0RL7$Foq9^-=v7NBjxaKnP;^SsmxW%$k^)
z;C%vS7K%N1(JWc`i$@Q+QViFV*-oxyXLSs;Ui?8QxK#)WL51C;>x5-f#Td8ENXud^
z`}<pnOhk6F$E1k}6!$({kA3V~vxaiXt_9I0)<zT7-^Bv7Y3yr%G$ZVptkSJJagqxK
zFsSxgKhR9vy`dYlbr^fxpv{jQ{-=(}yuh2>p3N9@<20@u%2+1>FVV3CeLBkAo>5La
zI?4&(93>Z3h3hO)M%q!LL}#yc5C*a2a*P<-g<A|Sve?}7eH~-K5*=9Rzsij~{Z9vT
z<X&W>#KRTvG18*k2)6F=Y?399_0T!2F5jRYV_B8cJ;dYGg=5?|oa=3>7&C@TzROPF
zvaj3&<f3wn>ro_qn_+!)3}B!pYp+^fu7m_yMDOnt$N&eQ&Ls4TU9QJ=c4T>rFBY-&
zBaIh3sq<5ar>yY|-nlP6AM55L`iAo|nsH27W16=<23ES>Exk(itj!)NIn7_hP@`zM
z(r~L~>$J>ln1lxz?vt`-y73pty2omQ#j#J6ZM(kVMUMCSJM@l)keYc6d%F=1nlz(l
z9Nwu3V_4nM3t7wB{F83I^7Cx{A?!KL9U`sq=LO#&k;NL24U=K4oG?To+A&JT1pQF0
zPfmCk9rBP|mh7SpmDPBgoLW77wVYaA-j*}9c(DIu*_QWnJqiILvolJ&^hKIZ`yfd#
z(mEb=J?dhq&}Ow!GT}M?M3*qXEj!Q{PlMx3&v8SVC-dVK<Atq80qF5RYL*kM{`i!&
zp-_oM;n{2jWU!_G4)hkUlE7YGq2{T(MGl`kpe-a5u7<PpI1yGP+kOgWtKeqof~OJZ
zF*y~sTLgYc-Dr(9c|gv^Nj`KI0xU))8v$=rF!{j?by3#zCrrnE?19*mwbwBmYJD4_
z_bseDbgj#H=z5f+g|)0()Oj3rT{>3Pv7%VP!zku_EiH7u#;^v5+1A?;iib(H;6ELc
z?DdY)e}IYu?{C<3D4(lr{W_HXG&j89yYl`R|EIZ|f=Bf4hFso+(Z5wFYe(w=joq0S
z`K<TQ3%OJF<(~Ya&q8B+7vW~X9XsE<^}R&!so;}rd=&VJ#yYm)pno%r6$hP*zen`n
zul3)<`tMiz@0a@T7y574_AIUWM&AzO)Kz+NmbdY8KEIdUA`FP=b#QLIQ@D<t;|yG0
zI3);QFbAo{dCV6#oR%GUF*mT)6MQx+BLfNto8@urPPr`3>^gp1uqAVQ(*nneh`|2r
zK<To;A=Whh7<l^Gfx@UmcTqRW+@u}$0uLt0DPH|saOGFf2)6~3H|8?#3a3RM|H>0u
zxtls^2>e_;BX$M+sHXGUau4yyMps15#TPc^O-S^j0D_&v($l<69v7Mim%@&x@3wVX
z*FDb2FuqM5*U1ug+i!Qp?1t;rG057e>s+5l#qLsXzDape4kdng4NmU)Y9=BX6qzjg
zh-5E$5Sf!smPfX-1AaA14uJXN_Q+%C9Aoa%>kl8NC8!}0pCVhx=9Apztm*P`ZM9lX
z38Zsne(d@ID!1r!Ig6Q1Q^VnjOY_^<rx8zk8}y>!i%h}2hhSb&aFjddot2oI*|L;}
z=S`twy<tM>vfr@9F1s)hWuE^rG3|;BmA_oZOgZlG4G5Kgdm@~NH)PPM?3tVJF?TTe
z4hSGBQ+?9{Io0HdjKjp?Kpg%QgE6%hCuPyggN_8dYcJNtft11Ib%cj+)^uU#s;NSA
zf3$UR85wE1xZC1fECOg%%XfOGJa46zNIq$t0UBq3#@SSw7-AxX^+E{`R6p8NEouSx
z$t+gDtxlxLEuX~JFh*8V*{~v-f!aBn;U<d=X5c6X5uj;aa5;p@Gg3XN7&l-Pb#SlX
z?$&yD8CVwE152Sju;`bnQKFcLQqmNZlFHiYs6Lh@eJrh4A3J3oS<!t=1^kPrz-nmE
z7a8*}VKc+}bp)!T4qaXy*dsk;7^J2J(ov+3+|0HwuUJNE5s`S7EZ(pvT=^)TYFoO1
ze!(%k-7n5KUK9B)v%2mca)wH^|3|oa{BTjYdANEs56vFN<J$bd4yvDy64`7;)6i%y
zp+18e8R4AT(@I;8G+$pby0HpbFzQ!Q;CFf`0<7Vl4PhoV9pLbsbp!RDcGW*p?}g!d
z&oa+lTPui7DqQN5db}MV^`0g5u2~{d*-Y}(uDplMg#ul}IZQLu@B+Jr3qn(eSzVaN
z<qM^LyMNu|e;zk!$M18k{yE*6Lq2Cs(ZQ`TzOzKVP~5sGZo0JS$HoqBjbL^NU{P;H
z*st6i+#2OeFji6e-J2*;hqJXk+CR%6k?^l^7lkmkN*taFZHtlRHaF6@YkfGRp%V}d
zIiHFp3UcJ<8reWWkuK=gm*Zx2eV#<f>))}m3UhlKJ#BfSCMS>`+bOnPT5pc06U#3D
zOC&b3{TfE$p7E{cJW?K}t9fJ-5h_<oRIDo{J2uO^YHJ;4vhhBTbcl~lS(x(z@g}`I
z*Y^H=GXLkrCQ4!{7;_WFE=BCzVwXy`vc$ek>@Bf38AHJaww+?z<$oY|l_e=40VKdx
zFPSu&dNxy;$Ce+RLF;oPQ9N{X1$l$dgz89Fkhi`)qDLj^3c@ZbTuGq{D(J4D`gW(#
zR1?nO4_8o(sUQw|!byC~`pJ&%5=wNEuvAbAb&)6)1mOmoWIQ~ToaBF5S5K{}p6>eA
z^~3DB)YK1kA=MJDCR0CKd(=;!ou1IQOXv&1^I{?W+*qlETubcQ#BRUXwURGgLsEUS
zsK`8%GgCoMER(*eezs6Q`qcbww(j~ta9KSEa-G&Wh0^;k<oybRq*$p2aa$t|l4_k`
zkTfenBXL%=vB<IxU#UZTtxpY7V7+IM1=e2-QfTcr$YN`+K{BkJ2C255Fvv3NVT}ZY
zX4d@%Un}^X2464udV|aOVl^0igW$^yF2j#iVepND7aCmVBWtd~n+5k8yhZS725%KS
z&EWe5A7k(~!BY%w2_A3oPQjJIy9EF23ZX+lxWSfXaHrsZGPr2?w^|LJBKQu2y9M85
zaM|r!zcqN8;2R8{A^2?umxZ^r*5F>jR~WoN@M?os3tnRIWr8m-c%9&R245?9mciEx
zo^J5l1y42jV!?+S{C>d`4ZczED1&bjyz6pZ_GZD~H+YNSZ3b@@{3U~L5WL0U`vw1_
z!P^AiXmCsLdkx+x`0WPo68vU^%dvu0XK;BU-SQbcQSikEPZ4~f!QFxv7(7+*Y=fr>
zo?-9|!B00htXT9W8r&=RV1pM3?lkxU!4EIgWiJ%G)8LB*f7{^Ig6}u@GQoEnyiV|D
zgRd3*VS}$1{C<PqF8G}W-yryUgWoTBgTXfnzRcj81g{XBy|rw<WH(&a-PikjGZS*?
zNIVlWQ-`>aCo~c=jZM0-LE<Li3}Z9e*et+ik+DfMHYnapxZKzr`EDpRJ+>%ns5`yf
z6g<BF1D)W@;xTZc8=JR`&30pxip_pw^B=~B*BTS{7@J=hn+$Ar7@H<zlZDL|V{^T+
z@nW;l*pwTa#n?P)Y~~xAYHS`hHaW&-88#0Xn<?5RP)BFR@-Aa}lChML2+Q@xvcIu}
z0%BQjEI+#}M2V2DN}+y&2y=*ll7D#iT8H(M72SNvlfhZa>#9PbW&ZdUF5%8t8|C1V
zE&>q9Q#|YcfZ+ZCYm=-iB;aTg?06a_HqV9^MBVER7DIV~XJrjEY@Or0b%Xn#v(0}A
z8VHDLzW2~p*(UqnUEjSOzMyGv|FTtY1zlyUzU*=>eU3#i3NvXU+x$=EZV7Fl^CDmH
z)_2mN&<r?bTke|ezFi$I?=Uue`-9uzJjyDE4f8lQ$tT+z=3%m7ws9ADoY_1_v3U;2
zsjVH@6yd1+>s7*NDZ*g(^Nw?(V*RHZ9fa8VKeVTQ|43o?xQshHVy&a_V=jzuN9`TC
zTF*)@!gn_1@n#akcTw#}GiMt2=V>i}po#wJptR2H*cAUnS&)g^!{=pQ53MhL779O1
zmmTL1WeLcwF-Q^q0`cfHZ1K9DVIyo(57$iZ@=2!srjoiVLCQMPR2K!I#^$q}^j$=q
zT@b3Xzx1l8eLX7bX`Q!v%h_FF*P_L-Gf1`B)wQ)FUPu$7`nRvEwGxa%2;bO><LC^o
zPph<e;jjhwbtvoHNtg`p7eC&ngndDN$>U*TBBxLx@&ejb&eao2#n_loX22o?76Wt|
zfrNQt6C8VRD#C@Dmzb#aF7?#8loogm^@C`zo^mj-ul_x_yib!K5Z_huCtv<7sDCfg
zH>du+DBr~T_xkxx2tMmO(;Bs0*kvc++4|iw*j!ogn&12x=>-yA0kq4}2Uf2es}}(s
zD==>}=EuccVKs2-WW-R6IH8=Hb&D<L6-S>v7k2HXQSxf-RyL>2-mPs>-pFkt!Dt<2
ztc@0L5y+W06*=<*r;q7ylUlY(Z8{)y;jxf+e==kxZ{?!PTkk&)lhu4=xMDp``H|Lb
zKjkn4E{YTN#oqhS?_B?t)0b5LRh%!r{;Md2$Y6Y?cATCUcv6-|d9u0n*54;MZ`3;d
zgR%pUZUo<Tll&DbbVSP~qC#<;8c4X5qn*G$cnt19^ephmmdt%CPvZegtrh#G4Fo_?
zrNzlBm)wVN2NF{8)bXOV<cA1gG)9dfXEEgLclUBJ&xz;E1009`SkemYMIUoVbbza1
zFJ~U$kub8{pDer9q|k)&8g+g%54bd2GP_advi<8LQUmg)l`XL^YRvWX3Htn`G2zrZ
z<n2crYW}5Li-9*?kfL=caoP<RCYanPXOoT5*WIVV)dD!dj&4HZd_U13u8%add@TD{
zr{;GEM<Ddh2x38bfsd`=ZAPK?6v79SrxRyhpp7OqOq(Z28i?a$?r^Q9O2NBw#~;pX
zs&Z17PS@)1V<#^MOg&xPI&(9huAQgf9cKXcy3T9$Mz*42u_j6Uyz_HWE(Z6=KUDLK
znl5pBGheC66}M+_6TZ?k?^dpkHx2L7NBX~(L(0bJ+kYjApl|pm+KfA|+a<3vj<wqH
z&l02c9m-<McV`K8y}~j#0><I@DP$bzkSY-UqKEbeTTJiHniCe2VW<#(=9Xn7ZVr9C
zo&ft9xk_#=kh7vUyi-Tqdb_5EYt73-mZpSS4h@6J37TFa<>hL)Rk~JF@&!2P(#(<!
zi^Fxg&mj-K>rCw<Mf-q*7kw^~29s08qsWW@+PJqBh*{iE(eBQW`}d9ehOqkp?QV&+
zgkJ=La!&$AOKzd>XfkxE@g7WW4*C0zAdS)ce?q%wuNb{okO3e&LGl74b^%0o>nbFw
zd`OEE^<W(~;X!c;bn^a=PO42*nN5>~&JMmJ0QM?8K97EJPcC0&Xf_{g{LhKS6MP9T
zF$cM)fkZaiB9b}a2_$%QYI}X@!Q|hin{1zoY_DNFj>JQ%?O{+bxykmx9$H>{!%raL
ziysRSYi*ZAu71E~LXn*ILOW@eLm;ml0tGLo9dMQsQgd+mckOq4<QAQl&PMQ)l}~?J
z`HbK^Cds;!4Rh#7HWfUy^g&24iTAzb(2@nu$Fkt*SC-S5)bV^SD<aops_eW*)<pXL
zi@hpp7f*@e$(kv#>UGimtcxCGzB2uO${YECR#7oWHuRqt{BAt(QphtbPRQ9naYVi0
zkPb_)&cLiMIGhb-aSeDVi?Etdc$Uk#ntyoy_}9r)MA?kSs6n}$vdX#ZB;f(IcckWx
z-#3FZk)gc)8<{KekGKgV3L#V04{vLYceo8BLD!l}209&OTv_A7Sw|39FX&h=xu}&~
zNRit8c+vAOCwA`oFCuP8sQ)6;e?lO7@fw=hs6ccfurc8>F%7aZ31`o8E!S`=sTCTA
z<?uuAa+n)mLX=oJfIVRj^Wpb|o-x+s0`P_2`Y+p-&Y(5i3d>Y>cQQD7MH*0~E#cM%
zlgp>*wo5bhSMm1C4_V;T@1L{IKq!bJkN4Jp)pqR@VlxsO>uz#ml<Jy8xilGJGH5=W
z|5<Br)PwT0Gnf`ytO=NTfAeLlBIIzgaTu%}M2PcobJiH<L%ZdL8t$=4+wqMM*8TZy
z-b0_}W;WNltg!?OCEhU|_1JLXpYb`Zt*1yC7%h2wZjbe<o?2w|@tq+01e3huk<5*c
zkpgeGe#itSO2C<Wdgk4%Q{3U<4=KT>-;Qa02T_8wVXQU2$F&V%_y(fyuO%@V5!bkf
ziUc7NcPNh>g&G<zo8&;o7<mMsAD*a)k=75ZgTYZ5*7pE*g&wNX723WPKY0NJXa9;S
zhzB?|&)s^MdoO<*DUXSWTx>x;w@*Cle69?c?F+La4ra9;LDD-y%X@SG2Dvk>6ZsC$
z!E6^=%M-Xq`<&KVerOOC@SOG10jWe+!?SEANhF6vE(k=m;XOu9um6Cxb$Fc~%Q?he
z$f~eekK@t9@HzF;!IBeXI9#sVwg;0hrtT!Nm4t$m&F!Cqt_Il>bKZgz6hPkNO_;$8
zbC3#e$j3#ztZAU#twUJ6?u%H?f^p9yD_dA1%4;f~`V}V@D4*N2F8jp1wRvNTJhJgs
zYqL?UR9}LVoURvkpzZG&>xRGTCYhc~^^M=28_9~97w!J-K|RC3p*BHj1y&S3wN%nW
z;)clka9cu$79zZC>#uLw9)2hu5Io7yf729$;zG^?#}t}Nvic^|lov#LBU&iKVWDul
zd7qZ`GD=B=9v4Xzgky>=8RHf@oAqdXi->}A-b4X}h&h2B!Q`t5CxPU6i?@`<e;rA~
z$(~v=W`XPGXzY+g$)i<J`DR5Nj<b=42O7N!6Ljl1Dq>T%U~)e@?w#b6cosNZH_L?x
zbf#tV?)Y`I9EWZ>5&o07T*twCS$$V*8Rg+(>}@+lv|G*}@?_lz=;8ew*JDDoAD;{-
zJQMH!MfJNPMBr+at=c)Tn`xm0FSTJWBq<5&qR8py)1J(owWqYd_jNFcuzyqXX4ZGX
zT@>am&)RHP9?kMC&#vs40%)M<n|bYD=$7>fORB*B_V+Pp+YS&Yd_AFs5W3;hl8<05
z)5JTv#mUtM-3CX%9&MVFAQ}a-y-km}>2W;5$!WUD&N$Dys4=<09n)g{acfU7Iy~6A
z@qcYUlzMOq6r>;3?D39TC@S98NO;t-W{+p`%%;A18}z4A_wie`8Y)?#>zbB&_oCrU
z{0Eb(CYUOp#0)@f<Det*j_>pqqsz^kxzlxXJozVITSVg0WX`pECjQ$$g&xx7U2FD-
z3MCvY?eTcUn#`m|x$1XBNCo>54mrU?g^7MOJvB2umo>6D#<=Q>BT~Zc$1h>hw<uu~
zl_ZTipON=?B|MFS^e$nhlrRYgU0K!QW0O!o`Y4B_-4!+I=n}=#+T=7xi$;lflzkS&
zq00S`yk=+59xc7OdOUp*ApLkADInh7{<Ts+9gp(aeO<ic5vmi@xkpeQbU8?oWVtVI
zUrBYF?p?gc+jLukRBaB2ZcPcDdhr*JSeYI*q~-(h&g}6!gUNoR{h5X0B3XoIXCAq6
zQ-?E{>^@Cev>21Q2Wtw<IN(8x$LdH3qFWKtZ)+rJ#@U7SUq$;bv`*#N-PY!NE@)#)
z`=&4OoxJZ<iLT=r8DYGP!E8UtLXKYR@m@HINiqI#m=zFhZ^|1T_cAXGCx-TAgb%gj
z@wyOETlLJ4<%{#wtyJj6o{Sgk_Z)cdl6NBDbA#5qRr_@8$J3|e)UipXL0LyWmLu`q
zIc6>MB|_^mZHD)BS0Jdv{;MzDU~*l`XkJdSN=*FLG@WFBlI)=ytcn$FFWq21td6G}
z?6$;Xbc6BGCz4%*x}b&V276_3n4}$`6wK%bi%5c`q8sdGV{1Lw?eQG3>QgtEluxUc
z?!J4f^+_jMmEqu8y8&_xYgy%?MEb5DQKFS{afrvT%)QgQv9e2qjHTQ=HQLTZHS{)D
z_}-~#I~$KxCRTbUvV~^A+Jj5A&Es@~U?)i9Nw$(m9A(h&aV%{sgVV~QPl7s>ageny
z>|k918ooBfitecUsD0=>8ymd9xh%mOh**m#ScL1*tsPF8rho8LqCuuMs()k;6=<P#
zURZCzKcuhhTz2y4D@*sR>!GfUgYF=z|Lf6KHc+&cao?Ht`0{^z$MWKWs<M6GLRFd0
zS8rWqN9%olv|JjvtoY<0MAp51>3#l!vEv)`K98k$SS83*u&eSm=4=oy#p%`@EbL`r
zTdBB-)`z1ND2ou-8*qF*Xri$7K3_hzr{3r9$cnZpImL&c%$>f}9(teC@tFI~dY_Z<
z64v{?^IPhDzLUJ#**+DtuWYk6Z68CnrMQ8)@OfCz??U(EQF@<qP(6*F7Oe;JZAR2?
zz0V;Pk)rqcaa?-oeSY+2=f>eZ^*-B*)tb4bG}HBHL;qG>JzFibs_B(v7fMiMKJ^4z
zSfaZcipiOX!ru%lOJKSUKeg@uY{NTk*gzIUWPXff<)5zzIwrS%ms2({lR^s7zP%#o
zjeeoybJqR)8RPp>1U-_erl%t4UEin(y4*z9ry}TZNUaF^Vx&@fD1zR|&_v}^h@%ui
zpZ|YN5p*H_3VQxC6+wSTs@r<%B|SLkRR_~G`f0heTh@3ss>se};qnhCg4WHaW1_^W
zW9e1|eSTMmD1rur6+weX<pj>>0XCFH|No!}`pUJ8m&a8Ejl5;T6E$qcg?K#`L8p$Q
z9sHLRLEk{M!Q?i##M74|=u5PFb5HkU6hXg0BZ1?RMbBbn`yW*V{e9t12XZ#(3(m4c
zFX*9e>?9Udw4mcCg3cqTUVb)DMaTTNQUrZXoIQMe8%59?j1n<kn$(J*4`w6Qczi|B
zHO9A)@%W0Me|lG#&=h*348};*w^*-D)4epL2->JLmZg7K6ZBIf5TIK(T5EznlZ7%9
zjxW|z-xY)Ud8qWwilJ-HF^lMLQVcyE#lwqz6Zsob485M~JRih$G}fI{!JU!dHZjJx
zFO>-o)zIz2o&<5XGgk-K8AZ@2haOyao#=*^4U`0MwaW~NZfLPbHMDJyYUqh#U&6x%
z0?S<uCkaF~^a%n{4Lv|0s-gP{L^ZVByAl;zh0@NuRYPC94^C4bs-f@rT*}NE;qR-4
zuEML`{M%QN3N+BFq4fv~lT53ImJ2{UcrJ|~yS)ZOZ`IIOXb)OPS$6xZP&BB9)&nQ~
zN-HK4t(c<E`FN_KQ%t~bPz`+$W(P4i+dnW!RQuZoakRf72t<!*-)F2M+FL+`YJIAP
zHl-2gx$VEeqcvn<cnNkNA`DtJ^z{dO-luZIk3^7HG;L?F9!P{20>ca~jn<n4Fq;7{
zt4p4p!H4XRr-_n#IoCMMZVxhKh<DBxmavth5%;J0zeUgvbRr;Pu$@Kcr)!C{59QFZ
zugo~=YKS=p=KN9X<_YP}&@b=w*#8kb+c0ZdID_rCuv3C%er@LTD$=U0JW4mT539cR
ze{zB6HrOQckdCbzdZ2zsC!`x1E_KI=*2{=_*n8^tKuOtac7SrhnF4kUw_Y&z)&t#M
z&juB`N%2J4(=qy?gV8INNch+E!+zFBtMHGi9vMOscu~{2YsMIn9PAi`AqtfmZY;<w
zhfjEt2Q+yd+bdUWj9wpeZW-P;aWLnGMGj3CWhQ+0`_SY{_Rn0rS_IBUQnVJamlVxK
z)WYW!X<AIspIJZs-Gy9K^^b*Pegc=z<2c0_viUQ5Y)AZNdR4F^dNa)jj>1yezw3~V
z!{KGKQGW2!FrBu6LMOZUaM1hKA0>Ckv|PEHd|s28@Q0hoXSsfWc*0ZQ=vvaZ34`SG
z4aw)%yfi19+8nZ*67-#0KmBZ--Elp#JFJiFPI)1iyi*tu5{0)uK9W0Z<oK%v;T$LS
zm19V2-_z6g=#s7X2tc{4ZQ+0&9PunWBQv3ky?X7b-eQE~6QXq1d*0ndYIW<u>_l>o
z<atygEoOrq)3R_(Ry3$?F(N|I$6YATCAw0JIhp#a90G6w{0>qLx9s$HwG=`9iYf8R
zpWbwFe{0-LA|Rm6Lz#-FB--ys*QV$v&|f(D%V74Dc=OcsR}E~2d8O{cK>WM-9g-MK
ze*Z*v|Lm2+XCO?@S;DIIn)a;aICO~zl8>Wrt4fK9CXp*TV}DCL!uROwTs_OEPJB0K
z$_GtXh{~>j<b&f8Hin`C6Puznl!61Frs#i1&YIzSOnorR)fB)rulUdff#DqDaQ)(A
z-8aZ9OyW*&v|?qzYq75SXRtpw!^zWm{|;7vJ;a%2itLn#wZ$lo$wS1sgxr#Wxa_9I
z4t+VLBQiL{CekbQGEslvN8R#;5a_uROw`=c(dO-#QDw{)Ts(beC#iZHr|@RlC-pr3
zHlB=bx+gGki*<KkqW4e-EG?=rDmSphyVd$mUSwNf*VeXZt_*860v)1Hg@I#_6#OB=
zw~wUTWoN$YTJuB75!}@-C-YktfHz&xVx`?6!-rh5VEm}{7QafWD+q;9Mr(carC@G&
zf2~N48^Ua@9lA4129UI!S^Z<{3*+e)%?or49j|QtTQp>5W?-Dxmt5`Jt?-(fcXBJ#
z!NB=lrWZCL*{Br$n|R&~y_NOIYME5gl5o^TJeo_EIXBk)JtvG=BuqF(Gq?NThI1;%
z&63yTFw9)-lOwx`QD{MG=S-4AvS)me_5Fjk8p>;vt*m+72e-TDGTm?QC_&vomR$6+
z4ooq({5<v74_2-<4-o^G$}{x4?5LZ(_5wM2A1IfR67&(LoCp4b^}h8UF_~L-)&bDE
zm0c>J<XT|(HlDC9>m*0@I|{E9ekCzM^PvA!>p?;^T{#*yS|%7bv$@MBOQ{~A+sSp1
zQv-Nz{dPstfO#RZOL5m;d&>#kJ#3H0Twj_BEBr!+{v0lQ$V91cKIb*%WSDDytnEd*
zhxH35P3x2O<U6Q-Why16{D_FW;rk`$s&@sGUxa&K-*ug9%`k0$Oxf@GK4t%qb76f5
zO#!Y0H#xhPM#joEoU_}+T>rk#3<Kc=ZRBQhc)VJS6jybMw{e+U>()!lEtc2c(7+z}
zi#(Z)qy)FyTC6Dgo`@iDwy{_wPYSt%1)W=EPPSwSc*EzWB@d_Isrm}Z&cMrDak4Lp
zMNry~6UXn@+69`tM_k^mTHhe!KsGFPxsk<`1B=}UL!Q`W0v2tH=KMB=wN7HsGhEb8
zPWd44B_ck7H)(1-GyIp?(h%s*%Bloy{}L=OFbefiMpf39=~##`&a^aXY8JhY^HcGZ
z*=982mrY$9;SHR5`_*ztz%#YC?eb=xc?%|g6&KqBAJVZz-&MzDoUk~#)H`*6|MOsT
zSchfdbwVGy1%n$`P@25`t*2{sRnQrleZ#!tKazdM8aPs-3XN?jBQCNI&3<dj2j0d>
z6ndGr@ysD4NIIeC-=e?x9?c}^%au5?t=~ULjE&Jzr4;k(-%5X8zTCQlXVG!3w%(i-
zqJf^r!|lFX28;HeLu^q@rUxYHlbgIw>y+g>(jSnLq(YBRg%0br@u1(WHPTrQ<LNrv
z)6b2ktHl`jQ2Nx(-ax<n@$Y*BM{@UlEf0ZK=NBUy+w9AEQb?aKIxA7|v)jsifb9ZT
z=KMqCCi8hy(-*rMeu)pzcu-jX^i`pbsPyzRo1Gagsf<4&(o=^HFz;}Rvi4@Fx~WU(
zimN3+@ga_CKUda3PUED6WqDI8K3BdG%xIqzl>;TDA`{vu3#Z^t?dZ1{bVJIOf@tn)
zb=AwN6h^^qaE3jbs3~RrNXktquJ5QJC)W$h*yN<0%0&vU<a3qZII)AXagKJrBE*{D
z@`ytRn$C~N+~vC2M{nb)zV1}=GMioXvQIJXhG8t-B!Dt!>6yiQ^BTvrK)x0y(Nfj@
zNilmWx43<NA>J*&2?n3ki^`_>e!RB$9-BdFb>wiKxYyv$RW!Nb-ZZ$M6*ohghJO~z
zD7g$Smgh5;pXQBxg$(Dqa$XK5{{n^{eg?2awtj}pkQq*;TR%O)5R+Htc3Yb;kR`M<
z+|5MNtzu8A+HGBO5nB}T_Cw>X{SG{Z&IW9`mMjqf(RUHup1>Du5iASOlC@O1vFvGB
z5jny?lBSd_c5b8=vKVmn4d#<~if9vsjMmaFecfed3}NID?dr^3ECK`jJe#>?3a_%6
z+tSG0pp3Q8F^@fqQ6m<3Z%R<!k3Qdl<Y3b$W|&~B<SW1~LSBxymSQWLEg!PUZ=xkl
z)-nIKl~jVs-T}0kr(^@rG@lmN!YN`fc@CCdJ=plqu+D`>_QTavKm)k+Iqt~|o;<j+
zeT%ANIkm_7Gw~ynz^l)>nFlxs$#LcH!usSlnR3WVy!UpKlN*M0ykUKjk8MV@KhD|<
zW_0~{(OD|*=j^d=)mgoZqf)IywndiNzsA%tZ~5gAipcSF%g3gWMprWy4}K=q#Qw1Y
zuZQ+~haq2h04)Jt7FYhUR#`Y9>v~WvDKrqDven^0L$eWxTwXifW1Sg}{1EM()q()M
z*39Gil%^5OuamJtKWUk3KWT|Tz;oxV%XVaN0<h5GjA-_(`YV*-iIpc?J^Q}o#$6WD
zO$&h7`s4;4R~&q)0wa{qEf6g|-t+469L_q{n$Mx(L}jePtTG%OX}#=MYx{_f6nr_H
zH+Ce3+{pws8FeT=^T%l2U_5|$==EXEV^y<4Sr(a)3U$hyC9>8`OD9?v<b{T0>(vVp
zI+6*hBQ_9ySrzngKyleRg!)Ovn3T{VBa<(pU+f31jCC}XIVoJ9KDcc)8j`w*#y;`8
zFvYz|YoW-XpB&r<o7Z|>yN;Gr+NJ~#ZgcpCG+ysKxGmAuuntST4SnkfyU@ltDS;U&
zxYf6PRNoTOI3wjZatYf%$+~iaRDUx!JoftrShI|&5EE~;@3Ag@T#qQUaP%j427`xY
zu)SlorghT<#(M*E631Vi$dz<nM~)247{iTDblI-?;D#aDfu{-o{9h<eSI7MNXWe9>
z9j;rDSH4hVcI1ffB#{F}2&gH!b{Xp*6tuvC&`Me&<F|Fhuu+S<l!AH?i8@ibqZWx;
z@sVU#lo-7)Es1?L1Dv~KxK@)ULOMiB(pa($vM$oeXMXKk^CZ3zKhP`RELnUQQCh95
zS1(Q4`&H;MLu6`$twhc66T4ZjFcciGgVFhy)4+I*Q4dL5Sm0!Nn!FKK@O<7*iG<kJ
zPp_6S&~6JutaC32w}t0&CDXR_pVnQI&~g=LkX+>0k;(?_)BYl2zq?HMDthr2NU+#9
zdqp`+ytP@^WWp=PCP-_PR?solNHW+`Dsx3}ike|)YGS2N=3jF?md!e=UaO@EwK;oi
zPSb1oXMA~9+C5B85t2fa*THJW3XT)9>M3TTmzVFg0@oI6BUQ(=fy&Tb9VsT|?n%L#
z$x*E+AT}c$auOtqhH=V7aWIsin1??snDvT~s$D-;#_DIbkTQ3Y8UKUHKZ+$6jnN-|
zS4zIaYxLtVJ-?|f(4Z181o8C?CO<B#D(OnWv8j+QIQBICH{FntRLw7I9;v&%ya^r1
z&$3QBU4+A78E|c0yFdhSDYT+&m$Z<J9fo_8<9mg%UDB-9-Yyc`X3iOvHOp@T^@<Ma
z?h81rrT6s_r4~@LQtW`?97<}N8CsR~wXd&G@#6GWpH4c|t{zUBBw>nZA!h5>J>0`i
z^-t6hExRhS60GmbkGD9Vys?r`?z)z$2n>GKit9m;V=BOuFQd<>0tsU-k!E`e#5<~f
zr1Vm8Q|a;{hfvH%mxdMJlxJ3DL@U+ox@~KKf4%FuekGcrrmz96u3wpsMmKLUvbK8b
z%s%|HS~L8hA4+!6Mn6=nwe`b3>al)hq0*N-u4X|P%2k+lR%1yYwx}eue0F3<*DWnx
zS)=-j$#6jW^>8}6$YwkLE(@JdCZy8-_3KH2+s}{zQK|cExXFe)ZP;eRPi)w4vhhFM
zh8Z@TYr`@duCU=PHvF9pci3>h4J{jX*)Va6iGQ>Wcb{#{TWt7%4cFUnh3#*x4R5pI
zZ*924hOgMrvf*JHrlgzr&$8hKHoU@y%WQbF4ezkwHXFWR!?$eMWy5}Fns^7>&~3xh
zY<QLpy*9kWh9x$vwBZdlyv>FiZ1|83ciQj;8@_GBPiz=<mdVF(8;-GIx(%~zINOF5
zHoVD(ciQkF8}7E@pKSPv4dd<l7;3}QY?xs~uMID=VWkaku;G3ihT7&_yME5KVWAB}
z?#F}cM~iYwrS@N9;QD6_?E1NZy~8yhGWOLc_wC->znE8!`<iuzETvhP^KC%HdBZ?M
z=e9WxoqpY11B+F$V(3)!)Lb=FO;8!&@(Y>IP-m$;m18Wm{Y5HQ%}^JsY;EgRUUiOI
z!oPEfM`AL+5@r6KuH59o{BvtNu~}~all<kYN!osrwv*5W*vZdhL&39EDLE}AovZlE
z@x1-JNL8t8`>?+l-#*+zzUSbl8k^oRc$8l);;Y3?eiwjOkdx3)%$0-+{XE1{qssAP
ze)*~hbFo@%n`h$pDs24PzGpl|#M5nS%A=IYzk;5UU#@xUd`j6RU!nXMSczHElUPkY
zj9I8*(iMM_j>J<$e139LVu!$z-%OqRZo9eUTzu8`@;9G+l<1Nl?J^hNr9FJ-L*vRG
zVdvm}v{~{IN>|a!Bt4}}{9=~)q#P2D<XghC9`T;DWXU<T;RaR0?{s%QKer&u`QeLj
z`IAaYCK*Ek&BkMzj>;}AE?sg}X}F<WRCVo9=8KDcRpLCSwAvSP@c0+`Ysu^d{t6xW
z1^!B1@t*3Ma;fk9qMG7xJ(pfp<1eZSSMUWzmD)(UinJ8*OWcY$B|g4N!Y^0ECGn`4
zrB^A!s5wPGe@zJv{ASja+Zc3N?60W}o1j-|No8pdi@APd%CD-_zUKICSmcv<B)o)C
z_*3{%xJwes5fK>`-7m)3KQ=BtVSp<!Y2cv2$tRqcGGyqm;Ui8O=^i!u<S}DU8JBwM
zY2#0yFmY1a8Iz}^pLy2V8B@>6oHqU3?__z-n~|L}^L%ga1sCS!UvzQ7tl4ws!scCY
z>1E$tc=;7q78YGqTvA%LXmR=XuC7>8Syg>aO|8#=?b2n-ue*N5${TJ}GpcHGmX-So
zYO0D$rFNIlmWrwS8d^cAnn+8k(0xmKP$ey=93Q2O7}Do!v_H2lM}m@dm$aWe`pz8w
z_4E^RmG+cNA3Ogzt}?D%OxyElUwy?eoAEDAP2r!!Ie~aQ<jRaAGM>2ks`x7-h~zV0
zr<eyOr7F>OWjg0ewBN;)s1~e<zY;>mGZ}AWY?OXjPN^4Rs?`0rT#s!%;}Z9B(k#cl
zg1^_<{-pQB>fUAI7k?$V7i)Lvv67~n)MQ+7<5J1r<>XOP6}M{sNsJ~$IWCpdha1XB
zDNU?Pu$7V0t$kii{!QL}^lB-+)M70$R%ky}sth}cPwF&OG8vz`=`=ypX$fh|m?~qA
zTct816l1DUr(!B2zDmqeX33M-NJ|iUN{No8RHe?Nv>-DFNcp6N^$eM<^CY9G<ZGg?
zU1?9D`koxF?@Gc-iA(V()LKMY-K0=WSecO|Rug*#(3DneC0^sQ1fQYYcehMQtvkIl
z!s+$hz9hDz>s`_a(R~K_o{L%PN9w@17)lGxB%c%iDeWUvo)F#A!sQ6%DMY`%N>CD}
zyP-yi9+O#zg!-G*ev$4ard-n7`ije~+n}`LP@cN!J6W9_jxUs-Z&#m7NvrP^`>s<%
zhslf@q5OaQ^rUA=pZ(9IcV;-fYTBr21J@E)4ROk<qXMcO+mk|lvzua}{HKTG`}X<2
zlAOz0X&LGI=)*#xkV#r(s200Z3)S}-YHB#WzUsS*T9x`TBcb%~Dm_}rs9DMwDWg`Y
zjv>^JLeP}wj9%?YawRd!_+Z8y8Na0M^fd>B;_7ZsXY^=KlHX(FTLRT(6ckD<*7Z@O
z$2K!YTz%YhLizpAw4b9>k~N;tyeGB0>D}E=rB-Cr@G<Vnc)OS|GF!;XIYe_af(xaN
zjx7{lT95ks_U%PtH*Hkfjm+~h;~$-Zp+{Pe`uq0r%gS8V_Mw<-d&S*dpJ}Rlyf35P
zsx<9nl##iz8nfUs3&`vyGo_)J%syszFkz%M9!(?JgUPQj(d@V6gi`-(Gwe?N+u$<p
zW>v!;$To90rGK3Rj5`;i^l!aw9%!4hZ1W)7+?HVcBZZ`Y)wX$vZFbw{p|*Kryz!63
znf_(j=Ha%vGtRi5WSj4|%_D7dTdZ+++vaN9JjyoLIgLA~1o~HKn?noeEZcmY?e4bC
zhix-Q7JA<b*IfU)VvIRo_kCFp$e2*3>*x~fq@K*EH$#o*pPLy{daCqDv!cuclbxEh
z5|fKqdrc_`Ow|8)XN|g+*cWM^vgVN4$iyJ=U9DTdQvRN+^VK_*9KxA(>nLK6WpCRv
zwsVNj{8EWQMvMyjp!`xR{S_6U{p7zxaYz~2PxXsPjLON$iI(4)X~ZQS-5CW7Vw~#i
zw6ysJuwUJ7-Nc-QiwpTFwXAv>KPNtTNyg~}IQb{WfBm3<`<Q>JjDzOiv2MrOc&V9h
z`q!Y2{dctgRjT`+Lw&n{J!4p{y8lJM^Z7RaLgC&2Y6HjAzs!LD!!5wED*VrARsZ{c
zLp3OHwWIrAgyY-&3xz+nMgOBVf3F8fN`v_qN>NPRc%rRG{_mIA_~`Bb+m*K4SEB01
z4d!5U?f%uRT3z3;=BDqjZCn?)x#{12u>Oa)+<M!Oe*BZ$e|pEy?!4>gzu550yYIR8
zSNHw;{@*<C@4tQUcfa5G9}oTE;YS{QY}4i~kN@$BC!cEGx^4T8r+4mZdFI*Yc0a#o
zZ|lAnUVQ20S6<!!+Usxp>CHbMX#2}se|`I%cmHO!zt{2p2Ooaa`SB;8e)jpnLtS5d
z`PE@mas8JWG{<Mad@Bac|91KRx6}VG)Bo==$d2!>8D#(4<&Wn471@LEZv<wM$qM~`
z+{@gAx#wEq-+GyU(968Oml-+hqr%_P%Y17uvpmDwGd+2#x2IX8IAl%T%qK_d=a+_f
zjq}SZORAR6@fG>X;fG>BueP-2;;X(_TI|cMEUT(nq8;WFMt->G71jDY#lG@uOAD&1
z{ncT6V`rjM`EW6d7L}e?wakQ^2mddJwdNFd6cgbtqC&<5wEy<2tGlUgRUHeu$eZeJ
zT3t6dI+_*Tnl)=6d|FyvLET#ARH@@K3g*|bUSm;LP_UMu?$o-qb%atZ>lQCw>~zK~
ztFB&JU46`YPEKYn;*;~6G5DXUcQR%r+>?hY`x)Wl73o#6oL`8mtVhSPb`I@A2w&tY
zs&JRq)Kt~D%PZX#MgGd-#icdpxX0FNPc^Ke<u|jayrQ(k?W=NERhL$}OP7@v`+Y@M
zRcHn}?(-_eAns+<gS)8GT~v+762b^q9U@QE@pSvEDJ?2-m(^4)A%uzM<WX`q<e_9<
zXuJT3>INMOo_*C-<S$%}?rZ#|HOtE@7rD!H#*T5XE%o_&IICJ;3B@b%S67r5>xK{t
zXvdFxmEU)K54c05<Gb6@P%p=Fvx=d-a36#hA-hf4AqYQ1IK+mt9NLMFqjoB=9cR~+
z;O5s&|3#%f$Y1Vr7gv>(x~t0E)gfNH_?$?*%lJaSNz{KWDNdpuC6!6I$*w%~%UM=U
z2Qf8kYL0l9EGeQ6sXd_}WE(e;`W`1(?c&m_im<FGuPmjFRD`mpj)`aK;&NYUZFNy`
zsk^AmS6bs9H_2aHGwG`G%1Nb_*NzJX?rsk{_3m~hso}A_rmAvDX{9gZzdN1MnkD6x
zR3*8g>S%luuJKp-O5L=P9?kQ3nVxn`-?);Uz3|h{Rr+w%CeYj-$(Z<;mirb<Q>pb8
z)#%j!kz{-HBVAsbp2%7Ct_Mh_%V+v!PrB=z_4Hp-s+&SjKW=}m5N6)onG?*3Z%_X^
z<#8vEa~IjAkXF<)G$|bGf7CcgTTxN9R3etpy_$m|*fHUbuF+np^pQ?c%_6^4c&$6N
z^jb!m@-lbnl4{@bQ~!Q?SJBk$L8yp~($7o7jaeG3dr9e%D*H%pwB6H2>k(1<nOhxe
z2mfnM_MAY}2M--6S(|;=m!C#mdDZIG4vISCoP{#K)GoY)M!0+-=Up<<)Gn+oUs7FB
zdSz%FU070H>s#nMD}7>hi5W-@nU4Ec;!YamRD(+5)u8k^HE6c0HK94KI+bb^Uehg1
z*pKj~cbO=*fbZ#HP8u4ehE6`AI=OIgnuL+~HpA5Ut1x!#Fpk&=6+5|K+K>qeXO7(A
zQp0=$)QKetq!+JTQ(|lSwMDf?z<k(o4RaR39I;U<HXZIpO}}bKoI}M?635_JH8|a+
z22W1x9MBfu8r$rwjw$R{kTfJ#4cQT=hWLOb{nZfkeGHkM+#1TuCU_pANNK2@m!#p*
zYWR66%_hgNJM26!J58yx#&?&~F(O`#@WrVSC9!J6-2Q3=@s5~0r0vAk<mMz-lyarV
zDA!~|Cn>W`H&uKWh02@~t5Tq8%G@}WLRnH~4{jaUoLHSSxStwa;-oAwQWi~T37<S!
zsWE)v@cklGzu6JrSU#zrQ>U;t;ahB{y9fNQJ<Nud{e=G2edT-7nWzKg3#Hp%)4soo
zo!u{-x2Us}x`(fxGz2=(X%_EDQVw^#a+f42_uNF~P9LD$HN!iHwxzV5&^)->F+5%k
zFL9~ia|fv5)bsG!DV-;@*)(wVQ!eVt1x;PEyJ<LjI<o$-y?$wzWynP6Ua|w)Z&xE6
zPpSdU@zrs5J85Hm<KV5RD7%$AVj@(G<7c}42|e|f*iZ3vuu4n^PL6MO^p8;eCr76Z
zNsCh>)9+Iw9e1juTa#&ntt?Q7OzN*r@;#zXDtTC)l>P^Gl4GMvw9~F8?Ica77){qu
z8>*S5)H8g44CQ~MleF2J)^xX5Y2z8>@9(wS{qvM+xTHI-Bxw(mBf@=b#$`%f%J-_B
zmdTH)XUUJWjaY<a2lIVm`#BZ7fN$UzIPyyx6h$A5QG+JCbX`lBjZ8*w@`b{D1b)ip
z-C-O9qtw9k1U2xMxB`crCx`A2)G7TTX?U!uciO}7n(jIe(dZY2N<CPl)C4;ZLng$j
zVI{NFu(<_lSo+0knBxLvT8XKPEHdR79;b%;QfNyj(w0t8!yN-va@(NRq-NZt|NH3o
z^r<0pW9a|=)R4)^%?{oF=y&wp6xvzJ<Zo_!mETk9Exu6O)Ai$vCtk)D`Y&Tjr=%F7
z?P&;bRPxQT%keRnw!V*<=cV+|k?d5-KE9F|l}w(JCnq&K2Gj4Q?~~8L*h&AlX;_eS
ztpC;!%@$QE^(($RLvas_WeiP(Zj7bSdDtzwYz2;9{Yo;T`v^>Z$B9nH-2Upsxj^dt
z#L0uIwY&Hk-d_#BoAR|KwYr)Us^bge(qd`rNs<m@*f8dWVUthnG&DDDMfz9W4N5)4
zcjK256Y=Qu85b#=v;{{Bbf>&2ls5%C>Y!SellY)Vo0(~13q$36Frd@{zHoe+UIU<4
z0`!VkgKvRelE&Ov(qQ~x>@f9D9WhQ1p|0)mzd0$XpGu<Mk|xV+)}6-5KW8t-w<SbN
zod$CYVF#yEH?!?DsCO6PyVFP@4cY_axo!_Nv@tyfIQ1CNU&f;Iy62Pc|C%)T+DJ#B
zV@#|XlRiX^`DAEkO4|vogPR9dClw|Zn0{;Kx)2?n|GiS3d=WNXhm3NnfpcB-y8&uo
zjUELH!*iw7kv*plV@@3gooElHZ`MSlNj)*|=8W_Wq%M=F`$RQp#(-O5JDqL)TBDjn
z^R72se@T=(QMq1-tJd?i-Of%V?Lkup)btLQ77phk+yLczD6YF*4Tw+!CdY~wJs$Ul
zy=nHrPNhEPlROJdIx&_u%UXf)=ET{9IzufcM5i?^N)393TiQ0AOrPzs4w!6OY{>sX
z{QmJ-rOHEeJ&F0}mbkY5tuf8f)lr3!1rcdNSE0p_v*Og)^lKu=I?5vZnj_r9$e;At
z<Fw^xURCNVzEE2}UVHr6e%d@=s6Cpwsf4-dvOedg7RJMGO!pn7zUB+1Yx+xfpEUCh
z{lv$3$=GC%mu(>$-DmO80N?FL(R2WQY5%mXAvN7JmHFc7cBS6u`-APj0z9EZsTXat
zBbl*}_LTh4fa-+8_yRpHV`e?nIj}9U)wJf=g5#{WI%U1(h>lRv>6~N?lztFPKLAcP
zAszi4s{d8A8R>tkfqD$G`)&<w`1A-h)X`|xmNKtvbAN~KKTgc!W7JSzx?^bi6vt3U
znj^HnsP0c(@%>ahV?g|Dv(|Ksj8`LlNor(CBI}0%YGn8PX3E7F)MLJBll9(^vlG-Q
zzQgL2lCRV$>0hc-9G|K1tjHKE`B={}o6i4vj29E7^_ySX6u}*8nJtShw$<3(9?|W`
z`0W1sFZp&un}5l-8#?@7k#8UA=qbk8<bYo~!|;Xj*h$Y<<D=%33S+OJ$hUaDx&c#9
zE-TzR!+BNrs~Ir*e5JNPC`{CyIxc@r4V(Osn5Z*)eo?t^W>w7`m<tu9cGxBOtSqe|
z^o**?+Nz4u8NQl|9GC*g@SdPNwYBAoD(x8NR&^(-N*u%lyVvI3lIFXTrW9xfJhM=u
zYG?$u`Bf$Uiqe^|ATKIfLc!FpBWDS3u?Nq%JL>Yte1C<n{JiD9(z#Xh%S%dUEH0{1
zKeEdh_UBRRYKeP}ufz){O}Lv*F$>2zM_8@!HHBh5ie>!OsP|R2&7&-}gU(hnDynKj
zrVDdsUzC$KW%9(53RbrPCG?*STjN??ggG$t=BpgX9A6Fpb1BU^+6Pq!<4sC8$D23b
zQ;@5JzZ&5!EvlYbQ%e3`)VN33Ch8NFQwjTNMoqa7W@*J77#qS;SDBG{rA6149%El^
z%34F+&0StCsodPFy?E4~s1PTuoBnS_&8u9j=~I%ktQbLUQlTP9n)yrUb6n?$$lTiO
z(yRQ77M0c%)RfjrlQ<=6wy)xn@*1DNsA66vT&fbKMv7ftRn^u0>X|UMB>{>iET9x|
znNd`YbhflEU+FTR8Y^}tXwEX#5s_O70g5Whuj^f8Pi4uR>hj7NResX_5NZkkt)Qx0
zsHUD1+4LUfH#B9B?jK4$AT+xK29l=i%i53WDTs7v>J>-}RF#5zW-v3ID<Lk<$rn7H
z@?S#EN_2bXd_rC3m|0OPQ5IDo5&m5<k)$zQDkfdcbwbr1t?)UWlIe?c7Yj!|7pg4~
z|E4LZJV{l0jHjdoLf0yFlGvDDV_GQnogO`(#-f{`S|Mo|7egTRrKBP~Oj?Kfo`mO^
zhKj0|BF<MYK(UHadU>w~*Bmvcq7)hXNs)Oo@{6iz(X=p9+a5WaoJxdB`6M+#L*!SB
z98%PrZq~60S36(*Me@;?gBsFZCW%W%0{XB!I@HDIR)zb$`i&VM3QBAAX+&i)?T2<i
z&EFxh%q=gz+AjC59@Mo59mrd!%fGyqYYB79NvBp*22B0H9!JDtzVbxoRTY)wm0wlE
zH3Ulix^5%0OHIXW&~e+tA}!*f9%d>B%3Mw@`fC?UWas(I%4ljz-6quPF)EcHufL?a
zsHQYb+fwn-gGQGW)szcUb-pSxE+rS2NtEogr5tv#WE@fIPo|~QU${4IT7*5qk^STR
z>Z*;LSI9YJKI+syG30uDC~IFc!yeyHPZ#ko-@ktUqQJi>@SmqZsLxHl`@n>sj#ujW
z%iS-Oy(G#H%un1;;0yIPIlmX2t)EKai{?w<>&M3yk27&|uFqCbpYMxZJYOuIxW(~>
z+$3HJE6~L!@ybvkc1e7&+4Lv&qxi%g*1GoRvCT7VGef8jGuyVGV?!CaB>qeJByAR5
zI-Vs!Hy^{Eez1Whi_X84L;TnANuF2Pa5YfMQqL#u4SbTHAM%~b2MbJ_e+iWQ-peQH
z!K%{sj{&7jd-%ltRX%Y~fha;B`GhY2++X5xe<oe`aex2ZeEm<weth98lY`?6|NKwo
z@SmT~ahrfWOCPrhxc~Wi`(H@m|9F!q$T90LM?{n!KJI0JE?m8Q^(dQ^_Z=|EFMnm=
zs$aAn7A)(AIt}l~|JHk6zsGHykNLamh_TAD;UnMDzsL6fDE{}}{r25M)jM}vcXL?Q
z>lcpyhF|IsvzSn3y?({(Zgu7B-+O&>FW-#EFYf=doB^D1g9(Ysq2P=jzP$FmgKQgS
z*>IW-Gi;b{!!#SF+R$yo6dO8i*wxR_`F$I<+3-&`+;78|Y}jhU-8O8o;SL)%+whMz
z++@RtZMe~f_uKGx8{TZg1{;RrUtyblHmtB=p$!+<&}+jC8>ZRtbQ`*D=(J&1v?+Ig
zCVWQ^I(ORkmJQo%xZj4YHf*tBvkf=eaDxrk+i;l;3vF0n!wegy*)Y|HZX2f9Fwuri
z8!8)iMVb6}+R(CLn+^Bdu*HTOZMeaP>unf{zs@#S+py4vUK?iE&}~Df4G%|}e0*lZ
zHXClT;RYM_q;U^&|F@$J7nuAUFXI1gccH^K(V}y9-}x^bY}a>+fz?9|TyK}RAm5l7
zHuM^|<OE|5(LwCxS0{_Vf8wuq*?OCMC*9k<xA`CS|Br_MXUE?=KfTSp)Bl(G|0V_g
z-aV3tUcX5D7b<PnK+|6>8;1J(Rdzp4J!tgs{CB~LBrIQOylJz?on^%)AOBT&qy2l^
zj(3F}?>`EqzeqlN_Z!)3%1_ow@>3T^%NF;)@5ip8Ms^OIvm)A{-sS6@;7}IuVm7=B
zPj#pQ;136JR}(+C0ap%I>U8irU<Y3t{@({CCUZ`Xy})x%#0;JV%o_qv8(d(^aQ5ur
z0$<=0|D8Y=GL(rY6BhUZ-(c`g;Ea<9KhB{_fS>afVBZBib0oZH@C@K`KJl{xIKpjk
zH}I@caK?F!GXvPlCus@1X|yR9x}p?%pLAG(Kj9NUw*$Yj?GFPdj4^&T0q;3QsTHJq
zFYqJ2dnG@>q2rJh10N2Y14CgG_*~#ue68SzfkRG1h2>cM052F1&Bs6!;6r>;mWP40
zr<*+ZfTz(QQt@*-uz@cdT;R_qaZa9!&MDvrX~;Ta-w7OWhKWBBxQ%ZGes%!QWf@+F
zpDf^4d{U=}fk&p0XY5rv=Vg3C!wTTLe4W@^z>8qm90o4{?m7#e3;AyWzRoAK`V;V!
z4DyD($V`kqhj;`BMo%Yi;7;I`=TZjn#lSy&N2%X}KMZ__PvWtF^Rs9J)Yk&wwR}RW
zW?&ni_z}qU1dR)v$tQU(1UB&P$NzfZ{d{fU8-f49_qN0X+{$Nx?*RVjJmfUMZwKz>
zI}F|m+>sA&>=gU}hhAjT8V-DvPiV3Un0>LKt-$nI)Div#e#qwq?*!J(CN0V$@bkIw
zt+4L`zH$jqK7*s5Oq4X~vZO6g>NhaBq+WgtjJ(X0D+;)rZxjC40w3fPI&1`%vK8Bp
z{bJzze3CbTi3?3wfio_LF9m(Fflu=Zty+M0UBUhld;{<`KC%B3@Dm%4zmmSsC-w!v
zdcL{f4ZtV(B&}v(RiVMFfx#m7t@z2fN~tUOB<#(=_7dbdz~2W>;#@-Vp8>p@PyEP9
z#<`1?dKf$l_#|H|cr$QDxxur6&)E2G;N0&)Tl@$-!l!8GTohN!`GkfmfGvCyzrcqp
z@PeOaU^a}y#oz*;<C8w}Ht^X>@&>*em{?`XCGa4h^tCQv)-~jZ_yu0UC+)KkxSdbZ
z64{l%@JSip26}2ZlOb#!a1UQ6cq{O7AEMyk)xgXAq(__!fxo-f<bNaZ#g&YK*uMn)
z=my4H@J`?fH=6iUfWP3A@@@cr%vS;a8F0fozSFS>o)s{DGJq%EOuNKS3h-h+$#Vhl
zmwXcTUf{V+hPGM2J8n09;ZER=pVDXXBXGeTCJ#Q~)Sn@5jr}y>HFp~N_<&#V32hGp
zH{E6EDe(HA6F>e}0RO-zd3YH3IiJuCJ$)+i7X}yDw!y?BF!63a`jo%}_n5J<4fx8v
z45irb2k!or8S@23-DlDjIL*cde#Dn2eG}&HR=x$`JAf6x=j<0;;JF)Vx8Pa88a}D(
z4Zt9u<Wv0z_(QZU{HQ-bXFll{1;D2th7Q=b0+Syx<3I}VN*k{RraX#&{0Mw&lTx37
zzYV-@GyLrF&<FVX7U~`RPr%C_r`>~B1Mhv3HViKCmTlx4{5GK4Zsrkzu{(@?Ja7r0
z(76tn_B3V0e-<!iC+z{;4SbnzE%<)mS9~{v9|jKDWy+feyx|$z0QTrqR4?*LoG$_Y
z{4DJp`!?VqK3$JM^*rMb?NHzvKJmX6IDe197XWXU4|)o`dar4#6~Iqy{4?NOnC+>=
zBXG)o!h)v*<6fgI;PJrOd=md$U^}0T5AOpXf7|qhKLTgHW9n!w@a%VK(}c|c2KXfG
z&A_RDGwp2}@Lj%6{8+$+mdU3;M>}O>&2u_1y#tzp3+#HI^#r)U_zz5*5%>_Fj2jOF
zt3HP2_^AeV@X6W<fe&^2r+nZ7%RZxBfiDLBgiq54IPM_wn%JiUeSBgs@If2j2<(4|
zwD1!TT*W8jPXq8NzWvxY1K;A4uyP+o?t!ewk3hN8azAZY;6=8*K)FjHegw*$2k|3N
zWW&W?pvd?OE>L9f1s5oC^MVUZ_`={KZ!hxhVlPl+#swF++{Q(2T;#jOUZBW>3NG+P
z8y7yJ$OMbMK#_Zuya^PUR<Rc-vY&zr6gf`81&WNO-~#v9xX5XKXyerK|2MxVUD8Mu
z2~4Gl4ggjIQ-EuM0R1!mV)Q;`1NITvZURcUR-m}kMe3q~c&h6MNCCzG5x%Yi=%0zl
zp>Ilh`>>~Vs=_|(CGawFw11&^#JKi2_O~C${{G|GYaQ`@#NTop|ND<)Z}nj>eAq7R
zop&>?K)kn20aWL`teLS7nN#j_sQaDW=H}ng{~&6}J@sMS$99`rU&EZ(ZC>^s{)s!}
zzwJZJlqqEPe&j%AsoR{2o0~6-56NNv9{)FS;zV`+`RA+o^XIGb@^a<(`&FHIudCyK
zox1(@+tsgs{cE*(^JdlD+^k-G^;LD`$Pp#mSMjAiW9Sr9y!yfJI_|ygTDp{>9^>BN
zM~Ca;4=-K1Vug74D7gFZ-r(*-IPb#j#DK2zAm*h@#cb_G>9;mx8&ppId=xxfrrnpW
z=ybkM;NVW%ymYU#OTw3x5x@Ly6#u*TmX+-#eQnn9mzD9*K@dMTO8kd$mmhw#e+e(Y
zibI$Wlm6bF+Dsx6{{cx~{|=EpZ#(QIf5cW+Ciy$O_lpCV4vGhz|J8@r?LNHwpu{2O
zBeNIg;^A-w@nequ<1>R#y>s_oiclu>aqfR`)gU1NKZaE0{Cdsgq`cjG@o_WWiT^iu
zoRMKXXmi)|d+#0n+uho)xD)Pu&$M6{!Q-|6y}S3^Gk15_;k|XuVun7!ujf70byz!#
zf9TtOXID@=Yx+wRmT?yUTIu?J<E-P?d6UQ`zP0wRSsT^ik<B-@Mb>?%4&lHaUnIDL
zPdAO@Kyep;J;O;neSJ4#AFNXjzDT|pJ{RA}ptSQuJ~!XrYv<|d>FB>j<LI0@>bmQ$
z(|HTE@%8K1s|Ox<Kt25M!@7;X^2#gfop;^|xASTd57@{Uy793XY3bKjUmtw5>?w8Q
zQy)E5c6F7ykt!;CDj2-+sg5gY30L3v;pbOA3UcGm-{D2jugX?F^Ul0^^PVcpOaFJ^
zl~-SI&BejsBUc7*XdL&{cjsNHZVcY@)Fbo$UwdZ)US*N&{YFI=l|^(2xa1JFK!kvZ
z>?9#!NgxW&9R?L|3>aC25E4KbWmCqLK{Degf(S`mkOTx5L{T<3#H+HYxPpp`D1wTJ
zYu*2^bKY=>0TJi>p6`1e`$?zIyHs~obyanB)qCDUe^1Py|H)>%zx{TJ^HO|`e6{Fk
zt5qf1-0|Tm+QqtxYj6+uQ)`y;2_7YSKFJUrp)_vX*u}-g>HP|=T$e6gTvC$W_nMmO
zdDpLBKi9v1e|Pc47rV<YyUb0xqK6wYWQZF+e7GAqa-_@6)q6x`KPFC`=nBRrxZ=Nc
zagR*u<gOpm-A%tL+1)-W$<4`4bStKIbc?2>y4h0)xyNVaxaV){?KTu$<ziQwJ7=xA
z*3X+uc-CCo_2xRiVs7Be=90H4T=tf^e%s9Dss7~ybC-T%Zt!+<gFZJmb?Q`i^UXKA
z{QP`(=bd-DyY9Nn-F^4nZvOoF?!No(^Ygo8$rAV2V~=@T_S92Pxy{ckao2rm?y<e*
zo_p>&_u`8$x|d&m*=^jo(QVnX#l7{`TkhR=-*tOF+UhocW$yj=-}iFy>8GE%eS3Df
z55F_Fckf>J?YG~0S%Iy`#cQw9SI^)`XsXVX@4iIBBW16#S8{5nx-Qn*U26T@1RL#U
zS-yMBmbxvrF|eoZG{ML8)%u#_T$h>hWtZrA8Nm<PtF_W<yITZ*x8N5Gezo8?34TWe
zd=tSZ_SGIEM}Fl@=VmNXJVNkm_v*XCg5N6m_XPi;;6D}o9>MRAfRAsYxLlHC{Zjc;
zV-!=Gp_s~p@}0F0u}!s|ZEfxB-G0urDYjkt&h{>Kwtr(8{_&>?K1T4Z1m9Kg>4H~Z
zdxr^rLTzWaw01VPpR<QXJ6n^lK9@TCXyZY6IUjvb5d4XPuO|5Ff|vc-D<{T6r#kD}
z+S$N<&i*#q*`4{$mMwL*W#d73S3~c;s4IV`ft#s!*)7rAMPHTV@723`t@b6(TIV?H
zcY`x+a4r8~XG_;P+qf+PJ|y__1>Z;Tg9JZb@G}H|uizgM{7S*UAb5?L|Bm2468zpW
z_;d7Dh~Da9n0mNTJ=~`ro>dR;tB1X{&3)C{+`fM1_K!CAZN9nhmYVxvqm{v*A@~-8
zPZ0b?f*&mSae}`|@ORZV{kDU-NBfyuJKEf<`R3kPYVNa*2jQy<9uAx?_%j6GK=4fj
ze~#e0);2ewwYky#%uOGyzVgkjT59gCjR)ZmH4Pc1CGuo)a<`;zNh$tRpXRZR8^y#l
z=~;F|Qn$3!)RdI8<b;Hzl#CX!O`A4u)U#*9jPMO9sk*GcRDDQE$%t#l4Ly5?!q?N%
zle?!SsQd28NeSJOGS1<K#*Jedgs-QjCnlvOC8s0{9?V*v6BpMtj3c+CrKbg@#~D#|
zGg|5fdT12WAk<JurqX{}T53XC##wdhMd`Y3hz;M+Bt!5CNpz5$mT^X%I`vAgdmJ0Z
zgoI>jS^pWQpH`<%?=HTBI8S8*T^If-z$c~Y`e}8}>K(?dPjgTZd`3c2`UPoe-P1Da
z(?Pwcx^@3_^2sNk*#{iC&P&_VHA+VPLvF}`4O~y|o}QYPmfk%*`j8uRy=imbf4B6M
zwC?FC={?S_e|mTbjgZkSwnZP&Pyfk&h=6Muouh;TN8+FFzjdc{u{gbZTDm8~;~4N?
z_-CZFP6UOt^z@ASJ$lrsQ%6LUUC%iG#EiuF?i%6(T|c`=4^QQpW!IByR<7B;Myu{=
zDe2;Jk7!TjSv|tyk<c+I>D=RMR&JG$k)DyB+C9A#OPP?;lA3&8x8(Q}DpkKAd;wmi
zrpR1{uV-|KuT|~DN|kE&5{96do|Yg%I(R*)UE5Y|svTeT)Kpze?j~72@4V#XgV!@M
zx+PuMsYaE`=WB%I40=yZIXHesGIDoer&ErrlF0Ss1c_@}051N)9|>6ENwsTSn30^G
z&`GjZc3Ibh(yLbO4(UnaV`{`@_@CnM(D`<4k~>LNA}{;?HNR;o62#Q*Z9A5`9MQif
zIyI@|q0rKgLreN0oy)%3>d6OcPD$7<=VG<$l+yZp{JF{MqkOfBe7Pwup`1T=WIrYF
z=PtVFBJYn(%IaC>dpt0{tGj7fcQ-3H**$t)ceiBrB-d`8d<xmQUT>J|FW&*5VZ7Qq
z?zqFvnKQ@DojcbR6co67@4eUi3XeSUi1!DdeDX<$ukhOH2izR_8%yLXJp1gk?v+<w
z@xH;154O1vKKQ`x*s;TX_St9d^UptbUwyg9`v%{9^NsuIr=MK@x8|10SJ?PNgq@9V
zpoOlT7CPzW%)wgdCTO9%O$*)quC_huTH8w3&(^uow%O&|J8r3cr1ksYI^*KCAoh(C
zycXM;=Lr6M!6ynnP4Jfrezf3k6#QJlKP>nc1;4Fqo%zF05&Qn|Q~tm7Q|i0YQonwE
zDUssZ_4r>us&RaLd~-g9>er8|-=KMPtr|7XmOorCCbn_orj6rk*Q(j<6dl)Z(6DJ!
z-CMg>bbMTVoI5k7d2IYy)#GdHh8m}wa`u@G8pp<;R6X|W@QF|;wt0Njswc+^rrD`A
zPN^SNw|V?YRjXF7R=M)Y&1%-Hf5M6No1b-3)#{vxuN8fIl}c4&bZ>n8S=B1j|DU3c
ztD~cn8dk4XEl&G@293`+{!CpJ$XPnp_;F{R*0f<<e0*F};ji(V$Hg^@i)#?)={r+}
zCxII@@P}@4P31tU=tlX<zE)COQQ>@W5BCesMf;eblY8ziSFPki`v1Giae|h|?!R^*
zuidwm)iUz`jdD2Zk2E&;o}_wubaZqBwbVwcO{!I^rX7%zWq?z1p_RH*Jw-L(xIX?z
z3jCp8?QV{$z}s4?h<|9_ym^1sy0c=>o;@Fb@x>RPXzlr6_wL;vsol13-@ZNCm+pAy
zop+YL@WKnX>N%gd&Ye3;@;yyjG<-kWUHN(YE&OAyS(s04(xgd4weX7Y^3jy2OE0}N
z;d~X{e1_tPw`m`3t5&VDPd@p?w4R#cE(EA-+qP|{{kL&lG?@0_@9x~W^Hb6K{-#Zv
z?pd>D&E#&~y0uY1%+r~wbyaJtf(!FnJzV(=kGb|I)w5LVDpt|vz<~qG3}{<)^!V2k
zzh9LOo<|?;+O=x}e!|P+zkdCCQ;gJvpDka$+~chnl70N~$F^a^22)JI-v^9*1kUde
z%)F&bmri{A@y931?dyL1_19mRlarG&W5$fW@~gqEnQC0!x^>$qwsFb1=bj7iqEb>)
zV(C|(e-r*+fBm(|m&tF~uwh&AaK^4(yG$|NGCsfh>Z|tVn{RqNH9sDA=4Si$?e_ND
zZ~J3t3aWe_|5-A(@5?X0JRrIIL4EH0{`>FktFONL`nA_yd*Z_nKisCVz5_;d{!9AS
zRyfQ6_P63Mf66pgSq1-~!q=cOCqV^&ctsn0=9n7LK?^=X70wn^&AA0NI2W|Xg8wtm
zJTqPM7$cdO1}$sXuJtq^ABr~_bD%hrmltqEC#1u^-Mo3TQPB<NgBJZjcYt~6rI$Pn
z%%Sw(m<Pq`3E`F%9si*7KXP3<e6DCXTK%oJfB$~dGUVmIef#!JkYg%yptzZ>Sh2!1
z=O&-o>o9Y`oG7m5E4Z&)x6aU&ty{PH&(MGkK;F<3<_O%D>Gwmk-ZD#g#q7Kn&ElUk
zi(6yXa<$n->&+H^WcJPe{hOsL=>O3akN?V*EAtyQYSdOf{0!Mk(|mXuusO^De1#t7
z0^Iq`{J;0!d%p4+p2KhOMHZk1yx~7GTKKtH%Iju{o6I^X1m8|MgEs3#!?R}1MMIOP
z&0?N3oAHiv13&Uq#ZeWHzihn)75sx5%tg>1i=Lnd$je{fGwZok-{p8s{D%h3!TB$l
zohur$-%!5eN5#AK8_}&+da+Vu@u*5Y#YvIn>22DyiIFT!gAUDurzfC;7G5Gp@V_ED
z;5$5Lj*uJVAG@nPn@8wE;otl1QX0DH`;%RTYe&(bc(Ub)F7O|=*{so1rD}0h*vpO7
znqh(cNB*@Q88w&>TJR6#9QkKHkSk;(pamUA&X9X_BWTeJ%AfTs-WQ05G|7Jt@f#Yt
z=qI{6yj)5{E9rvb<QBWi-;NzUn&R=7EzVbrzpdtB26~2VsfZ5bJ#tP0xuS*tTxVSX
z7CRGJ`tOjALc_aesiL8~Xjrm4@{YrP{!&+FABLEE-+lL;X`MNwLPJmkIx3ozfR;!)
ze)!=B+xWy>yYJdGn>{+g?iiKm5xeALv%h?3)^EF6IyAf))@R8~=RlvaNz!L*QWNO`
z`rJbDgiimgJX-}cc>Fcr(-pgjkzJn#E!acafCgIR9=R@0M<8FwI<mCwe;&05uI_9_
zW4qWrd0jmX5OCS2W*3KP=)29Vk8tWG8p`w;8p8VA5}PEO+E_NJfoO<cUTRy_&D3%<
zc>H5xV#@5l)_B(WU(5&k%X$#Z2l~KqpeNujyJxHKyuyknbhi7i?qY?aVXkPPWXgUH
z6b%Dp<NxaeGiV6(85#n8#wN9XL41G4tQj<j|Dh+$E|i^8d8H!!W$(TGOV?)L5214b
z9RV%O0qa5JoCLJcf<Jchv8hS6_?k|(P&C{p8Vbgg;-9z2?DEe<!%nlmiU#x<o0KM-
z6zDTF1o{jOfj(oCVpn+l^<>W>r5<|5`XWE8tU^Oj%hM6)N+cb8h6c*xlRMbM*LJkU
zf9qrqju#E%y4W{+ci9_KXK2U}4a%|EUnBGxn}j|mNf)q5?PZf#p97oJbd_1dQvA!?
zC6B-S`{`}lwvCaGG7UPgi?qlLbl~&QLJQ|uYXiTGYpl2U43sCQbg*TUI@nUtut+p4
z5Dib=HOltwk?<Tv`BZd{)SR?ueHIOYkI{5xDexiOm;J|H1oGdpW5*`UMNrXK@CG+<
z4`{*mWAEA5U^iK-SlcKouWN5lh=#`|b+jedcCr%DP+p(^Et`}-GRdZ2)y-}imTcD#
zNw&#Xq}Z)vFR}OD*kI5Q>0@|(mQA8mgum>)mw(|i1Kh!j7M#EveSpuwoM7W4{bT$g
zXhi;>xv8r?EgF`KhDRrg2I&I&3=QZrHt8<eRcM$A4a2+HjYCDll_@sqite5U@WjVp
zeGYt#wp!m*ej)$Z4Ax-$2<n0b3#_=f*zik(8q5dnk@Q4yS=(?=rmeZYojo;GG)Na7
z5e*N8^%<K~Ft)4B&FyNlauV$J>_oe5M3UVq8g38`*NKLSqJdK0$M|pQhRQGO5BN(K
zy!=b9r$NgNH{4()B_*DofCk#b(E&}!7O*=vK4NR9wX@ZtVTEY$`Yal-Nr67kmrc4m
zH^J`ANwj~7h8d#a7SZr`$<frT6ptu2DJjCoctm=y@(cS9{(<~=>eQ(TIDn^~3Mr$3
zd5NUsNVNR)(~tK4n%VZ;^kiFgeS2FG)@N)|pwIWpCPBlTFb)5d9L=~Y$!;E2N&|>`
zA4C3jAJw_CS3jG*R8ICetjC;d{ms{N3~AZf+3Ud-eMAQ)O`7Csh?KALw3MF{j<E^o
z!mpJ#o?Tq#W1!Ff2<vk>xFh;M;LqIm>eY*Rum>M}(EDEaG>Q+{xN+mkXgCrbN17Ax
z!6rS5P5L!`77dgNcwNz{dhkil+N_c7w5Cm)T1G~O>Ddg!uglBJvoT}F*!1bsy<RKi
z<LwT<P(`%Bd)5YQ6}}MuDEk2l`uytsW9`T9wcjWj=hx>*ALFjDKF^dcP%1(;IHy=e
zP5Ju&rDKnOixw@;*P}hz`ibq&<VX8?C@d_r3opFT^lXv+;~)Pp<&^C9+i&;yu)l}j
z(7;;2I)PkK*~35s_7pi}ErdtU-kM^Y9svLSw*KC62Yn3b0zL-%j7^$7J{|Obb^oQ<
z-_1&ePDOqs>-pOEx7BknCDLKjHPdh2nRLQ9?%lh$_j~j_jJKcQ4zA1*Gz67%@Eh4<
zpM!75T%Zr=wAW|N1M733&)B3$eg2=v=ivv=33z>^wnK*wx9gc69|vLVur8aPQ8Yc1
zWQu87vu4dqzO}~%Jn)wyD>MW(po5nFsK`{%H@5ZVxr6Mfzb9&aF7+{3pNl6Z+vEQl
zVsF2+%=Ult&1TK_QO6(jETv7GHtlOYqh!}zcilIaTylwx7%{^0UHeKeOVEH`5cdH$
z=qOJMF$mUS<Q^XhT_GN^O8ZI9;Ulq5KuZNhEcos{=Igh{f9OlPJ6|!%ZP#3L&ClSe
z=SF=+rvn<AH*aowcFoTNYX&lp?-S4gzTl6{LnnI!TJ!-OK_7xSp+yGqO@g(Dy*K-3
z$;)qwf1+E+zhtRE&x>tAPn8k3Yp=c5&jU1IR~1{f0Rsm3^UMJ>1Qi;BeJ^`Td~D<%
zJZX_3Xba?v^Y~Qw+_EMARP5<|J!g0udx&GfAGxO@OT?R@3EYS|>)AW6zsbqTmYA4m
zdOF3=1J{8GXrK+`DwvZ%PtXr=4_f4iJp*!uAIRJV@eScmy6t4uqbc5gitg!30mO)h
z)6nOqpMKiY0Dp)ZN<TaenVFf^r%xX*Tgu6M{NXh`hZgWg53oO+XODpV;A^jv9-ss0
z1pQ)zh5OIyXIfNLRHEj+P;sZ7LYkZpd7Yyv-hT*W5dSCOEBI{Nw$0<Cxi$F~JXP%V
zLGx{rH!lOMQSh1jsT@NCb`+js{~vz%VOzX-v0nopdgvh!M~pyx+9}(1nbyc_h5K5a
zyHQA!_c+@8O+E0%|H1xCA7^lkzR`jU^NwARoO)kEc@l41rR#ou!`2|*$Q<~i2k0ep
zf}Ai1#Iv{_6h6~0bHseGo{Qf5gg17RJmJw6kAEPiw2?9l4M7Dr=t73jg&S|Y(PXoX
zbvm+uTTp?)&R~lu$ParWD!4<}ym|A8G0xZ5;(sgd(CG0G{D1L#8Z-oUF`y-&ffjya
zo3wWOeF8GYS{un<aOD{MnVZ0eAg_bmBTMic9g@wMB|MG=_cHt=<sTanIUg0x33L%-
zA2@KJ>A74l-vQ4fTkb=akaf<p27r5zAJHC3-#9#G+&%t`5$u1p_RK&oS%aVh9fVKV
z4{ROlQRJM!+hxm^+3eY~y*$J3ph7pYgYMurag5B+A8UbZ<^y_l!m;ul+$lc(5V<ab
ze^8+zs7IO;Xwoy$e!W7*fPpsfMYdMSc0x;lyZqDpk5S%Bu|D|U$A6?>e*dfWdm6OB
zf7*Z!+JFvPc#3^N7pTk)=a>g<Cwj`9VT;Hmkb{C2_^vUI#m*eW_|Q)t|3LobD>Q*m
z)FaIa{yqK=bdi^%B3rc2KmWY9yYK*gMc%<5J&-)!tKomI%tTU94}J#mPuYpG_zyI&
zcH+Na|BwULBi2rM%$^h8GY|Lz!8~w`&BxYa$F!&Lc@5G0pT-?Jy!=PXMtM08jsv}o
zY>{=2xrezx=HW9mBI}Z)pXDR$)LgNy@{GlAS)0J`*UG87foBl@Pgcg@*$1A}_}#^(
zXmMF}_0>PRD)w{2)mLxV_jC4^w)*6c|8wo};r=RxTYdXQ<Ei}4Hs~+tKLYP5bg$#p
z;dcA)X(xyAw9>XxxII4HRtdK?!)<i9O$fJ>!>yIJm1tvyPe?UU^%$SiIzgcLw^Zc$
zu)d;ZdaA0T;I>~ivT#gBrF=Y4-Bnl^D@uF8R$BAZva+)J$=^>=%s)xzTdCr6pRQUa
zr}X{q0kd(+_4InZG{;6Pn4H47%IyqPZ20xBJW5Bx0b0+jT)A>P?d?WOrw?Gy<a2%_
zd;6)@g3o1_-jaV_s5seh`M@c<zqM+N{Ea<Bl;a>zMl3W@@mq4<<cqg_ZT707a{4|J
z<qO?^xN??kc#+0Dfc?ZqvR?uRYLLSS`}{x4u6`|>yIFSgNjfHHO1_ai7x@)p;^c>3
z+h?{xv>!#THyS&wxI(64PyN9G--*2^>mzoZwFp~{FN>eTH9k`=Rj!JhC%HCqJUqWZ
zj*9#ad4F<jl*19P^U>@9v<J=BeqlK4FY6lnT*k$Zh9_bAz3)`oW9fhLWtS*+OTLd>
z*`s?SuU7b(Bvzz6`0?2f;v-POfr@>n!V}i7-5<SW4_x2h=Ou`TQwHr;zH3)$-t^DH
zfxIuzKoHv}=Nrf)`Cjsjoz=c}s7yw)rfC0~DL=PAcm%jG|M<Y*!uqq~u8}^bP0pE^
zd@w#Z{I_r*?@9jL%cF20*G7&9c_c?gu9H0B#nKU#b>TUQW*t}DC0pOW8_wEH4RFBc
zfG7CYizg-fTp#%v;)oQ+rjmOle@xCVQXYAhg&YmJK5|URW8Bjobbl~Deo&BKWL?Ei
z3;eeL7a)i$6ALU-Jd>QSzDs9QrDKseAdmga$)ld%_d3C|G{|GQJY6*7E1#07xI+I(
zJQy1}r=^f@BS%8MkUZ70J9B<DXSnNov)paUc?t)f=RqgP*-`@f@hc`wn2<er^5o(8
zpws{l;wJEdLVTTE6FClYW#pO2Z;&S=$3$*}92xngYX_IsJFXjM;Nay^dDkHKO@EQ&
zV*{x8Hq=Nwz=io=b7O*$?|N7`5Yr?!PL2h6B+o^Dg<PZ0afQd9ctsC}@;VX7V;Av3
zrELE3&6J18)b}p?V++{t<DWw}xWEJ2O+~|e-jIA1xm$9E<euk+^M&XH`4Mu3Q<S3$
zc)(zhHk#b6N}2qlTl#Kqw(S3KbP>D5zJR?QJi+$Bk9|AewDte$>+=M}r;$f;_{63I
zogmLdu8%y~<S-5l)^}TJ9)F<5e&<`xl-ZzY{7YmIJ;djy1rI9xpn?Z{VjhlEHm`li
z=S<1fO%o2}OUspC*gwX<_10T6@44rm{^W-6$H4=hv#(}PP23bb;05-GYZUUgJO>cy
zL`Cw*ePLOvsENkMR=grx@s^SB;kMgu^L7ur%le1?M;71*vdGxrLP00K_+X3e{@``#
zL^*ksP9TqziUtnkpZz#-4r03SnEjP>(eJm=O>he4Cvt9>i|6wD+TI;oY|n?UACyPw
z1o>;^an7WR8NR~xU$zy0JDTy8i+DdF0k7_ApPSY@73`K<Zt?p&aKbL42jBq@m>+oa
z_0G5Km4d76iR+X6vjBlS7Eb745C1#IKHDMZ<e;n_!iKJ0yS7ohcLH=Mk2z}4pg}L_
z``dQaRaf~qu%40hv5R2u1JB_H{AYiMEWi)&FJI_W_id7FMXt4njL(7cVt<j|`+Xp5
zJ$V^&OY*Z!&wYEkgZ&qHP~iu7l%E^$W8K1burF2j=d0r19jQdK2bKS^i(Ddk34PDh
zh`)lv=+UD+-?0a*gY+H90Apbn0$tTQ@uTuGLnO<2@{xYlpgi;RYkR6_cqQJ?96EI9
z^W=Dl(d!HU#$1qJ)4J@(!5@I{j8DZU!$%8RtySNPpVz3bdCFJp*4S(Xeyw=<LkH;#
z-wu8g%S8r>rIXh{Kfp7HT`>pP1>nF1USPMenc%r<)vDVxaE)IZT-Uw+D}S4*@6q*V
zZ2DxL!9ni{Fuhm6F1X+Vj~h5pxd$EKKI8^J346hFiHe06s9*L9M^n80#s26y`r-7q
zO)+`ad~6Q61--Mt=a|t8@T0(oAjXToOil&AT{PUSL63H9@blvb@(f?8;6Y_P)+4<m
z!P^F&RfTqBj`@Pu(2Y%2?B)L7IJO_3ab#<}{jUg*zz5cM4ou&7^s!?6LSjzH<L?;T
zj}N`U`im?<FMU$6dFULv4V}ms&+qW;g}xWy?ZYwB&DfM^=r7OrNd7YiRBSJ{k9pQR
zA&|e_iih2-K8T+jYvH>lwT`i(U%zJG4vW{1(fZDArLynqMo$qhR4b{vqo~{$z(fm#
znxJz*ovhDPn^M6$Sf>2qd%GcbxT0sZ=)1xqc}$)+Z{DNI(d?Iv`a;iz{PX_%??1%u
zC<m}deT-VTaG^i1drl}SDoRy6d*z}<i~M{BYZ&t^oBn#_VC2*E{4;UZAJoTo$=^Qo
zki9YTx>$RVKg+M<xyA(Tt>$PSsPcHw2lpb=_;7(g6X+DSEJOPy_DsYOHp#6yPtSF#
z1pcujf52Gi8g_|_yaG$f)b@lu@Z+T}nLii)_l??R*e3J{T=5-{?F~=eYx$!}eZ#@w
z{Tus7_OI*}*sHYCUg<93MXr@SIk+SLjQilERPW<_tv%Qr;Y=Uw#o2oii(uc!zO%jd
zoy4f|slXe%MPU!a9_o>Qk2d;<ET75564N1$z@82MF;A>P_(7BvH+1*@7W)tO9_)Sa
zb=hx}+<mjr2mA0|!h`wKyJvi!8yf~6wm(~7%cgYk`$>Fv{C4&Y?42fN_4H%>d7Ie+
z?Q8WtZ<{=MvVTT|yc%<fyafFBH|yVqHA}qTKT&(1aDmvz;Gfn7Z@0+F@%#X=fy^zP
z)YW!v-|YFx9_sJI{P_C<`9b!u_1GQeQr}(oJjGTsm+!4Dw1=<j>7VDGJHEHAfARr_
z*Bd5Fi@v+!eKqVCa)aH*=VCsvr;)hunYBECrRDx${^4EVcWu);$@r{C>=Wo4yR5Z;
zawI%<8ocQTUg)~lC)RA@Nx-ttX6;rk<`7u=nN+1Dsg|lcK3tvJ!`0v(?x)t|-bxB&
zhC;Q}p5WiOruT=|Dm~(TYscvt_f++7TRUFYN{@Kg+6j825l12arnSo9J9VUcP7L1}
z@^4wI;yP#M<z<Z=G-5(%{Kyg6d0k@0=4N-y8$2{?WM*EAk;4Y(j>;Q#<(L+OM~&>5
znK!cKxYjYDk(t@UuFT2{euc72OzW1dV!EDEJrwFZCU<O}|2@~E?5#~HoFMbE29MRx
zI8N~Wgj71`W{n=JQL?V+n>%cremQVRR$ke~$jjZw3zT2z?2|PvYeZ-S|GUIw=A~wj
z8+BDyZcJ$Gu%y9*^%Im`Vy?^_k(U+IwR3z~--iO1^&fG^FGlYie+aIf<I9K^c<1<l
zpI!SV^-W4iNxh)wfC1qTe;ohk_<?-$<=zd2TMM`A7k*q()uO&d1BzTNy$4k1*UjHL
zf9L!I^Q#s_6~q>_FX&Y;pkQdh_=1}XW)&<bSYEKMU~9q7f&&Fr3!@5obN?2>xcRl_
zPkC_W!dVOFFI=#2$-?CeS1(+*aKpl_3%4)axp42o0}EYo)#6&kQN^L+*y2{j?TZtO
zdlmOB9#DLF@zCO&;_<~(if<~OSv;$Fe({3hCB@5&R~N4<-cY=?czf}IVpmeNq*h5(
zNvI^Yq*Y1#lEji;C4EZ<lw4jiv?Qlwe94rOn@VPu%qp2*vY=#1$?}rbCF@Eylx!{8
zUb3@fZ^?lYx2Wo(T8p9<g%-swYPG2SqQphL7A;@2b<u%EQH$Fz9=~|z;#rI5FJ7>C
z$>P<EMN413qg_o-;rPNSg*O$>ESyz1zi>g}lEUSMs|(i^!nd7;dkYVE&ebZ4Dhd_F
z7PTsBU)0O<@$#afML9*|i>4I8m_N!N9Qc2W0}UGt?l^F4o_?KnVD2dWM)kn#QF#-x
z2VbF|Y#ym!b<P@?H)?F|;H*)D@~$2@X5^T`1NHOY;|Asp&K;IBCU0QQgfT-$Ww*>4
zpH=;o>V113f5K^=y4m;E={K?WxmDNeh{`S}BV%Odux!15D`!H(P>bd*Li&wn{hV;e
z(AY6owrJ0p>cd9njLIDo%FPNs<xR+|er4{ck)fPnIW05%&pT&lj%Yb}#ITlh777FK
zx%#jxLm3&_`r+V=j8K;@p{BujO*?8q4TaQI%go#%<1TG=S*VMKXqh*5P;73~*cPRv
z3=~>dUpo*=nk6)9dQPaRY6MKPvQDz}E9S9`7~8CwNUn6;Y5rvodRux0M0;-N-xPTo
Whp?b;_-8yS$^3TECB5}o<$nR-VGrs6

literal 0
HcmV?d00001

diff --git a/venv/Scripts/python.exe b/venv/Scripts/python.exe
new file mode 100644
index 0000000000000000000000000000000000000000..b1b864047e1a13321dd116e391f26f35c9c95ca4
GIT binary patch
literal 524872
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

literal 0
HcmV?d00001

diff --git a/venv/Scripts/pythonw.exe b/venv/Scripts/pythonw.exe
new file mode 100644
index 0000000000000000000000000000000000000000..4ceb8756c5dc1ea1a72149303e34bec03eb4e5c1
GIT binary patch
literal 523848
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%0AEz-rmBT&5E*_BIq`DlHy5E^^-L
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

literal 0
HcmV?d00001

diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1
deleted file mode 100644
index 900f50e..0000000
--- a/venv/bin/Activate.ps1
+++ /dev/null
@@ -1,230 +0,0 @@
-<#
-.Synopsis
-Activate a Python virtual environment for the current Powershell session.
-
-.Description
-Pushes the python executable for a virtual environment to the front of the
-$Env:PATH environment variable and sets the prompt to signify that you are
-in a Python virtual environment. Makes use of the command line switches as
-well as the `pyvenv.cfg` file values present in the virtual environment.
-
-.Parameter VenvDir
-Path to the directory that contains the virtual environment to activate. The
-default value for this is the parent of the directory that the Activate.ps1
-script is located within.
-
-.Parameter Prompt
-The prompt prefix to display when this virtual environment is activated. By
-default, this prompt is the name of the virtual environment folder (VenvDir)
-surrounded by parentheses and followed by a single space (ie. '(.venv) ').
-
-.Example
-Activate.ps1
-Activates the Python virtual environment that contains the Activate.ps1 script.
-
-.Example
-Activate.ps1 -Verbose
-Activates the Python virtual environment that contains the Activate.ps1 script,
-and shows extra information about the activation as it executes.
-
-.Example
-Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
-Activates the Python virtual environment located in the specified location.
-
-.Example
-Activate.ps1 -Prompt "MyPython"
-Activates the Python virtual environment that contains the Activate.ps1 script,
-and prefixes the current prompt with the specified string (surrounded in
-parentheses) while the virtual environment is active.
-
-
-#>
-Param(
-    [Parameter(Mandatory = $false)]
-    [String]
-    $VenvDir,
-    [Parameter(Mandatory = $false)]
-    [String]
-    $Prompt
-)
-
-<# Function declarations --------------------------------------------------- #>
-
-<#
-.Synopsis
-Remove all shell session elements added by the Activate script, including the
-addition of the virtual environment's Python executable from the beginning of
-the PATH variable.
-
-.Parameter NonDestructive
-If present, do not remove this function from the global namespace for the
-session.
-
-#>
-function global:deactivate ([switch]$NonDestructive) {
-    # Revert to original values
-
-    # The prior prompt:
-    if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
-        Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
-        Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
-    }
-
-    # The prior PYTHONHOME:
-    if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
-        Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
-        Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
-    }
-
-    # The prior PATH:
-    if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
-        Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
-        Remove-Item -Path Env:_OLD_VIRTUAL_PATH
-    }
-
-    # Just remove the VIRTUAL_ENV altogether:
-    if (Test-Path -Path Env:VIRTUAL_ENV) {
-        Remove-Item -Path env:VIRTUAL_ENV
-    }
-
-    # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
-    if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
-        Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
-    }
-
-    # Leave deactivate function in the global namespace if requested:
-    if (-not $NonDestructive) {
-        Remove-Item -Path function:deactivate
-    }
-}
-
-<#
-.Description
-Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
-given folder, and returns them in a map.
-
-For each line in the pyvenv.cfg file, if that line can be parsed into exactly
-two strings separated by `=` (with any amount of whitespace surrounding the =)
-then it is considered a `key = value` line. The left hand string is the key,
-the right hand is the value.
-
-If the value starts with a `'` or a `"` then the first and last character is
-stripped from the value before being captured.
-
-.Parameter ConfigDir
-Path to the directory that contains the `pyvenv.cfg` file.
-#>
-function Get-PyVenvConfig(
-    [String]
-    $ConfigDir
-) {
-    Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
-
-    # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
-    $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
-
-    # An empty map will be returned if no config file is found.
-    $pyvenvConfig = @{ }
-
-    if ($pyvenvConfigPath) {
-
-        Write-Verbose "File exists, parse `key = value` lines"
-        $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
-
-        $pyvenvConfigContent | ForEach-Object {
-            $keyval = $PSItem -split "\s*=\s*", 2
-            if ($keyval[0] -and $keyval[1]) {
-                $val = $keyval[1]
-
-                # Remove extraneous quotations around a string value.
-                if ("'""".Contains($val.Substring(0,1))) {
-                    $val = $val.Substring(1, $val.Length - 2)
-                }
-
-                $pyvenvConfig[$keyval[0]] = $val
-                Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
-            }
-        }
-    }
-    return $pyvenvConfig
-}
-
-
-<# Begin Activate script --------------------------------------------------- #>
-
-# Determine the containing directory of this script
-$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
-$VenvExecDir = Get-Item -Path $VenvExecPath
-
-Write-Verbose "Activation script is located in path: '$VenvExecPath'"
-Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
-Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
-
-# Set values required in priority: CmdLine, ConfigFile, Default
-# First, get the location of the virtual environment, it might not be
-# VenvExecDir if specified on the command line.
-if ($VenvDir) {
-    Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
-} else {
-    Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
-    $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
-    Write-Verbose "VenvDir=$VenvDir"
-}
-
-# Next, read the `pyvenv.cfg` file to determine any required value such
-# as `prompt`.
-$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
-
-# Next, set the prompt from the command line, or the config file, or
-# just use the name of the virtual environment folder.
-if ($Prompt) {
-    Write-Verbose "Prompt specified as argument, using '$Prompt'"
-} else {
-    Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
-    if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
-        Write-Verbose "  Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
-        $Prompt = $pyvenvCfg['prompt'];
-    }
-    else {
-        Write-Verbose "  Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
-        Write-Verbose "  Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
-        $Prompt = Split-Path -Path $venvDir -Leaf
-    }
-}
-
-Write-Verbose "Prompt = '$Prompt'"
-Write-Verbose "VenvDir='$VenvDir'"
-
-# Deactivate any currently active virtual environment, but leave the
-# deactivate function in place.
-deactivate -nondestructive
-
-# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
-# that there is an activated venv.
-$env:VIRTUAL_ENV = $VenvDir
-
-if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
-
-    Write-Verbose "Setting prompt to '$Prompt'"
-
-    # Set the prompt to include the env name
-    # Make sure _OLD_VIRTUAL_PROMPT is global
-    function global:_OLD_VIRTUAL_PROMPT { "" }
-    Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
-    New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
-
-    function global:prompt {
-        Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
-        _OLD_VIRTUAL_PROMPT
-    }
-}
-
-# Clear PYTHONHOME
-if (Test-Path -Path Env:PYTHONHOME) {
-    Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
-    Remove-Item -Path Env:PYTHONHOME
-}
-
-# Add the venv to the PATH
-Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
-$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh
deleted file mode 100644
index d97be30..0000000
--- a/venv/bin/activate.csh
+++ /dev/null
@@ -1,37 +0,0 @@
-# This file must be used with "source bin/activate.csh" *from csh*.
-# You cannot run it directly.
-# Created by Davide Di Blasi <davidedb@gmail.com>.
-# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
-
-alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
-
-# Unset irrelevant variables.
-deactivate nondestructive
-
-setenv VIRTUAL_ENV "/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv"
-
-set _OLD_VIRTUAL_PATH="$PATH"
-setenv PATH "$VIRTUAL_ENV/bin:$PATH"
-
-
-set _OLD_VIRTUAL_PROMPT="$prompt"
-
-if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
-    if ("venv" != "") then
-        set env_name = "venv"
-    else
-        if (`basename "VIRTUAL_ENV"` == "__") then
-            # special case for Aspen magic directories
-            # see http://www.zetadev.com/software/aspen/
-            set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
-        else
-            set env_name = `basename "$VIRTUAL_ENV"`
-        endif
-    endif
-    set prompt = "[$env_name] $prompt"
-    unset env_name
-endif
-
-alias pydoc python -m pydoc
-
-rehash
diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish
deleted file mode 100644
index 4fa4eac..0000000
--- a/venv/bin/activate.fish
+++ /dev/null
@@ -1,75 +0,0 @@
-# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
-# you cannot run it directly
-
-function deactivate  -d "Exit virtualenv and return to normal shell environment"
-    # reset old environment variables
-    if test -n "$_OLD_VIRTUAL_PATH"
-        set -gx PATH $_OLD_VIRTUAL_PATH
-        set -e _OLD_VIRTUAL_PATH
-    end
-    if test -n "$_OLD_VIRTUAL_PYTHONHOME"
-        set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
-        set -e _OLD_VIRTUAL_PYTHONHOME
-    end
-
-    if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
-        functions -e fish_prompt
-        set -e _OLD_FISH_PROMPT_OVERRIDE
-        functions -c _old_fish_prompt fish_prompt
-        functions -e _old_fish_prompt
-    end
-
-    set -e VIRTUAL_ENV
-    if test "$argv[1]" != "nondestructive"
-        # Self destruct!
-        functions -e deactivate
-    end
-end
-
-# unset irrelevant variables
-deactivate nondestructive
-
-set -gx VIRTUAL_ENV "/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv"
-
-set -gx _OLD_VIRTUAL_PATH $PATH
-set -gx PATH "$VIRTUAL_ENV/bin" $PATH
-
-# unset PYTHONHOME if set
-if set -q PYTHONHOME
-    set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
-    set -e PYTHONHOME
-end
-
-if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
-    # fish uses a function instead of an env var to generate the prompt.
-
-    # save the current fish_prompt function as the function _old_fish_prompt
-    functions -c fish_prompt _old_fish_prompt
-
-    # with the original prompt function renamed, we can override with our own.
-    function fish_prompt
-        # Save the return status of the last command
-        set -l old_status $status
-
-        # Prompt override?
-        if test -n "(venv) "
-            printf "%s%s" "(venv) " (set_color normal)
-        else
-            # ...Otherwise, prepend env
-            set -l _checkbase (basename "$VIRTUAL_ENV")
-            if test $_checkbase = "__"
-                # special case for Aspen magic directories
-                # see http://www.zetadev.com/software/aspen/
-                printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal)
-            else
-                printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
-            end
-        end
-
-        # Restore the return status of the previous command.
-        echo "exit $old_status" | .
-        _old_fish_prompt
-    end
-
-    set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
-end
diff --git a/venv/bin/easy_install b/venv/bin/easy_install
deleted file mode 100755
index 62fadc4..0000000
--- a/venv/bin/easy_install
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-
-from setuptools.command.easy_install import main
-
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())
diff --git a/venv/bin/easy_install-3.8 b/venv/bin/easy_install-3.8
deleted file mode 100755
index 62fadc4..0000000
--- a/venv/bin/easy_install-3.8
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-
-from setuptools.command.easy_install import main
-
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())
diff --git a/venv/bin/miniterm.py b/venv/bin/miniterm.py
deleted file mode 100755
index 6444258..0000000
--- a/venv/bin/miniterm.py
+++ /dev/null
@@ -1,976 +0,0 @@
-#!/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv/bin/python
-#
-# Very simple serial terminal
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C)2002-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-import codecs
-import os
-import sys
-import threading
-
-import serial
-from serial.tools.list_ports import comports
-from serial.tools import hexlify_codec
-
-# pylint: disable=wrong-import-order,wrong-import-position
-
-codecs.register(lambda c: hexlify_codec.getregentry() if c == 'hexlify' else None)
-
-try:
-    raw_input
-except NameError:
-    # pylint: disable=redefined-builtin,invalid-name
-    raw_input = input   # in python3 it's "raw"
-    unichr = chr
-
-
-def key_description(character):
-    """generate a readable description for a key"""
-    ascii_code = ord(character)
-    if ascii_code < 32:
-        return 'Ctrl+{:c}'.format(ord('@') + ascii_code)
-    else:
-        return repr(character)
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-class ConsoleBase(object):
-    """OS abstraction for console (input/output codec, no echo)"""
-
-    def __init__(self):
-        if sys.version_info >= (3, 0):
-            self.byte_output = sys.stdout.buffer
-        else:
-            self.byte_output = sys.stdout
-        self.output = sys.stdout
-
-    def setup(self):
-        """Set console to read single characters, no echo"""
-
-    def cleanup(self):
-        """Restore default console settings"""
-
-    def getkey(self):
-        """Read a single key from the console"""
-        return None
-
-    def write_bytes(self, byte_string):
-        """Write bytes (already encoded)"""
-        self.byte_output.write(byte_string)
-        self.byte_output.flush()
-
-    def write(self, text):
-        """Write string"""
-        self.output.write(text)
-        self.output.flush()
-
-    def cancel(self):
-        """Cancel getkey operation"""
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-    # context manager:
-    # switch terminal temporary to normal mode (e.g. to get user input)
-
-    def __enter__(self):
-        self.cleanup()
-        return self
-
-    def __exit__(self, *args, **kwargs):
-        self.setup()
-
-
-if os.name == 'nt':  # noqa
-    import msvcrt
-    import ctypes
-
-    class Out(object):
-        """file-like wrapper that uses os.write"""
-
-        def __init__(self, fd):
-            self.fd = fd
-
-        def flush(self):
-            pass
-
-        def write(self, s):
-            os.write(self.fd, s)
-
-    class Console(ConsoleBase):
-        def __init__(self):
-            super(Console, self).__init__()
-            self._saved_ocp = ctypes.windll.kernel32.GetConsoleOutputCP()
-            self._saved_icp = ctypes.windll.kernel32.GetConsoleCP()
-            ctypes.windll.kernel32.SetConsoleOutputCP(65001)
-            ctypes.windll.kernel32.SetConsoleCP(65001)
-            self.output = codecs.getwriter('UTF-8')(Out(sys.stdout.fileno()), 'replace')
-            # the change of the code page is not propagated to Python, manually fix it
-            sys.stderr = codecs.getwriter('UTF-8')(Out(sys.stderr.fileno()), 'replace')
-            sys.stdout = self.output
-            self.output.encoding = 'UTF-8'  # needed for input
-
-        def __del__(self):
-            ctypes.windll.kernel32.SetConsoleOutputCP(self._saved_ocp)
-            ctypes.windll.kernel32.SetConsoleCP(self._saved_icp)
-
-        def getkey(self):
-            while True:
-                z = msvcrt.getwch()
-                if z == unichr(13):
-                    return unichr(10)
-                elif z in (unichr(0), unichr(0x0e)):    # functions keys, ignore
-                    msvcrt.getwch()
-                else:
-                    return z
-
-        def cancel(self):
-            # CancelIo, CancelSynchronousIo do not seem to work when using
-            # getwch, so instead, send a key to the window with the console
-            hwnd = ctypes.windll.kernel32.GetConsoleWindow()
-            ctypes.windll.user32.PostMessageA(hwnd, 0x100, 0x0d, 0)
-
-elif os.name == 'posix':
-    import atexit
-    import termios
-    import fcntl
-
-    class Console(ConsoleBase):
-        def __init__(self):
-            super(Console, self).__init__()
-            self.fd = sys.stdin.fileno()
-            self.old = termios.tcgetattr(self.fd)
-            atexit.register(self.cleanup)
-            if sys.version_info < (3, 0):
-                self.enc_stdin = codecs.getreader(sys.stdin.encoding)(sys.stdin)
-            else:
-                self.enc_stdin = sys.stdin
-
-        def setup(self):
-            new = termios.tcgetattr(self.fd)
-            new[3] = new[3] & ~termios.ICANON & ~termios.ECHO & ~termios.ISIG
-            new[6][termios.VMIN] = 1
-            new[6][termios.VTIME] = 0
-            termios.tcsetattr(self.fd, termios.TCSANOW, new)
-
-        def getkey(self):
-            c = self.enc_stdin.read(1)
-            if c == unichr(0x7f):
-                c = unichr(8)    # map the BS key (which yields DEL) to backspace
-            return c
-
-        def cancel(self):
-            fcntl.ioctl(self.fd, termios.TIOCSTI, b'\0')
-
-        def cleanup(self):
-            termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.old)
-
-else:
-    raise NotImplementedError(
-        'Sorry no implementation for your platform ({}) available.'.format(sys.platform))
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-class Transform(object):
-    """do-nothing: forward all data unchanged"""
-    def rx(self, text):
-        """text received from serial port"""
-        return text
-
-    def tx(self, text):
-        """text to be sent to serial port"""
-        return text
-
-    def echo(self, text):
-        """text to be sent but displayed on console"""
-        return text
-
-
-class CRLF(Transform):
-    """ENTER sends CR+LF"""
-
-    def tx(self, text):
-        return text.replace('\n', '\r\n')
-
-
-class CR(Transform):
-    """ENTER sends CR"""
-
-    def rx(self, text):
-        return text.replace('\r', '\n')
-
-    def tx(self, text):
-        return text.replace('\n', '\r')
-
-
-class LF(Transform):
-    """ENTER sends LF"""
-
-
-class NoTerminal(Transform):
-    """remove typical terminal control codes from input"""
-
-    REPLACEMENT_MAP = dict((x, 0x2400 + x) for x in range(32) if unichr(x) not in '\r\n\b\t')
-    REPLACEMENT_MAP.update(
-        {
-            0x7F: 0x2421,  # DEL
-            0x9B: 0x2425,  # CSI
-        })
-
-    def rx(self, text):
-        return text.translate(self.REPLACEMENT_MAP)
-
-    echo = rx
-
-
-class NoControls(NoTerminal):
-    """Remove all control codes, incl. CR+LF"""
-
-    REPLACEMENT_MAP = dict((x, 0x2400 + x) for x in range(32))
-    REPLACEMENT_MAP.update(
-        {
-            0x20: 0x2423,  # visual space
-            0x7F: 0x2421,  # DEL
-            0x9B: 0x2425,  # CSI
-        })
-
-
-class Printable(Transform):
-    """Show decimal code for all non-ASCII characters and replace most control codes"""
-
-    def rx(self, text):
-        r = []
-        for c in text:
-            if ' ' <= c < '\x7f' or c in '\r\n\b\t':
-                r.append(c)
-            elif c < ' ':
-                r.append(unichr(0x2400 + ord(c)))
-            else:
-                r.extend(unichr(0x2080 + ord(d) - 48) for d in '{:d}'.format(ord(c)))
-                r.append(' ')
-        return ''.join(r)
-
-    echo = rx
-
-
-class Colorize(Transform):
-    """Apply different colors for received and echo"""
-
-    def __init__(self):
-        # XXX make it configurable, use colorama?
-        self.input_color = '\x1b[37m'
-        self.echo_color = '\x1b[31m'
-
-    def rx(self, text):
-        return self.input_color + text
-
-    def echo(self, text):
-        return self.echo_color + text
-
-
-class DebugIO(Transform):
-    """Print what is sent and received"""
-
-    def rx(self, text):
-        sys.stderr.write(' [RX:{}] '.format(repr(text)))
-        sys.stderr.flush()
-        return text
-
-    def tx(self, text):
-        sys.stderr.write(' [TX:{}] '.format(repr(text)))
-        sys.stderr.flush()
-        return text
-
-
-# other ideas:
-# - add date/time for each newline
-# - insert newline after: a) timeout b) packet end character
-
-EOL_TRANSFORMATIONS = {
-    'crlf': CRLF,
-    'cr': CR,
-    'lf': LF,
-}
-
-TRANSFORMATIONS = {
-    'direct': Transform,    # no transformation
-    'default': NoTerminal,
-    'nocontrol': NoControls,
-    'printable': Printable,
-    'colorize': Colorize,
-    'debug': DebugIO,
-}
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-def ask_for_port():
-    """\
-    Show a list of ports and ask the user for a choice. To make selection
-    easier on systems with long device names, also allow the input of an
-    index.
-    """
-    sys.stderr.write('\n--- Available ports:\n')
-    ports = []
-    for n, (port, desc, hwid) in enumerate(sorted(comports()), 1):
-        sys.stderr.write('--- {:2}: {:20} {!r}\n'.format(n, port, desc))
-        ports.append(port)
-    while True:
-        port = raw_input('--- Enter port index or full name: ')
-        try:
-            index = int(port) - 1
-            if not 0 <= index < len(ports):
-                sys.stderr.write('--- Invalid index!\n')
-                continue
-        except ValueError:
-            pass
-        else:
-            port = ports[index]
-        return port
-
-
-class Miniterm(object):
-    """\
-    Terminal application. Copy data from serial port to console and vice versa.
-    Handle special keys from the console to show menu etc.
-    """
-
-    def __init__(self, serial_instance, echo=False, eol='crlf', filters=()):
-        self.console = Console()
-        self.serial = serial_instance
-        self.echo = echo
-        self.raw = False
-        self.input_encoding = 'UTF-8'
-        self.output_encoding = 'UTF-8'
-        self.eol = eol
-        self.filters = filters
-        self.update_transformations()
-        self.exit_character = 0x1d  # GS/CTRL+]
-        self.menu_character = 0x14  # Menu: CTRL+T
-        self.alive = None
-        self._reader_alive = None
-        self.receiver_thread = None
-        self.rx_decoder = None
-        self.tx_decoder = None
-
-    def _start_reader(self):
-        """Start reader thread"""
-        self._reader_alive = True
-        # start serial->console thread
-        self.receiver_thread = threading.Thread(target=self.reader, name='rx')
-        self.receiver_thread.daemon = True
-        self.receiver_thread.start()
-
-    def _stop_reader(self):
-        """Stop reader thread only, wait for clean exit of thread"""
-        self._reader_alive = False
-        if hasattr(self.serial, 'cancel_read'):
-            self.serial.cancel_read()
-        self.receiver_thread.join()
-
-    def start(self):
-        """start worker threads"""
-        self.alive = True
-        self._start_reader()
-        # enter console->serial loop
-        self.transmitter_thread = threading.Thread(target=self.writer, name='tx')
-        self.transmitter_thread.daemon = True
-        self.transmitter_thread.start()
-        self.console.setup()
-
-    def stop(self):
-        """set flag to stop worker threads"""
-        self.alive = False
-
-    def join(self, transmit_only=False):
-        """wait for worker threads to terminate"""
-        self.transmitter_thread.join()
-        if not transmit_only:
-            if hasattr(self.serial, 'cancel_read'):
-                self.serial.cancel_read()
-            self.receiver_thread.join()
-
-    def close(self):
-        self.serial.close()
-
-    def update_transformations(self):
-        """take list of transformation classes and instantiate them for rx and tx"""
-        transformations = [EOL_TRANSFORMATIONS[self.eol]] + [TRANSFORMATIONS[f]
-                                                             for f in self.filters]
-        self.tx_transformations = [t() for t in transformations]
-        self.rx_transformations = list(reversed(self.tx_transformations))
-
-    def set_rx_encoding(self, encoding, errors='replace'):
-        """set encoding for received data"""
-        self.input_encoding = encoding
-        self.rx_decoder = codecs.getincrementaldecoder(encoding)(errors)
-
-    def set_tx_encoding(self, encoding, errors='replace'):
-        """set encoding for transmitted data"""
-        self.output_encoding = encoding
-        self.tx_encoder = codecs.getincrementalencoder(encoding)(errors)
-
-    def dump_port_settings(self):
-        """Write current settings to sys.stderr"""
-        sys.stderr.write("\n--- Settings: {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits}\n".format(
-            p=self.serial))
-        sys.stderr.write('--- RTS: {:8}  DTR: {:8}  BREAK: {:8}\n'.format(
-            ('active' if self.serial.rts else 'inactive'),
-            ('active' if self.serial.dtr else 'inactive'),
-            ('active' if self.serial.break_condition else 'inactive')))
-        try:
-            sys.stderr.write('--- CTS: {:8}  DSR: {:8}  RI: {:8}  CD: {:8}\n'.format(
-                ('active' if self.serial.cts else 'inactive'),
-                ('active' if self.serial.dsr else 'inactive'),
-                ('active' if self.serial.ri else 'inactive'),
-                ('active' if self.serial.cd else 'inactive')))
-        except serial.SerialException:
-            # on RFC 2217 ports, it can happen if no modem state notification was
-            # yet received. ignore this error.
-            pass
-        sys.stderr.write('--- software flow control: {}\n'.format('active' if self.serial.xonxoff else 'inactive'))
-        sys.stderr.write('--- hardware flow control: {}\n'.format('active' if self.serial.rtscts else 'inactive'))
-        sys.stderr.write('--- serial input encoding: {}\n'.format(self.input_encoding))
-        sys.stderr.write('--- serial output encoding: {}\n'.format(self.output_encoding))
-        sys.stderr.write('--- EOL: {}\n'.format(self.eol.upper()))
-        sys.stderr.write('--- filters: {}\n'.format(' '.join(self.filters)))
-
-    def reader(self):
-        """loop and copy serial->console"""
-        try:
-            while self.alive and self._reader_alive:
-                # read all that is there or wait for one byte
-                data = self.serial.read(self.serial.in_waiting or 1)
-                if data:
-                    if self.raw:
-                        self.console.write_bytes(data)
-                    else:
-                        text = self.rx_decoder.decode(data)
-                        for transformation in self.rx_transformations:
-                            text = transformation.rx(text)
-                        self.console.write(text)
-        except serial.SerialException:
-            self.alive = False
-            self.console.cancel()
-            raise       # XXX handle instead of re-raise?
-
-    def writer(self):
-        """\
-        Loop and copy console->serial until self.exit_character character is
-        found. When self.menu_character is found, interpret the next key
-        locally.
-        """
-        menu_active = False
-        try:
-            while self.alive:
-                try:
-                    c = self.console.getkey()
-                except KeyboardInterrupt:
-                    c = '\x03'
-                if not self.alive:
-                    break
-                if menu_active:
-                    self.handle_menu_key(c)
-                    menu_active = False
-                elif c == self.menu_character:
-                    menu_active = True      # next char will be for menu
-                elif c == self.exit_character:
-                    self.stop()             # exit app
-                    break
-                else:
-                    #~ if self.raw:
-                    text = c
-                    for transformation in self.tx_transformations:
-                        text = transformation.tx(text)
-                    self.serial.write(self.tx_encoder.encode(text))
-                    if self.echo:
-                        echo_text = c
-                        for transformation in self.tx_transformations:
-                            echo_text = transformation.echo(echo_text)
-                        self.console.write(echo_text)
-        except:
-            self.alive = False
-            raise
-
-    def handle_menu_key(self, c):
-        """Implement a simple menu / settings"""
-        if c == self.menu_character or c == self.exit_character:
-            # Menu/exit character again -> send itself
-            self.serial.write(self.tx_encoder.encode(c))
-            if self.echo:
-                self.console.write(c)
-        elif c == '\x15':                       # CTRL+U -> upload file
-            self.upload_file()
-        elif c in '\x08hH?':                    # CTRL+H, h, H, ? -> Show help
-            sys.stderr.write(self.get_help_text())
-        elif c == '\x12':                       # CTRL+R -> Toggle RTS
-            self.serial.rts = not self.serial.rts
-            sys.stderr.write('--- RTS {} ---\n'.format('active' if self.serial.rts else 'inactive'))
-        elif c == '\x04':                       # CTRL+D -> Toggle DTR
-            self.serial.dtr = not self.serial.dtr
-            sys.stderr.write('--- DTR {} ---\n'.format('active' if self.serial.dtr else 'inactive'))
-        elif c == '\x02':                       # CTRL+B -> toggle BREAK condition
-            self.serial.break_condition = not self.serial.break_condition
-            sys.stderr.write('--- BREAK {} ---\n'.format('active' if self.serial.break_condition else 'inactive'))
-        elif c == '\x05':                       # CTRL+E -> toggle local echo
-            self.echo = not self.echo
-            sys.stderr.write('--- local echo {} ---\n'.format('active' if self.echo else 'inactive'))
-        elif c == '\x06':                       # CTRL+F -> edit filters
-            self.change_filter()
-        elif c == '\x0c':                       # CTRL+L -> EOL mode
-            modes = list(EOL_TRANSFORMATIONS)  # keys
-            eol = modes.index(self.eol) + 1
-            if eol >= len(modes):
-                eol = 0
-            self.eol = modes[eol]
-            sys.stderr.write('--- EOL: {} ---\n'.format(self.eol.upper()))
-            self.update_transformations()
-        elif c == '\x01':                       # CTRL+A -> set encoding
-            self.change_encoding()
-        elif c == '\x09':                       # CTRL+I -> info
-            self.dump_port_settings()
-        #~ elif c == '\x01':                       # CTRL+A -> cycle escape mode
-        #~ elif c == '\x0c':                       # CTRL+L -> cycle linefeed mode
-        elif c in 'pP':                         # P -> change port
-            self.change_port()
-        elif c in 'sS':                         # S -> suspend / open port temporarily
-            self.suspend_port()
-        elif c in 'bB':                         # B -> change baudrate
-            self.change_baudrate()
-        elif c == '8':                          # 8 -> change to 8 bits
-            self.serial.bytesize = serial.EIGHTBITS
-            self.dump_port_settings()
-        elif c == '7':                          # 7 -> change to 8 bits
-            self.serial.bytesize = serial.SEVENBITS
-            self.dump_port_settings()
-        elif c in 'eE':                         # E -> change to even parity
-            self.serial.parity = serial.PARITY_EVEN
-            self.dump_port_settings()
-        elif c in 'oO':                         # O -> change to odd parity
-            self.serial.parity = serial.PARITY_ODD
-            self.dump_port_settings()
-        elif c in 'mM':                         # M -> change to mark parity
-            self.serial.parity = serial.PARITY_MARK
-            self.dump_port_settings()
-        elif c in 'sS':                         # S -> change to space parity
-            self.serial.parity = serial.PARITY_SPACE
-            self.dump_port_settings()
-        elif c in 'nN':                         # N -> change to no parity
-            self.serial.parity = serial.PARITY_NONE
-            self.dump_port_settings()
-        elif c == '1':                          # 1 -> change to 1 stop bits
-            self.serial.stopbits = serial.STOPBITS_ONE
-            self.dump_port_settings()
-        elif c == '2':                          # 2 -> change to 2 stop bits
-            self.serial.stopbits = serial.STOPBITS_TWO
-            self.dump_port_settings()
-        elif c == '3':                          # 3 -> change to 1.5 stop bits
-            self.serial.stopbits = serial.STOPBITS_ONE_POINT_FIVE
-            self.dump_port_settings()
-        elif c in 'xX':                         # X -> change software flow control
-            self.serial.xonxoff = (c == 'X')
-            self.dump_port_settings()
-        elif c in 'rR':                         # R -> change hardware flow control
-            self.serial.rtscts = (c == 'R')
-            self.dump_port_settings()
-        else:
-            sys.stderr.write('--- unknown menu character {} --\n'.format(key_description(c)))
-
-    def upload_file(self):
-        """Ask user for filenname and send its contents"""
-        sys.stderr.write('\n--- File to upload: ')
-        sys.stderr.flush()
-        with self.console:
-            filename = sys.stdin.readline().rstrip('\r\n')
-            if filename:
-                try:
-                    with open(filename, 'rb') as f:
-                        sys.stderr.write('--- Sending file {} ---\n'.format(filename))
-                        while True:
-                            block = f.read(1024)
-                            if not block:
-                                break
-                            self.serial.write(block)
-                            # Wait for output buffer to drain.
-                            self.serial.flush()
-                            sys.stderr.write('.')   # Progress indicator.
-                    sys.stderr.write('\n--- File {} sent ---\n'.format(filename))
-                except IOError as e:
-                    sys.stderr.write('--- ERROR opening file {}: {} ---\n'.format(filename, e))
-
-    def change_filter(self):
-        """change the i/o transformations"""
-        sys.stderr.write('\n--- Available Filters:\n')
-        sys.stderr.write('\n'.join(
-            '---   {:<10} = {.__doc__}'.format(k, v)
-            for k, v in sorted(TRANSFORMATIONS.items())))
-        sys.stderr.write('\n--- Enter new filter name(s) [{}]: '.format(' '.join(self.filters)))
-        with self.console:
-            new_filters = sys.stdin.readline().lower().split()
-        if new_filters:
-            for f in new_filters:
-                if f not in TRANSFORMATIONS:
-                    sys.stderr.write('--- unknown filter: {}\n'.format(repr(f)))
-                    break
-            else:
-                self.filters = new_filters
-                self.update_transformations()
-        sys.stderr.write('--- filters: {}\n'.format(' '.join(self.filters)))
-
-    def change_encoding(self):
-        """change encoding on the serial port"""
-        sys.stderr.write('\n--- Enter new encoding name [{}]: '.format(self.input_encoding))
-        with self.console:
-            new_encoding = sys.stdin.readline().strip()
-        if new_encoding:
-            try:
-                codecs.lookup(new_encoding)
-            except LookupError:
-                sys.stderr.write('--- invalid encoding name: {}\n'.format(new_encoding))
-            else:
-                self.set_rx_encoding(new_encoding)
-                self.set_tx_encoding(new_encoding)
-        sys.stderr.write('--- serial input encoding: {}\n'.format(self.input_encoding))
-        sys.stderr.write('--- serial output encoding: {}\n'.format(self.output_encoding))
-
-    def change_baudrate(self):
-        """change the baudrate"""
-        sys.stderr.write('\n--- Baudrate: ')
-        sys.stderr.flush()
-        with self.console:
-            backup = self.serial.baudrate
-            try:
-                self.serial.baudrate = int(sys.stdin.readline().strip())
-            except ValueError as e:
-                sys.stderr.write('--- ERROR setting baudrate: {} ---\n'.format(e))
-                self.serial.baudrate = backup
-            else:
-                self.dump_port_settings()
-
-    def change_port(self):
-        """Have a conversation with the user to change the serial port"""
-        with self.console:
-            try:
-                port = ask_for_port()
-            except KeyboardInterrupt:
-                port = None
-        if port and port != self.serial.port:
-            # reader thread needs to be shut down
-            self._stop_reader()
-            # save settings
-            settings = self.serial.getSettingsDict()
-            try:
-                new_serial = serial.serial_for_url(port, do_not_open=True)
-                # restore settings and open
-                new_serial.applySettingsDict(settings)
-                new_serial.rts = self.serial.rts
-                new_serial.dtr = self.serial.dtr
-                new_serial.open()
-                new_serial.break_condition = self.serial.break_condition
-            except Exception as e:
-                sys.stderr.write('--- ERROR opening new port: {} ---\n'.format(e))
-                new_serial.close()
-            else:
-                self.serial.close()
-                self.serial = new_serial
-                sys.stderr.write('--- Port changed to: {} ---\n'.format(self.serial.port))
-            # and restart the reader thread
-            self._start_reader()
-
-    def suspend_port(self):
-        """\
-        open port temporarily, allow reconnect, exit and port change to get
-        out of the loop
-        """
-        # reader thread needs to be shut down
-        self._stop_reader()
-        self.serial.close()
-        sys.stderr.write('\n--- Port closed: {} ---\n'.format(self.serial.port))
-        do_change_port = False
-        while not self.serial.is_open:
-            sys.stderr.write('--- Quit: {exit} | p: port change | any other key to reconnect ---\n'.format(
-                exit=key_description(self.exit_character)))
-            k = self.console.getkey()
-            if k == self.exit_character:
-                self.stop()             # exit app
-                break
-            elif k in 'pP':
-                do_change_port = True
-                break
-            try:
-                self.serial.open()
-            except Exception as e:
-                sys.stderr.write('--- ERROR opening port: {} ---\n'.format(e))
-        if do_change_port:
-            self.change_port()
-        else:
-            # and restart the reader thread
-            self._start_reader()
-            sys.stderr.write('--- Port opened: {} ---\n'.format(self.serial.port))
-
-    def get_help_text(self):
-        """return the help text"""
-        # help text, starts with blank line!
-        return """
---- pySerial ({version}) - miniterm - help
----
---- {exit:8} Exit program
---- {menu:8} Menu escape key, followed by:
---- Menu keys:
----    {menu:7} Send the menu character itself to remote
----    {exit:7} Send the exit character itself to remote
----    {info:7} Show info
----    {upload:7} Upload file (prompt will be shown)
----    {repr:7} encoding
----    {filter:7} edit filters
---- Toggles:
----    {rts:7} RTS   {dtr:7} DTR   {brk:7} BREAK
----    {echo:7} echo  {eol:7} EOL
----
---- Port settings ({menu} followed by the following):
----    p          change port
----    7 8        set data bits
----    N E O S M  change parity (None, Even, Odd, Space, Mark)
----    1 2 3      set stop bits (1, 2, 1.5)
----    b          change baud rate
----    x X        disable/enable software flow control
----    r R        disable/enable hardware flow control
-""".format(version=getattr(serial, 'VERSION', 'unknown version'),
-           exit=key_description(self.exit_character),
-           menu=key_description(self.menu_character),
-           rts=key_description('\x12'),
-           dtr=key_description('\x04'),
-           brk=key_description('\x02'),
-           echo=key_description('\x05'),
-           info=key_description('\x09'),
-           upload=key_description('\x15'),
-           repr=key_description('\x01'),
-           filter=key_description('\x06'),
-           eol=key_description('\x0c'))
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# default args can be used to override when calling main() from an other script
-# e.g to create a miniterm-my-device.py
-def main(default_port=None, default_baudrate=9600, default_rts=None, default_dtr=None):
-    """Command line tool, entry point"""
-
-    import argparse
-
-    parser = argparse.ArgumentParser(
-        description="Miniterm - A simple terminal program for the serial port.")
-
-    parser.add_argument(
-        "port",
-        nargs='?',
-        help="serial port name ('-' to show port list)",
-        default=default_port)
-
-    parser.add_argument(
-        "baudrate",
-        nargs='?',
-        type=int,
-        help="set baud rate, default: %(default)s",
-        default=default_baudrate)
-
-    group = parser.add_argument_group("port settings")
-
-    group.add_argument(
-        "--parity",
-        choices=['N', 'E', 'O', 'S', 'M'],
-        type=lambda c: c.upper(),
-        help="set parity, one of {N E O S M}, default: N",
-        default='N')
-
-    group.add_argument(
-        "--rtscts",
-        action="store_true",
-        help="enable RTS/CTS flow control (default off)",
-        default=False)
-
-    group.add_argument(
-        "--xonxoff",
-        action="store_true",
-        help="enable software flow control (default off)",
-        default=False)
-
-    group.add_argument(
-        "--rts",
-        type=int,
-        help="set initial RTS line state (possible values: 0, 1)",
-        default=default_rts)
-
-    group.add_argument(
-        "--dtr",
-        type=int,
-        help="set initial DTR line state (possible values: 0, 1)",
-        default=default_dtr)
-
-    group.add_argument(
-        "--ask",
-        action="store_true",
-        help="ask again for port when open fails",
-        default=False)
-
-    group = parser.add_argument_group("data handling")
-
-    group.add_argument(
-        "-e", "--echo",
-        action="store_true",
-        help="enable local echo (default off)",
-        default=False)
-
-    group.add_argument(
-        "--encoding",
-        dest="serial_port_encoding",
-        metavar="CODEC",
-        help="set the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default: %(default)s",
-        default='UTF-8')
-
-    group.add_argument(
-        "-f", "--filter",
-        action="append",
-        metavar="NAME",
-        help="add text transformation",
-        default=[])
-
-    group.add_argument(
-        "--eol",
-        choices=['CR', 'LF', 'CRLF'],
-        type=lambda c: c.upper(),
-        help="end of line mode",
-        default='CRLF')
-
-    group.add_argument(
-        "--raw",
-        action="store_true",
-        help="Do no apply any encodings/transformations",
-        default=False)
-
-    group = parser.add_argument_group("hotkeys")
-
-    group.add_argument(
-        "--exit-char",
-        type=int,
-        metavar='NUM',
-        help="Unicode of special character that is used to exit the application, default: %(default)s",
-        default=0x1d)  # GS/CTRL+]
-
-    group.add_argument(
-        "--menu-char",
-        type=int,
-        metavar='NUM',
-        help="Unicode code of special character that is used to control miniterm (menu), default: %(default)s",
-        default=0x14)  # Menu: CTRL+T
-
-    group = parser.add_argument_group("diagnostics")
-
-    group.add_argument(
-        "-q", "--quiet",
-        action="store_true",
-        help="suppress non-error messages",
-        default=False)
-
-    group.add_argument(
-        "--develop",
-        action="store_true",
-        help="show Python traceback on error",
-        default=False)
-
-    args = parser.parse_args()
-
-    if args.menu_char == args.exit_char:
-        parser.error('--exit-char can not be the same as --menu-char')
-
-    if args.filter:
-        if 'help' in args.filter:
-            sys.stderr.write('Available filters:\n')
-            sys.stderr.write('\n'.join(
-                '{:<10} = {.__doc__}'.format(k, v)
-                for k, v in sorted(TRANSFORMATIONS.items())))
-            sys.stderr.write('\n')
-            sys.exit(1)
-        filters = args.filter
-    else:
-        filters = ['default']
-
-    while True:
-        # no port given on command line -> ask user now
-        if args.port is None or args.port == '-':
-            try:
-                args.port = ask_for_port()
-            except KeyboardInterrupt:
-                sys.stderr.write('\n')
-                parser.error('user aborted and port is not given')
-            else:
-                if not args.port:
-                    parser.error('port is not given')
-        try:
-            serial_instance = serial.serial_for_url(
-                args.port,
-                args.baudrate,
-                parity=args.parity,
-                rtscts=args.rtscts,
-                xonxoff=args.xonxoff,
-                do_not_open=True)
-
-            if not hasattr(serial_instance, 'cancel_read'):
-                # enable timeout for alive flag polling if cancel_read is not available
-                serial_instance.timeout = 1
-
-            if args.dtr is not None:
-                if not args.quiet:
-                    sys.stderr.write('--- forcing DTR {}\n'.format('active' if args.dtr else 'inactive'))
-                serial_instance.dtr = args.dtr
-            if args.rts is not None:
-                if not args.quiet:
-                    sys.stderr.write('--- forcing RTS {}\n'.format('active' if args.rts else 'inactive'))
-                serial_instance.rts = args.rts
-
-            serial_instance.open()
-        except serial.SerialException as e:
-            sys.stderr.write('could not open port {}: {}\n'.format(repr(args.port), e))
-            if args.develop:
-                raise
-            if not args.ask:
-                sys.exit(1)
-            else:
-                args.port = '-'
-        else:
-            break
-
-    miniterm = Miniterm(
-        serial_instance,
-        echo=args.echo,
-        eol=args.eol.lower(),
-        filters=filters)
-    miniterm.exit_character = unichr(args.exit_char)
-    miniterm.menu_character = unichr(args.menu_char)
-    miniterm.raw = args.raw
-    miniterm.set_rx_encoding(args.serial_port_encoding)
-    miniterm.set_tx_encoding(args.serial_port_encoding)
-
-    if not args.quiet:
-        sys.stderr.write('--- Miniterm on {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} ---\n'.format(
-            p=miniterm.serial))
-        sys.stderr.write('--- Quit: {} | Menu: {} | Help: {} followed by {} ---\n'.format(
-            key_description(miniterm.exit_character),
-            key_description(miniterm.menu_character),
-            key_description(miniterm.menu_character),
-            key_description('\x08')))
-
-    miniterm.start()
-    try:
-        miniterm.join(True)
-    except KeyboardInterrupt:
-        pass
-    if not args.quiet:
-        sys.stderr.write("\n--- exit ---\n")
-    miniterm.join()
-    miniterm.close()
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-if __name__ == '__main__':
-    main()
diff --git a/venv/bin/miniterm.pyc b/venv/bin/miniterm.pyc
deleted file mode 100755
index 07aff4e78edaeabe52fc80414be46e7ef643856f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 28907
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
b79R#|MGgDQINqAu_w@Y8Oz!x0hx7jdj4k)t

diff --git a/venv/bin/pip b/venv/bin/pip
deleted file mode 100755
index 242a349..0000000
--- a/venv/bin/pip
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-
-from pip._internal.cli.main import main
-
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())
diff --git a/venv/bin/pip3 b/venv/bin/pip3
deleted file mode 100755
index 242a349..0000000
--- a/venv/bin/pip3
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-
-from pip._internal.cli.main import main
-
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())
diff --git a/venv/bin/pip3.8 b/venv/bin/pip3.8
deleted file mode 100755
index 242a349..0000000
--- a/venv/bin/pip3.8
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/home/rmueller/Documents/KSat/sourceobsw/tmtc/venv/bin/python
-# -*- coding: utf-8 -*-
-import re
-import sys
-
-from pip._internal.cli.main import main
-
-if __name__ == '__main__':
-    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
-    sys.exit(main())
diff --git a/venv/bin/python b/venv/bin/python
deleted file mode 120000
index 4e58b60..0000000
--- a/venv/bin/python
+++ /dev/null
@@ -1 +0,0 @@
-python3.8
\ No newline at end of file
diff --git a/venv/bin/python3 b/venv/bin/python3
deleted file mode 120000
index 4e58b60..0000000
--- a/venv/bin/python3
+++ /dev/null
@@ -1 +0,0 @@
-python3.8
\ No newline at end of file
diff --git a/venv/bin/python3.8 b/venv/bin/python3.8
deleted file mode 120000
index 2736161..0000000
--- a/venv/bin/python3.8
+++ /dev/null
@@ -1 +0,0 @@
-/usr/local/bin/python3.8
\ No newline at end of file
diff --git a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/PKG-INFO b/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/PKG-INFO
deleted file mode 100644
index 9c89a50..0000000
--- a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/PKG-INFO
+++ /dev/null
@@ -1,157 +0,0 @@
-Metadata-Version: 1.1
-Name: crcmod
-Version: 1.7
-Summary: CRC Generator
-Home-page: http://crcmod.sourceforge.net/
-Author: Ray Buvel
-Author-email: rlbuvel@gmail.com
-License: MIT
-Download-URL: http://sourceforge.net/projects/crcmod
-Description: ===========================
-        crcmod for Calculating CRCs
-        ===========================
-        
-        The software in this package is a Python module for generating objects that
-        compute the Cyclic Redundancy Check (CRC).  There is no attempt in this package
-        to explain how the CRC works.  There are a number of resources on the web that
-        give a good explanation of the algorithms.  Just do a Google search for "crc
-        calculation" and browse till you find what you need.  Another resource can be
-        found in chapter 20 of the book "Numerical Recipes in C" by Press et. al.
-        
-        This package allows the use of any 8, 16, 24, 32, or 64 bit CRC.  You can
-        generate a Python function for the selected polynomial or an instance of the
-        Crc class which provides the same interface as the ``md5`` and ``sha`` modules
-        from the Python standard library.  A ``Crc`` class instance can also generate
-        C/C++ source code that can be used in another application.
-        
-        ----------
-        Guidelines
-        ----------
-        
-        Documentation is available from the doc strings.  It is up to you to decide
-        what polynomials to use in your application.  If someone has not specified the
-        polynomials to use, you will need to do some research to find one suitable for
-        your application.  Examples are available in the unit test script ``test.py``.
-        You may also use the ``predefined`` module to select one of the standard
-        polynomials.
-        
-        If you need to generate code for another language, I suggest you subclass the
-        ``Crc`` class and replace the method ``generateCode``.  Use ``generateCode`` as
-        a model for the new version.
-        
-        ------------
-        Dependencies
-        ------------
-        
-        Python Version
-        ^^^^^^^^^^^^^^
-        
-        The package has separate code to support the 2.x and 3.x Python series.
-        
-        For the 2.x versions of Python, these versions have been tested:
-        
-        * 2.4
-        * 2.5
-        * 2.6
-        * 2.7
-        
-        It may still work on earlier versions of Python 2.x, but these have not been
-        recently tested.
-        
-        For the 3.x versions of Python, these versions have been tested:
-        
-        * 3.1
-        
-        Building C extension
-        ^^^^^^^^^^^^^^^^^^^^
-        
-        To build the C extension, the appropriate compiler tools for your platform must
-        be installed. Refer to the Python documentation for building C extensions for
-        details.
-        
-        ------------
-        Installation
-        ------------
-        
-        The crcmod package is installed using ``distutils``.
-        Run the following command::
-        
-            python setup.py install
-        
-        If the extension module builds, it will be installed.  Otherwise, the
-        installation will include the pure Python version.  This will run significantly
-        slower than the extension module but will allow the package to be used.
-        
-        For Windows users who want to use the mingw32 compiler, run this command::
-        
-            python setup.py build --compiler=mingw32 install
-        
-        For Python 3.x, the install process is the same but you need to use the 3.x
-        interpreter.
-        
-        ------------
-        Unit Testing
-        ------------
-        
-        The ``crcmod`` package has a module ``crcmod.test``, which contains unit
-        tests for both ``crcmod`` and ``crcmod.predefined``.
-        
-        When you first install ``crcmod``, you should run the unit tests to make sure
-        everything is installed properly.  The test script performs a number of tests
-        including a comparison to the direct method which uses a class implementing
-        polynomials over the integers mod 2.
-        
-        To run the unit tests on Python >=2.5::
-        
-            python -m crcmod.test
-        
-        Alternatively, in the ``test`` directory run::
-        
-            python test_crcmod.py
-        
-        ---------------
-        Code Generation
-        ---------------
-        
-        The crcmod package is capable of generating C functions that can be compiled
-        with a C or C++ compiler.  In the test directory, there is an examples.py
-        script that demonstrates how to use the code generator.  The result of this is
-        written out to the file ``examples.c``.  The generated code was checked to make
-        sure it compiles with the GCC compiler.
-        
-        -------
-        License
-        -------
-        
-        The ``crcmod`` package is released under the MIT license. See the ``LICENSE``
-        file for details.
-        
-        ------------
-        Contributors
-        ------------
-        
-        Craig McQueen
-        
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: Education
-Classifier: Intended Audience :: End Users/Desktop
-Classifier: Intended Audience :: Information Technology
-Classifier: Intended Audience :: Science/Research
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: C
-Classifier: Programming Language :: C++
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.4
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.1
-Classifier: Topic :: Communications
-Classifier: Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator
-Classifier: Topic :: Scientific/Engineering :: Mathematics
-Classifier: Topic :: Utilities
diff --git a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/SOURCES.txt b/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/SOURCES.txt
deleted file mode 100644
index 932708d..0000000
--- a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-LICENSE
-MANIFEST.in
-README
-changelog
-setup.py
-crcmod.egg-info/PKG-INFO
-crcmod.egg-info/SOURCES.txt
-crcmod.egg-info/dependency_links.txt
-crcmod.egg-info/top_level.txt
-docs/html/.buildinfo
-docs/html/crcmod.html
-docs/html/crcmod.predefined.html
-docs/html/genindex.html
-docs/html/index.html
-docs/html/intro.html
-docs/html/modindex.html
-docs/html/objects.inv
-docs/html/search.html
-docs/html/searchindex.js
-docs/html/_sources/crcmod.predefined.txt
-docs/html/_sources/crcmod.txt
-docs/html/_sources/index.txt
-docs/html/_sources/intro.txt
-docs/html/_static/basic.css
-docs/html/_static/default.css
-docs/html/_static/doctools.js
-docs/html/_static/file.png
-docs/html/_static/jquery.js
-docs/html/_static/minus.png
-docs/html/_static/plus.png
-docs/html/_static/pygments.css
-docs/html/_static/searchtools.js
-docs/source/Makefile
-docs/source/conf.py
-docs/source/crcmod.predefined.rst
-docs/source/crcmod.rst
-docs/source/index.rst
-docs/source/intro.rst
-docs/source/make.bat
-docs/source/make_predefined_table.py
-python2/crcmod/__init__.py
-python2/crcmod/_crcfunpy.py
-python2/crcmod/crcmod.py
-python2/crcmod/predefined.py
-python2/crcmod/test.py
-python2/src/_crcfunext.c
-python3/crcmod/__init__.py
-python3/crcmod/_crcfunpy.py
-python3/crcmod/crcmod.py
-python3/crcmod/predefined.py
-python3/crcmod/test.py
-python3/src/_crcfunext.c
-test/examples.py
-test/test_crcmod.py
\ No newline at end of file
diff --git a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/dependency_links.txt b/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/dependency_links.txt
deleted file mode 100644
index 8b13789..0000000
--- a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/installed-files.txt b/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/installed-files.txt
deleted file mode 100644
index 519612a..0000000
--- a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/installed-files.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-../crcmod/__init__.py
-../crcmod/__pycache__/__init__.cpython-38.pyc
-../crcmod/__pycache__/_crcfunpy.cpython-38.pyc
-../crcmod/__pycache__/crcmod.cpython-38.pyc
-../crcmod/__pycache__/predefined.cpython-38.pyc
-../crcmod/__pycache__/test.cpython-38.pyc
-../crcmod/_crcfunext.cpython-38-x86_64-linux-gnu.so
-../crcmod/_crcfunpy.py
-../crcmod/crcmod.py
-../crcmod/predefined.py
-../crcmod/test.py
-PKG-INFO
-SOURCES.txt
-dependency_links.txt
-top_level.txt
diff --git a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/top_level.txt b/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/top_level.txt
deleted file mode 100644
index 3bb3157..0000000
--- a/venv/lib/python3.8/site-packages/crcmod-1.7-py3.8.egg-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-crcmod
diff --git a/venv/lib/python3.8/site-packages/crcmod/__init__.py b/venv/lib/python3.8/site-packages/crcmod/__init__.py
deleted file mode 100644
index 80f2ac3..0000000
--- a/venv/lib/python3.8/site-packages/crcmod/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-try:
-    from crcmod.crcmod import *
-    import crcmod.predefined
-except ImportError:
-    # Make this backward compatible
-    from crcmod import *
-    import predefined
-__doc__ = crcmod.__doc__
diff --git a/venv/lib/python3.8/site-packages/crcmod/_crcfunext.cpython-38-x86_64-linux-gnu.so b/venv/lib/python3.8/site-packages/crcmod/_crcfunext.cpython-38-x86_64-linux-gnu.so
deleted file mode 100755
index ed2494879f75416e004b0ecae42b90495f017d11..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 50768
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

diff --git a/venv/lib/python3.8/site-packages/crcmod/_crcfunpy.py b/venv/lib/python3.8/site-packages/crcmod/_crcfunpy.py
deleted file mode 100644
index 01476ca..0000000
--- a/venv/lib/python3.8/site-packages/crcmod/_crcfunpy.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#-----------------------------------------------------------------------------
-# Low level CRC functions for use by crcmod.  This version is implemented in
-# Python for a couple of reasons.  1) Provide a reference implememtation.
-# 2) Provide a version that can be used on systems where a C compiler is not
-# available for building extension modules.
-#
-# Copyright (c) 2009  Raymond L. Buvel
-# Copyright (c) 2010  Craig McQueen
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-# 
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-# 
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-#-----------------------------------------------------------------------------
-
-def _get_buffer_view(in_obj):
-    if isinstance(in_obj, str):
-        raise TypeError('Unicode-objects must be encoded before calculating a CRC')
-    mv = memoryview(in_obj)
-    if mv.ndim > 1:
-        raise BufferError('Buffer must be single dimension')
-    return mv
-
-
-def _crc8(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFF
-    for x in mv.tobytes():
-        crc = table[x ^ crc]
-    return crc
-
-def _crc8r(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFF
-    for x in mv.tobytes():
-        crc = table[x ^ crc]
-    return crc
-
-def _crc16(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFFFF
-    for x in mv.tobytes():
-        crc = table[x ^ ((crc>>8) & 0xFF)] ^ ((crc << 8) & 0xFF00)
-    return crc
-
-def _crc16r(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFFFF
-    for x in mv.tobytes():
-        crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8)
-    return crc
-
-def _crc24(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFFFFFF
-    for x in mv.tobytes():
-        crc = table[x ^ (crc>>16 & 0xFF)] ^ ((crc << 8) & 0xFFFF00)
-    return crc
-
-def _crc24r(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFFFFFF
-    for x in mv.tobytes():
-        crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8)
-    return crc
-
-def _crc32(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFFFFFFFF
-    for x in mv.tobytes():
-        crc = table[x ^ ((crc>>24) & 0xFF)] ^ ((crc << 8) & 0xFFFFFF00)
-    return crc
-
-def _crc32r(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFFFFFFFF
-    for x in mv.tobytes():
-        crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8)
-    return crc
-
-def _crc64(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFFFFFFFFFFFFFFFF
-    for x in mv.tobytes():
-        crc = table[x ^ ((crc>>56) & 0xFF)] ^ ((crc << 8) & 0xFFFFFFFFFFFFFF00)
-    return crc
-
-def _crc64r(data, crc, table):
-    mv = _get_buffer_view(data)
-    crc = crc & 0xFFFFFFFFFFFFFFFF
-    for x in mv.tobytes():
-        crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8)
-    return crc
-
diff --git a/venv/lib/python3.8/site-packages/crcmod/crcmod.py b/venv/lib/python3.8/site-packages/crcmod/crcmod.py
deleted file mode 100644
index ec5adaf..0000000
--- a/venv/lib/python3.8/site-packages/crcmod/crcmod.py
+++ /dev/null
@@ -1,457 +0,0 @@
-#-----------------------------------------------------------------------------
-# Copyright (c) 2010  Raymond L. Buvel
-# Copyright (c) 2010  Craig McQueen
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-# 
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-# 
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-#-----------------------------------------------------------------------------
-'''crcmod is a Python module for gererating objects that compute the Cyclic
-Redundancy Check.  Any 8, 16, 24, 32, or 64 bit polynomial can be used.  
-
-The following are the public components of this module.
-
-Crc -- a class that creates instances providing the same interface as the
-algorithms in the hashlib module in the Python standard library.  These
-instances also provide a method for generating a C/C++ function to compute
-the CRC.
-
-mkCrcFun -- create a Python function to compute the CRC using the specified
-polynomial and initial value.  This provides a much simpler interface if
-all you need is a function for CRC calculation.
-'''
-
-__all__ = '''mkCrcFun Crc
-'''.split()
-
-# Select the appropriate set of low-level CRC functions for this installation.
-# If the extension module was not built, drop back to the Python implementation
-# even though it is significantly slower.
-try:
-    import crcmod._crcfunext as _crcfun
-    _usingExtension = True
-except ImportError:
-    import crcmod._crcfunpy as _crcfun
-    _usingExtension = False
-
-import sys, struct
-
-#-----------------------------------------------------------------------------
-class Crc:
-    '''Compute a Cyclic Redundancy Check (CRC) using the specified polynomial.
-
-    Instances of this class have the same interface as the algorithms in the
-    hashlib module in the Python standard library.  See the documentation of
-    this module for examples of how to use a Crc instance.
-
-    The string representation of a Crc instance identifies the polynomial,
-    initial value, XOR out value, and the current CRC value.  The print
-    statement can be used to output this information.
-
-    If you need to generate a C/C++ function for use in another application,
-    use the generateCode method.  If you need to generate code for another
-    language, subclass Crc and override the generateCode method.
-
-    The following are the parameters supplied to the constructor.
-
-    poly -- The generator polynomial to use in calculating the CRC.  The value
-    is specified as a Python integer.  The bits in this integer are the
-    coefficients of the polynomial.  The only polynomials allowed are those
-    that generate 8, 16, 24, 32, or 64 bit CRCs.
-
-    initCrc -- Initial value used to start the CRC calculation.  This initial
-    value should be the initial shift register value XORed with the final XOR
-    value.  That is equivalent to the CRC result the algorithm should return for
-    a zero-length string.  Defaults to all bits set because that starting value
-    will take leading zero bytes into account.  Starting with zero will ignore
-    all leading zero bytes.
-
-    rev -- A flag that selects a bit reversed algorithm when True.  Defaults to
-    True because the bit reversed algorithms are more efficient.
-
-    xorOut -- Final value to XOR with the calculated CRC value.  Used by some
-    CRC algorithms.  Defaults to zero.
-    '''
-    def __init__(self, poly, initCrc=~0, rev=True, xorOut=0, initialize=True):
-        if not initialize:
-            # Don't want to perform the initialization when using new or copy
-            # to create a new instance.
-            return
-
-        (sizeBits, initCrc, xorOut) = _verifyParams(poly, initCrc, xorOut)
-        self.digest_size = sizeBits//8
-        self.initCrc = initCrc
-        self.xorOut = xorOut
-
-        self.poly = poly
-        self.reverse = rev
-
-        (crcfun, table) = _mkCrcFun(poly, sizeBits, initCrc, rev, xorOut)
-        self._crc = crcfun
-        self.table = table
-
-        self.crcValue = self.initCrc
-
-    def __str__(self):
-        lst = []
-        lst.append('poly = 0x%X' % self.poly)
-        lst.append('reverse = %s' % self.reverse)
-        fmt = '0x%%0%dX' % (self.digest_size*2)
-        lst.append('initCrc  = %s' % (fmt % self.initCrc))
-        lst.append('xorOut   = %s' % (fmt % self.xorOut))
-        lst.append('crcValue = %s' % (fmt % self.crcValue))
-        return '\n'.join(lst)
-
-    def new(self, arg=None):
-        '''Create a new instance of the Crc class initialized to the same
-        values as the original instance.  The current CRC is set to the initial
-        value.  If a string is provided in the optional arg parameter, it is
-        passed to the update method.
-        '''
-        n = Crc(poly=None, initialize=False)
-        n._crc = self._crc
-        n.digest_size = self.digest_size
-        n.initCrc = self.initCrc
-        n.xorOut = self.xorOut
-        n.table = self.table
-        n.crcValue = self.initCrc
-        n.reverse = self.reverse
-        n.poly = self.poly
-        if arg is not None:
-            n.update(arg)
-        return n
-
-    def copy(self):
-        '''Create a new instance of the Crc class initialized to the same
-        values as the original instance.  The current CRC is set to the current
-        value.  This allows multiple CRC calculations using a common initial
-        string.
-        '''
-        c = self.new()
-        c.crcValue = self.crcValue
-        return c
-
-    def update(self, data):
-        '''Update the current CRC value using the string specified as the data
-        parameter.
-        '''
-        self.crcValue = self._crc(data, self.crcValue)
-
-    def digest(self):
-        '''Return the current CRC value as a string of bytes.  The length of
-        this string is specified in the digest_size attribute.
-        '''
-        n = self.digest_size
-        crc = self.crcValue
-        lst = []
-        while n > 0:
-            lst.append(crc & 0xFF)
-            crc = crc >> 8
-            n -= 1
-        lst.reverse()
-        return bytes(lst)
-
-    def hexdigest(self):
-        '''Return the current CRC value as a string of hex digits.  The length
-        of this string is twice the digest_size attribute.
-        '''
-        n = self.digest_size
-        crc = self.crcValue
-        lst = []
-        while n > 0:
-            lst.append('%02X' % (crc & 0xFF))
-            crc = crc >> 8
-            n -= 1
-        lst.reverse()
-        return ''.join(lst)
-
-    def generateCode(self, functionName, out, dataType=None, crcType=None):
-        '''Generate a C/C++ function.
-
-        functionName -- String specifying the name of the function.
-
-        out -- An open file-like object with a write method.  This specifies
-        where the generated code is written.
-
-        dataType -- An optional parameter specifying the data type of the input
-        data to the function.  Defaults to UINT8.
-
-        crcType -- An optional parameter specifying the data type of the CRC
-        value.  Defaults to one of UINT8, UINT16, UINT32, or UINT64 depending
-        on the size of the CRC value.
-        '''
-        if dataType is None:
-            dataType = 'UINT8'
-
-        if crcType is None:
-            size = 8*self.digest_size
-            if size == 24:
-                size = 32
-            crcType = 'UINT%d' % size
-
-        if self.digest_size == 1:
-            # Both 8-bit CRC algorithms are the same
-            crcAlgor = 'table[*data ^ (%s)crc]'
-        elif self.reverse:
-            # The bit reverse algorithms are all the same except for the data
-            # type of the crc variable which is specified elsewhere.
-            crcAlgor = 'table[*data ^ (%s)crc] ^ (crc >> 8)'
-        else:
-            # The forward CRC algorithms larger than 8 bits have an extra shift
-            # operation to get the high byte.
-            shift = 8*(self.digest_size - 1)
-            crcAlgor = 'table[*data ^ (%%s)(crc >> %d)] ^ (crc << 8)' % shift
-
-        fmt = '0x%%0%dX' % (2*self.digest_size)
-        if self.digest_size <= 4:
-            fmt = fmt + 'U,'
-        else:
-            # Need the long long type identifier to keep gcc from complaining.
-            fmt = fmt + 'ULL,'
-
-        # Select the number of entries per row in the output code.
-        n = {1:8, 2:8, 3:4, 4:4, 8:2}[self.digest_size]
-
-        lst = []
-        for i, val in enumerate(self.table):
-            if (i % n) == 0:
-                lst.append('\n    ')
-            lst.append(fmt % val)
-
-        poly = 'polynomial: 0x%X' % self.poly
-        if self.reverse:
-            poly = poly + ', bit reverse algorithm'
-
-        if self.xorOut:
-            # Need to remove the comma from the format.
-            preCondition = '\n    crc = crc ^ %s;' % (fmt[:-1] % self.xorOut)
-            postCondition = preCondition
-        else:
-            preCondition = ''
-            postCondition = ''
-
-        if self.digest_size == 3:
-            # The 24-bit CRC needs to be conditioned so that only 24-bits are
-            # used from the 32-bit variable.
-            if self.reverse:
-                preCondition += '\n    crc = crc & 0xFFFFFFU;'
-            else:
-                postCondition += '\n    crc = crc & 0xFFFFFFU;'
-                
-
-        parms = {
-            'dataType' : dataType,
-            'crcType' : crcType,
-            'name' : functionName,
-            'crcAlgor' : crcAlgor % dataType,
-            'crcTable' : ''.join(lst),
-            'poly' : poly,
-            'preCondition' : preCondition,
-            'postCondition' : postCondition,
-        }
-        out.write(_codeTemplate % parms) 
-
-#-----------------------------------------------------------------------------
-def mkCrcFun(poly, initCrc=~0, rev=True, xorOut=0):
-    '''Return a function that computes the CRC using the specified polynomial.
-
-    poly -- integer representation of the generator polynomial
-    initCrc -- default initial CRC value
-    rev -- when true, indicates that the data is processed bit reversed.
-    xorOut -- the final XOR value
-
-    The returned function has the following user interface
-    def crcfun(data, crc=initCrc):
-    '''
-
-    # First we must verify the params
-    (sizeBits, initCrc, xorOut) = _verifyParams(poly, initCrc, xorOut)
-    # Make the function (and table), return the function
-    return _mkCrcFun(poly, sizeBits, initCrc, rev, xorOut)[0]
-
-#-----------------------------------------------------------------------------
-# Naming convention:
-# All function names ending with r are bit reverse variants of the ones
-# without the r.
-
-#-----------------------------------------------------------------------------
-# Check the polynomial to make sure that it is acceptable and return the number
-# of bits in the CRC.
-
-def _verifyPoly(poly):
-    msg = 'The degree of the polynomial must be 8, 16, 24, 32 or 64'
-    for n in (8,16,24,32,64):
-        low = 1<<n
-        high = low*2
-        if low <= poly < high:
-            return n
-    raise ValueError(msg)
-
-#-----------------------------------------------------------------------------
-# Bit reverse the input value.
-
-def _bitrev(x, n):
-    y = 0
-    for i in range(n):
-        y = (y << 1) | (x & 1)
-        x = x >> 1
-    return y
-
-#-----------------------------------------------------------------------------
-# The following functions compute the CRC for a single byte.  These are used
-# to build up the tables needed in the CRC algorithm.  Assumes the high order
-# bit of the polynomial has been stripped off.
-
-def _bytecrc(crc, poly, n):
-    mask = 1<<(n-1)
-    for i in range(8):
-        if crc & mask:
-            crc = (crc << 1) ^ poly
-        else:
-            crc = crc << 1
-    mask = (1<<n) - 1
-    crc = crc & mask
-    return crc
-
-def _bytecrc_r(crc, poly, n):
-    for i in range(8):
-        if crc & 1:
-            crc = (crc >> 1) ^ poly
-        else:
-            crc = crc >> 1
-    mask = (1<<n) - 1
-    crc = crc & mask
-    return crc
-
-#-----------------------------------------------------------------------------
-# The following functions compute the table needed to compute the CRC.  The
-# table is returned as a list.  Note that the array module does not support
-# 64-bit integers on a 32-bit architecture as of Python 2.3.
-#
-# These routines assume that the polynomial and the number of bits in the CRC
-# have been checked for validity by the caller.
-
-def _mkTable(poly, n):
-    mask = (1<<n) - 1
-    poly = poly & mask
-    table = [_bytecrc(i<<(n-8),poly,n) for i in range(256)]
-    return table
-
-def _mkTable_r(poly, n):
-    mask = (1<<n) - 1
-    poly = _bitrev(poly & mask, n)
-    table = [_bytecrc_r(i,poly,n) for i in range(256)]
-    return table
-
-#-----------------------------------------------------------------------------
-# Map the CRC size onto the functions that handle these sizes.
-
-_sizeMap = {
-     8 : [_crcfun._crc8, _crcfun._crc8r],
-    16 : [_crcfun._crc16, _crcfun._crc16r],
-    24 : [_crcfun._crc24, _crcfun._crc24r],
-    32 : [_crcfun._crc32, _crcfun._crc32r],
-    64 : [_crcfun._crc64, _crcfun._crc64r],
-}
-
-#-----------------------------------------------------------------------------
-# Build a mapping of size to struct module type code.  This table is
-# constructed dynamically so that it has the best chance of picking the best
-# code to use for the platform we are running on.  This should properly adapt
-# to 32 and 64 bit machines.
-
-_sizeToTypeCode = {}
-
-for typeCode in 'B H I L Q'.split():
-    size = {1:8, 2:16, 4:32, 8:64}.get(struct.calcsize(typeCode),None)
-    if size is not None and size not in _sizeToTypeCode:
-        _sizeToTypeCode[size] = '256%s' % typeCode
-
-_sizeToTypeCode[24] = _sizeToTypeCode[32]
-
-del typeCode, size
-
-#-----------------------------------------------------------------------------
-# The following function validates the parameters of the CRC, namely,
-# poly, and initial/final XOR values.
-# It returns the size of the CRC (in bits), and "sanitized" initial/final XOR values.
-
-def _verifyParams(poly, initCrc, xorOut):
-    sizeBits = _verifyPoly(poly)
-
-    mask = (1<<sizeBits) - 1
-
-    # Adjust the initial CRC to the correct data type (unsigned value).
-    initCrc = initCrc & mask
-
-    # Similar for XOR-out value.
-    xorOut = xorOut & mask
-
-    return (sizeBits, initCrc, xorOut)
-
-#-----------------------------------------------------------------------------
-# The following function returns a Python function to compute the CRC.
-#
-# It must be passed parameters that are already verified & sanitized by
-# _verifyParams().
-#
-# The returned function calls a low level function that is written in C if the
-# extension module could be loaded.  Otherwise, a Python implementation is
-# used.
-#
-# In addition to this function, a list containing the CRC table is returned.
-
-def _mkCrcFun(poly, sizeBits, initCrc, rev, xorOut):
-    if rev:
-        tableList = _mkTable_r(poly, sizeBits)
-        _fun = _sizeMap[sizeBits][1]
-    else:
-        tableList = _mkTable(poly, sizeBits)
-        _fun = _sizeMap[sizeBits][0]
-
-    _table = tableList
-    if _usingExtension:
-        _table = struct.pack(_sizeToTypeCode[sizeBits], *tableList)
-
-    if xorOut == 0:
-        def crcfun(data, crc=initCrc, table=_table, fun=_fun):
-            return fun(data, crc, table)
-    else:
-        def crcfun(data, crc=initCrc, table=_table, fun=_fun):
-            return xorOut ^ fun(data, xorOut ^ crc, table)
-
-    return crcfun, tableList
-
-#-----------------------------------------------------------------------------
-_codeTemplate = '''// Automatically generated CRC function
-// %(poly)s
-%(crcType)s
-%(name)s(%(dataType)s *data, int len, %(crcType)s crc)
-{
-    static const %(crcType)s table[256] = {%(crcTable)s
-    };
-    %(preCondition)s
-    while (len > 0)
-    {
-        crc = %(crcAlgor)s;
-        data++;
-        len--;
-    }%(postCondition)s
-    return crc;
-}
-'''
-
diff --git a/venv/lib/python3.8/site-packages/crcmod/predefined.py b/venv/lib/python3.8/site-packages/crcmod/predefined.py
deleted file mode 100644
index 21e2b32..0000000
--- a/venv/lib/python3.8/site-packages/crcmod/predefined.py
+++ /dev/null
@@ -1,162 +0,0 @@
-#-----------------------------------------------------------------------------
-# Copyright (c) 2010 Craig McQueen
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-# 
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-# 
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-#-----------------------------------------------------------------------------
-'''
-crcmod.predefined defines some well-known CRC algorithms.
-
-To use it, e.g.:
-    import crcmod.predefined
-    
-    crc32func = crcmod.predefined.mkPredefinedCrcFun("crc-32")
-    crc32class = crcmod.predefined.PredefinedCrc("crc-32")
-
-crcmod.predefined.Crc is an alias for crcmod.predefined.PredefinedCrc
-But if doing 'from crc.predefined import *', only PredefinedCrc is imported.
-'''
-
-# local imports
-import crcmod
-
-__all__ = [
-    'PredefinedCrc',
-    'mkPredefinedCrcFun',
-]
-
-REVERSE = True
-NON_REVERSE = False
-
-# The following table defines the parameters of well-known CRC algorithms.
-# The "Check" value is the CRC for the ASCII byte sequence b"123456789". It
-# can be used for unit tests.
-_crc_definitions_table = [
-#       Name                Identifier-name,    Poly            Reverse         Init-value      XOR-out     Check
-    [   'crc-8',            'Crc8',             0x107,          NON_REVERSE,    0x00,           0x00,       0xF4,       ],
-    [   'crc-8-darc',       'Crc8Darc',         0x139,          REVERSE,        0x00,           0x00,       0x15,       ],
-    [   'crc-8-i-code',     'Crc8ICode',        0x11D,          NON_REVERSE,    0xFD,           0x00,       0x7E,       ],
-    [   'crc-8-itu',        'Crc8Itu',          0x107,          NON_REVERSE,    0x55,           0x55,       0xA1,       ],
-    [   'crc-8-maxim',      'Crc8Maxim',        0x131,          REVERSE,        0x00,           0x00,       0xA1,       ],
-    [   'crc-8-rohc',       'Crc8Rohc',         0x107,          REVERSE,        0xFF,           0x00,       0xD0,       ],
-    [   'crc-8-wcdma',      'Crc8Wcdma',        0x19B,          REVERSE,        0x00,           0x00,       0x25,       ],
-
-    [   'crc-16',           'Crc16',            0x18005,        REVERSE,        0x0000,         0x0000,     0xBB3D,     ],
-    [   'crc-16-buypass',   'Crc16Buypass',     0x18005,        NON_REVERSE,    0x0000,         0x0000,     0xFEE8,     ],
-    [   'crc-16-dds-110',   'Crc16Dds110',      0x18005,        NON_REVERSE,    0x800D,         0x0000,     0x9ECF,     ],
-    [   'crc-16-dect',      'Crc16Dect',        0x10589,        NON_REVERSE,    0x0001,         0x0001,     0x007E,     ],
-    [   'crc-16-dnp',       'Crc16Dnp',         0x13D65,        REVERSE,        0xFFFF,         0xFFFF,     0xEA82,     ],
-    [   'crc-16-en-13757',  'Crc16En13757',     0x13D65,        NON_REVERSE,    0xFFFF,         0xFFFF,     0xC2B7,     ],
-    [   'crc-16-genibus',   'Crc16Genibus',     0x11021,        NON_REVERSE,    0x0000,         0xFFFF,     0xD64E,     ],
-    [   'crc-16-maxim',     'Crc16Maxim',       0x18005,        REVERSE,        0xFFFF,         0xFFFF,     0x44C2,     ],
-    [   'crc-16-mcrf4xx',   'Crc16Mcrf4xx',     0x11021,        REVERSE,        0xFFFF,         0x0000,     0x6F91,     ],
-    [   'crc-16-riello',    'Crc16Riello',      0x11021,        REVERSE,        0x554D,         0x0000,     0x63D0,     ],
-    [   'crc-16-t10-dif',   'Crc16T10Dif',      0x18BB7,        NON_REVERSE,    0x0000,         0x0000,     0xD0DB,     ],
-    [   'crc-16-teledisk',  'Crc16Teledisk',    0x1A097,        NON_REVERSE,    0x0000,         0x0000,     0x0FB3,     ],
-    [   'crc-16-usb',       'Crc16Usb',         0x18005,        REVERSE,        0x0000,         0xFFFF,     0xB4C8,     ],
-    [   'x-25',             'CrcX25',           0x11021,        REVERSE,        0x0000,         0xFFFF,     0x906E,     ],
-    [   'xmodem',           'CrcXmodem',        0x11021,        NON_REVERSE,    0x0000,         0x0000,     0x31C3,     ],
-    [   'modbus',           'CrcModbus',        0x18005,        REVERSE,        0xFFFF,         0x0000,     0x4B37,     ],
-
-    # Note definitions of CCITT are disputable. See:
-    #    http://homepages.tesco.net/~rainstorm/crc-catalogue.htm
-    #    http://web.archive.org/web/20071229021252/http://www.joegeluso.com/software/articles/ccitt.htm
-    [   'kermit',           'CrcKermit',        0x11021,        REVERSE,        0x0000,         0x0000,     0x2189,     ],
-    [   'crc-ccitt-false',  'CrcCcittFalse',    0x11021,        NON_REVERSE,    0xFFFF,         0x0000,     0x29B1,     ],
-    [   'crc-aug-ccitt',    'CrcAugCcitt',      0x11021,        NON_REVERSE,    0x1D0F,         0x0000,     0xE5CC,     ],
-
-    [   'crc-24',           'Crc24',            0x1864CFB,      NON_REVERSE,    0xB704CE,       0x000000,   0x21CF02,   ],
-    [   'crc-24-flexray-a', 'Crc24FlexrayA',    0x15D6DCB,      NON_REVERSE,    0xFEDCBA,       0x000000,   0x7979BD,   ],
-    [   'crc-24-flexray-b', 'Crc24FlexrayB',    0x15D6DCB,      NON_REVERSE,    0xABCDEF,       0x000000,   0x1F23B8,   ],
-
-    [   'crc-32',           'Crc32',            0x104C11DB7,    REVERSE,        0x00000000,     0xFFFFFFFF, 0xCBF43926, ],
-    [   'crc-32-bzip2',     'Crc32Bzip2',       0x104C11DB7,    NON_REVERSE,    0x00000000,     0xFFFFFFFF, 0xFC891918, ],
-    [   'crc-32c',          'Crc32C',           0x11EDC6F41,    REVERSE,        0x00000000,     0xFFFFFFFF, 0xE3069283, ],
-    [   'crc-32d',          'Crc32D',           0x1A833982B,    REVERSE,        0x00000000,     0xFFFFFFFF, 0x87315576, ],
-    [   'crc-32-mpeg',      'Crc32Mpeg',        0x104C11DB7,    NON_REVERSE,    0xFFFFFFFF,     0x00000000, 0x0376E6E7, ],
-    [   'posix',            'CrcPosix',         0x104C11DB7,    NON_REVERSE,    0xFFFFFFFF,     0xFFFFFFFF, 0x765E7680, ],
-    [   'crc-32q',          'Crc32Q',           0x1814141AB,    NON_REVERSE,    0x00000000,     0x00000000, 0x3010BF7F, ],
-    [   'jamcrc',           'CrcJamCrc',        0x104C11DB7,    REVERSE,        0xFFFFFFFF,     0x00000000, 0x340BC6D9, ],
-    [   'xfer',             'CrcXfer',          0x1000000AF,    NON_REVERSE,    0x00000000,     0x00000000, 0xBD0BE338, ],
-
-# 64-bit
-#       Name                Identifier-name,    Poly                    Reverse         Init-value          XOR-out             Check
-    [   'crc-64',           'Crc64',            0x1000000000000001B,    REVERSE,        0x0000000000000000, 0x0000000000000000, 0x46A5A9388A5BEFFE, ],
-    [   'crc-64-we',        'Crc64We',          0x142F0E1EBA9EA3693,    NON_REVERSE,    0x0000000000000000, 0xFFFFFFFFFFFFFFFF, 0x62EC59E3F1A4F00A, ],
-    [   'crc-64-jones',     'Crc64Jones',       0x1AD93D23594C935A9,    REVERSE,        0xFFFFFFFFFFFFFFFF, 0x0000000000000000, 0xCAA717168609F281, ],
-]
-
-
-def _simplify_name(name):
-    """
-    Reduce CRC definition name to a simplified form:
-        * lowercase
-        * dashes removed
-        * spaces removed
-        * any initial "CRC" string removed
-    """
-    name = name.lower()
-    name = name.replace('-', '')
-    name = name.replace(' ', '')
-    if name.startswith('crc'):
-        name = name[len('crc'):]
-    return name
-
-
-_crc_definitions_by_name = {}
-_crc_definitions_by_identifier = {}
-_crc_definitions = []
-
-_crc_table_headings = [ 'name', 'identifier', 'poly', 'reverse', 'init', 'xor_out', 'check' ]
-
-for table_entry in _crc_definitions_table:
-    crc_definition = dict(zip(_crc_table_headings, table_entry))
-    _crc_definitions.append(crc_definition)
-    name = _simplify_name(table_entry[0])
-    if name in _crc_definitions_by_name:
-        raise Exception("Duplicate entry for '{0}' in CRC table".format(name))
-    _crc_definitions_by_name[name] = crc_definition
-    _crc_definitions_by_identifier[table_entry[1]] = crc_definition
-
-
-def _get_definition_by_name(crc_name):
-    definition = _crc_definitions_by_name.get(_simplify_name(crc_name), None)
-    if not definition:
-        definition = _crc_definitions_by_identifier.get(crc_name, None)
-    if not definition:
-        raise KeyError("Unkown CRC name '{0}'".format(crc_name))
-    return definition
-
-
-class PredefinedCrc(crcmod.Crc):
-    def __init__(self, crc_name):
-        definition = _get_definition_by_name(crc_name)
-        super().__init__(poly=definition['poly'], initCrc=definition['init'], rev=definition['reverse'], xorOut=definition['xor_out'])
-
-
-# crcmod.predefined.Crc is an alias for crcmod.predefined.PredefinedCrc
-Crc = PredefinedCrc
-
-
-def mkPredefinedCrcFun(crc_name):
-    definition = _get_definition_by_name(crc_name)
-    return crcmod.mkCrcFun(poly=definition['poly'], initCrc=definition['init'], rev=definition['reverse'], xorOut=definition['xor_out'])
-
-
-# crcmod.predefined.mkCrcFun is an alias for crcmod.predefined.mkPredefinedCrcFun
-mkCrcFun = mkPredefinedCrcFun
diff --git a/venv/lib/python3.8/site-packages/crcmod/test.py b/venv/lib/python3.8/site-packages/crcmod/test.py
deleted file mode 100644
index 0190bb7..0000000
--- a/venv/lib/python3.8/site-packages/crcmod/test.py
+++ /dev/null
@@ -1,540 +0,0 @@
-#-----------------------------------------------------------------------------
-# Copyright (c) 2010  Raymond L. Buvel
-# Copyright (c) 2010  Craig McQueen
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-# 
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-# 
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-#-----------------------------------------------------------------------------
-'''Unit tests for crcmod functionality'''
-
-
-import unittest
-
-from array import array
-import binascii
-
-from .crcmod import mkCrcFun, Crc
-from .crcmod import _usingExtension
-from .predefined import PredefinedCrc
-from .predefined import mkPredefinedCrcFun
-from .predefined import _crc_definitions as _predefined_crc_definitions
-
-
-#-----------------------------------------------------------------------------
-# This polynomial was chosen because it is the product of two irreducible
-# polynomials.
-# g8 = (x^7+x+1)*(x+1)
-g8 = 0x185
-
-#-----------------------------------------------------------------------------
-# The following reproduces all of the entries in the Numerical Recipes table.
-# This is the standard CCITT polynomial.
-g16 = 0x11021
-
-#-----------------------------------------------------------------------------
-g24 = 0x15D6DCB
-
-#-----------------------------------------------------------------------------
-# This is the standard AUTODIN-II polynomial which appears to be used in a
-# wide variety of standards and applications.
-g32 = 0x104C11DB7
-
-
-#-----------------------------------------------------------------------------
-# I was able to locate a couple of 64-bit polynomials on the web.  To make it
-# easier to input the representation, define a function that builds a
-# polynomial from a list of the bits that need to be turned on.
-
-def polyFromBits(bits):
-    p = 0
-    for n in bits:
-        p = p | (1 << n)
-    return p
-
-# The following is from the paper "An Improved 64-bit Cyclic Redundancy Check
-# for Protein Sequences" by David T. Jones
-
-g64a = polyFromBits([64, 63, 61, 59, 58, 56, 55, 52, 49, 48, 47, 46, 44, 41,
-            37, 36, 34, 32, 31, 28, 26, 23, 22, 19, 16, 13, 12, 10, 9, 6, 4,
-            3, 0])
-
-# The following is from Standard ECMA-182 "Data Interchange on 12,7 mm 48-Track
-# Magnetic Tape Cartridges -DLT1 Format-", December 1992.
-
-g64b = polyFromBits([64, 62, 57, 55, 54, 53, 52, 47, 46, 45, 40, 39, 38, 37,
-            35, 33, 32, 31, 29, 27, 24, 23, 22, 21, 19, 17, 13, 12, 10, 9, 7,
-            4, 1, 0])
-
-#-----------------------------------------------------------------------------
-# This class is used to check the CRC calculations against a direct
-# implementation using polynomial division.
-
-class poly:
-    '''Class implementing polynomials over the field of integers mod 2'''
-    def __init__(self,p):
-        p = int(p)
-        if p < 0: raise ValueError('invalid polynomial')
-        self.p = p
-
-    def __int__(self):
-        return self.p
-
-    def __eq__(self,other):
-        return self.p == other.p
-
-    def __ne__(self,other):
-        return self.p != other.p
-
-    # To allow sorting of polynomials, use their long integer form for
-    # comparison
-    def __cmp__(self,other):
-        return cmp(self.p, other.p)
-
-    def __bool__(self):
-        return self.p != 0
-
-    def __neg__(self):
-        return self # These polynomials are their own inverse under addition
-
-    def __invert__(self):
-        n = max(self.deg() + 1, 1)
-        x = (1 << n) - 1
-        return poly(self.p ^ x)
-
-    def __add__(self,other):
-        return poly(self.p ^ other.p)
-
-    def __sub__(self,other):
-        return poly(self.p ^ other.p)
-
-    def __mul__(self,other):
-        a = self.p
-        b = other.p
-        if a == 0 or b == 0: return poly(0)
-        x = 0
-        while b:
-            if b&1:
-                x = x ^ a
-            a = a<<1
-            b = b>>1
-        return poly(x)
-
-    def __divmod__(self,other):
-        u = self.p
-        m = self.deg()
-        v = other.p
-        n = other.deg()
-        if v == 0: raise ZeroDivisionError('polynomial division by zero')
-        if n == 0: return (self,poly(0))
-        if m < n: return (poly(0),self)
-        k = m-n
-        a = 1 << m
-        v = v << k
-        q = 0
-        while k > 0:
-            if a & u:
-                u = u ^ v
-                q = q | 1
-            q = q << 1
-            a = a >> 1
-            v = v >> 1
-            k -= 1
-        if a & u:
-            u = u ^ v
-            q = q | 1
-        return (poly(q),poly(u))
-
-    def __div__(self,other):
-        return self.__divmod__(other)[0]
-
-    def __mod__(self,other):
-        return self.__divmod__(other)[1]
-
-    def __repr__(self):
-        return 'poly(0x%XL)' % self.p
-
-    def __str__(self):
-        p = self.p
-        if p == 0: return '0'
-        lst = { 0:[], 1:['1'], 2:['x'], 3:['1','x'] }[p&3]
-        p = p>>2
-        n = 2
-        while p:
-            if p&1: lst.append('x^%d' % n)
-            p = p>>1
-            n += 1
-        lst.reverse()
-        return '+'.join(lst)
-
-    def deg(self):
-        '''return the degree of the polynomial'''
-        a = self.p
-        if a == 0: return -1
-        n = 0
-        while a >= 0x10000:
-            n += 16
-            a = a >> 16
-        a = int(a)
-        while a > 1:
-            n += 1
-            a = a >> 1
-        return n
-
-#-----------------------------------------------------------------------------
-# The following functions compute the CRC using direct polynomial division.
-# These functions are checked against the result of the table driven
-# algorithms.
-
-g8p = poly(g8)
-x8p = poly(1<<8)
-def crc8p(d):
-    p = 0
-    for i in d:
-        p = p*256 + i
-    p = poly(p)
-    return int(p*x8p%g8p)
-
-g16p = poly(g16)
-x16p = poly(1<<16)
-def crc16p(d):
-    p = 0
-    for i in d:
-        p = p*256 + i
-    p = poly(p)
-    return int(p*x16p%g16p)
-
-g24p = poly(g24)
-x24p = poly(1<<24)
-def crc24p(d):
-    p = 0
-    for i in d:
-        p = p*256 + i
-    p = poly(p)
-    return int(p*x24p%g24p)
-
-g32p = poly(g32)
-x32p = poly(1<<32)
-def crc32p(d):
-    p = 0
-    for i in d:
-        p = p*256 + i
-    p = poly(p)
-    return int(p*x32p%g32p)
-
-g64ap = poly(g64a)
-x64p = poly(1<<64)
-def crc64ap(d):
-    p = 0
-    for i in d:
-        p = p*256 + i
-    p = poly(p)
-    return int(p*x64p%g64ap)
-
-g64bp = poly(g64b)
-def crc64bp(d):
-    p = 0
-    for i in d:
-        p = p*256 + i
-    p = poly(p)
-    return int(p*x64p%g64bp)
-
-
-class KnownAnswerTests(unittest.TestCase):
-    test_messages = [
-        b'T',
-        b'CatMouse987654321',
-    ]
-
-    known_answers = [
-        [ (g8,0,0),             (0xFE,          0x9D)           ],
-        [ (g8,-1,1),            (0x4F,          0x9B)           ],
-        [ (g8,0,1),             (0xFE,          0x62)           ],
-        [ (g16,0,0),            (0x1A71,        0xE556)         ],
-        [ (g16,-1,1),           (0x1B26,        0xF56E)         ],
-        [ (g16,0,1),            (0x14A1,        0xC28D)         ],
-        [ (g24,0,0),            (0xBCC49D,      0xC4B507)       ],
-        [ (g24,-1,1),           (0x59BD0E,      0x0AAA37)       ],
-        [ (g24,0,1),            (0xD52B0F,      0x1523AB)       ],
-        [ (g32,0,0),            (0x6B93DDDB,    0x12DCA0F4)     ],
-        [ (g32,0xFFFFFFFF,1),   (0x41FB859F,    0xF7B400A7)     ],
-        [ (g32,0,1),            (0x6C0695ED,    0xC1A40EE5)     ],
-        [ (g32,0,1,0xFFFFFFFF), (0xBE047A60,    0x084BFF58)     ],
-    ]
-
-    def test_known_answers(self):
-        for crcfun_params, v in self.known_answers:
-            crcfun = mkCrcFun(*crcfun_params)
-            self.assertEqual(crcfun(b'',0), 0, "Wrong answer for CRC parameters %s, input ''" % (crcfun_params,))
-            for i, msg in enumerate(self.test_messages):
-                self.assertEqual(crcfun(msg), v[i], "Wrong answer for CRC parameters %s, input '%s'" % (crcfun_params,msg))
-                self.assertEqual(crcfun(msg[4:], crcfun(msg[:4])), v[i], "Wrong answer for CRC parameters %s, input '%s'" % (crcfun_params,msg))
-                self.assertEqual(crcfun(msg[-1:], crcfun(msg[:-1])), v[i], "Wrong answer for CRC parameters %s, input '%s'" % (crcfun_params,msg))
-
-
-class CompareReferenceCrcTest(unittest.TestCase):
-    test_messages = [
-        b'',
-        b'T',
-        b'123456789',
-        b'CatMouse987654321',
-    ]
-
-    test_poly_crcs = [
-        [ (g8,0,0),     crc8p    ],
-        [ (g16,0,0),    crc16p   ],
-        [ (g24,0,0),    crc24p   ],
-        [ (g32,0,0),    crc32p   ],
-        [ (g64a,0,0),   crc64ap  ],
-        [ (g64b,0,0),   crc64bp  ],
-    ]
-
-    @staticmethod
-    def reference_crc32(d, crc=0):
-        """This function modifies the return value of binascii.crc32
-        to be an unsigned 32-bit value. I.e. in the range 0 to 2**32-1."""
-        # Work around the future warning on constants.
-        if crc > 0x7FFFFFFF:
-            x = int(crc & 0x7FFFFFFF)
-            crc = x | -2147483648
-        x = binascii.crc32(d,crc)
-        return int(x) & 0xFFFFFFFF
-
-    def test_compare_crc32(self):
-        """The binascii module has a 32-bit CRC function that is used in a wide range
-        of applications including the checksum used in the ZIP file format.
-        This test compares the CRC-32 implementation of this crcmod module to
-        that of binascii.crc32."""
-        # The following function should produce the same result as
-        # self.reference_crc32 which is derived from binascii.crc32.
-        crc32 = mkCrcFun(g32,0,1,0xFFFFFFFF)
-
-        for msg in self.test_messages:
-            self.assertEqual(crc32(msg), self.reference_crc32(msg))
-
-    def test_compare_poly(self):
-        """Compare various CRCs of this crcmod module to a pure
-        polynomial-based implementation."""
-        for crcfun_params, crc_poly_fun in self.test_poly_crcs:
-            # The following function should produce the same result as
-            # the associated polynomial CRC function.
-            crcfun = mkCrcFun(*crcfun_params)
-
-            for msg in self.test_messages:
-                self.assertEqual(crcfun(msg), crc_poly_fun(msg))
-
-
-class CrcClassTest(unittest.TestCase):
-    """Verify the Crc class"""
-
-    msg = b'CatMouse987654321'
-
-    def test_simple_crc32_class(self):
-        """Verify the CRC class when not using xorOut"""
-        crc = Crc(g32)
-
-        str_rep = \
-'''poly = 0x104C11DB7
-reverse = True
-initCrc  = 0xFFFFFFFF
-xorOut   = 0x00000000
-crcValue = 0xFFFFFFFF'''
-        self.assertEqual(str(crc), str_rep)
-        self.assertEqual(crc.digest(), b'\xff\xff\xff\xff')
-        self.assertEqual(crc.hexdigest(), 'FFFFFFFF')
-
-        crc.update(self.msg)
-        self.assertEqual(crc.crcValue, 0xF7B400A7)
-        self.assertEqual(crc.digest(), b'\xf7\xb4\x00\xa7')
-        self.assertEqual(crc.hexdigest(), 'F7B400A7')
-
-        # Verify the .copy() method
-        x = crc.copy()
-        self.assertTrue(x is not crc)
-        str_rep = \
-'''poly = 0x104C11DB7
-reverse = True
-initCrc  = 0xFFFFFFFF
-xorOut   = 0x00000000
-crcValue = 0xF7B400A7'''
-        self.assertEqual(str(crc), str_rep)
-        self.assertEqual(str(x), str_rep)
-
-    def test_full_crc32_class(self):
-        """Verify the CRC class when using xorOut"""
-
-        crc = Crc(g32, initCrc=0, xorOut= ~0)
-
-        str_rep = \
-'''poly = 0x104C11DB7
-reverse = True
-initCrc  = 0x00000000
-xorOut   = 0xFFFFFFFF
-crcValue = 0x00000000'''
-        self.assertEqual(str(crc), str_rep)
-        self.assertEqual(crc.digest(), b'\x00\x00\x00\x00')
-        self.assertEqual(crc.hexdigest(), '00000000')
-
-        crc.update(self.msg)
-        self.assertEqual(crc.crcValue, 0x84BFF58)
-        self.assertEqual(crc.digest(), b'\x08\x4b\xff\x58')
-        self.assertEqual(crc.hexdigest(), '084BFF58')
-
-        # Verify the .copy() method
-        x = crc.copy()
-        self.assertTrue(x is not crc)
-        str_rep = \
-'''poly = 0x104C11DB7
-reverse = True
-initCrc  = 0x00000000
-xorOut   = 0xFFFFFFFF
-crcValue = 0x084BFF58'''
-        self.assertEqual(str(crc), str_rep)
-        self.assertEqual(str(x), str_rep)
-
-        # Verify the .new() method
-        y = crc.new()
-        self.assertTrue(y is not crc)
-        self.assertTrue(y is not x)
-        str_rep = \
-'''poly = 0x104C11DB7
-reverse = True
-initCrc  = 0x00000000
-xorOut   = 0xFFFFFFFF
-crcValue = 0x00000000'''
-        self.assertEqual(str(y), str_rep)
-
-
-class PredefinedCrcTest(unittest.TestCase):
-    """Verify the predefined CRCs"""
-
-    test_messages_for_known_answers = [
-        b'',                           # Test cases below depend on this first entry being the empty string. 
-        b'T',
-        b'CatMouse987654321',
-    ]
-
-    known_answers = [
-        [ 'crc-aug-ccitt',  (0x1D0F,        0xD6ED,        0x5637)         ],
-        [ 'x-25',           (0x0000,        0xE4D9,        0x0A91)         ],
-        [ 'crc-32',         (0x00000000,    0xBE047A60,    0x084BFF58)     ],
-    ]
-
-    def test_known_answers(self):
-        for crcfun_name, v in self.known_answers:
-            crcfun = mkPredefinedCrcFun(crcfun_name)
-            self.assertEqual(crcfun(b'',0), 0, "Wrong answer for CRC '%s', input ''" % crcfun_name)
-            for i, msg in enumerate(self.test_messages_for_known_answers):
-                self.assertEqual(crcfun(msg), v[i], "Wrong answer for CRC %s, input '%s'" % (crcfun_name,msg))
-                self.assertEqual(crcfun(msg[4:], crcfun(msg[:4])), v[i], "Wrong answer for CRC %s, input '%s'" % (crcfun_name,msg))
-                self.assertEqual(crcfun(msg[-1:], crcfun(msg[:-1])), v[i], "Wrong answer for CRC %s, input '%s'" % (crcfun_name,msg))
-
-    def test_class_with_known_answers(self):
-        for crcfun_name, v in self.known_answers:
-            for i, msg in enumerate(self.test_messages_for_known_answers):
-                crc1 = PredefinedCrc(crcfun_name)
-                crc1.update(msg)
-                self.assertEqual(crc1.crcValue, v[i], "Wrong answer for crc1 %s, input '%s'" % (crcfun_name,msg))
-
-                crc2 = crc1.new()
-                # Check that crc1 maintains its same value, after .new() call.
-                self.assertEqual(crc1.crcValue, v[i], "Wrong state for crc1 %s, input '%s'" % (crcfun_name,msg))
-                # Check that the new class instance created by .new() contains the initialisation value.
-                # This depends on the first string in self.test_messages_for_known_answers being
-                # the empty string.
-                self.assertEqual(crc2.crcValue, v[0], "Wrong state for crc2 %s, input '%s'" % (crcfun_name,msg))
-
-                crc2.update(msg)
-                # Check that crc1 maintains its same value, after crc2 has called .update()
-                self.assertEqual(crc1.crcValue, v[i], "Wrong state for crc1 %s, input '%s'" % (crcfun_name,msg))
-                # Check that crc2 contains the right value after calling .update()
-                self.assertEqual(crc2.crcValue, v[i], "Wrong state for crc2 %s, input '%s'" % (crcfun_name,msg))
-
-    def test_function_predefined_table(self):
-        for table_entry in _predefined_crc_definitions:
-            # Check predefined function
-            crc_func = mkPredefinedCrcFun(table_entry['name'])
-            calc_value = crc_func(b"123456789")
-            self.assertEqual(calc_value, table_entry['check'], "Wrong answer for CRC '%s'" % table_entry['name'])
-
-    def test_class_predefined_table(self):
-        for table_entry in _predefined_crc_definitions:
-            # Check predefined class
-            crc1 = PredefinedCrc(table_entry['name'])
-            crc1.update(b"123456789")
-            self.assertEqual(crc1.crcValue, table_entry['check'], "Wrong answer for CRC '%s'" % table_entry['name'])
-
-
-class InputTypesTest(unittest.TestCase):
-    """Check the various input types that CRC functions can accept."""
-
-    msg = b'CatMouse987654321'
-
-    check_crc_names = [
-        'crc-aug-ccitt',
-        'x-25',
-        'crc-32',
-    ]
-    
-    array_check_types = [
-        'B',
-        'H',
-        'I',
-        'L',
-    ]
-
-    def test_bytearray_input(self):
-        """Test that bytearray inputs are accepted, as an example
-        of a type that implements the buffer protocol."""
-        for crc_name in self.check_crc_names:
-            crcfun = mkPredefinedCrcFun(crc_name)
-            for i in range(len(self.msg) + 1):
-                test_msg = self.msg[:i]
-                bytes_answer = crcfun(test_msg)
-                bytearray_answer = crcfun(bytearray(test_msg))
-                self.assertEqual(bytes_answer, bytearray_answer)
-
-    def test_array_input(self):
-        """Test that array inputs are accepted, as an example
-        of a type that implements the buffer protocol."""
-        for crc_name in self.check_crc_names:
-            crcfun = mkPredefinedCrcFun(crc_name)
-            for i in range(len(self.msg) + 1):
-                test_msg = self.msg[:i]
-                bytes_answer = crcfun(test_msg)
-                for array_type in self.array_check_types:
-                    if i % array(array_type).itemsize == 0:
-                        test_array = array(array_type, test_msg)
-                        array_answer = crcfun(test_array)
-                        self.assertEqual(bytes_answer, array_answer)
-
-    def test_unicode_input(self):
-        """Test that Unicode input raises TypeError"""
-        for crc_name in self.check_crc_names:
-            crcfun = mkPredefinedCrcFun(crc_name)
-            with self.assertRaises(TypeError):
-                crcfun("123456789")
-
-
-def runtests():
-    print("Using extension:", _usingExtension)
-    print()
-    unittest.main()
-
-
-if __name__ == '__main__':
-    runtests()
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/network/utils.py b/venv/lib/python3.8/site-packages/pip/_internal/network/utils.py
deleted file mode 100644
index a19050b..0000000
--- a/venv/lib/python3.8/site-packages/pip/_internal/network/utils.py
+++ /dev/null
@@ -1,48 +0,0 @@
-from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
-
-from pip._internal.utils.typing import MYPY_CHECK_RUNNING
-
-if MYPY_CHECK_RUNNING:
-    from typing import Iterator
-
-
-def response_chunks(response, chunk_size=CONTENT_CHUNK_SIZE):
-    # type: (Response, int) -> Iterator[bytes]
-    """Given a requests Response, provide the data chunks.
-    """
-    try:
-        # Special case for urllib3.
-        for chunk in response.raw.stream(
-            chunk_size,
-            # We use decode_content=False here because we don't
-            # want urllib3 to mess with the raw bytes we get
-            # from the server. If we decompress inside of
-            # urllib3 then we cannot verify the checksum
-            # because the checksum will be of the compressed
-            # file. This breakage will only occur if the
-            # server adds a Content-Encoding header, which
-            # depends on how the server was configured:
-            # - Some servers will notice that the file isn't a
-            #   compressible file and will leave the file alone
-            #   and with an empty Content-Encoding
-            # - Some servers will notice that the file is
-            #   already compressed and will leave the file
-            #   alone and will add a Content-Encoding: gzip
-            #   header
-            # - Some servers won't notice anything at all and
-            #   will take a file that's already been compressed
-            #   and compress it again and set the
-            #   Content-Encoding: gzip header
-            #
-            # By setting this not to decode automatically we
-            # hope to eliminate problems with the second case.
-            decode_content=False,
-        ):
-            yield chunk
-    except AttributeError:
-        # Standard file-like object.
-        while True:
-            chunk = response.raw.read(chunk_size)
-            if not chunk:
-                break
-            yield chunk
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py b/venv/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py
deleted file mode 100644
index e7315ee..0000000
--- a/venv/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py
+++ /dev/null
@@ -1,631 +0,0 @@
-"""Support for installing and building the "wheel" binary package format.
-"""
-
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
-
-from __future__ import absolute_import
-
-import collections
-import compileall
-import contextlib
-import csv
-import logging
-import os.path
-import re
-import shutil
-import stat
-import sys
-import warnings
-from base64 import urlsafe_b64encode
-from itertools import starmap
-from zipfile import ZipFile
-
-from pip._vendor import pkg_resources
-from pip._vendor.distlib.scripts import ScriptMaker
-from pip._vendor.distlib.util import get_export_entry
-from pip._vendor.six import StringIO
-
-from pip._internal.exceptions import InstallationError
-from pip._internal.locations import get_major_minor_version
-from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl
-from pip._internal.utils.filesystem import adjacent_tmp_file, replace
-from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file
-from pip._internal.utils.temp_dir import TempDirectory
-from pip._internal.utils.typing import MYPY_CHECK_RUNNING
-from pip._internal.utils.unpacking import current_umask, unpack_file
-from pip._internal.utils.wheel import parse_wheel
-
-if MYPY_CHECK_RUNNING:
-    from email.message import Message
-    from typing import (
-        Dict, List, Optional, Sequence, Tuple, Any,
-        Iterable, Iterator, Callable, Set,
-    )
-
-    from pip._internal.models.scheme import Scheme
-    from pip._internal.utils.filesystem import NamedTemporaryFileResult
-
-    InstalledCSVRow = Tuple[str, ...]
-
-
-logger = logging.getLogger(__name__)
-
-
-def normpath(src, p):
-    # type: (str, str) -> str
-    return os.path.relpath(src, p).replace(os.path.sep, '/')
-
-
-def rehash(path, blocksize=1 << 20):
-    # type: (str, int) -> Tuple[str, str]
-    """Return (encoded_digest, length) for path using hashlib.sha256()"""
-    h, length = hash_file(path, blocksize)
-    digest = 'sha256=' + urlsafe_b64encode(
-        h.digest()
-    ).decode('latin1').rstrip('=')
-    # unicode/str python2 issues
-    return (digest, str(length))  # type: ignore
-
-
-def csv_io_kwargs(mode):
-    # type: (str) -> Dict[str, Any]
-    """Return keyword arguments to properly open a CSV file
-    in the given mode.
-    """
-    if sys.version_info.major < 3:
-        return {'mode': '{}b'.format(mode)}
-    else:
-        return {'mode': mode, 'newline': ''}
-
-
-def fix_script(path):
-    # type: (str) -> Optional[bool]
-    """Replace #!python with #!/path/to/python
-    Return True if file was changed.
-    """
-    # XXX RECORD hashes will need to be updated
-    if os.path.isfile(path):
-        with open(path, 'rb') as script:
-            firstline = script.readline()
-            if not firstline.startswith(b'#!python'):
-                return False
-            exename = sys.executable.encode(sys.getfilesystemencoding())
-            firstline = b'#!' + exename + os.linesep.encode("ascii")
-            rest = script.read()
-        with open(path, 'wb') as script:
-            script.write(firstline)
-            script.write(rest)
-        return True
-    return None
-
-
-def wheel_root_is_purelib(metadata):
-    # type: (Message) -> bool
-    return metadata.get("Root-Is-Purelib", "").lower() == "true"
-
-
-def get_entrypoints(filename):
-    # type: (str) -> Tuple[Dict[str, str], Dict[str, str]]
-    if not os.path.exists(filename):
-        return {}, {}
-
-    # This is done because you can pass a string to entry_points wrappers which
-    # means that they may or may not be valid INI files. The attempt here is to
-    # strip leading and trailing whitespace in order to make them valid INI
-    # files.
-    with open(filename) as fp:
-        data = StringIO()
-        for line in fp:
-            data.write(line.strip())
-            data.write("\n")
-        data.seek(0)
-
-    # get the entry points and then the script names
-    entry_points = pkg_resources.EntryPoint.parse_map(data)
-    console = entry_points.get('console_scripts', {})
-    gui = entry_points.get('gui_scripts', {})
-
-    def _split_ep(s):
-        # type: (pkg_resources.EntryPoint) -> Tuple[str, str]
-        """get the string representation of EntryPoint,
-        remove space and split on '='
-        """
-        split_parts = str(s).replace(" ", "").split("=")
-        return split_parts[0], split_parts[1]
-
-    # convert the EntryPoint objects into strings with module:function
-    console = dict(_split_ep(v) for v in console.values())
-    gui = dict(_split_ep(v) for v in gui.values())
-    return console, gui
-
-
-def message_about_scripts_not_on_PATH(scripts):
-    # type: (Sequence[str]) -> Optional[str]
-    """Determine if any scripts are not on PATH and format a warning.
-    Returns a warning message if one or more scripts are not on PATH,
-    otherwise None.
-    """
-    if not scripts:
-        return None
-
-    # Group scripts by the path they were installed in
-    grouped_by_dir = collections.defaultdict(set)  # type: Dict[str, Set[str]]
-    for destfile in scripts:
-        parent_dir = os.path.dirname(destfile)
-        script_name = os.path.basename(destfile)
-        grouped_by_dir[parent_dir].add(script_name)
-
-    # We don't want to warn for directories that are on PATH.
-    not_warn_dirs = [
-        os.path.normcase(i).rstrip(os.sep) for i in
-        os.environ.get("PATH", "").split(os.pathsep)
-    ]
-    # If an executable sits with sys.executable, we don't warn for it.
-    #     This covers the case of venv invocations without activating the venv.
-    not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable)))
-    warn_for = {
-        parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items()
-        if os.path.normcase(parent_dir) not in not_warn_dirs
-    }  # type: Dict[str, Set[str]]
-    if not warn_for:
-        return None
-
-    # Format a message
-    msg_lines = []
-    for parent_dir, dir_scripts in warn_for.items():
-        sorted_scripts = sorted(dir_scripts)  # type: List[str]
-        if len(sorted_scripts) == 1:
-            start_text = "script {} is".format(sorted_scripts[0])
-        else:
-            start_text = "scripts {} are".format(
-                ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1]
-            )
-
-        msg_lines.append(
-            "The {} installed in '{}' which is not on PATH."
-            .format(start_text, parent_dir)
-        )
-
-    last_line_fmt = (
-        "Consider adding {} to PATH or, if you prefer "
-        "to suppress this warning, use --no-warn-script-location."
-    )
-    if len(msg_lines) == 1:
-        msg_lines.append(last_line_fmt.format("this directory"))
-    else:
-        msg_lines.append(last_line_fmt.format("these directories"))
-
-    # Add a note if any directory starts with ~
-    warn_for_tilde = any(
-        i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i
-    )
-    if warn_for_tilde:
-        tilde_warning_msg = (
-            "NOTE: The current PATH contains path(s) starting with `~`, "
-            "which may not be expanded by all applications."
-        )
-        msg_lines.append(tilde_warning_msg)
-
-    # Returns the formatted multiline message
-    return "\n".join(msg_lines)
-
-
-def sorted_outrows(outrows):
-    # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow]
-    """Return the given rows of a RECORD file in sorted order.
-
-    Each row is a 3-tuple (path, hash, size) and corresponds to a record of
-    a RECORD file (see PEP 376 and PEP 427 for details).  For the rows
-    passed to this function, the size can be an integer as an int or string,
-    or the empty string.
-    """
-    # Normally, there should only be one row per path, in which case the
-    # second and third elements don't come into play when sorting.
-    # However, in cases in the wild where a path might happen to occur twice,
-    # we don't want the sort operation to trigger an error (but still want
-    # determinism).  Since the third element can be an int or string, we
-    # coerce each element to a string to avoid a TypeError in this case.
-    # For additional background, see--
-    # https://github.com/pypa/pip/issues/5868
-    return sorted(outrows, key=lambda row: tuple(str(x) for x in row))
-
-
-def get_csv_rows_for_installed(
-    old_csv_rows,  # type: Iterable[List[str]]
-    installed,  # type: Dict[str, str]
-    changed,  # type: Set[str]
-    generated,  # type: List[str]
-    lib_dir,  # type: str
-):
-    # type: (...) -> List[InstalledCSVRow]
-    """
-    :param installed: A map from archive RECORD path to installation RECORD
-        path.
-    """
-    installed_rows = []  # type: List[InstalledCSVRow]
-    for row in old_csv_rows:
-        if len(row) > 3:
-            logger.warning(
-                'RECORD line has more than three elements: {}'.format(row)
-            )
-        # Make a copy because we are mutating the row.
-        row = list(row)
-        old_path = row[0]
-        new_path = installed.pop(old_path, old_path)
-        row[0] = new_path
-        if new_path in changed:
-            digest, length = rehash(new_path)
-            row[1] = digest
-            row[2] = length
-        installed_rows.append(tuple(row))
-    for f in generated:
-        digest, length = rehash(f)
-        installed_rows.append((normpath(f, lib_dir), digest, str(length)))
-    for f in installed:
-        installed_rows.append((installed[f], '', ''))
-    return installed_rows
-
-
-class MissingCallableSuffix(Exception):
-    pass
-
-
-def _raise_for_invalid_entrypoint(specification):
-    # type: (str) -> None
-    entry = get_export_entry(specification)
-    if entry is not None and entry.suffix is None:
-        raise MissingCallableSuffix(str(entry))
-
-
-class PipScriptMaker(ScriptMaker):
-    def make(self, specification, options=None):
-        # type: (str, Dict[str, Any]) -> List[str]
-        _raise_for_invalid_entrypoint(specification)
-        return super(PipScriptMaker, self).make(specification, options)
-
-
-def install_unpacked_wheel(
-    name,  # type: str
-    wheeldir,  # type: str
-    wheel_zip,  # type: ZipFile
-    scheme,  # type: Scheme
-    req_description,  # type: str
-    pycompile=True,  # type: bool
-    warn_script_location=True,  # type: bool
-    direct_url=None,  # type: Optional[DirectUrl]
-):
-    # type: (...) -> None
-    """Install a wheel.
-
-    :param name: Name of the project to install
-    :param wheeldir: Base directory of the unpacked wheel
-    :param wheel_zip: open ZipFile for wheel being installed
-    :param scheme: Distutils scheme dictating the install directories
-    :param req_description: String used in place of the requirement, for
-        logging
-    :param pycompile: Whether to byte-compile installed Python files
-    :param warn_script_location: Whether to check that scripts are installed
-        into a directory on PATH
-    :raises UnsupportedWheel:
-        * when the directory holds an unpacked wheel with incompatible
-          Wheel-Version
-        * when the .dist-info dir does not match the wheel
-    """
-    # TODO: Investigate and break this up.
-    # TODO: Look into moving this into a dedicated class for representing an
-    #       installation.
-
-    source = wheeldir.rstrip(os.path.sep) + os.path.sep
-
-    info_dir, metadata = parse_wheel(wheel_zip, name)
-
-    if wheel_root_is_purelib(metadata):
-        lib_dir = scheme.purelib
-    else:
-        lib_dir = scheme.platlib
-
-    subdirs = os.listdir(source)
-    data_dirs = [s for s in subdirs if s.endswith('.data')]
-
-    # Record details of the files moved
-    #   installed = files copied from the wheel to the destination
-    #   changed = files changed while installing (scripts #! line typically)
-    #   generated = files newly generated during the install (script wrappers)
-    installed = {}  # type: Dict[str, str]
-    changed = set()
-    generated = []  # type: List[str]
-
-    # Compile all of the pyc files that we're going to be installing
-    if pycompile:
-        with captured_stdout() as stdout:
-            with warnings.catch_warnings():
-                warnings.filterwarnings('ignore')
-                compileall.compile_dir(source, force=True, quiet=True)
-        logger.debug(stdout.getvalue())
-
-    def record_installed(srcfile, destfile, modified=False):
-        # type: (str, str, bool) -> None
-        """Map archive RECORD paths to installation RECORD paths."""
-        oldpath = normpath(srcfile, wheeldir)
-        newpath = normpath(destfile, lib_dir)
-        installed[oldpath] = newpath
-        if modified:
-            changed.add(destfile)
-
-    def clobber(
-            source,  # type: str
-            dest,  # type: str
-            is_base,  # type: bool
-            fixer=None,  # type: Optional[Callable[[str], Any]]
-            filter=None  # type: Optional[Callable[[str], bool]]
-    ):
-        # type: (...) -> None
-        ensure_dir(dest)  # common for the 'include' path
-
-        for dir, subdirs, files in os.walk(source):
-            basedir = dir[len(source):].lstrip(os.path.sep)
-            destdir = os.path.join(dest, basedir)
-            if is_base and basedir == '':
-                subdirs[:] = [s for s in subdirs if not s.endswith('.data')]
-            for f in files:
-                # Skip unwanted files
-                if filter and filter(f):
-                    continue
-                srcfile = os.path.join(dir, f)
-                destfile = os.path.join(dest, basedir, f)
-                # directory creation is lazy and after the file filtering above
-                # to ensure we don't install empty dirs; empty dirs can't be
-                # uninstalled.
-                ensure_dir(destdir)
-
-                # copyfile (called below) truncates the destination if it
-                # exists and then writes the new contents. This is fine in most
-                # cases, but can cause a segfault if pip has loaded a shared
-                # object (e.g. from pyopenssl through its vendored urllib3)
-                # Since the shared object is mmap'd an attempt to call a
-                # symbol in it will then cause a segfault. Unlinking the file
-                # allows writing of new contents while allowing the process to
-                # continue to use the old copy.
-                if os.path.exists(destfile):
-                    os.unlink(destfile)
-
-                # We use copyfile (not move, copy, or copy2) to be extra sure
-                # that we are not moving directories over (copyfile fails for
-                # directories) as well as to ensure that we are not copying
-                # over any metadata because we want more control over what
-                # metadata we actually copy over.
-                shutil.copyfile(srcfile, destfile)
-
-                # Copy over the metadata for the file, currently this only
-                # includes the atime and mtime.
-                st = os.stat(srcfile)
-                if hasattr(os, "utime"):
-                    os.utime(destfile, (st.st_atime, st.st_mtime))
-
-                # If our file is executable, then make our destination file
-                # executable.
-                if os.access(srcfile, os.X_OK):
-                    st = os.stat(srcfile)
-                    permissions = (
-                        st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
-                    )
-                    os.chmod(destfile, permissions)
-
-                changed = False
-                if fixer:
-                    changed = fixer(destfile)
-                record_installed(srcfile, destfile, changed)
-
-    clobber(source, lib_dir, True)
-
-    dest_info_dir = os.path.join(lib_dir, info_dir)
-
-    # Get the defined entry points
-    ep_file = os.path.join(dest_info_dir, 'entry_points.txt')
-    console, gui = get_entrypoints(ep_file)
-
-    def is_entrypoint_wrapper(name):
-        # type: (str) -> bool
-        # EP, EP.exe and EP-script.py are scripts generated for
-        # entry point EP by setuptools
-        if name.lower().endswith('.exe'):
-            matchname = name[:-4]
-        elif name.lower().endswith('-script.py'):
-            matchname = name[:-10]
-        elif name.lower().endswith(".pya"):
-            matchname = name[:-4]
-        else:
-            matchname = name
-        # Ignore setuptools-generated scripts
-        return (matchname in console or matchname in gui)
-
-    for datadir in data_dirs:
-        fixer = None
-        filter = None
-        for subdir in os.listdir(os.path.join(wheeldir, datadir)):
-            fixer = None
-            if subdir == 'scripts':
-                fixer = fix_script
-                filter = is_entrypoint_wrapper
-            source = os.path.join(wheeldir, datadir, subdir)
-            dest = getattr(scheme, subdir)
-            clobber(source, dest, False, fixer=fixer, filter=filter)
-
-    maker = PipScriptMaker(None, scheme.scripts)
-
-    # Ensure old scripts are overwritten.
-    # See https://github.com/pypa/pip/issues/1800
-    maker.clobber = True
-
-    # Ensure we don't generate any variants for scripts because this is almost
-    # never what somebody wants.
-    # See https://bitbucket.org/pypa/distlib/issue/35/
-    maker.variants = {''}
-
-    # This is required because otherwise distlib creates scripts that are not
-    # executable.
-    # See https://bitbucket.org/pypa/distlib/issue/32/
-    maker.set_mode = True
-
-    scripts_to_generate = []
-
-    # Special case pip and setuptools to generate versioned wrappers
-    #
-    # The issue is that some projects (specifically, pip and setuptools) use
-    # code in setup.py to create "versioned" entry points - pip2.7 on Python
-    # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into
-    # the wheel metadata at build time, and so if the wheel is installed with
-    # a *different* version of Python the entry points will be wrong. The
-    # correct fix for this is to enhance the metadata to be able to describe
-    # such versioned entry points, but that won't happen till Metadata 2.0 is
-    # available.
-    # In the meantime, projects using versioned entry points will either have
-    # incorrect versioned entry points, or they will not be able to distribute
-    # "universal" wheels (i.e., they will need a wheel per Python version).
-    #
-    # Because setuptools and pip are bundled with _ensurepip and virtualenv,
-    # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
-    # override the versioned entry points in the wheel and generate the
-    # correct ones. This code is purely a short-term measure until Metadata 2.0
-    # is available.
-    #
-    # To add the level of hack in this section of code, in order to support
-    # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment
-    # variable which will control which version scripts get installed.
-    #
-    # ENSUREPIP_OPTIONS=altinstall
-    #   - Only pipX.Y and easy_install-X.Y will be generated and installed
-    # ENSUREPIP_OPTIONS=install
-    #   - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note
-    #     that this option is technically if ENSUREPIP_OPTIONS is set and is
-    #     not altinstall
-    # DEFAULT
-    #   - The default behavior is to install pip, pipX, pipX.Y, easy_install
-    #     and easy_install-X.Y.
-    pip_script = console.pop('pip', None)
-    if pip_script:
-        if "ENSUREPIP_OPTIONS" not in os.environ:
-            scripts_to_generate.append('pip = ' + pip_script)
-
-        if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall":
-            scripts_to_generate.append(
-                'pip{} = {}'.format(sys.version_info[0], pip_script)
-            )
-
-        scripts_to_generate.append(
-            'pip{} = {}'.format(get_major_minor_version(), pip_script)
-        )
-        # Delete any other versioned pip entry points
-        pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)]
-        for k in pip_ep:
-            del console[k]
-    easy_install_script = console.pop('easy_install', None)
-    if easy_install_script:
-        if "ENSUREPIP_OPTIONS" not in os.environ:
-            scripts_to_generate.append(
-                'easy_install = ' + easy_install_script
-            )
-
-        scripts_to_generate.append(
-            'easy_install-{} = {}'.format(
-                get_major_minor_version(), easy_install_script
-            )
-        )
-        # Delete any other versioned easy_install entry points
-        easy_install_ep = [
-            k for k in console if re.match(r'easy_install(-\d\.\d)?$', k)
-        ]
-        for k in easy_install_ep:
-            del console[k]
-
-    # Generate the console and GUI entry points specified in the wheel
-    scripts_to_generate.extend(starmap('{} = {}'.format, console.items()))
-
-    gui_scripts_to_generate = list(starmap('{} = {}'.format, gui.items()))
-
-    generated_console_scripts = []  # type: List[str]
-
-    try:
-        generated_console_scripts = maker.make_multiple(scripts_to_generate)
-        generated.extend(generated_console_scripts)
-
-        generated.extend(
-            maker.make_multiple(gui_scripts_to_generate, {'gui': True})
-        )
-    except MissingCallableSuffix as e:
-        entry = e.args[0]
-        raise InstallationError(
-            "Invalid script entry point: {} for req: {} - A callable "
-            "suffix is required. Cf https://packaging.python.org/"
-            "specifications/entry-points/#use-for-scripts for more "
-            "information.".format(entry, req_description)
-        )
-
-    if warn_script_location:
-        msg = message_about_scripts_not_on_PATH(generated_console_scripts)
-        if msg is not None:
-            logger.warning(msg)
-
-    generated_file_mode = 0o666 - current_umask()
-
-    @contextlib.contextmanager
-    def _generate_file(path, **kwargs):
-        # type: (str, **Any) -> Iterator[NamedTemporaryFileResult]
-        with adjacent_tmp_file(path, **kwargs) as f:
-            yield f
-        os.chmod(f.name, generated_file_mode)
-        replace(f.name, path)
-
-    # Record pip as the installer
-    installer_path = os.path.join(dest_info_dir, 'INSTALLER')
-    with _generate_file(installer_path) as installer_file:
-        installer_file.write(b'pip\n')
-    generated.append(installer_path)
-
-    # Record the PEP 610 direct URL reference
-    if direct_url is not None:
-        direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME)
-        with _generate_file(direct_url_path) as direct_url_file:
-            direct_url_file.write(direct_url.to_json().encode("utf-8"))
-        generated.append(direct_url_path)
-
-    # Record details of all files installed
-    record_path = os.path.join(dest_info_dir, 'RECORD')
-    with open(record_path, **csv_io_kwargs('r')) as record_file:
-        rows = get_csv_rows_for_installed(
-            csv.reader(record_file),
-            installed=installed,
-            changed=changed,
-            generated=generated,
-            lib_dir=lib_dir)
-    with _generate_file(record_path, **csv_io_kwargs('w')) as record_file:
-        writer = csv.writer(record_file)
-        writer.writerows(sorted_outrows(rows))  # sort to simplify testing
-
-
-def install_wheel(
-    name,  # type: str
-    wheel_path,  # type: str
-    scheme,  # type: Scheme
-    req_description,  # type: str
-    pycompile=True,  # type: bool
-    warn_script_location=True,  # type: bool
-    _temp_dir_for_testing=None,  # type: Optional[str]
-    direct_url=None,  # type: Optional[DirectUrl]
-):
-    # type: (...) -> None
-    with TempDirectory(
-        path=_temp_dir_for_testing, kind="unpacked-wheel"
-    ) as unpacked_dir, ZipFile(wheel_path, allowZip64=True) as z:
-        unpack_file(wheel_path, unpacked_dir.path)
-        install_unpacked_wheel(
-            name=name,
-            wheeldir=unpacked_dir.path,
-            wheel_zip=z,
-            scheme=scheme,
-            req_description=req_description,
-            pycompile=pycompile,
-            warn_script_location=warn_script_location,
-            direct_url=direct_url,
-        )
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/factory.py b/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/factory.py
deleted file mode 100644
index 23686f7..0000000
--- a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/factory.py
+++ /dev/null
@@ -1,201 +0,0 @@
-from pip._vendor.packaging.utils import canonicalize_name
-
-from pip._internal.exceptions import (
-    InstallationError,
-    UnsupportedPythonVersion,
-)
-from pip._internal.utils.misc import get_installed_distributions
-from pip._internal.utils.typing import MYPY_CHECK_RUNNING
-
-from .candidates import (
-    AlreadyInstalledCandidate,
-    EditableCandidate,
-    ExtrasCandidate,
-    LinkCandidate,
-    RequiresPythonCandidate,
-)
-from .requirements import (
-    ExplicitRequirement,
-    RequiresPythonRequirement,
-    SpecifierRequirement,
-)
-
-if MYPY_CHECK_RUNNING:
-    from typing import Dict, Iterator, Optional, Set, Tuple, TypeVar
-
-    from pip._vendor.packaging.specifiers import SpecifierSet
-    from pip._vendor.packaging.version import _BaseVersion
-    from pip._vendor.pkg_resources import Distribution
-    from pip._vendor.resolvelib import ResolutionImpossible
-
-    from pip._internal.index.package_finder import PackageFinder
-    from pip._internal.models.link import Link
-    from pip._internal.operations.prepare import RequirementPreparer
-    from pip._internal.req.req_install import InstallRequirement
-    from pip._internal.resolution.base import InstallRequirementProvider
-
-    from .base import Candidate, Requirement
-    from .candidates import BaseCandidate
-
-    C = TypeVar("C")
-    Cache = Dict[Link, C]
-
-
-class Factory(object):
-    def __init__(
-        self,
-        finder,  # type: PackageFinder
-        preparer,  # type: RequirementPreparer
-        make_install_req,  # type: InstallRequirementProvider
-        force_reinstall,  # type: bool
-        ignore_installed,  # type: bool
-        ignore_requires_python,  # type: bool
-        py_version_info=None,  # type: Optional[Tuple[int, ...]]
-    ):
-        # type: (...) -> None
-        self.finder = finder
-        self.preparer = preparer
-        self._python_candidate = RequiresPythonCandidate(py_version_info)
-        self._make_install_req_from_spec = make_install_req
-        self._force_reinstall = force_reinstall
-        self._ignore_requires_python = ignore_requires_python
-
-        self._link_candidate_cache = {}  # type: Cache[LinkCandidate]
-        self._editable_candidate_cache = {}  # type: Cache[EditableCandidate]
-
-        if not ignore_installed:
-            self._installed_dists = {
-                canonicalize_name(dist.project_name): dist
-                for dist in get_installed_distributions()
-            }
-        else:
-            self._installed_dists = {}
-
-    def _make_candidate_from_dist(
-        self,
-        dist,  # type: Distribution
-        extras,  # type: Set[str]
-        parent,  # type: InstallRequirement
-    ):
-        # type: (...) -> Candidate
-        base = AlreadyInstalledCandidate(dist, parent, factory=self)
-        if extras:
-            return ExtrasCandidate(base, extras)
-        return base
-
-    def _make_candidate_from_link(
-        self,
-        link,          # type: Link
-        extras,        # type: Set[str]
-        parent,        # type: InstallRequirement
-        name=None,     # type: Optional[str]
-        version=None,  # type: Optional[_BaseVersion]
-    ):
-        # type: (...) -> Candidate
-        # TODO: Check already installed candidate, and use it if the link and
-        # editable flag match.
-        if parent.editable:
-            if link not in self._editable_candidate_cache:
-                self._editable_candidate_cache[link] = EditableCandidate(
-                    link, parent, factory=self, name=name, version=version,
-                )
-            base = self._editable_candidate_cache[link]  # type: BaseCandidate
-        else:
-            if link not in self._link_candidate_cache:
-                self._link_candidate_cache[link] = LinkCandidate(
-                    link, parent, factory=self, name=name, version=version,
-                )
-            base = self._link_candidate_cache[link]
-        if extras:
-            return ExtrasCandidate(base, extras)
-        return base
-
-    def iter_found_candidates(self, ireq, extras):
-        # type: (InstallRequirement, Set[str]) -> Iterator[Candidate]
-        name = canonicalize_name(ireq.req.name)
-        if not self._force_reinstall:
-            installed_dist = self._installed_dists.get(name)
-        else:
-            installed_dist = None
-
-        found = self.finder.find_best_candidate(
-            project_name=ireq.req.name,
-            specifier=ireq.req.specifier,
-            hashes=ireq.hashes(trust_internet=False),
-        )
-        for ican in found.iter_applicable():
-            if (installed_dist is not None and
-                    installed_dist.parsed_version == ican.version):
-                continue
-            yield self._make_candidate_from_link(
-                link=ican.link,
-                extras=extras,
-                parent=ireq,
-                name=name,
-                version=ican.version,
-            )
-
-        # Return installed distribution if it matches the specifier. This is
-        # done last so the resolver will prefer it over downloading links.
-        if (installed_dist is not None and
-                installed_dist.parsed_version in ireq.req.specifier):
-            yield self._make_candidate_from_dist(
-                dist=installed_dist,
-                extras=extras,
-                parent=ireq,
-            )
-
-    def make_requirement_from_install_req(self, ireq):
-        # type: (InstallRequirement) -> Requirement
-        if ireq.link:
-            # TODO: Get name and version from ireq, if possible?
-            #       Specifically, this might be needed in "name @ URL"
-            #       syntax - need to check where that syntax is handled.
-            cand = self._make_candidate_from_link(
-                ireq.link, extras=set(), parent=ireq,
-            )
-            return ExplicitRequirement(cand)
-        return SpecifierRequirement(ireq, factory=self)
-
-    def make_requirement_from_spec(self, specifier, comes_from):
-        # type: (str, InstallRequirement) -> Requirement
-        ireq = self._make_install_req_from_spec(specifier, comes_from)
-        return self.make_requirement_from_install_req(ireq)
-
-    def make_requires_python_requirement(self, specifier):
-        # type: (Optional[SpecifierSet]) -> Optional[Requirement]
-        if self._ignore_requires_python or specifier is None:
-            return None
-        return RequiresPythonRequirement(specifier, self._python_candidate)
-
-    def should_reinstall(self, candidate):
-        # type: (Candidate) -> bool
-        # TODO: Are there more cases this needs to return True? Editable?
-        return candidate.name in self._installed_dists
-
-    def _report_requires_python_error(
-        self,
-        requirement,  # type: RequiresPythonRequirement
-        parent,  # type: Candidate
-    ):
-        # type: (...) -> UnsupportedPythonVersion
-        template = (
-            "Package {package!r} requires a different Python: "
-            "{version} not in {specifier!r}"
-        )
-        message = template.format(
-            package=parent.name,
-            version=self._python_candidate.version,
-            specifier=str(requirement.specifier),
-        )
-        return UnsupportedPythonVersion(message)
-
-    def get_installation_error(self, e):
-        # type: (ResolutionImpossible) -> Optional[InstallationError]
-        for cause in e.causes:
-            if isinstance(cause.requirement, RequiresPythonRequirement):
-                return self._report_requires_python_error(
-                    cause.requirement,
-                    cause.parent,
-                )
-        return None
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/provider.py b/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/provider.py
deleted file mode 100644
index 5c3d210..0000000
--- a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/provider.py
+++ /dev/null
@@ -1,54 +0,0 @@
-from pip._vendor.resolvelib.providers import AbstractProvider
-
-from pip._internal.utils.typing import MYPY_CHECK_RUNNING
-
-if MYPY_CHECK_RUNNING:
-    from typing import Any, Optional, Sequence, Tuple, Union
-
-    from pip._internal.req.req_install import InstallRequirement
-
-    from .base import Requirement, Candidate
-    from .factory import Factory
-
-
-class PipProvider(AbstractProvider):
-    def __init__(
-        self,
-        factory,  # type: Factory
-        ignore_dependencies,  # type: bool
-    ):
-        # type: (...) -> None
-        self._factory = factory
-        self._ignore_dependencies = ignore_dependencies
-
-    def get_install_requirement(self, c):
-        # type: (Candidate) -> Optional[InstallRequirement]
-        return c.get_install_requirement()
-
-    def identify(self, dependency):
-        # type: (Union[Requirement, Candidate]) -> str
-        return dependency.name
-
-    def get_preference(
-        self,
-        resolution,  # type: Optional[Candidate]
-        candidates,  # type: Sequence[Candidate]
-        information  # type: Sequence[Tuple[Requirement, Candidate]]
-    ):
-        # type: (...) -> Any
-        # Use the "usual" value for now
-        return len(candidates)
-
-    def find_matches(self, requirement):
-        # type: (Requirement) -> Sequence[Candidate]
-        return requirement.find_matches()
-
-    def is_satisfied_by(self, requirement, candidate):
-        # type: (Requirement, Candidate) -> bool
-        return requirement.is_satisfied_by(candidate)
-
-    def get_dependencies(self, candidate):
-        # type: (Candidate) -> Sequence[Requirement]
-        if self._ignore_dependencies:
-            return []
-        return candidate.get_dependencies()
diff --git a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/resolver.py
deleted file mode 100644
index cba5a49..0000000
--- a/venv/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+++ /dev/null
@@ -1,174 +0,0 @@
-import functools
-import logging
-
-from pip._vendor import six
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible
-from pip._vendor.resolvelib import Resolver as RLResolver
-
-from pip._internal.exceptions import InstallationError
-from pip._internal.req.req_set import RequirementSet
-from pip._internal.resolution.base import BaseResolver
-from pip._internal.resolution.resolvelib.provider import PipProvider
-from pip._internal.utils.typing import MYPY_CHECK_RUNNING
-
-from .factory import Factory
-
-if MYPY_CHECK_RUNNING:
-    from typing import Dict, List, Optional, Tuple
-
-    from pip._vendor.resolvelib.resolvers import Result
-
-    from pip._internal.cache import WheelCache
-    from pip._internal.index.package_finder import PackageFinder
-    from pip._internal.operations.prepare import RequirementPreparer
-    from pip._internal.req.req_install import InstallRequirement
-    from pip._internal.resolution.base import InstallRequirementProvider
-
-
-logger = logging.getLogger(__name__)
-
-
-class Resolver(BaseResolver):
-    def __init__(
-        self,
-        preparer,  # type: RequirementPreparer
-        finder,  # type: PackageFinder
-        wheel_cache,  # type: Optional[WheelCache]
-        make_install_req,  # type: InstallRequirementProvider
-        use_user_site,  # type: bool
-        ignore_dependencies,  # type: bool
-        ignore_installed,  # type: bool
-        ignore_requires_python,  # type: bool
-        force_reinstall,  # type: bool
-        upgrade_strategy,  # type: str
-        py_version_info=None,  # type: Optional[Tuple[int, ...]]
-    ):
-        super(Resolver, self).__init__()
-        self.factory = Factory(
-            finder=finder,
-            preparer=preparer,
-            make_install_req=make_install_req,
-            force_reinstall=force_reinstall,
-            ignore_installed=ignore_installed,
-            ignore_requires_python=ignore_requires_python,
-            py_version_info=py_version_info,
-        )
-        self.ignore_dependencies = ignore_dependencies
-        self._result = None  # type: Optional[Result]
-
-    def resolve(self, root_reqs, check_supported_wheels):
-        # type: (List[InstallRequirement], bool) -> RequirementSet
-
-        # FIXME: Implement constraints.
-        if any(r.constraint for r in root_reqs):
-            raise InstallationError("Constraints are not yet supported.")
-
-        provider = PipProvider(
-            factory=self.factory,
-            ignore_dependencies=self.ignore_dependencies,
-        )
-        reporter = BaseReporter()
-        resolver = RLResolver(provider, reporter)
-
-        requirements = [
-            self.factory.make_requirement_from_install_req(r)
-            for r in root_reqs
-        ]
-
-        try:
-            self._result = resolver.resolve(requirements)
-
-        except ResolutionImpossible as e:
-            error = self.factory.get_installation_error(e)
-            if not error:
-                # TODO: This needs fixing, we need to look at the
-                # factory.get_installation_error infrastructure, as that
-                # doesn't really allow for the logger.critical calls I'm
-                # using here.
-                for req, parent in e.causes:
-                    logger.critical(
-                        "Could not find a version that satisfies " +
-                        "the requirement " +
-                        str(req) +
-                        ("" if parent is None else " (from {})".format(
-                            parent.name
-                        ))
-                    )
-                raise InstallationError(
-                    "No matching distribution found for " +
-                    ", ".join([r.name for r, _ in e.causes])
-                )
-                raise
-            six.raise_from(error, e)
-
-        req_set = RequirementSet(check_supported_wheels=check_supported_wheels)
-        for candidate in self._result.mapping.values():
-            ireq = provider.get_install_requirement(candidate)
-            if ireq is None:
-                continue
-            ireq.should_reinstall = self.factory.should_reinstall(candidate)
-            req_set.add_named_requirement(ireq)
-
-        return req_set
-
-    def get_installation_order(self, req_set):
-        # type: (RequirementSet) -> List[InstallRequirement]
-        """Create a list that orders given requirements for installation.
-
-        The returned list should contain all requirements in ``req_set``,
-        so the caller can loop through it and have a requirement installed
-        before the requiring thing.
-
-        The current implementation walks the resolved dependency graph, and
-        make sure every node has a greater "weight" than all its parents.
-        """
-        assert self._result is not None, "must call resolve() first"
-        weights = {}  # type: Dict[Optional[str], int]
-
-        graph = self._result.graph
-        key_count = len(self._result.mapping) + 1  # Packages plus sentinal.
-        while len(weights) < key_count:
-            progressed = False
-            for key in graph:
-                if key in weights:
-                    continue
-                parents = list(graph.iter_parents(key))
-                if not all(p in weights for p in parents):
-                    continue
-                if parents:
-                    weight = max(weights[p] for p in parents) + 1
-                else:
-                    weight = 0
-                weights[key] = weight
-                progressed = True
-
-            # FIXME: This check will fail if there are unbreakable cycles.
-            # Implement something to forcifully break them up to continue.
-            if not progressed:
-                raise InstallationError(
-                    "Could not determine installation order due to cicular "
-                    "dependency."
-                )
-
-        sorted_items = sorted(
-            req_set.requirements.items(),
-            key=functools.partial(_req_set_item_sorter, weights=weights),
-            reverse=True,
-        )
-        return [ireq for _, ireq in sorted_items]
-
-
-def _req_set_item_sorter(
-    item,     # type: Tuple[str, InstallRequirement]
-    weights,  # type: Dict[Optional[str], int]
-):
-    # type: (...) -> Tuple[int, str]
-    """Key function used to sort install requirements for installation.
-
-    Based on the "weight" mapping calculated in ``get_installation_order()``.
-    The canonical package name is returned as the second member as a tie-
-    breaker to ensure the result is predictable, which is useful in tests.
-    """
-    name = canonicalize_name(item[0])
-    return weights[name], name
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/certifi/core.py b/venv/lib/python3.8/site-packages/pip/_vendor/certifi/core.py
deleted file mode 100644
index 56b52a3..0000000
--- a/venv/lib/python3.8/site-packages/pip/_vendor/certifi/core.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-certifi.py
-~~~~~~~~~~
-
-This module returns the installation location of cacert.pem or its contents.
-"""
-import os
-
-try:
-    from importlib.resources import read_text
-except ImportError:
-    # This fallback will work for Python versions prior to 3.7 that lack the
-    # importlib.resources module but relies on the existing `where` function
-    # so won't address issues with environments like PyOxidizer that don't set
-    # __file__ on modules.
-    def read_text(_module, _path, encoding="ascii"):
-        with open(where(), "r", encoding=encoding) as data:
-            return data.read()
-
-
-def where():
-    f = os.path.dirname(__file__)
-
-    return os.path.join(f, "cacert.pem")
-
-
-def contents():
-    return read_text("certifi", "cacert.pem", encoding="ascii")
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__init__.py
deleted file mode 100644
index a5ba4bf..0000000
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from __future__ import absolute_import, division, unicode_literals
-
-from .py import Trie as PyTrie
-
-Trie = PyTrie
-
-# pylint:disable=wrong-import-position
-try:
-    from .datrie import Trie as DATrie
-except ImportError:
-    pass
-else:
-    Trie = DATrie
-# pylint:enable=wrong-import-position
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/datrie.py
deleted file mode 100644
index e2e5f86..0000000
--- a/venv/lib/python3.8/site-packages/pip/_vendor/html5lib/_trie/datrie.py
+++ /dev/null
@@ -1,44 +0,0 @@
-from __future__ import absolute_import, division, unicode_literals
-
-from datrie import Trie as DATrie
-from pip._vendor.six import text_type
-
-from ._base import Trie as ABCTrie
-
-
-class Trie(ABCTrie):
-    def __init__(self, data):
-        chars = set()
-        for key in data.keys():
-            if not isinstance(key, text_type):
-                raise TypeError("All keys must be strings")
-            for char in key:
-                chars.add(char)
-
-        self._data = DATrie("".join(chars))
-        for key, value in data.items():
-            self._data[key] = value
-
-    def __contains__(self, key):
-        return key in self._data
-
-    def __len__(self):
-        return len(self._data)
-
-    def __iter__(self):
-        raise NotImplementedError()
-
-    def __getitem__(self, key):
-        return self._data[key]
-
-    def keys(self, prefix=None):
-        return self._data.keys(prefix)
-
-    def has_keys_with_prefix(self, prefix):
-        return self._data.has_keys_with_prefix(prefix)
-
-    def longest_prefix(self, prefix):
-        return self._data.longest_prefix(prefix)
-
-    def longest_prefix_item(self, prefix):
-        return self._data.longest_prefix_item(prefix)
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/idna/package_data.py b/venv/lib/python3.8/site-packages/pip/_vendor/idna/package_data.py
deleted file mode 100644
index b5d8216..0000000
--- a/venv/lib/python3.8/site-packages/pip/_vendor/idna/package_data.py
+++ /dev/null
@@ -1,2 +0,0 @@
-__version__ = '2.9'
-
diff --git a/venv/lib/python3.8/site-packages/pip/_vendor/toml.py b/venv/lib/python3.8/site-packages/pip/_vendor/toml.py
deleted file mode 100644
index dac3988..0000000
--- a/venv/lib/python3.8/site-packages/pip/_vendor/toml.py
+++ /dev/null
@@ -1,1039 +0,0 @@
-"""Python module which parses and emits TOML.
-
-Released under the MIT license.
-"""
-import re
-import io
-import datetime
-from os import linesep
-import sys
-
-__version__ = "0.9.6"
-_spec_ = "0.4.0"
-
-
-class TomlDecodeError(Exception):
-    """Base toml Exception / Error."""
-    pass
-
-
-class TomlTz(datetime.tzinfo):
-    def __init__(self, toml_offset):
-        if toml_offset == "Z":
-            self._raw_offset = "+00:00"
-        else:
-            self._raw_offset = toml_offset
-        self._sign = -1 if self._raw_offset[0] == '-' else 1
-        self._hours = int(self._raw_offset[1:3])
-        self._minutes = int(self._raw_offset[4:6])
-
-    def tzname(self, dt):
-        return "UTC" + self._raw_offset
-
-    def utcoffset(self, dt):
-        return self._sign * datetime.timedelta(hours=self._hours,
-                                               minutes=self._minutes)
-
-    def dst(self, dt):
-        return datetime.timedelta(0)
-
-
-class InlineTableDict(object):
-    """Sentinel subclass of dict for inline tables."""
-
-
-def _get_empty_inline_table(_dict):
-    class DynamicInlineTableDict(_dict, InlineTableDict):
-        """Concrete sentinel subclass for inline tables.
-        It is a subclass of _dict which is passed in dynamically at load time
-        It is also a subclass of InlineTableDict
-        """
-
-    return DynamicInlineTableDict()
-
-
-try:
-    _range = xrange
-except NameError:
-    unicode = str
-    _range = range
-    basestring = str
-    unichr = chr
-
-try:
-    FNFError = FileNotFoundError
-except NameError:
-    FNFError = IOError
-
-
-def load(f, _dict=dict):
-    """Parses named file or files as toml and returns a dictionary
-
-    Args:
-        f: Path to the file to open, array of files to read into single dict
-           or a file descriptor
-        _dict: (optional) Specifies the class of the returned toml dictionary
-
-    Returns:
-        Parsed toml file represented as a dictionary
-
-    Raises:
-        TypeError -- When f is invalid type
-        TomlDecodeError: Error while decoding toml
-        IOError / FileNotFoundError -- When an array with no valid (existing)
-        (Python 2 / Python 3)          file paths is passed
-    """
-
-    if isinstance(f, basestring):
-        with io.open(f, encoding='utf-8') as ffile:
-            return loads(ffile.read(), _dict)
-    elif isinstance(f, list):
-        from os import path as op
-        from warnings import warn
-        if not [path for path in f if op.exists(path)]:
-            error_msg = "Load expects a list to contain filenames only."
-            error_msg += linesep
-            error_msg += ("The list needs to contain the path of at least one "
-                          "existing file.")
-            raise FNFError(error_msg)
-        d = _dict()
-        for l in f:
-            if op.exists(l):
-                d.update(load(l))
-            else:
-                warn("Non-existent filename in list with at least one valid "
-                     "filename")
-        return d
-    else:
-        try:
-            return loads(f.read(), _dict)
-        except AttributeError:
-            raise TypeError("You can only load a file descriptor, filename or "
-                            "list")
-
-
-_groupname_re = re.compile(r'^[A-Za-z0-9_-]+$')
-
-
-def loads(s, _dict=dict):
-    """Parses string as toml
-
-    Args:
-        s: String to be parsed
-        _dict: (optional) Specifies the class of the returned toml dictionary
-
-    Returns:
-        Parsed toml file represented as a dictionary
-
-    Raises:
-        TypeError: When a non-string is passed
-        TomlDecodeError: Error while decoding toml
-    """
-
-    implicitgroups = []
-    retval = _dict()
-    currentlevel = retval
-    if not isinstance(s, basestring):
-        raise TypeError("Expecting something like a string")
-
-    if not isinstance(s, unicode):
-        s = s.decode('utf8')
-
-    sl = list(s)
-    openarr = 0
-    openstring = False
-    openstrchar = ""
-    multilinestr = False
-    arrayoftables = False
-    beginline = True
-    keygroup = False
-    keyname = 0
-    for i, item in enumerate(sl):
-        if item == '\r' and sl[i + 1] == '\n':
-            sl[i] = ' '
-            continue
-        if keyname:
-            if item == '\n':
-                raise TomlDecodeError("Key name found without value."
-                                      " Reached end of line.")
-            if openstring:
-                if item == openstrchar:
-                    keyname = 2
-                    openstring = False
-                    openstrchar = ""
-                continue
-            elif keyname == 1:
-                if item.isspace():
-                    keyname = 2
-                    continue
-                elif item.isalnum() or item == '_' or item == '-':
-                    continue
-            elif keyname == 2 and item.isspace():
-                continue
-            if item == '=':
-                keyname = 0
-            else:
-                raise TomlDecodeError("Found invalid character in key name: '" +
-                                      item + "'. Try quoting the key name.")
-        if item == "'" and openstrchar != '"':
-            k = 1
-            try:
-                while sl[i - k] == "'":
-                    k += 1
-                    if k == 3:
-                        break
-            except IndexError:
-                pass
-            if k == 3:
-                multilinestr = not multilinestr
-                openstring = multilinestr
-            else:
-                openstring = not openstring
-            if openstring:
-                openstrchar = "'"
-            else:
-                openstrchar = ""
-        if item == '"' and openstrchar != "'":
-            oddbackslash = False
-            k = 1
-            tripquote = False
-            try:
-                while sl[i - k] == '"':
-                    k += 1
-                    if k == 3:
-                        tripquote = True
-                        break
-                if k == 1 or (k == 3 and tripquote):
-                    while sl[i - k] == '\\':
-                        oddbackslash = not oddbackslash
-                        k += 1
-            except IndexError:
-                pass
-            if not oddbackslash:
-                if tripquote:
-                    multilinestr = not multilinestr
-                    openstring = multilinestr
-                else:
-                    openstring = not openstring
-            if openstring:
-                openstrchar = '"'
-            else:
-                openstrchar = ""
-        if item == '#' and (not openstring and not keygroup and
-                            not arrayoftables):
-            j = i
-            try:
-                while sl[j] != '\n':
-                    sl[j] = ' '
-                    j += 1
-            except IndexError:
-                break
-        if item == '[' and (not openstring and not keygroup and
-                            not arrayoftables):
-            if beginline:
-                if len(sl) > i + 1 and sl[i + 1] == '[':
-                    arrayoftables = True
-                else:
-                    keygroup = True
-            else:
-                openarr += 1
-        if item == ']' and not openstring:
-            if keygroup:
-                keygroup = False
-            elif arrayoftables:
-                if sl[i - 1] == ']':
-                    arrayoftables = False
-            else:
-                openarr -= 1
-        if item == '\n':
-            if openstring or multilinestr:
-                if not multilinestr:
-                    raise TomlDecodeError("Unbalanced quotes")
-                if ((sl[i - 1] == "'" or sl[i - 1] == '"') and (
-                        sl[i - 2] == sl[i - 1])):
-                    sl[i] = sl[i - 1]
-                    if sl[i - 3] == sl[i - 1]:
-                        sl[i - 3] = ' '
-            elif openarr:
-                sl[i] = ' '
-            else:
-                beginline = True
-        elif beginline and sl[i] != ' ' and sl[i] != '\t':
-            beginline = False
-            if not keygroup and not arrayoftables:
-                if sl[i] == '=':
-                    raise TomlDecodeError("Found empty keyname. ")
-                keyname = 1
-    s = ''.join(sl)
-    s = s.split('\n')
-    multikey = None
-    multilinestr = ""
-    multibackslash = False
-    for line in s:
-        if not multilinestr or multibackslash or '\n' not in multilinestr:
-            line = line.strip()
-        if line == "" and (not multikey or multibackslash):
-            continue
-        if multikey:
-            if multibackslash:
-                multilinestr += line
-            else:
-                multilinestr += line
-            multibackslash = False
-            if len(line) > 2 and (line[-1] == multilinestr[0] and
-                                  line[-2] == multilinestr[0] and
-                                  line[-3] == multilinestr[0]):
-                try:
-                    value, vtype = _load_value(multilinestr, _dict)
-                except ValueError as err:
-                    raise TomlDecodeError(str(err))
-                currentlevel[multikey] = value
-                multikey = None
-                multilinestr = ""
-            else:
-                k = len(multilinestr) - 1
-                while k > -1 and multilinestr[k] == '\\':
-                    multibackslash = not multibackslash
-                    k -= 1
-                if multibackslash:
-                    multilinestr = multilinestr[:-1]
-                else:
-                    multilinestr += "\n"
-            continue
-        if line[0] == '[':
-            arrayoftables = False
-            if len(line) == 1:
-                raise TomlDecodeError("Opening key group bracket on line by "
-                                      "itself.")
-            if line[1] == '[':
-                arrayoftables = True
-                line = line[2:]
-                splitstr = ']]'
-            else:
-                line = line[1:]
-                splitstr = ']'
-            i = 1
-            quotesplits = _get_split_on_quotes(line)
-            quoted = False
-            for quotesplit in quotesplits:
-                if not quoted and splitstr in quotesplit:
-                    break
-                i += quotesplit.count(splitstr)
-                quoted = not quoted
-            line = line.split(splitstr, i)
-            if len(line) < i + 1 or line[-1].strip() != "":
-                raise TomlDecodeError("Key group not on a line by itself.")
-            groups = splitstr.join(line[:-1]).split('.')
-            i = 0
-            while i < len(groups):
-                groups[i] = groups[i].strip()
-                if len(groups[i]) > 0 and (groups[i][0] == '"' or
-                                           groups[i][0] == "'"):
-                    groupstr = groups[i]
-                    j = i + 1
-                    while not groupstr[0] == groupstr[-1]:
-                        j += 1
-                        if j > len(groups) + 2:
-                            raise TomlDecodeError("Invalid group name '" +
-                                                  groupstr + "' Something " +
-                                                  "went wrong.")
-                        groupstr = '.'.join(groups[i:j]).strip()
-                    groups[i] = groupstr[1:-1]
-                    groups[i + 1:j] = []
-                else:
-                    if not _groupname_re.match(groups[i]):
-                        raise TomlDecodeError("Invalid group name '" +
-                                              groups[i] + "'. Try quoting it.")
-                i += 1
-            currentlevel = retval
-            for i in _range(len(groups)):
-                group = groups[i]
-                if group == "":
-                    raise TomlDecodeError("Can't have a keygroup with an empty "
-                                          "name")
-                try:
-                    currentlevel[group]
-                    if i == len(groups) - 1:
-                        if group in implicitgroups:
-                            implicitgroups.remove(group)
-                            if arrayoftables:
-                                raise TomlDecodeError("An implicitly defined "
-                                                      "table can't be an array")
-                        elif arrayoftables:
-                            currentlevel[group].append(_dict())
-                        else:
-                            raise TomlDecodeError("What? " + group +
-                                                  " already exists?" +
-                                                  str(currentlevel))
-                except TypeError:
-                    currentlevel = currentlevel[-1]
-                    try:
-                        currentlevel[group]
-                    except KeyError:
-                        currentlevel[group] = _dict()
-                        if i == len(groups) - 1 and arrayoftables:
-                            currentlevel[group] = [_dict()]
-                except KeyError:
-                    if i != len(groups) - 1:
-                        implicitgroups.append(group)
-                    currentlevel[group] = _dict()
-                    if i == len(groups) - 1 and arrayoftables:
-                        currentlevel[group] = [_dict()]
-                currentlevel = currentlevel[group]
-                if arrayoftables:
-                    try:
-                        currentlevel = currentlevel[-1]
-                    except KeyError:
-                        pass
-        elif line[0] == "{":
-            if line[-1] != "}":
-                raise TomlDecodeError("Line breaks are not allowed in inline"
-                                      "objects")
-            try:
-                _load_inline_object(line, currentlevel, _dict, multikey,
-                                    multibackslash)
-            except ValueError as err:
-                raise TomlDecodeError(str(err))
-        elif "=" in line:
-            try:
-                ret = _load_line(line, currentlevel, _dict, multikey,
-                                 multibackslash)
-            except ValueError as err:
-                raise TomlDecodeError(str(err))
-            if ret is not None:
-                multikey, multilinestr, multibackslash = ret
-    return retval
-
-
-def _load_inline_object(line, currentlevel, _dict, multikey=False,
-                        multibackslash=False):
-    candidate_groups = line[1:-1].split(",")
-    groups = []
-    if len(candidate_groups) == 1 and not candidate_groups[0].strip():
-        candidate_groups.pop()
-    while len(candidate_groups) > 0:
-        candidate_group = candidate_groups.pop(0)
-        try:
-            _, value = candidate_group.split('=', 1)
-        except ValueError:
-            raise ValueError("Invalid inline table encountered")
-        value = value.strip()
-        if ((value[0] == value[-1] and value[0] in ('"', "'")) or (
-                value[0] in '-0123456789' or
-                value in ('true', 'false') or
-                (value[0] == "[" and value[-1] == "]") or
-                (value[0] == '{' and value[-1] == '}'))):
-            groups.append(candidate_group)
-        elif len(candidate_groups) > 0:
-            candidate_groups[0] = candidate_group + "," + candidate_groups[0]
-        else:
-            raise ValueError("Invalid inline table value encountered")
-    for group in groups:
-        status = _load_line(group, currentlevel, _dict, multikey,
-                            multibackslash)
-        if status is not None:
-            break
-
-
-# Matches a TOML number, which allows underscores for readability
-_number_with_underscores = re.compile('([0-9])(_([0-9]))*')
-
-
-def _strictly_valid_num(n):
-    n = n.strip()
-    if not n:
-        return False
-    if n[0] == '_':
-        return False
-    if n[-1] == '_':
-        return False
-    if "_." in n or "._" in n:
-        return False
-    if len(n) == 1:
-        return True
-    if n[0] == '0' and n[1] != '.':
-        return False
-    if n[0] == '+' or n[0] == '-':
-        n = n[1:]
-        if n[0] == '0' and n[1] != '.':
-            return False
-    if '__' in n:
-        return False
-    return True
-
-
-def _get_split_on_quotes(line):
-    doublequotesplits = line.split('"')
-    quoted = False
-    quotesplits = []
-    if len(doublequotesplits) > 1 and "'" in doublequotesplits[0]:
-        singlequotesplits = doublequotesplits[0].split("'")
-        doublequotesplits = doublequotesplits[1:]
-        while len(singlequotesplits) % 2 == 0 and len(doublequotesplits):
-            singlequotesplits[-1] += '"' + doublequotesplits[0]
-            doublequotesplits = doublequotesplits[1:]
-            if "'" in singlequotesplits[-1]:
-                singlequotesplits = (singlequotesplits[:-1] +
-                                     singlequotesplits[-1].split("'"))
-        quotesplits += singlequotesplits
-    for doublequotesplit in doublequotesplits:
-        if quoted:
-            quotesplits.append(doublequotesplit)
-        else:
-            quotesplits += doublequotesplit.split("'")
-            quoted = not quoted
-    return quotesplits
-
-
-def _load_line(line, currentlevel, _dict, multikey, multibackslash):
-    i = 1
-    quotesplits = _get_split_on_quotes(line)
-    quoted = False
-    for quotesplit in quotesplits:
-        if not quoted and '=' in quotesplit:
-            break
-        i += quotesplit.count('=')
-        quoted = not quoted
-    pair = line.split('=', i)
-    strictly_valid = _strictly_valid_num(pair[-1])
-    if _number_with_underscores.match(pair[-1]):
-        pair[-1] = pair[-1].replace('_', '')
-    while len(pair[-1]) and (pair[-1][0] != ' ' and pair[-1][0] != '\t' and
-                             pair[-1][0] != "'" and pair[-1][0] != '"' and
-                             pair[-1][0] != '[' and pair[-1][0] != '{' and
-                             pair[-1] != 'true' and pair[-1] != 'false'):
-        try:
-            float(pair[-1])
-            break
-        except ValueError:
-            pass
-        if _load_date(pair[-1]) is not None:
-            break
-        i += 1
-        prev_val = pair[-1]
-        pair = line.split('=', i)
-        if prev_val == pair[-1]:
-            raise ValueError("Invalid date or number")
-        if strictly_valid:
-            strictly_valid = _strictly_valid_num(pair[-1])
-    pair = ['='.join(pair[:-1]).strip(), pair[-1].strip()]
-    if (pair[0][0] == '"' or pair[0][0] == "'") and \
-            (pair[0][-1] == '"' or pair[0][-1] == "'"):
-        pair[0] = pair[0][1:-1]
-    if len(pair[1]) > 2 and ((pair[1][0] == '"' or pair[1][0] == "'") and
-                             pair[1][1] == pair[1][0] and
-                             pair[1][2] == pair[1][0] and
-                             not (len(pair[1]) > 5 and
-                                  pair[1][-1] == pair[1][0] and
-                                  pair[1][-2] == pair[1][0] and
-                                  pair[1][-3] == pair[1][0])):
-        k = len(pair[1]) - 1
-        while k > -1 and pair[1][k] == '\\':
-            multibackslash = not multibackslash
-            k -= 1
-        if multibackslash:
-            multilinestr = pair[1][:-1]
-        else:
-            multilinestr = pair[1] + "\n"
-        multikey = pair[0]
-    else:
-        value, vtype = _load_value(pair[1], _dict, strictly_valid)
-    try:
-        currentlevel[pair[0]]
-        raise ValueError("Duplicate keys!")
-    except KeyError:
-        if multikey:
-            return multikey, multilinestr, multibackslash
-        else:
-            currentlevel[pair[0]] = value
-
-
-def _load_date(val):
-    microsecond = 0
-    tz = None
-    try:
-        if len(val) > 19:
-            if val[19] == '.':
-                if val[-1].upper() == 'Z':
-                    subsecondval = val[20:-1]
-                    tzval = "Z"
-                else:
-                    subsecondvalandtz = val[20:]
-                    if '+' in subsecondvalandtz:
-                        splitpoint = subsecondvalandtz.index('+')
-                        subsecondval = subsecondvalandtz[:splitpoint]
-                        tzval = subsecondvalandtz[splitpoint:]
-                    elif '-' in subsecondvalandtz:
-                        splitpoint = subsecondvalandtz.index('-')
-                        subsecondval = subsecondvalandtz[:splitpoint]
-                        tzval = subsecondvalandtz[splitpoint:]
-                tz = TomlTz(tzval)
-                microsecond = int(int(subsecondval) *
-                                  (10 ** (6 - len(subsecondval))))
-            else:
-                tz = TomlTz(val[19:])
-    except ValueError:
-        tz = None
-    if "-" not in val[1:]:
-        return None
-    try:
-        d = datetime.datetime(
-            int(val[:4]), int(val[5:7]),
-            int(val[8:10]), int(val[11:13]),
-            int(val[14:16]), int(val[17:19]), microsecond, tz)
-    except ValueError:
-        return None
-    return d
-
-
-def _load_unicode_escapes(v, hexbytes, prefix):
-    skip = False
-    i = len(v) - 1
-    while i > -1 and v[i] == '\\':
-        skip = not skip
-        i -= 1
-    for hx in hexbytes:
-        if skip:
-            skip = False
-            i = len(hx) - 1
-            while i > -1 and hx[i] == '\\':
-                skip = not skip
-                i -= 1
-            v += prefix
-            v += hx
-            continue
-        hxb = ""
-        i = 0
-        hxblen = 4
-        if prefix == "\\U":
-            hxblen = 8
-        hxb = ''.join(hx[i:i + hxblen]).lower()
-        if hxb.strip('0123456789abcdef'):
-            raise ValueError("Invalid escape sequence: " + hxb)
-        if hxb[0] == "d" and hxb[1].strip('01234567'):
-            raise ValueError("Invalid escape sequence: " + hxb +
-                             ". Only scalar unicode points are allowed.")
-        v += unichr(int(hxb, 16))
-        v += unicode(hx[len(hxb):])
-    return v
-
-
-# Unescape TOML string values.
-
-# content after the \
-_escapes = ['0', 'b', 'f', 'n', 'r', 't', '"']
-# What it should be replaced by
-_escapedchars = ['\0', '\b', '\f', '\n', '\r', '\t', '\"']
-# Used for substitution
-_escape_to_escapedchars = dict(zip(_escapes, _escapedchars))
-
-
-def _unescape(v):
-    """Unescape characters in a TOML string."""
-    i = 0
-    backslash = False
-    while i < len(v):
-        if backslash:
-            backslash = False
-            if v[i] in _escapes:
-                v = v[:i - 1] + _escape_to_escapedchars[v[i]] + v[i + 1:]
-            elif v[i] == '\\':
-                v = v[:i - 1] + v[i:]
-            elif v[i] == 'u' or v[i] == 'U':
-                i += 1
-            else:
-                raise ValueError("Reserved escape sequence used")
-            continue
-        elif v[i] == '\\':
-            backslash = True
-        i += 1
-    return v
-
-
-def _load_value(v, _dict, strictly_valid=True):
-    if not v:
-        raise ValueError("Empty value is invalid")
-    if v == 'true':
-        return (True, "bool")
-    elif v == 'false':
-        return (False, "bool")
-    elif v[0] == '"':
-        testv = v[1:].split('"')
-        triplequote = False
-        triplequotecount = 0
-        if len(testv) > 1 and testv[0] == '' and testv[1] == '':
-            testv = testv[2:]
-            triplequote = True
-        closed = False
-        for tv in testv:
-            if tv == '':
-                if triplequote:
-                    triplequotecount += 1
-                else:
-                    closed = True
-            else:
-                oddbackslash = False
-                try:
-                    i = -1
-                    j = tv[i]
-                    while j == '\\':
-                        oddbackslash = not oddbackslash
-                        i -= 1
-                        j = tv[i]
-                except IndexError:
-                    pass
-                if not oddbackslash:
-                    if closed:
-                        raise ValueError("Stuff after closed string. WTF?")
-                    else:
-                        if not triplequote or triplequotecount > 1:
-                            closed = True
-                        else:
-                            triplequotecount = 0
-        escapeseqs = v.split('\\')[1:]
-        backslash = False
-        for i in escapeseqs:
-            if i == '':
-                backslash = not backslash
-            else:
-                if i[0] not in _escapes and (i[0] != 'u' and i[0] != 'U' and
-                                             not backslash):
-                    raise ValueError("Reserved escape sequence used")
-                if backslash:
-                    backslash = False
-        for prefix in ["\\u", "\\U"]:
-            if prefix in v:
-                hexbytes = v.split(prefix)
-                v = _load_unicode_escapes(hexbytes[0], hexbytes[1:], prefix)
-        v = _unescape(v)
-        if len(v) > 1 and v[1] == '"' and (len(v) < 3 or v[1] == v[2]):
-            v = v[2:-2]
-        return (v[1:-1], "str")
-    elif v[0] == "'":
-        if v[1] == "'" and (len(v) < 3 or v[1] == v[2]):
-            v = v[2:-2]
-        return (v[1:-1], "str")
-    elif v[0] == '[':
-        return (_load_array(v, _dict), "array")
-    elif v[0] == '{':
-        inline_object = _get_empty_inline_table(_dict)
-        _load_inline_object(v, inline_object, _dict)
-        return (inline_object, "inline_object")
-    else:
-        parsed_date = _load_date(v)
-        if parsed_date is not None:
-            return (parsed_date, "date")
-        if not strictly_valid:
-            raise ValueError("Weirdness with leading zeroes or "
-                             "underscores in your number.")
-        itype = "int"
-        neg = False
-        if v[0] == '-':
-            neg = True
-            v = v[1:]
-        elif v[0] == '+':
-            v = v[1:]
-        v = v.replace('_', '')
-        if '.' in v or 'e' in v or 'E' in v:
-            if '.' in v and v.split('.', 1)[1] == '':
-                raise ValueError("This float is missing digits after "
-                                 "the point")
-            if v[0] not in '0123456789':
-                raise ValueError("This float doesn't have a leading digit")
-            v = float(v)
-            itype = "float"
-        else:
-            v = int(v)
-        if neg:
-            return (0 - v, itype)
-        return (v, itype)
-
-
-def _bounded_string(s):
-    if len(s) == 0:
-        return True
-    if s[-1] != s[0]:
-        return False
-    i = -2
-    backslash = False
-    while len(s) + i > 0:
-        if s[i] == "\\":
-            backslash = not backslash
-            i -= 1
-        else:
-            break
-    return not backslash
-
-
-def _load_array(a, _dict):
-    atype = None
-    retval = []
-    a = a.strip()
-    if '[' not in a[1:-1] or "" != a[1:-1].split('[')[0].strip():
-        strarray = False
-        tmpa = a[1:-1].strip()
-        if tmpa != '' and (tmpa[0] == '"' or tmpa[0] == "'"):
-            strarray = True
-        if not a[1:-1].strip().startswith('{'):
-            a = a[1:-1].split(',')
-        else:
-            # a is an inline object, we must find the matching parenthesis
-            # to define groups
-            new_a = []
-            start_group_index = 1
-            end_group_index = 2
-            in_str = False
-            while end_group_index < len(a[1:]):
-                if a[end_group_index] == '"' or a[end_group_index] == "'":
-                    if in_str:
-                        backslash_index = end_group_index - 1
-                        while (backslash_index > -1 and
-                               a[backslash_index] == '\\'):
-                            in_str = not in_str
-                            backslash_index -= 1
-                    in_str = not in_str
-                if in_str or a[end_group_index] != '}':
-                    end_group_index += 1
-                    continue
-
-                # Increase end_group_index by 1 to get the closing bracket
-                end_group_index += 1
-                new_a.append(a[start_group_index:end_group_index])
-
-                # The next start index is at least after the closing bracket, a
-                # closing bracket can be followed by a comma since we are in
-                # an array.
-                start_group_index = end_group_index + 1
-                while (start_group_index < len(a[1:]) and
-                       a[start_group_index] != '{'):
-                    start_group_index += 1
-                end_group_index = start_group_index + 1
-            a = new_a
-        b = 0
-        if strarray:
-            while b < len(a) - 1:
-                ab = a[b].strip()
-                while (not _bounded_string(ab) or
-                       (len(ab) > 2 and
-                        ab[0] == ab[1] == ab[2] and
-                        ab[-2] != ab[0] and
-                        ab[-3] != ab[0])):
-                    a[b] = a[b] + ',' + a[b + 1]
-                    ab = a[b].strip()
-                    if b < len(a) - 2:
-                        a = a[:b + 1] + a[b + 2:]
-                    else:
-                        a = a[:b + 1]
-                b += 1
-    else:
-        al = list(a[1:-1])
-        a = []
-        openarr = 0
-        j = 0
-        for i in _range(len(al)):
-            if al[i] == '[':
-                openarr += 1
-            elif al[i] == ']':
-                openarr -= 1
-            elif al[i] == ',' and not openarr:
-                a.append(''.join(al[j:i]))
-                j = i + 1
-        a.append(''.join(al[j:]))
-    for i in _range(len(a)):
-        a[i] = a[i].strip()
-        if a[i] != '':
-            nval, ntype = _load_value(a[i], _dict)
-            if atype:
-                if ntype != atype:
-                    raise ValueError("Not a homogeneous array")
-            else:
-                atype = ntype
-            retval.append(nval)
-    return retval
-
-
-def dump(o, f):
-    """Writes out dict as toml to a file
-
-    Args:
-        o: Object to dump into toml
-        f: File descriptor where the toml should be stored
-
-    Returns:
-        String containing the toml corresponding to dictionary
-
-    Raises:
-        TypeError: When anything other than file descriptor is passed
-    """
-
-    if not f.write:
-        raise TypeError("You can only dump an object to a file descriptor")
-    d = dumps(o)
-    f.write(d)
-    return d
-
-
-def dumps(o, preserve=False):
-    """Stringifies input dict as toml
-
-    Args:
-        o: Object to dump into toml
-
-        preserve: Boolean parameter. If true, preserve inline tables.
-
-    Returns:
-        String containing the toml corresponding to dict
-    """
-
-    retval = ""
-    addtoretval, sections = _dump_sections(o, "")
-    retval += addtoretval
-    while sections != {}:
-        newsections = {}
-        for section in sections:
-            addtoretval, addtosections = _dump_sections(sections[section],
-                                                        section, preserve)
-            if addtoretval or (not addtoretval and not addtosections):
-                if retval and retval[-2:] != "\n\n":
-                    retval += "\n"
-                retval += "[" + section + "]\n"
-                if addtoretval:
-                    retval += addtoretval
-            for s in addtosections:
-                newsections[section + "." + s] = addtosections[s]
-        sections = newsections
-    return retval
-
-
-def _dump_sections(o, sup, preserve=False):
-    retstr = ""
-    if sup != "" and sup[-1] != ".":
-        sup += '.'
-    retdict = o.__class__()
-    arraystr = ""
-    for section in o:
-        section = unicode(section)
-        qsection = section
-        if not re.match(r'^[A-Za-z0-9_-]+$', section):
-            if '"' in section:
-                qsection = "'" + section + "'"
-            else:
-                qsection = '"' + section + '"'
-        if not isinstance(o[section], dict):
-            arrayoftables = False
-            if isinstance(o[section], list):
-                for a in o[section]:
-                    if isinstance(a, dict):
-                        arrayoftables = True
-            if arrayoftables:
-                for a in o[section]:
-                    arraytabstr = "\n"
-                    arraystr += "[[" + sup + qsection + "]]\n"
-                    s, d = _dump_sections(a, sup + qsection)
-                    if s:
-                        if s[0] == "[":
-                            arraytabstr += s
-                        else:
-                            arraystr += s
-                    while d != {}:
-                        newd = {}
-                        for dsec in d:
-                            s1, d1 = _dump_sections(d[dsec], sup + qsection +
-                                                    "." + dsec)
-                            if s1:
-                                arraytabstr += ("[" + sup + qsection + "." +
-                                                dsec + "]\n")
-                                arraytabstr += s1
-                            for s1 in d1:
-                                newd[dsec + "." + s1] = d1[s1]
-                        d = newd
-                    arraystr += arraytabstr
-            else:
-                if o[section] is not None:
-                    retstr += (qsection + " = " +
-                               unicode(_dump_value(o[section])) + '\n')
-        elif preserve and isinstance(o[section], InlineTableDict):
-            retstr += (qsection + " = " + _dump_inline_table(o[section]))
-        else:
-            retdict[qsection] = o[section]
-    retstr += arraystr
-    return (retstr, retdict)
-
-
-def _dump_inline_table(section):
-    """Preserve inline table in its compact syntax instead of expanding
-    into subsection.
-
-    https://github.com/toml-lang/toml#user-content-inline-table
-    """
-    retval = ""
-    if isinstance(section, dict):
-        val_list = []
-        for k, v in section.items():
-            val = _dump_inline_table(v)
-            val_list.append(k + " = " + val)
-        retval += "{ " + ", ".join(val_list) + " }\n"
-        return retval
-    else:
-        return unicode(_dump_value(section))
-
-
-def _dump_value(v):
-    dump_funcs = {
-        str: _dump_str,
-        unicode: _dump_str,
-        list: _dump_list,
-        int: lambda v: v,
-        bool: lambda v: unicode(v).lower(),
-        float: _dump_float,
-        datetime.datetime: lambda v: v.isoformat().replace('+00:00', 'Z'),
-    }
-    # Lookup function corresponding to v's type
-    dump_fn = dump_funcs.get(type(v))
-    if dump_fn is None and hasattr(v, '__iter__'):
-        dump_fn = dump_funcs[list]
-    # Evaluate function (if it exists) else return v
-    return dump_fn(v) if dump_fn is not None else dump_funcs[str](v)
-
-
-def _dump_str(v):
-    if sys.version_info < (3,) and hasattr(v, 'decode') and isinstance(v, str):
-        v = v.decode('utf-8')
-    v = "%r" % v
-    if v[0] == 'u':
-        v = v[1:]
-    singlequote = v.startswith("'")
-    if singlequote or v.startswith('"'):
-        v = v[1:-1]
-    if singlequote:
-        v = v.replace("\\'", "'")
-        v = v.replace('"', '\\"')
-    v = v.split("\\x")
-    while len(v) > 1:
-        i = -1
-        if not v[0]:
-            v = v[1:]
-        v[0] = v[0].replace("\\\\", "\\")
-        # No, I don't know why != works and == breaks
-        joinx = v[0][i] != "\\"
-        while v[0][:i] and v[0][i] == "\\":
-            joinx = not joinx
-            i -= 1
-        if joinx:
-            joiner = "x"
-        else:
-            joiner = "u00"
-        v = [v[0] + joiner + v[1]] + v[2:]
-    return unicode('"' + v[0] + '"')
-
-
-def _dump_list(v):
-    retval = "["
-    for u in v:
-        retval += " " + unicode(_dump_value(u)) + ","
-    retval += "]"
-    return retval
-
-
-def _dump_float(v):
-    return "{0:.16}".format(v).replace("e+0", "e+").replace("e-0", "e-")
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py b/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py
deleted file mode 100644
index 942387c..0000000
--- a/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-from __future__ import absolute_import, division, print_function
-
-import re
-
-
-_canonicalize_regex = re.compile(r"[-_.]+")
-
-
-def canonicalize_name(name):
-    # This is taken from PEP 503.
-    return _canonicalize_regex.sub("-", name).lower()
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/py2_warn.py b/venv/lib/python3.8/site-packages/pkg_resources/py2_warn.py
deleted file mode 100644
index bfc3523..0000000
--- a/venv/lib/python3.8/site-packages/pkg_resources/py2_warn.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import sys
-import warnings
-import textwrap
-
-
-msg = textwrap.dedent("""
-    You are running Setuptools on Python 2, which is no longer
-    supported and
-    >>> SETUPTOOLS WILL STOP WORKING <<<
-    in a subsequent release (no sooner than 2020-04-20).
-    Please ensure you are installing
-    Setuptools using pip 9.x or later or pin to `setuptools<45`
-    in your environment.
-    If you have done those things and are still encountering
-    this message, please follow up at
-    https://bit.ly/setuptools-py2-warning.
-    """)
-
-pre = "Setuptools will stop working on Python 2\n"
-
-sys.version_info < (3,) and warnings.warn(pre + "*" * 60 + msg + "*" * 60)
diff --git a/venv/lib/python3.8/site-packages/pkg_resources/py31compat.py b/venv/lib/python3.8/site-packages/pkg_resources/py31compat.py
deleted file mode 100644
index a381c42..0000000
--- a/venv/lib/python3.8/site-packages/pkg_resources/py31compat.py
+++ /dev/null
@@ -1,23 +0,0 @@
-import os
-import errno
-import sys
-
-from .extern import six
-
-
-def _makedirs_31(path, exist_ok=False):
-    try:
-        os.makedirs(path)
-    except OSError as exc:
-        if not exist_ok or exc.errno != errno.EEXIST:
-            raise
-
-
-# rely on compatibility behavior until mode considerations
-#  and exists_ok considerations are disentangled.
-# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663
-needs_makedirs = (
-    six.PY2 or
-    (3, 4) <= sys.version_info < (3, 4, 1)
-)
-makedirs = _makedirs_31 if needs_makedirs else os.makedirs
diff --git a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/DESCRIPTION.rst b/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/DESCRIPTION.rst
deleted file mode 100644
index 606dcaa..0000000
--- a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/DESCRIPTION.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-Python Serial Port Extension for Win32, OSX, Linux, BSD, Jython, IronPython
-
-Stable:
-
-- Documentation: http://pythonhosted.org/pyserial/
-- Download Page: https://pypi.python.org/pypi/pyserial
-
-Latest:
-
-- Documentation: http://pyserial.readthedocs.io/en/latest/
-- Project Homepage: https://github.com/pyserial/pyserial
-
-
diff --git a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/METADATA b/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/METADATA
deleted file mode 100644
index d9aef45..0000000
--- a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/METADATA
+++ /dev/null
@@ -1,44 +0,0 @@
-Metadata-Version: 2.0
-Name: pyserial
-Version: 3.4
-Summary: Python Serial Port Extension
-Home-page: https://github.com/pyserial/pyserial
-Author: Chris Liechti
-Author-email: cliechti@gmx.net
-License: BSD
-Platform: any
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: End Users/Desktop
-Classifier: License :: OSI Approved :: BSD License
-Classifier: Natural Language :: English
-Classifier: Operating System :: POSIX
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.2
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Topic :: Communications
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Terminals :: Serial
-
-Python Serial Port Extension for Win32, OSX, Linux, BSD, Jython, IronPython
-
-Stable:
-
-- Documentation: http://pythonhosted.org/pyserial/
-- Download Page: https://pypi.python.org/pypi/pyserial
-
-Latest:
-
-- Documentation: http://pyserial.readthedocs.io/en/latest/
-- Project Homepage: https://github.com/pyserial/pyserial
-
-
diff --git a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/RECORD b/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/RECORD
deleted file mode 100644
index 87e6727..0000000
--- a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/RECORD
+++ /dev/null
@@ -1,91 +0,0 @@
-../../../bin/__pycache__/miniterm.cpython-38.pyc,,
-../../../bin/miniterm.py,sha256=XmdvozzNwHh8zd6tDMoefXHz39myqwvc63L3b6mnS0g,35088
-../../../bin/miniterm.pyc,sha256=cjhQp6L0aitsx6yg5IpG9lYPVzBAYkrSndVHpGwYorY,28907
-pyserial-3.4.dist-info/DESCRIPTION.rst,sha256=rXXIUFeAsfXq2YS7DGkztGmXez-G7gAwbwdBL8t9KME,320
-pyserial-3.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pyserial-3.4.dist-info/METADATA,sha256=CExk0lotyj8ds3rAKUq2ME1vN0lsYWn3CWPDjFqzLH8,1563
-pyserial-3.4.dist-info/RECORD,,
-pyserial-3.4.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
-pyserial-3.4.dist-info/metadata.json,sha256=fUPYvHyeQugtZXmQ7u6u8vJOn7CGHArr__PtrUQrg0w,1280
-pyserial-3.4.dist-info/top_level.txt,sha256=FSjfWHWw-VjPiEqOhttbiP-F8OHn-liixq1wKL2fWOA,7
-serial/__init__.py,sha256=M6W0AbWpV-Y6fyw9eb56C2hahVw7MIvWBefT6yCAHIE,3172
-serial/__init__.pyc,sha256=CajVqMkMYQHB_krKsRE8Rz1x_IeWtEz7NUD0oKFZ0tk,2322
-serial/__pycache__/__init__.cpython-38.pyc,,
-serial/__pycache__/aio.cpython-38.pyc,,
-serial/__pycache__/rfc2217.cpython-38.pyc,,
-serial/__pycache__/rs485.cpython-38.pyc,,
-serial/__pycache__/serialcli.cpython-38.pyc,,
-serial/__pycache__/serialjava.cpython-38.pyc,,
-serial/__pycache__/serialposix.cpython-38.pyc,,
-serial/__pycache__/serialutil.cpython-38.pyc,,
-serial/__pycache__/serialwin32.cpython-38.pyc,,
-serial/__pycache__/win32.cpython-38.pyc,,
-serial/aio.py,sha256=6gWn7JXv21B1jE-Ykf-7v17y8AA1pha1cEp-OXmCmDU,3659
-serial/aio.pyc,sha256=t5P_mbq_c2SDIDwqG88UbKGMKYeNYh77wqZC3k-vyMQ,4496
-serial/rfc2217.py,sha256=FLgI3m-gx53aH1vISC7P8okCyoagN80Nh1tC6t7hisc,59486
-serial/rfc2217.pyc,sha256=y8gblsIrXc0OUU-HZV-QRhJ138n5a2qbQqi1eht-hs0,37632
-serial/rs485.py,sha256=O2YbxLMlziEX1N39WOukrlhMWcYzVwiP95FBhMmUIHc,3265
-serial/rs485.pyc,sha256=9pJKRaRQLI-aLwWRdJ-5LObGezVeSO45M6AollCHjnM,3266
-serial/serialcli.py,sha256=MVzD-mB-snJhwY4hjXVAuOWA3OXjFU79A2zMMlAMPKQ,9104
-serial/serialcli.pyc,sha256=CqL9FtRa1Wz15V428jnBaukO-7KKn5_4q1t0z713C7s,8308
-serial/serialjava.py,sha256=OsYX1HEEo0pJzRJqmJfJLqZdBFhCO2s8LLt1s1-TYVg,8414
-serial/serialjava.pyc,sha256=fDM30MRvDuytk1Ss8rfK88Gk-a3KvYhhvGWNks7-a2U,9577
-serial/serialposix.py,sha256=UYZDZcu5uCNHjZJfnJ1IUhTXLz-wyV2n0AB0hFd0qxE,31654
-serial/serialposix.pyc,sha256=UOz_nIhtX_D6cpXqQXeGzZBIX4_i6R-xhR9NWiv_K8I,24286
-serial/serialutil.py,sha256=V-AeEMJyl8GvijaiildLRY8k-IOAZpW-YeBxHV2iDvg,21692
-serial/serialutil.pyc,sha256=BO3_7SlWWYxCbYOmerYsQOiLu7XRbda4kkrZx4wIZWw,20027
-serial/serialwin32.py,sha256=tMa-81Oh1c4g5nHf86v2eDnLKb7JHAG-vEQZfq2q_Jo,20087
-serial/serialwin32.pyc,sha256=FArzpAX1_F6xFQmkAbDmaYUbw0wEPWRr39lkXuoHPVA,14471
-serial/threaded/__init__.py,sha256=EHay8pD__ePKaa-WvweNjWe9V1SUgZMefNnayVyiwRw,9272
-serial/threaded/__pycache__/__init__.cpython-38.pyc,,
-serial/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-serial/tools/__init__.pyc,sha256=stNDuwUOHX5ySsWZfedBkax1go_wefynkMBqnkv9DSI,140
-serial/tools/__pycache__/__init__.cpython-38.pyc,,
-serial/tools/__pycache__/hexlify_codec.cpython-38.pyc,,
-serial/tools/__pycache__/list_ports.cpython-38.pyc,,
-serial/tools/__pycache__/list_ports_common.cpython-38.pyc,,
-serial/tools/__pycache__/list_ports_linux.cpython-38.pyc,,
-serial/tools/__pycache__/list_ports_osx.cpython-38.pyc,,
-serial/tools/__pycache__/list_ports_posix.cpython-38.pyc,,
-serial/tools/__pycache__/list_ports_windows.cpython-38.pyc,,
-serial/tools/__pycache__/miniterm.cpython-38.pyc,,
-serial/tools/hexlify_codec.py,sha256=1lvd2TFWYUsYMRt7nsyw0VfHTRfl57Hl6kdCmNhMkC4,3637
-serial/tools/hexlify_codec.pyc,sha256=xy_EM_EuW4LzSO3BhEAs7V7HhCxb6e-Iv3KafY9Ckrw,4872
-serial/tools/list_ports.py,sha256=mfNJILSFufMJR2Ns7AWF7CMMhSqXcuK-R-cyK4xBLro,3349
-serial/tools/list_ports.pyc,sha256=Czc32SiTfXsqIC3s2gtZoQNS8i0AoQ6iTBakY84R2-s,2815
-serial/tools/list_ports_common.py,sha256=H_NcNxOc15MnzQWGlIXi0mRiLQV1QNiO6fHjPQ3SXEY,3319
-serial/tools/list_ports_common.pyc,sha256=gE-B4IMXiG2w2mUybAEyrCcSkmuGYcCkcbKhE7tbIm4,3315
-serial/tools/list_ports_linux.py,sha256=-uPj714Jb2Iu3NzFjpnFBEYLCaL3eQG6_iuXj1p9tp4,4427
-serial/tools/list_ports_linux.pyc,sha256=BJ7V6Bu44dKh2PcTK3dDyIhU8qPzjaPxPnqmypLNepI,3038
-serial/tools/list_ports_osx.py,sha256=h0AaNNnMgRWX2VBfQCWpeAlpynA8YUVUblHa8krdoTY,9302
-serial/tools/list_ports_osx.pyc,sha256=FQYKsoGne9LNzhwIM8WFOzvhhR8dYzgPHLOgOcKK1gQ,7164
-serial/tools/list_ports_posix.py,sha256=6z6XZKrjsHkORJe1bn4_loVcgKrkmZCWtSPikrST6y8,4495
-serial/tools/list_ports_posix.pyc,sha256=bpGgc6CIIb3JHvXe14LF6bWx7dT4_yyv2XCdYaya6q0,3966
-serial/tools/list_ports_windows.py,sha256=yHlGXUuCtaBMt3ucU7WeYL27IAHkvrB732ZDiT8TUgA,11336
-serial/tools/list_ports_windows.pyc,sha256=X47GTdA5jDWxd013ilynOgxsYP_vffQfOiJUJEIdxVg,6912
-serial/tools/miniterm.py,sha256=t3rlJRihyYzMGO0EAz0Kpd0sewWYnS6M8qtw6ygqg_g,35101
-serial/tools/miniterm.pyc,sha256=qNPk-vOUXoPDpswiQE4R0LEybrRBzmNBPWV1XglLhTc,30469
-serial/urlhandler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-serial/urlhandler/__init__.pyc,sha256=SBlUmYLyKiul4P6w70w1c0vIiRpv8MGzn5awpHwaO3o,145
-serial/urlhandler/__pycache__/__init__.cpython-38.pyc,,
-serial/urlhandler/__pycache__/protocol_alt.cpython-38.pyc,,
-serial/urlhandler/__pycache__/protocol_hwgrep.cpython-38.pyc,,
-serial/urlhandler/__pycache__/protocol_loop.cpython-38.pyc,,
-serial/urlhandler/__pycache__/protocol_rfc2217.cpython-38.pyc,,
-serial/urlhandler/__pycache__/protocol_serve-rfc2217.cpython-38.pyc,,
-serial/urlhandler/__pycache__/protocol_socket.cpython-38.pyc,,
-serial/urlhandler/__pycache__/protocol_spy.cpython-38.pyc,,
-serial/urlhandler/protocol_alt.py,sha256=pWlKn8HBBENU9DNeO46gLgTTWvYHLaLB9O5YVwfEQ0o,1993
-serial/urlhandler/protocol_hwgrep.py,sha256=tx4r6Y8smyF7rV0tb2OXMV3ws7xpJtImBH57ZUaSWIo,3119
-serial/urlhandler/protocol_hwgrep.pyc,sha256=cW_46V23glPYWPwp17_zbxxcZJyJEvEOuoZzosyR11o,1627
-serial/urlhandler/protocol_loop.py,sha256=FoDnQw69tQnPRz8Q7p7PMhxIL1wlBKBi7oAPBwJ9-Xo,10119
-serial/urlhandler/protocol_loop.pyc,sha256=g7QJtSdFQBBNZQwHlgABtxYtWZbOMUH92KuKjZmJDEA,9394
-serial/urlhandler/protocol_rfc2217.py,sha256=886ex7FHRb_qPKXJC7HcR6RtMdmvxo4ChEohliqNs5E,277
-serial/urlhandler/protocol_rfc2217.pyc,sha256=Yb3Cn9QymSWgHiiU3s21_yQiKyOKOgjd3nTRIrkvY4Q,214
-serial/urlhandler/protocol_serve-rfc2217.py,sha256=886ex7FHRb_qPKXJC7HcR6RtMdmvxo4ChEohliqNs5E,277
-serial/urlhandler/protocol_socket.py,sha256=cCy3zC4WzclIHnYQaf0MaW65h22TPRJpEGbMmJhXPyk,14130
-serial/urlhandler/protocol_socket.pyc,sha256=KoUDgHAXrHpKi8NC5ABBZuscVOe8dIC-URq5iWGTWys,9803
-serial/urlhandler/protocol_spy.py,sha256=9DxcDfV0upKmH3beYBcHMSQzLcxRS9ptnx7a__vefUg,9024
-serial/urlhandler/protocol_spy.pyc,sha256=laRaXOAPYzcgG05c68fWObXgVJBJLL5g9CfqOMAdr8I,10984
-serial/win32.py,sha256=-GiHVB-QFrQfD4vHelhaEccwfW__6kC2S_46lIYLVsM,10853
-serial/win32.pyc,sha256=iZof5kxLw1eLsxzaD_O2xgIXs9TVFao_zlyqN8C5fZ8,7725
diff --git a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/WHEEL b/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/WHEEL
deleted file mode 100644
index 8b6dd1b..0000000
--- a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/WHEEL
+++ /dev/null
@@ -1,6 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.29.0)
-Root-Is-Purelib: true
-Tag: py2-none-any
-Tag: py3-none-any
-
diff --git a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/metadata.json b/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/metadata.json
deleted file mode 100644
index fbbe671..0000000
--- a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/metadata.json
+++ /dev/null
@@ -1 +0,0 @@
-{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: POSIX", "Operating System :: Microsoft :: Windows", "Operating System :: MacOS :: MacOS X", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Communications", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Terminals :: Serial"], "extensions": {"python.details": {"contacts": [{"email": "cliechti@gmx.net", "name": "Chris Liechti", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/pyserial/pyserial"}}}, "generator": "bdist_wheel (0.29.0)", "license": "BSD", "metadata_version": "2.0", "name": "pyserial", "platform": "any", "summary": "Python Serial Port Extension", "version": "3.4"}
\ No newline at end of file
diff --git a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/top_level.txt b/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/top_level.txt
deleted file mode 100644
index b6be06a..0000000
--- a/venv/lib/python3.8/site-packages/pyserial-3.4.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-serial
diff --git a/venv/lib/python3.8/site-packages/serial/__init__.py b/venv/lib/python3.8/site-packages/serial/__init__.py
deleted file mode 100644
index c24ced8..0000000
--- a/venv/lib/python3.8/site-packages/serial/__init__.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env python
-#
-# This is a wrapper module for different platform implementations
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2001-2017 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-import sys
-import importlib
-
-from serial.serialutil import *
-#~ SerialBase, SerialException, to_bytes, iterbytes
-
-__version__ = '3.4'
-
-VERSION = __version__
-
-# pylint: disable=wrong-import-position
-if sys.platform == 'cli':
-    from serial.serialcli import Serial
-else:
-    import os
-    # chose an implementation, depending on os
-    if os.name == 'nt':  # sys.platform == 'win32':
-        from serial.serialwin32 import Serial
-    elif os.name == 'posix':
-        from serial.serialposix import Serial, PosixPollSerial, VTIMESerial  # noqa
-    elif os.name == 'java':
-        from serial.serialjava import Serial
-    else:
-        raise ImportError("Sorry: no implementation for your platform ('{}') available".format(os.name))
-
-
-protocol_handler_packages = [
-    'serial.urlhandler',
-]
-
-
-def serial_for_url(url, *args, **kwargs):
-    """\
-    Get an instance of the Serial class, depending on port/url. The port is not
-    opened when the keyword parameter 'do_not_open' is true, by default it
-    is. All other parameters are directly passed to the __init__ method when
-    the port is instantiated.
-
-    The list of package names that is searched for protocol handlers is kept in
-    ``protocol_handler_packages``.
-
-    e.g. we want to support a URL ``foobar://``. A module
-    ``my_handlers.protocol_foobar`` is provided by the user. Then
-    ``protocol_handler_packages.append("my_handlers")`` would extend the search
-    path so that ``serial_for_url("foobar://"))`` would work.
-    """
-    # check and remove extra parameter to not confuse the Serial class
-    do_open = not kwargs.pop('do_not_open', False)
-    # the default is to use the native implementation
-    klass = Serial
-    try:
-        url_lowercase = url.lower()
-    except AttributeError:
-        # it's not a string, use default
-        pass
-    else:
-        # if it is an URL, try to import the handler module from the list of possible packages
-        if '://' in url_lowercase:
-            protocol = url_lowercase.split('://', 1)[0]
-            module_name = '.protocol_{}'.format(protocol)
-            for package_name in protocol_handler_packages:
-                try:
-                    importlib.import_module(package_name)
-                    handler_module = importlib.import_module(module_name, package_name)
-                except ImportError:
-                    continue
-                else:
-                    if hasattr(handler_module, 'serial_class_for_url'):
-                        url, klass = handler_module.serial_class_for_url(url)
-                    else:
-                        klass = handler_module.Serial
-                    break
-            else:
-                raise ValueError('invalid URL, protocol {!r} not known'.format(protocol))
-    # instantiate and open when desired
-    instance = klass(None, *args, **kwargs)
-    instance.port = url
-    if do_open:
-        instance.open()
-    return instance
diff --git a/venv/lib/python3.8/site-packages/serial/__init__.pyc b/venv/lib/python3.8/site-packages/serial/__init__.pyc
deleted file mode 100644
index 7f1122a6a2dc07b5fe5e8acde461e686cc060ea0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2322
zcmbVNUvC>l5T8B&i~poaTNIQRSVfe$(4MQdDpmO-Dp8>#lvYkjt4Qd)@onO@*LTP6
zx{f9Lh4R7!{S5sYyz<I-K}dW6nAy8aO8bDsCAXfPo&C-HW@h&)f33GZ{*@gJp?E6z
z`z5~i4;*6rXP^NN&twLN%<BWt0X&H-a99D!U|fZ`3X=fLH-5PWx(3ra9M*v)FH58b
z95z5UV7vx#-CLiQ*3C2PL21$O7O%X;8t7JGF>S+P8&U6;c1>^hTZz;;L)rql4soln
zJ7%!;g29g%e;ZDa$OVWy@DsAzAe#H#b)>BR#%Hg~P;@kWWNSFy3U7!Tj&d{9DqpPQ
zWM3L3v<py7oFl_5wd%A>iarf)1Bb_?dz@-rm{(CZ7SDzK6oviNn8iJwq+CriEvGVZ
z!l^Xj$Eo3qbY^&_g~Q2|cXzMY-K!jTDlLw*v=?!|^&x~aqemi%wKPMDx`S^6-$!IY
z@gl!v0Fwq}?~s7g?ar!Fs_S5`7wXRwj2d87g~cW;F;E6Ca9V?>$wjCl)kzD?0Wijr
zSMV$jU|E9+?*Eg7F(M*(1zzA-h3!=x;u<XLK&f9f;B*SE3SWKy5LRn|`5M<@xdvF1
zRTCClrKaJP0jyeuQ|tqD`a3!O;TL$eY{A$^_!wtToo}VWM_%5fUQk$KQzDw@{t~^k
ziP5qRQ45w8Fds0K$893WkTy>CyK9uOpRslvpRc9kBH=2rP9#Ig(_`*NlIL~gLoKYm
z#$%buBv#1@$EsziaXl<X$e*Ag&A75yUDqPK6fI@U=OdYTpov_}Qxo${7%`Pj8onE+
z5n4xNxl3D}naOMXXn}5y#Y`hy4yA0!?`zFd3<!Iq1h8Bf$zx^Y(CG#0two0}_3olb
zCCWt+M_;2fkHg1Bq{>)xvQ7yn<FMtIiHcU%5&ujKC*nl%1OvwCM#2-cQkdZgJyF+Y
zCUxmB)x79POFSkrL(9bD4F;u2RG35stQ`yrpE5iN`CRh3NF2p)XPJ*s@bCKH^1<LZ
zO^<}R*X!X9exFa%c&256K3$Z!Hazo`Zx{?H7*sx2F@}qICGImkMZRMH8DA(es&;qh
zH6J@y5p|x<bj;<c!&Q%&r^H8;2{+=FYJk}q4DurzVX7kRl<v+Mm7S~SNZ1#X(C>C_
zY{}Q!!qPQ_#1$QMg)dk-?&nOeSi3_@$#bDqO!>NYUXv?^x{*(kbe`;WX=8p-(dDJn
zxiszqO81>J>S*TV17om<Y0+j{Ik%0{SxVn5o@?SNUSqgJt0U*HQ$LIH@^~f>y(Y(P
zq5Xl-v%(EsjC*M!@s6OI)HpBDQSgEK`xi6jwZfcOM|bdK?nS!oFiB+W!=2FK^daDm
z$TJ%XEAh5CC*b4BLyM@N9i^k_#9TqBg~I2hWL)qeu<~-~q6~hpJ(R-U(M;*MhlvQa
zN@l0mPw(D|?%ck9GyJ5NcR;T^k72g(=>Kkv4-v)QCe+P$S%<ZPdQf4TY(1z39k#{R
z@o$4wyi^UEtQKsc#U<8cbzJFg;=Vrd@maGA>t6d><c?-eX-5nX9`yGgKHAH3Q+#b4
z0pxaJ{)1n>yjAGKmRes0pS4SGTFzB+>!y24?Z1tE>ZP}1q3>azI<HUN-hUs5^MwBY
otga!>XL+%{pk}l0;m~27pjD{{8|-q>p%L@Ajql}PtJ<vo1K<}>6951J

diff --git a/venv/lib/python3.8/site-packages/serial/aio.py b/venv/lib/python3.8/site-packages/serial/aio.py
deleted file mode 100644
index 257c47c..0000000
--- a/venv/lib/python3.8/site-packages/serial/aio.py
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/env python3
-#
-# Python Serial Port Extension for Win32, Linux, BSD, Jython
-# module for serial IO for POSIX compatible systems, like Linux
-# see __init__.py
-#
-# (C) 2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-"""\
-Support asyncio with serial ports. EXPERIMENTAL
-
-Posix platforms only, Python 3.4+ only.
-
-Windows event loops can not wait for serial ports with the current
-implementation. It should be possible to get that working though.
-"""
-import asyncio
-import serial
-import logger
-
-
-class SerialTransport(asyncio.Transport):
-    def __init__(self, loop, protocol, serial_instance):
-        self._loop = loop
-        self._protocol = protocol
-        self.serial = serial_instance
-        self._closing = False
-        self._paused = False
-        # XXX how to support url handlers too
-        self.serial.timeout = 0
-        self.serial.nonblocking()
-        loop.call_soon(protocol.connection_made, self)
-        # only start reading when connection_made() has been called
-        loop.call_soon(loop.add_reader, self.serial.fd, self._read_ready)
-
-    def __repr__(self):
-        return '{self.__class__.__name__}({self._loop}, {self._protocol}, {self.serial})'.format(self=self)
-
-    def close(self):
-        if self._closing:
-            return
-        self._closing = True
-        self._loop.remove_reader(self.serial.fd)
-        self.serial.close()
-        self._loop.call_soon(self._protocol.connection_lost, None)
-
-    def _read_ready(self):
-        data = self.serial.read(1024)
-        if data:
-            self._protocol.data_received(data)
-
-    def write(self, data):
-        self.serial.write(data)
-
-    def can_write_eof(self):
-        return False
-
-    def pause_reading(self):
-        if self._closing:
-            raise RuntimeError('Cannot pause_reading() when closing')
-        if self._paused:
-            raise RuntimeError('Already paused')
-        self._paused = True
-        self._loop.remove_reader(self._sock_fd)
-        if self._loop.get_debug():
-            logger.debug("%r pauses reading", self)
-
-    def resume_reading(self):
-        if not self._paused:
-            raise RuntimeError('Not paused')
-        self._paused = False
-        if self._closing:
-            return
-        self._loop.add_reader(self._sock_fd, self._read_ready)
-        if self._loop.get_debug():
-            logger.debug("%r resumes reading", self)
-
-    #~ def set_write_buffer_limits(self, high=None, low=None):
-    #~ def get_write_buffer_size(self):
-    #~ def writelines(self, list_of_data):
-    #~ def write_eof(self):
-    #~ def abort(self):
-
-
-@asyncio.coroutine
-def create_serial_connection(loop, protocol_factory, *args, **kwargs):
-    ser = serial.Serial(*args, **kwargs)
-    protocol = protocol_factory()
-    transport = SerialTransport(loop, protocol, ser)
-    return (transport, protocol)
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    class Output(asyncio.Protocol):
-        def connection_made(self, transport):
-            self.transport = transport
-            print('port opened', transport)
-            transport.serial.rts = False
-            transport.write(b'hello world\n')
-
-        def data_received(self, data):
-            print('data received', repr(data))
-            self.transport.close()
-
-        def connection_lost(self, exc):
-            print('port closed')
-            asyncio.get_event_loop().stop()
-
-    loop = asyncio.get_event_loop()
-    coro = create_serial_connection(loop, Output, '/dev/ttyUSB0', baudrate=115200)
-    loop.run_until_complete(coro)
-    loop.run_forever()
-    loop.close()
diff --git a/venv/lib/python3.8/site-packages/serial/aio.pyc b/venv/lib/python3.8/site-packages/serial/aio.pyc
deleted file mode 100644
index 3e720250fe9f256e1fb53e9c39823031ca4fc812..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4496
zcmb_fTXP)674F%awQC83xY<Q6L%^^EymEpAR3()JC~>KRMKv;z=w&jRX{|<{o!;v1
zv8;;qg7cgo#Y6r^p7Wd^kbK|i*<IPBQe|UF-8yr+r{`S0bLsBCw?;2_{`GaP+Mfab
z{}IFe15=^Y0p>^*9aTl@07RfW>Y%fvyXv5;imuX;I_aq+Z0M=KDfK|9KOgjkJ5WVm
zSUBR6(i^H6s5>2HzgGnw@!C*c+gQCe67FT5aj>a0HenvAVyFtt;CG{gEizA@QF==~
zh*ZRfD||tyXN9UEdq?e$H>uA*G3_^tg|R-)+*zHMCO$3waqP4$vnu9-o5Z_++S^S&
z|8jSF`@=6rqdnuwd-0;m{E@M97n`~|dnevI^T(!+-<{lgTR4-^=-aX`%&Cj@U0wUQ
zGG^i8Jgei{`1mv{eT?@X`cn9|Kh|;HSc{iN<$O`;IjGE+rk=!~``8_urYhn?4e6XK
z4=Wve6VJ4d{c(najlEOWGd!4Pc03uC|H04HU!kU=)NPy9j*6|^8)5Aunqv=>hI!#G
zMY{)ol7KTi!s*eg<n&vY9xNRRFT#aff-f%#F;vO^cms##Jxt5-F+X)5)BQ-{Ukail
z1RlFWbd(Q7Z%N>5viYQ=(gF8?IJqPa#VIEnJOYTp!h?>AS{4>Y%e|L{*aS*cRKOJD
z4g{E%nACU+lka0n=_5ZRwXnvU+*F>}4``4rpJbKOo;sy@1t8Qje@XUdjnjqDzMN~*
zcz+rE+SG@Y$>|X}H_xgnb;i`<klfU@&gt27o)y}U@J3b?snvM0o+2I<a*nWMIvdlD
zo|Dtnkq{y_Wm-v1cL%A{vUWbJb3F!2$>e?sYO-_KlvS})m4}n6tebl`?tSoH`rfS@
zzn;9m6JFiPN;6rU1#NLo>C^No58mcc(Qx_O*^IWL=Q}xZ#L>kNCqD}Uemjwnqi<BS
zKj!MxeTMn3RA7?AkePF73aZZLI!({V?F#iee<yCAmddR-LCW*Dl4o$(m|qreF)A}J
z&tU}%KSpt@7dB0=;}A!WsOX1^egif^sg&Jf?Ckp$v;$NH&d7u(eMwB*i-$n~@Dk1B
zZV<*efiUJlqQ-PgEG2}f`1`hPbRzl^x>nE4UEP8vp?MP~H-RfLsuLnQq3n;M4y#^H
zoSIrc1&bvw<0HhFqXdLV591}kLu^J7I0PI!AcD<Kq=X=0pTlaAvTrYg7FLVIUQF5-
zg0_c`U?@>m<Y&YL4QY`g^BL@s>+-HHB+>;4vXg619100fzlq_P7F4ty4WfLh)k?D$
zu(Z;w)!>3Jxi3ggho0Kf>$Qx@Pr!R}`F@JGe}nNTQVABZI?d+SxFSCx?<qLn(>SPa
zsi>4{bMyfik4i#(iX;|9u#&y15HCm+fWUW=g0sm-FK|=%oi)EL3sNpZG;t@w2*sWh
zVoHjFtrfBsBS`{}!L)=Bm7TiRC`DGY5-*s!C3=vg$8W`_$GVQ&-0qlJKCFnYv#_yn
z&w+K_h9?(uiSIFWhX5t=lcr`B*tOQ!giuLd<RsR92~<d_4uv5_f@gT5ey4>#Y-W<e
zDl?m*01zL-d|KXlNY~%ubjK9UIK9%2=RrxVQr4BP=6DFcazF4D$`qDZ#o>UivJ(l_
z)*F4{hKdc(ur>!bZ7}uOQbBnXX*3t$Uvv{cJ$1C|bm^l)>JChAwQJ^jZF@<MV&$J>
zzra~s5$r9iF&Bu><W)|;;6w~O4Z{*6L8K*$cENebvdn|mU|E4lTTer+lbWBVb5k@G
zN?*d#nlOP#Dh(ntsFR;@dY#jCOzR9G)MHlk1Scq_Y7ue}4Y!8f;l{9!xjP(5LSs|I
zQ2C0x-p7QbfjrGlt*id7)Ok;GGl;$l2)GYl_t;;Z!`=Ant0VT=#L-lWe#m+B)4nvK
zBE^^=O4zP=LUCE+)1xf+#-2&a&g{%dSll@klGs4)Pxyiak6*U5YqLD2MLheO9Kq~$
z8rq6<-JG$yyA4dLvyCv>j#>}Sv$9T8k?gC+FPi_+Q4?btE%E>DsL>=-C9(Umn0yR|
z`xPeC4}=E7iw$r@n|}Hky9=~c=!K<1BJCl7m;(!DcAhnLguUEr%tF_?kb-=ys|pt!
zW2<5`W^zexaH5}sbNDK5JP8qZp(b(H6Pq?+5N8;{gfQUcXmedP`AJchF$o=kvrsZc
zQ)Ua%^Z~MzXh#E09YdLw9J!#a@;s+)1r|2wCCv!;OZESemGu>zGsAGSmWrNRYe0mH
z2G>A91NcXzhRATyBZ9BoBAr<w&XQY0d;RpxCM*VWX$%(<e$jceSbGF@5V*RRKe<zg
z_d7f{sMC)E9^L>ed6SbAG%B5N>-s}NJ!W(zY?=OoA#D@#&0yFQK<*U!?vD3oU+;f(
zQ-bO+YYK}XEY<gs8ne`f>s4Bq9NF<*Fa)WR!6o)r*I7v?!pe=s{j02XGU0yeB!};{
zcRCR#xy3a}JTw8{@l3w9sZ&<(3JHLhZ?EM7Mm8=M@QPhExfiVRm<ADXeixGd@2Mrq
bs!{{Q1%A8N{;)mVjILeTjIN?{9!38JhyHmY

diff --git a/venv/lib/python3.8/site-packages/serial/rfc2217.py b/venv/lib/python3.8/site-packages/serial/rfc2217.py
deleted file mode 100644
index 419947d..0000000
--- a/venv/lib/python3.8/site-packages/serial/rfc2217.py
+++ /dev/null
@@ -1,1346 +0,0 @@
-#! python
-#
-# This module implements a RFC2217 compatible client. RF2217 descibes a
-# protocol to access serial ports over TCP/IP and allows setting the baud rate,
-# modem control lines etc.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2001-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-# TODO:
-# - setting control line -> answer is not checked (had problems with one of the
-#   severs). consider implementing a compatibility mode flag to make check
-#   conditional
-# - write timeout not implemented at all
-
-# ###########################################################################
-# observations and issues with servers
-# ===========================================================================
-# sredird V2.2.1
-# - http://www.ibiblio.org/pub/Linux/system/serial/   sredird-2.2.2.tar.gz
-# - does not acknowledge SET_CONTROL (RTS/DTR) correctly, always responding
-#   [105 1] instead of the actual value.
-# - SET_BAUDRATE answer contains 4 extra null bytes -> probably for larger
-#   numbers than 2**32?
-# - To get the signature [COM_PORT_OPTION 0] has to be sent.
-# - run a server: while true; do nc -l -p 7000 -c "sredird debug /dev/ttyUSB0 /var/lock/sredir"; done
-# ===========================================================================
-# telnetcpcd (untested)
-# - http://ftp.wayne.edu/kermit/sredird/telnetcpcd-1.09.tar.gz
-# - To get the signature [COM_PORT_OPTION] w/o data has to be sent.
-# ===========================================================================
-# ser2net
-# - does not negotiate BINARY or COM_PORT_OPTION for his side but at least
-#   acknowledges that the client activates these options
-# - The configuration may be that the server prints a banner. As this client
-#   implementation does a flushInput on connect, this banner is hidden from
-#   the user application.
-# - NOTIFY_MODEMSTATE: the poll interval of the server seems to be one
-#   second.
-# - To get the signature [COM_PORT_OPTION 0] has to be sent.
-# - run a server: run ser2net daemon, in /etc/ser2net.conf:
-#     2000:telnet:0:/dev/ttyS0:9600 remctl banner
-# ###########################################################################
-
-# How to identify ports? pySerial might want to support other protocols in the
-# future, so lets use an URL scheme.
-# for RFC2217 compliant servers we will use this:
-#    rfc2217://<host>:<port>[?option[&option...]]
-#
-# options:
-# - "logging" set log level print diagnostic messages (e.g. "logging=debug")
-# - "ign_set_control": do not look at the answers to SET_CONTROL
-# - "poll_modem": issue NOTIFY_MODEMSTATE requests when CTS/DTR/RI/CD is read.
-#   Without this option it expects that the server sends notifications
-#   automatically on change (which most servers do and is according to the
-#   RFC).
-# the order of the options is not relevant
-
-import logging
-import socket
-import struct
-import threading
-import time
-try:
-    import urlparse
-except ImportError:
-    import urllib.parse as urlparse
-try:
-    import Queue
-except ImportError:
-    import queue as Queue
-
-import serial
-from serial.serialutil import SerialBase, SerialException, to_bytes, \
-    iterbytes, portNotOpenError, Timeout
-
-# port string is expected to be something like this:
-# rfc2217://host:port
-# host may be an IP or including domain, whatever.
-# port is 0...65535
-
-# map log level names to constants. used in from_url()
-LOGGER_LEVELS = {
-    'debug': logging.DEBUG,
-    'info': logging.INFO,
-    'warning': logging.WARNING,
-    'error': logging.ERROR,
-}
-
-
-# telnet protocol characters
-SE = b'\xf0'    # Subnegotiation End
-NOP = b'\xf1'   # No Operation
-DM = b'\xf2'    # Data Mark
-BRK = b'\xf3'   # Break
-IP = b'\xf4'    # Interrupt process
-AO = b'\xf5'    # Abort output
-AYT = b'\xf6'   # Are You There
-EC = b'\xf7'    # Erase Character
-EL = b'\xf8'    # Erase Line
-GA = b'\xf9'    # Go Ahead
-SB = b'\xfa'    # Subnegotiation Begin
-WILL = b'\xfb'
-WONT = b'\xfc'
-DO = b'\xfd'
-DONT = b'\xfe'
-IAC = b'\xff'   # Interpret As Command
-IAC_DOUBLED = b'\xff\xff'
-
-# selected telnet options
-BINARY = b'\x00'    # 8-bit data path
-ECHO = b'\x01'      # echo
-SGA = b'\x03'       # suppress go ahead
-
-# RFC2217
-COM_PORT_OPTION = b'\x2c'
-
-# Client to Access Server
-SET_BAUDRATE = b'\x01'
-SET_DATASIZE = b'\x02'
-SET_PARITY = b'\x03'
-SET_STOPSIZE = b'\x04'
-SET_CONTROL = b'\x05'
-NOTIFY_LINESTATE = b'\x06'
-NOTIFY_MODEMSTATE = b'\x07'
-FLOWCONTROL_SUSPEND = b'\x08'
-FLOWCONTROL_RESUME = b'\x09'
-SET_LINESTATE_MASK = b'\x0a'
-SET_MODEMSTATE_MASK = b'\x0b'
-PURGE_DATA = b'\x0c'
-
-SERVER_SET_BAUDRATE = b'\x65'
-SERVER_SET_DATASIZE = b'\x66'
-SERVER_SET_PARITY = b'\x67'
-SERVER_SET_STOPSIZE = b'\x68'
-SERVER_SET_CONTROL = b'\x69'
-SERVER_NOTIFY_LINESTATE = b'\x6a'
-SERVER_NOTIFY_MODEMSTATE = b'\x6b'
-SERVER_FLOWCONTROL_SUSPEND = b'\x6c'
-SERVER_FLOWCONTROL_RESUME = b'\x6d'
-SERVER_SET_LINESTATE_MASK = b'\x6e'
-SERVER_SET_MODEMSTATE_MASK = b'\x6f'
-SERVER_PURGE_DATA = b'\x70'
-
-RFC2217_ANSWER_MAP = {
-    SET_BAUDRATE: SERVER_SET_BAUDRATE,
-    SET_DATASIZE: SERVER_SET_DATASIZE,
-    SET_PARITY: SERVER_SET_PARITY,
-    SET_STOPSIZE: SERVER_SET_STOPSIZE,
-    SET_CONTROL: SERVER_SET_CONTROL,
-    NOTIFY_LINESTATE: SERVER_NOTIFY_LINESTATE,
-    NOTIFY_MODEMSTATE: SERVER_NOTIFY_MODEMSTATE,
-    FLOWCONTROL_SUSPEND: SERVER_FLOWCONTROL_SUSPEND,
-    FLOWCONTROL_RESUME: SERVER_FLOWCONTROL_RESUME,
-    SET_LINESTATE_MASK: SERVER_SET_LINESTATE_MASK,
-    SET_MODEMSTATE_MASK: SERVER_SET_MODEMSTATE_MASK,
-    PURGE_DATA: SERVER_PURGE_DATA,
-}
-
-SET_CONTROL_REQ_FLOW_SETTING = b'\x00'        # Request Com Port Flow Control Setting (outbound/both)
-SET_CONTROL_USE_NO_FLOW_CONTROL = b'\x01'     # Use No Flow Control (outbound/both)
-SET_CONTROL_USE_SW_FLOW_CONTROL = b'\x02'     # Use XON/XOFF Flow Control (outbound/both)
-SET_CONTROL_USE_HW_FLOW_CONTROL = b'\x03'     # Use HARDWARE Flow Control (outbound/both)
-SET_CONTROL_REQ_BREAK_STATE = b'\x04'         # Request BREAK State
-SET_CONTROL_BREAK_ON = b'\x05'                # Set BREAK State ON
-SET_CONTROL_BREAK_OFF = b'\x06'               # Set BREAK State OFF
-SET_CONTROL_REQ_DTR = b'\x07'                 # Request DTR Signal State
-SET_CONTROL_DTR_ON = b'\x08'                  # Set DTR Signal State ON
-SET_CONTROL_DTR_OFF = b'\x09'                 # Set DTR Signal State OFF
-SET_CONTROL_REQ_RTS = b'\x0a'                 # Request RTS Signal State
-SET_CONTROL_RTS_ON = b'\x0b'                  # Set RTS Signal State ON
-SET_CONTROL_RTS_OFF = b'\x0c'                 # Set RTS Signal State OFF
-SET_CONTROL_REQ_FLOW_SETTING_IN = b'\x0d'     # Request Com Port Flow Control Setting (inbound)
-SET_CONTROL_USE_NO_FLOW_CONTROL_IN = b'\x0e'  # Use No Flow Control (inbound)
-SET_CONTROL_USE_SW_FLOW_CONTOL_IN = b'\x0f'   # Use XON/XOFF Flow Control (inbound)
-SET_CONTROL_USE_HW_FLOW_CONTOL_IN = b'\x10'   # Use HARDWARE Flow Control (inbound)
-SET_CONTROL_USE_DCD_FLOW_CONTROL = b'\x11'    # Use DCD Flow Control (outbound/both)
-SET_CONTROL_USE_DTR_FLOW_CONTROL = b'\x12'    # Use DTR Flow Control (inbound)
-SET_CONTROL_USE_DSR_FLOW_CONTROL = b'\x13'    # Use DSR Flow Control (outbound/both)
-
-LINESTATE_MASK_TIMEOUT = 128        # Time-out Error
-LINESTATE_MASK_SHIFTREG_EMPTY = 64  # Transfer Shift Register Empty
-LINESTATE_MASK_TRANSREG_EMPTY = 32  # Transfer Holding Register Empty
-LINESTATE_MASK_BREAK_DETECT = 16    # Break-detect Error
-LINESTATE_MASK_FRAMING_ERROR = 8    # Framing Error
-LINESTATE_MASK_PARTIY_ERROR = 4     # Parity Error
-LINESTATE_MASK_OVERRUN_ERROR = 2    # Overrun Error
-LINESTATE_MASK_DATA_READY = 1       # Data Ready
-
-MODEMSTATE_MASK_CD = 128            # Receive Line Signal Detect (also known as Carrier Detect)
-MODEMSTATE_MASK_RI = 64             # Ring Indicator
-MODEMSTATE_MASK_DSR = 32            # Data-Set-Ready Signal State
-MODEMSTATE_MASK_CTS = 16            # Clear-To-Send Signal State
-MODEMSTATE_MASK_CD_CHANGE = 8       # Delta Receive Line Signal Detect
-MODEMSTATE_MASK_RI_CHANGE = 4       # Trailing-edge Ring Detector
-MODEMSTATE_MASK_DSR_CHANGE = 2      # Delta Data-Set-Ready
-MODEMSTATE_MASK_CTS_CHANGE = 1      # Delta Clear-To-Send
-
-PURGE_RECEIVE_BUFFER = b'\x01'      # Purge access server receive data buffer
-PURGE_TRANSMIT_BUFFER = b'\x02'     # Purge access server transmit data buffer
-PURGE_BOTH_BUFFERS = b'\x03'        # Purge both the access server receive data
-                                    # buffer and the access server transmit data buffer
-
-
-RFC2217_PARITY_MAP = {
-    serial.PARITY_NONE: 1,
-    serial.PARITY_ODD: 2,
-    serial.PARITY_EVEN: 3,
-    serial.PARITY_MARK: 4,
-    serial.PARITY_SPACE: 5,
-}
-RFC2217_REVERSE_PARITY_MAP = dict((v, k) for k, v in RFC2217_PARITY_MAP.items())
-
-RFC2217_STOPBIT_MAP = {
-    serial.STOPBITS_ONE: 1,
-    serial.STOPBITS_ONE_POINT_FIVE: 3,
-    serial.STOPBITS_TWO: 2,
-}
-RFC2217_REVERSE_STOPBIT_MAP = dict((v, k) for k, v in RFC2217_STOPBIT_MAP.items())
-
-# Telnet filter states
-M_NORMAL = 0
-M_IAC_SEEN = 1
-M_NEGOTIATE = 2
-
-# TelnetOption and TelnetSubnegotiation states
-REQUESTED = 'REQUESTED'
-ACTIVE = 'ACTIVE'
-INACTIVE = 'INACTIVE'
-REALLY_INACTIVE = 'REALLY_INACTIVE'
-
-
-class TelnetOption(object):
-    """Manage a single telnet option, keeps track of DO/DONT WILL/WONT."""
-
-    def __init__(self, connection, name, option, send_yes, send_no, ack_yes,
-                 ack_no, initial_state, activation_callback=None):
-        """\
-        Initialize option.
-        :param connection: connection used to transmit answers
-        :param name: a readable name for debug outputs
-        :param send_yes: what to send when option is to be enabled.
-        :param send_no: what to send when option is to be disabled.
-        :param ack_yes: what to expect when remote agrees on option.
-        :param ack_no: what to expect when remote disagrees on option.
-        :param initial_state: options initialized with REQUESTED are tried to
-            be enabled on startup. use INACTIVE for all others.
-        """
-        self.connection = connection
-        self.name = name
-        self.option = option
-        self.send_yes = send_yes
-        self.send_no = send_no
-        self.ack_yes = ack_yes
-        self.ack_no = ack_no
-        self.state = initial_state
-        self.active = False
-        self.activation_callback = activation_callback
-
-    def __repr__(self):
-        """String for debug outputs"""
-        return "{o.name}:{o.active}({o.state})".format(o=self)
-
-    def process_incoming(self, command):
-        """\
-        A DO/DONT/WILL/WONT was received for this option, update state and
-        answer when needed.
-        """
-        if command == self.ack_yes:
-            if self.state is REQUESTED:
-                self.state = ACTIVE
-                self.active = True
-                if self.activation_callback is not None:
-                    self.activation_callback()
-            elif self.state is ACTIVE:
-                pass
-            elif self.state is INACTIVE:
-                self.state = ACTIVE
-                self.connection.telnet_send_option(self.send_yes, self.option)
-                self.active = True
-                if self.activation_callback is not None:
-                    self.activation_callback()
-            elif self.state is REALLY_INACTIVE:
-                self.connection.telnet_send_option(self.send_no, self.option)
-            else:
-                raise ValueError('option in illegal state {!r}'.format(self))
-        elif command == self.ack_no:
-            if self.state is REQUESTED:
-                self.state = INACTIVE
-                self.active = False
-            elif self.state is ACTIVE:
-                self.state = INACTIVE
-                self.connection.telnet_send_option(self.send_no, self.option)
-                self.active = False
-            elif self.state is INACTIVE:
-                pass
-            elif self.state is REALLY_INACTIVE:
-                pass
-            else:
-                raise ValueError('option in illegal state {!r}'.format(self))
-
-
-class TelnetSubnegotiation(object):
-    """\
-    A object to handle subnegotiation of options. In this case actually
-    sub-sub options for RFC 2217. It is used to track com port options.
-    """
-
-    def __init__(self, connection, name, option, ack_option=None):
-        if ack_option is None:
-            ack_option = option
-        self.connection = connection
-        self.name = name
-        self.option = option
-        self.value = None
-        self.ack_option = ack_option
-        self.state = INACTIVE
-
-    def __repr__(self):
-        """String for debug outputs."""
-        return "{sn.name}:{sn.state}".format(sn=self)
-
-    def set(self, value):
-        """\
-        Request a change of the value. a request is sent to the server. if
-        the client needs to know if the change is performed he has to check the
-        state of this object.
-        """
-        self.value = value
-        self.state = REQUESTED
-        self.connection.rfc2217_send_subnegotiation(self.option, self.value)
-        if self.connection.logger:
-            self.connection.logger.debug("SB Requesting {} -> {!r}".format(self.name, self.value))
-
-    def is_ready(self):
-        """\
-        Check if answer from server has been received. when server rejects
-        the change, raise a ValueError.
-        """
-        if self.state == REALLY_INACTIVE:
-            raise ValueError("remote rejected value for option {!r}".format(self.name))
-        return self.state == ACTIVE
-    # add property to have a similar interface as TelnetOption
-    active = property(is_ready)
-
-    def wait(self, timeout=3):
-        """\
-        Wait until the subnegotiation has been acknowledged or timeout. It
-        can also throw a value error when the answer from the server does not
-        match the value sent.
-        """
-        timeout_timer = Timeout(timeout)
-        while not timeout_timer.expired():
-            time.sleep(0.05)    # prevent 100% CPU load
-            if self.is_ready():
-                break
-        else:
-            raise SerialException("timeout while waiting for option {!r}".format(self.name))
-
-    def check_answer(self, suboption):
-        """\
-        Check an incoming subnegotiation block. The parameter already has
-        cut off the header like sub option number and com port option value.
-        """
-        if self.value == suboption[:len(self.value)]:
-            self.state = ACTIVE
-        else:
-            # error propagation done in is_ready
-            self.state = REALLY_INACTIVE
-        if self.connection.logger:
-            self.connection.logger.debug("SB Answer {} -> {!r} -> {}".format(self.name, suboption, self.state))
-
-
-class Serial(SerialBase):
-    """Serial port implementation for RFC 2217 remote serial ports."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def __init__(self, *args, **kwargs):
-        self._thread = None
-        self._socket = None
-        self._linestate = 0
-        self._modemstate = None
-        self._modemstate_timeout = Timeout(-1)
-        self._remote_suspend_flow = False
-        self._write_lock = None
-        self.logger = None
-        self._ignore_set_control_answer = False
-        self._poll_modem_state = False
-        self._network_timeout = 3
-        self._telnet_options = None
-        self._rfc2217_port_settings = None
-        self._rfc2217_options = None
-        self._read_buffer = None
-        super(Serial, self).__init__(*args, **kwargs)  # must be last call in case of auto-open
-
-    def open(self):
-        """\
-        Open port with current settings. This may throw a SerialException
-        if the port cannot be opened.
-        """
-        self.logger = None
-        self._ignore_set_control_answer = False
-        self._poll_modem_state = False
-        self._network_timeout = 3
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self.is_open:
-            raise SerialException("Port is already open.")
-        try:
-            self._socket = socket.create_connection(self.from_url(self.portstr), timeout=5)  # XXX good value?
-            self._socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
-        except Exception as msg:
-            self._socket = None
-            raise SerialException("Could not open port {}: {}".format(self.portstr, msg))
-
-        # use a thread save queue as buffer. it also simplifies implementing
-        # the read timeout
-        self._read_buffer = Queue.Queue()
-        # to ensure that user writes does not interfere with internal
-        # telnet/rfc2217 options establish a lock
-        self._write_lock = threading.Lock()
-        # name the following separately so that, below, a check can be easily done
-        mandadory_options = [
-            TelnetOption(self, 'we-BINARY', BINARY, WILL, WONT, DO, DONT, INACTIVE),
-            TelnetOption(self, 'we-RFC2217', COM_PORT_OPTION, WILL, WONT, DO, DONT, REQUESTED),
-        ]
-        # all supported telnet options
-        self._telnet_options = [
-            TelnetOption(self, 'ECHO', ECHO, DO, DONT, WILL, WONT, REQUESTED),
-            TelnetOption(self, 'we-SGA', SGA, WILL, WONT, DO, DONT, REQUESTED),
-            TelnetOption(self, 'they-SGA', SGA, DO, DONT, WILL, WONT, REQUESTED),
-            TelnetOption(self, 'they-BINARY', BINARY, DO, DONT, WILL, WONT, INACTIVE),
-            TelnetOption(self, 'they-RFC2217', COM_PORT_OPTION, DO, DONT, WILL, WONT, REQUESTED),
-        ] + mandadory_options
-        # RFC 2217 specific states
-        # COM port settings
-        self._rfc2217_port_settings = {
-            'baudrate': TelnetSubnegotiation(self, 'baudrate', SET_BAUDRATE, SERVER_SET_BAUDRATE),
-            'datasize': TelnetSubnegotiation(self, 'datasize', SET_DATASIZE, SERVER_SET_DATASIZE),
-            'parity':   TelnetSubnegotiation(self, 'parity',   SET_PARITY,   SERVER_SET_PARITY),
-            'stopsize': TelnetSubnegotiation(self, 'stopsize', SET_STOPSIZE, SERVER_SET_STOPSIZE),
-        }
-        # There are more subnegotiation objects, combine all in one dictionary
-        # for easy access
-        self._rfc2217_options = {
-            'purge':    TelnetSubnegotiation(self, 'purge',    PURGE_DATA,   SERVER_PURGE_DATA),
-            'control':  TelnetSubnegotiation(self, 'control',  SET_CONTROL,  SERVER_SET_CONTROL),
-        }
-        self._rfc2217_options.update(self._rfc2217_port_settings)
-        # cache for line and modem states that the server sends to us
-        self._linestate = 0
-        self._modemstate = None
-        self._modemstate_timeout = Timeout(-1)
-        # RFC 2217 flow control between server and client
-        self._remote_suspend_flow = False
-
-        self.is_open = True
-        self._thread = threading.Thread(target=self._telnet_read_loop)
-        self._thread.setDaemon(True)
-        self._thread.setName('pySerial RFC 2217 reader thread for {}'.format(self._port))
-        self._thread.start()
-
-        try:    # must clean-up if open fails
-            # negotiate Telnet/RFC 2217 -> send initial requests
-            for option in self._telnet_options:
-                if option.state is REQUESTED:
-                    self.telnet_send_option(option.send_yes, option.option)
-            # now wait until important options are negotiated
-            timeout = Timeout(self._network_timeout)
-            while not timeout.expired():
-                time.sleep(0.05)    # prevent 100% CPU load
-                if sum(o.active for o in mandadory_options) == sum(o.state != INACTIVE for o in mandadory_options):
-                    break
-            else:
-                raise SerialException(
-                    "Remote does not seem to support RFC2217 or BINARY mode {!r}".format(mandadory_options))
-            if self.logger:
-                self.logger.info("Negotiated options: {}".format(self._telnet_options))
-
-            # fine, go on, set RFC 2271 specific things
-            self._reconfigure_port()
-            # all things set up get, now a clean start
-            if not self._dsrdtr:
-                self._update_dtr_state()
-            if not self._rtscts:
-                self._update_rts_state()
-            self.reset_input_buffer()
-            self.reset_output_buffer()
-        except:
-            self.close()
-            raise
-
-    def _reconfigure_port(self):
-        """Set communication parameters on opened port."""
-        if self._socket is None:
-            raise SerialException("Can only operate on open ports")
-
-        # if self._timeout != 0 and self._interCharTimeout is not None:
-            # XXX
-
-        if self._write_timeout is not None:
-            raise NotImplementedError('write_timeout is currently not supported')
-            # XXX
-
-        # Setup the connection
-        # to get good performance, all parameter changes are sent first...
-        if not 0 < self._baudrate < 2 ** 32:
-            raise ValueError("invalid baudrate: {!r}".format(self._baudrate))
-        self._rfc2217_port_settings['baudrate'].set(struct.pack(b'!I', self._baudrate))
-        self._rfc2217_port_settings['datasize'].set(struct.pack(b'!B', self._bytesize))
-        self._rfc2217_port_settings['parity'].set(struct.pack(b'!B', RFC2217_PARITY_MAP[self._parity]))
-        self._rfc2217_port_settings['stopsize'].set(struct.pack(b'!B', RFC2217_STOPBIT_MAP[self._stopbits]))
-
-        # and now wait until parameters are active
-        items = self._rfc2217_port_settings.values()
-        if self.logger:
-            self.logger.debug("Negotiating settings: {}".format(items))
-        timeout = Timeout(self._network_timeout)
-        while not timeout.expired():
-            time.sleep(0.05)    # prevent 100% CPU load
-            if sum(o.active for o in items) == len(items):
-                break
-        else:
-            raise SerialException("Remote does not accept parameter change (RFC2217): {!r}".format(items))
-        if self.logger:
-            self.logger.info("Negotiated settings: {}".format(items))
-
-        if self._rtscts and self._xonxoff:
-            raise ValueError('xonxoff and rtscts together are not supported')
-        elif self._rtscts:
-            self.rfc2217_set_control(SET_CONTROL_USE_HW_FLOW_CONTROL)
-        elif self._xonxoff:
-            self.rfc2217_set_control(SET_CONTROL_USE_SW_FLOW_CONTROL)
-        else:
-            self.rfc2217_set_control(SET_CONTROL_USE_NO_FLOW_CONTROL)
-
-    def close(self):
-        """Close port"""
-        self.is_open = False
-        if self._socket:
-            try:
-                self._socket.shutdown(socket.SHUT_RDWR)
-                self._socket.close()
-            except:
-                # ignore errors.
-                pass
-        if self._thread:
-            self._thread.join(7)  # XXX more than socket timeout
-            self._thread = None
-            # in case of quick reconnects, give the server some time
-            time.sleep(0.3)
-        self._socket = None
-
-    def from_url(self, url):
-        """\
-        extract host and port from an URL string, other settings are extracted
-        an stored in instance
-        """
-        parts = urlparse.urlsplit(url)
-        if parts.scheme != "rfc2217":
-            raise SerialException(
-                'expected a string in the form '
-                '"rfc2217://<host>:<port>[?option[&option...]]": '
-                'not starting with rfc2217:// ({!r})'.format(parts.scheme))
-        try:
-            # process options now, directly altering self
-            for option, values in urlparse.parse_qs(parts.query, True).items():
-                if option == 'logging':
-                    logging.basicConfig()   # XXX is that good to call it here?
-                    self.logger = logging.getLogger('pySerial.rfc2217')
-                    self.logger.setLevel(LOGGER_LEVELS[values[0]])
-                    self.logger.debug('enabled logging')
-                elif option == 'ign_set_control':
-                    self._ignore_set_control_answer = True
-                elif option == 'poll_modem':
-                    self._poll_modem_state = True
-                elif option == 'timeout':
-                    self._network_timeout = float(values[0])
-                else:
-                    raise ValueError('unknown option: {!r}'.format(option))
-            if not 0 <= parts.port < 65536:
-                raise ValueError("port not in range 0...65535")
-        except ValueError as e:
-            raise SerialException(
-                'expected a string in the form '
-                '"rfc2217://<host>:<port>[?option[&option...]]": {}'.format(e))
-        return (parts.hostname, parts.port)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    @property
-    def in_waiting(self):
-        """Return the number of bytes currently in the input buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        return self._read_buffer.qsize()
-
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        data = bytearray()
-        try:
-            timeout = Timeout(self._timeout)
-            while len(data) < size:
-                if self._thread is None:
-                    raise SerialException('connection failed (reader thread died)')
-                data += self._read_buffer.get(True, timeout.time_left())
-                if timeout.expired():
-                    break
-        except Queue.Empty:  # -> timeout
-            pass
-        return bytes(data)
-
-    def write(self, data):
-        """\
-        Output the given byte string over the serial port. Can block if the
-        connection is blocked. May raise SerialException if the connection is
-        closed.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        # XXX use protocol_socket's write
-        with self._write_lock:
-            try:
-                self._socket.sendall(to_bytes(data).replace(IAC, IAC_DOUBLED))
-            except socket.error as e:
-                raise SerialException("connection failed (socket error): {}".format(e))
-        return len(data)
-
-    def reset_input_buffer(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        self.rfc2217_send_purge(PURGE_RECEIVE_BUFFER)
-        # empty read buffer
-        while self._read_buffer.qsize():
-            self._read_buffer.get(False)
-
-    def reset_output_buffer(self):
-        """\
-        Clear output buffer, aborting the current output and
-        discarding all that is in the buffer.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        self.rfc2217_send_purge(PURGE_TRANSMIT_BUFFER)
-
-    def _update_break_state(self):
-        """\
-        Set break: Controls TXD. When active, to transmitting is
-        possible.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('set BREAK to {}'.format('active' if self._break_state else 'inactive'))
-        if self._break_state:
-            self.rfc2217_set_control(SET_CONTROL_BREAK_ON)
-        else:
-            self.rfc2217_set_control(SET_CONTROL_BREAK_OFF)
-
-    def _update_rts_state(self):
-        """Set terminal status line: Request To Send."""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('set RTS to {}'.format('active' if self._rts_state else 'inactive'))
-        if self._rts_state:
-            self.rfc2217_set_control(SET_CONTROL_RTS_ON)
-        else:
-            self.rfc2217_set_control(SET_CONTROL_RTS_OFF)
-
-    def _update_dtr_state(self):
-        """Set terminal status line: Data Terminal Ready."""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('set DTR to {}'.format('active' if self._dtr_state else 'inactive'))
-        if self._dtr_state:
-            self.rfc2217_set_control(SET_CONTROL_DTR_ON)
-        else:
-            self.rfc2217_set_control(SET_CONTROL_DTR_OFF)
-
-    @property
-    def cts(self):
-        """Read terminal status line: Clear To Send."""
-        if not self.is_open:
-            raise portNotOpenError
-        return bool(self.get_modem_state() & MODEMSTATE_MASK_CTS)
-
-    @property
-    def dsr(self):
-        """Read terminal status line: Data Set Ready."""
-        if not self.is_open:
-            raise portNotOpenError
-        return bool(self.get_modem_state() & MODEMSTATE_MASK_DSR)
-
-    @property
-    def ri(self):
-        """Read terminal status line: Ring Indicator."""
-        if not self.is_open:
-            raise portNotOpenError
-        return bool(self.get_modem_state() & MODEMSTATE_MASK_RI)
-
-    @property
-    def cd(self):
-        """Read terminal status line: Carrier Detect."""
-        if not self.is_open:
-            raise portNotOpenError
-        return bool(self.get_modem_state() & MODEMSTATE_MASK_CD)
-
-    # - - - platform specific - - -
-    # None so far
-
-    # - - - RFC2217 specific - - -
-
-    def _telnet_read_loop(self):
-        """Read loop for the socket."""
-        mode = M_NORMAL
-        suboption = None
-        try:
-            while self.is_open:
-                try:
-                    data = self._socket.recv(1024)
-                except socket.timeout:
-                    # just need to get out of recv form time to time to check if
-                    # still alive
-                    continue
-                except socket.error as e:
-                    # connection fails -> terminate loop
-                    if self.logger:
-                        self.logger.debug("socket error in reader thread: {}".format(e))
-                    break
-                if not data:
-                    break  # lost connection
-                for byte in iterbytes(data):
-                    if mode == M_NORMAL:
-                        # interpret as command or as data
-                        if byte == IAC:
-                            mode = M_IAC_SEEN
-                        else:
-                            # store data in read buffer or sub option buffer
-                            # depending on state
-                            if suboption is not None:
-                                suboption += byte
-                            else:
-                                self._read_buffer.put(byte)
-                    elif mode == M_IAC_SEEN:
-                        if byte == IAC:
-                            # interpret as command doubled -> insert character
-                            # itself
-                            if suboption is not None:
-                                suboption += IAC
-                            else:
-                                self._read_buffer.put(IAC)
-                            mode = M_NORMAL
-                        elif byte == SB:
-                            # sub option start
-                            suboption = bytearray()
-                            mode = M_NORMAL
-                        elif byte == SE:
-                            # sub option end -> process it now
-                            self._telnet_process_subnegotiation(bytes(suboption))
-                            suboption = None
-                            mode = M_NORMAL
-                        elif byte in (DO, DONT, WILL, WONT):
-                            # negotiation
-                            telnet_command = byte
-                            mode = M_NEGOTIATE
-                        else:
-                            # other telnet commands
-                            self._telnet_process_command(byte)
-                            mode = M_NORMAL
-                    elif mode == M_NEGOTIATE:  # DO, DONT, WILL, WONT was received, option now following
-                        self._telnet_negotiate_option(telnet_command, byte)
-                        mode = M_NORMAL
-        finally:
-            self._thread = None
-            if self.logger:
-                self.logger.debug("read thread terminated")
-
-    # - incoming telnet commands and options
-
-    def _telnet_process_command(self, command):
-        """Process commands other than DO, DONT, WILL, WONT."""
-        # Currently none. RFC2217 only uses negotiation and subnegotiation.
-        if self.logger:
-            self.logger.warning("ignoring Telnet command: {!r}".format(command))
-
-    def _telnet_negotiate_option(self, command, option):
-        """Process incoming DO, DONT, WILL, WONT."""
-        # check our registered telnet options and forward command to them
-        # they know themselves if they have to answer or not
-        known = False
-        for item in self._telnet_options:
-            # can have more than one match! as some options are duplicated for
-            # 'us' and 'them'
-            if item.option == option:
-                item.process_incoming(command)
-                known = True
-        if not known:
-            # handle unknown options
-            # only answer to positive requests and deny them
-            if command == WILL or command == DO:
-                self.telnet_send_option((DONT if command == WILL else WONT), option)
-                if self.logger:
-                    self.logger.warning("rejected Telnet option: {!r}".format(option))
-
-    def _telnet_process_subnegotiation(self, suboption):
-        """Process subnegotiation, the data between IAC SB and IAC SE."""
-        if suboption[0:1] == COM_PORT_OPTION:
-            if suboption[1:2] == SERVER_NOTIFY_LINESTATE and len(suboption) >= 3:
-                self._linestate = ord(suboption[2:3])  # ensure it is a number
-                if self.logger:
-                    self.logger.info("NOTIFY_LINESTATE: {}".format(self._linestate))
-            elif suboption[1:2] == SERVER_NOTIFY_MODEMSTATE and len(suboption) >= 3:
-                self._modemstate = ord(suboption[2:3])  # ensure it is a number
-                if self.logger:
-                    self.logger.info("NOTIFY_MODEMSTATE: {}".format(self._modemstate))
-                # update time when we think that a poll would make sense
-                self._modemstate_timeout.restart(0.3)
-            elif suboption[1:2] == FLOWCONTROL_SUSPEND:
-                self._remote_suspend_flow = True
-            elif suboption[1:2] == FLOWCONTROL_RESUME:
-                self._remote_suspend_flow = False
-            else:
-                for item in self._rfc2217_options.values():
-                    if item.ack_option == suboption[1:2]:
-                        #~ print "processing COM_PORT_OPTION: %r" % list(suboption[1:])
-                        item.check_answer(bytes(suboption[2:]))
-                        break
-                else:
-                    if self.logger:
-                        self.logger.warning("ignoring COM_PORT_OPTION: {!r}".format(suboption))
-        else:
-            if self.logger:
-                self.logger.warning("ignoring subnegotiation: {!r}".format(suboption))
-
-    # - outgoing telnet commands and options
-
-    def _internal_raw_write(self, data):
-        """internal socket write with no data escaping. used to send telnet stuff."""
-        with self._write_lock:
-            self._socket.sendall(data)
-
-    def telnet_send_option(self, action, option):
-        """Send DO, DONT, WILL, WONT."""
-        self._internal_raw_write(IAC + action + option)
-
-    def rfc2217_send_subnegotiation(self, option, value=b''):
-        """Subnegotiation of RFC2217 parameters."""
-        value = value.replace(IAC, IAC_DOUBLED)
-        self._internal_raw_write(IAC + SB + COM_PORT_OPTION + option + value + IAC + SE)
-
-    def rfc2217_send_purge(self, value):
-        """\
-        Send purge request to the remote.
-        (PURGE_RECEIVE_BUFFER / PURGE_TRANSMIT_BUFFER / PURGE_BOTH_BUFFERS)
-        """
-        item = self._rfc2217_options['purge']
-        item.set(value)  # transmit desired purge type
-        item.wait(self._network_timeout)  # wait for acknowledge from the server
-
-    def rfc2217_set_control(self, value):
-        """transmit change of control line to remote"""
-        item = self._rfc2217_options['control']
-        item.set(value)  # transmit desired control type
-        if self._ignore_set_control_answer:
-            # answers are ignored when option is set. compatibility mode for
-            # servers that answer, but not the expected one... (or no answer
-            # at all) i.e. sredird
-            time.sleep(0.1)  # this helps getting the unit tests passed
-        else:
-            item.wait(self._network_timeout)  # wait for acknowledge from the server
-
-    def rfc2217_flow_server_ready(self):
-        """\
-        check if server is ready to receive data. block for some time when
-        not.
-        """
-        #~ if self._remote_suspend_flow:
-        #~     wait---
-
-    def get_modem_state(self):
-        """\
-        get last modem state (cached value. If value is "old", request a new
-        one. This cache helps that we don't issue to many requests when e.g. all
-        status lines, one after the other is queried by the user (CTS, DSR
-        etc.)
-        """
-        # active modem state polling enabled? is the value fresh enough?
-        if self._poll_modem_state and self._modemstate_timeout.expired():
-            if self.logger:
-                self.logger.debug('polling modem state')
-            # when it is older, request an update
-            self.rfc2217_send_subnegotiation(NOTIFY_MODEMSTATE)
-            timeout = Timeout(self._network_timeout)
-            while not timeout.expired():
-                time.sleep(0.05)    # prevent 100% CPU load
-                # when expiration time is updated, it means that there is a new
-                # value
-                if not self._modemstate_timeout.expired():
-                    break
-            else:
-                if self.logger:
-                    self.logger.warning('poll for modem state failed')
-            # even when there is a timeout, do not generate an error just
-            # return the last known value. this way we can support buggy
-            # servers that do not respond to polls, but send automatic
-            # updates.
-        if self._modemstate is not None:
-            if self.logger:
-                self.logger.debug('using cached modem state')
-            return self._modemstate
-        else:
-            # never received a notification from the server
-            raise SerialException("remote sends no NOTIFY_MODEMSTATE")
-
-
-#############################################################################
-# The following is code that helps implementing an RFC 2217 server.
-
-class PortManager(object):
-    """\
-    This class manages the state of Telnet and RFC 2217. It needs a serial
-    instance and a connection to work with. Connection is expected to implement
-    a (thread safe) write function, that writes the string to the network.
-    """
-
-    def __init__(self, serial_port, connection, logger=None):
-        self.serial = serial_port
-        self.connection = connection
-        self.logger = logger
-        self._client_is_rfc2217 = False
-
-        # filter state machine
-        self.mode = M_NORMAL
-        self.suboption = None
-        self.telnet_command = None
-
-        # states for modem/line control events
-        self.modemstate_mask = 255
-        self.last_modemstate = None
-        self.linstate_mask = 0
-
-        # all supported telnet options
-        self._telnet_options = [
-            TelnetOption(self, 'ECHO', ECHO, WILL, WONT, DO, DONT, REQUESTED),
-            TelnetOption(self, 'we-SGA', SGA, WILL, WONT, DO, DONT, REQUESTED),
-            TelnetOption(self, 'they-SGA', SGA, DO, DONT, WILL, WONT, INACTIVE),
-            TelnetOption(self, 'we-BINARY', BINARY, WILL, WONT, DO, DONT, INACTIVE),
-            TelnetOption(self, 'they-BINARY', BINARY, DO, DONT, WILL, WONT, REQUESTED),
-            TelnetOption(self, 'we-RFC2217', COM_PORT_OPTION, WILL, WONT, DO, DONT, REQUESTED, self._client_ok),
-            TelnetOption(self, 'they-RFC2217', COM_PORT_OPTION, DO, DONT, WILL, WONT, INACTIVE, self._client_ok),
-        ]
-
-        # negotiate Telnet/RFC2217 -> send initial requests
-        if self.logger:
-            self.logger.debug("requesting initial Telnet/RFC 2217 options")
-        for option in self._telnet_options:
-            if option.state is REQUESTED:
-                self.telnet_send_option(option.send_yes, option.option)
-        # issue 1st modem state notification
-
-    def _client_ok(self):
-        """\
-        callback of telnet option. It gets called when option is activated.
-        This one here is used to detect when the client agrees on RFC 2217. A
-        flag is set so that other functions like check_modem_lines know if the
-        client is OK.
-        """
-        # The callback is used for we and they so if one party agrees, we're
-        # already happy. it seems not all servers do the negotiation correctly
-        # and i guess there are incorrect clients too.. so be happy if client
-        # answers one or the other positively.
-        self._client_is_rfc2217 = True
-        if self.logger:
-            self.logger.info("client accepts RFC 2217")
-        # this is to ensure that the client gets a notification, even if there
-        # was no change
-        self.check_modem_lines(force_notification=True)
-
-    # - outgoing telnet commands and options
-
-    def telnet_send_option(self, action, option):
-        """Send DO, DONT, WILL, WONT."""
-        self.connection.write(IAC + action + option)
-
-    def rfc2217_send_subnegotiation(self, option, value=b''):
-        """Subnegotiation of RFC 2217 parameters."""
-        value = value.replace(IAC, IAC_DOUBLED)
-        self.connection.write(IAC + SB + COM_PORT_OPTION + option + value + IAC + SE)
-
-    # - check modem lines, needs to be called periodically from user to
-    # establish polling
-
-    def check_modem_lines(self, force_notification=False):
-        """\
-        read control lines from serial port and compare the last value sent to remote.
-        send updates on changes.
-        """
-        modemstate = (
-            (self.serial.cts and MODEMSTATE_MASK_CTS) |
-            (self.serial.dsr and MODEMSTATE_MASK_DSR) |
-            (self.serial.ri and MODEMSTATE_MASK_RI) |
-            (self.serial.cd and MODEMSTATE_MASK_CD))
-        # check what has changed
-        deltas = modemstate ^ (self.last_modemstate or 0)  # when last is None -> 0
-        if deltas & MODEMSTATE_MASK_CTS:
-            modemstate |= MODEMSTATE_MASK_CTS_CHANGE
-        if deltas & MODEMSTATE_MASK_DSR:
-            modemstate |= MODEMSTATE_MASK_DSR_CHANGE
-        if deltas & MODEMSTATE_MASK_RI:
-            modemstate |= MODEMSTATE_MASK_RI_CHANGE
-        if deltas & MODEMSTATE_MASK_CD:
-            modemstate |= MODEMSTATE_MASK_CD_CHANGE
-        # if new state is different and the mask allows this change, send
-        # notification. suppress notifications when client is not rfc2217
-        if modemstate != self.last_modemstate or force_notification:
-            if (self._client_is_rfc2217 and (modemstate & self.modemstate_mask)) or force_notification:
-                self.rfc2217_send_subnegotiation(
-                    SERVER_NOTIFY_MODEMSTATE,
-                    to_bytes([modemstate & self.modemstate_mask]))
-                if self.logger:
-                    self.logger.info("NOTIFY_MODEMSTATE: {}".format(modemstate))
-            # save last state, but forget about deltas.
-            # otherwise it would also notify about changing deltas which is
-            # probably not very useful
-            self.last_modemstate = modemstate & 0xf0
-
-    # - outgoing data escaping
-
-    def escape(self, data):
-        """\
-        This generator function is for the user. All outgoing data has to be
-        properly escaped, so that no IAC character in the data stream messes up
-        the Telnet state machine in the server.
-
-        socket.sendall(escape(data))
-        """
-        for byte in iterbytes(data):
-            if byte == IAC:
-                yield IAC
-                yield IAC
-            else:
-                yield byte
-
-    # - incoming data filter
-
-    def filter(self, data):
-        """\
-        Handle a bunch of incoming bytes. This is a generator. It will yield
-        all characters not of interest for Telnet/RFC 2217.
-
-        The idea is that the reader thread pushes data from the socket through
-        this filter:
-
-        for byte in filter(socket.recv(1024)):
-            # do things like CR/LF conversion/whatever
-            # and write data to the serial port
-            serial.write(byte)
-
-        (socket error handling code left as exercise for the reader)
-        """
-        for byte in iterbytes(data):
-            if self.mode == M_NORMAL:
-                # interpret as command or as data
-                if byte == IAC:
-                    self.mode = M_IAC_SEEN
-                else:
-                    # store data in sub option buffer or pass it to our
-                    # consumer depending on state
-                    if self.suboption is not None:
-                        self.suboption += byte
-                    else:
-                        yield byte
-            elif self.mode == M_IAC_SEEN:
-                if byte == IAC:
-                    # interpret as command doubled -> insert character
-                    # itself
-                    if self.suboption is not None:
-                        self.suboption += byte
-                    else:
-                        yield byte
-                    self.mode = M_NORMAL
-                elif byte == SB:
-                    # sub option start
-                    self.suboption = bytearray()
-                    self.mode = M_NORMAL
-                elif byte == SE:
-                    # sub option end -> process it now
-                    self._telnet_process_subnegotiation(bytes(self.suboption))
-                    self.suboption = None
-                    self.mode = M_NORMAL
-                elif byte in (DO, DONT, WILL, WONT):
-                    # negotiation
-                    self.telnet_command = byte
-                    self.mode = M_NEGOTIATE
-                else:
-                    # other telnet commands
-                    self._telnet_process_command(byte)
-                    self.mode = M_NORMAL
-            elif self.mode == M_NEGOTIATE:  # DO, DONT, WILL, WONT was received, option now following
-                self._telnet_negotiate_option(self.telnet_command, byte)
-                self.mode = M_NORMAL
-
-    # - incoming telnet commands and options
-
-    def _telnet_process_command(self, command):
-        """Process commands other than DO, DONT, WILL, WONT."""
-        # Currently none. RFC2217 only uses negotiation and subnegotiation.
-        if self.logger:
-            self.logger.warning("ignoring Telnet command: {!r}".format(command))
-
-    def _telnet_negotiate_option(self, command, option):
-        """Process incoming DO, DONT, WILL, WONT."""
-        # check our registered telnet options and forward command to them
-        # they know themselves if they have to answer or not
-        known = False
-        for item in self._telnet_options:
-            # can have more than one match! as some options are duplicated for
-            # 'us' and 'them'
-            if item.option == option:
-                item.process_incoming(command)
-                known = True
-        if not known:
-            # handle unknown options
-            # only answer to positive requests and deny them
-            if command == WILL or command == DO:
-                self.telnet_send_option((DONT if command == WILL else WONT), option)
-                if self.logger:
-                    self.logger.warning("rejected Telnet option: {!r}".format(option))
-
-    def _telnet_process_subnegotiation(self, suboption):
-        """Process subnegotiation, the data between IAC SB and IAC SE."""
-        if suboption[0:1] == COM_PORT_OPTION:
-            if self.logger:
-                self.logger.debug('received COM_PORT_OPTION: {!r}'.format(suboption))
-            if suboption[1:2] == SET_BAUDRATE:
-                backup = self.serial.baudrate
-                try:
-                    (baudrate,) = struct.unpack(b"!I", suboption[2:6])
-                    if baudrate != 0:
-                        self.serial.baudrate = baudrate
-                except ValueError as e:
-                    if self.logger:
-                        self.logger.error("failed to set baud rate: {}".format(e))
-                    self.serial.baudrate = backup
-                else:
-                    if self.logger:
-                        self.logger.info("{} baud rate: {}".format('set' if baudrate else 'get', self.serial.baudrate))
-                self.rfc2217_send_subnegotiation(SERVER_SET_BAUDRATE, struct.pack(b"!I", self.serial.baudrate))
-            elif suboption[1:2] == SET_DATASIZE:
-                backup = self.serial.bytesize
-                try:
-                    (datasize,) = struct.unpack(b"!B", suboption[2:3])
-                    if datasize != 0:
-                        self.serial.bytesize = datasize
-                except ValueError as e:
-                    if self.logger:
-                        self.logger.error("failed to set data size: {}".format(e))
-                    self.serial.bytesize = backup
-                else:
-                    if self.logger:
-                        self.logger.info("{} data size: {}".format('set' if datasize else 'get', self.serial.bytesize))
-                self.rfc2217_send_subnegotiation(SERVER_SET_DATASIZE, struct.pack(b"!B", self.serial.bytesize))
-            elif suboption[1:2] == SET_PARITY:
-                backup = self.serial.parity
-                try:
-                    parity = struct.unpack(b"!B", suboption[2:3])[0]
-                    if parity != 0:
-                        self.serial.parity = RFC2217_REVERSE_PARITY_MAP[parity]
-                except ValueError as e:
-                    if self.logger:
-                        self.logger.error("failed to set parity: {}".format(e))
-                    self.serial.parity = backup
-                else:
-                    if self.logger:
-                        self.logger.info("{} parity: {}".format('set' if parity else 'get', self.serial.parity))
-                self.rfc2217_send_subnegotiation(
-                    SERVER_SET_PARITY,
-                    struct.pack(b"!B", RFC2217_PARITY_MAP[self.serial.parity]))
-            elif suboption[1:2] == SET_STOPSIZE:
-                backup = self.serial.stopbits
-                try:
-                    stopbits = struct.unpack(b"!B", suboption[2:3])[0]
-                    if stopbits != 0:
-                        self.serial.stopbits = RFC2217_REVERSE_STOPBIT_MAP[stopbits]
-                except ValueError as e:
-                    if self.logger:
-                        self.logger.error("failed to set stop bits: {}".format(e))
-                    self.serial.stopbits = backup
-                else:
-                    if self.logger:
-                        self.logger.info("{} stop bits: {}".format('set' if stopbits else 'get', self.serial.stopbits))
-                self.rfc2217_send_subnegotiation(
-                    SERVER_SET_STOPSIZE,
-                    struct.pack(b"!B", RFC2217_STOPBIT_MAP[self.serial.stopbits]))
-            elif suboption[1:2] == SET_CONTROL:
-                if suboption[2:3] == SET_CONTROL_REQ_FLOW_SETTING:
-                    if self.serial.xonxoff:
-                        self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_SW_FLOW_CONTROL)
-                    elif self.serial.rtscts:
-                        self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_HW_FLOW_CONTROL)
-                    else:
-                        self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_NO_FLOW_CONTROL)
-                elif suboption[2:3] == SET_CONTROL_USE_NO_FLOW_CONTROL:
-                    self.serial.xonxoff = False
-                    self.serial.rtscts = False
-                    if self.logger:
-                        self.logger.info("changed flow control to None")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_NO_FLOW_CONTROL)
-                elif suboption[2:3] == SET_CONTROL_USE_SW_FLOW_CONTROL:
-                    self.serial.xonxoff = True
-                    if self.logger:
-                        self.logger.info("changed flow control to XON/XOFF")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_SW_FLOW_CONTROL)
-                elif suboption[2:3] == SET_CONTROL_USE_HW_FLOW_CONTROL:
-                    self.serial.rtscts = True
-                    if self.logger:
-                        self.logger.info("changed flow control to RTS/CTS")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_HW_FLOW_CONTROL)
-                elif suboption[2:3] == SET_CONTROL_REQ_BREAK_STATE:
-                    if self.logger:
-                        self.logger.warning("requested break state - not implemented")
-                    pass  # XXX needs cached value
-                elif suboption[2:3] == SET_CONTROL_BREAK_ON:
-                    self.serial.break_condition = True
-                    if self.logger:
-                        self.logger.info("changed BREAK to active")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_BREAK_ON)
-                elif suboption[2:3] == SET_CONTROL_BREAK_OFF:
-                    self.serial.break_condition = False
-                    if self.logger:
-                        self.logger.info("changed BREAK to inactive")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_BREAK_OFF)
-                elif suboption[2:3] == SET_CONTROL_REQ_DTR:
-                    if self.logger:
-                        self.logger.warning("requested DTR state - not implemented")
-                    pass  # XXX needs cached value
-                elif suboption[2:3] == SET_CONTROL_DTR_ON:
-                    self.serial.dtr = True
-                    if self.logger:
-                        self.logger.info("changed DTR to active")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_DTR_ON)
-                elif suboption[2:3] == SET_CONTROL_DTR_OFF:
-                    self.serial.dtr = False
-                    if self.logger:
-                        self.logger.info("changed DTR to inactive")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_DTR_OFF)
-                elif suboption[2:3] == SET_CONTROL_REQ_RTS:
-                    if self.logger:
-                        self.logger.warning("requested RTS state - not implemented")
-                    pass  # XXX needs cached value
-                    #~ self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_ON)
-                elif suboption[2:3] == SET_CONTROL_RTS_ON:
-                    self.serial.rts = True
-                    if self.logger:
-                        self.logger.info("changed RTS to active")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_ON)
-                elif suboption[2:3] == SET_CONTROL_RTS_OFF:
-                    self.serial.rts = False
-                    if self.logger:
-                        self.logger.info("changed RTS to inactive")
-                    self.rfc2217_send_subnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_OFF)
-                #~ elif suboption[2:3] == SET_CONTROL_REQ_FLOW_SETTING_IN:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_NO_FLOW_CONTROL_IN:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_SW_FLOW_CONTOL_IN:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_HW_FLOW_CONTOL_IN:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_DCD_FLOW_CONTROL:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_DTR_FLOW_CONTROL:
-                #~ elif suboption[2:3] == SET_CONTROL_USE_DSR_FLOW_CONTROL:
-            elif suboption[1:2] == NOTIFY_LINESTATE:
-                # client polls for current state
-                self.rfc2217_send_subnegotiation(
-                    SERVER_NOTIFY_LINESTATE,
-                    to_bytes([0]))   # sorry, nothing like that implemented
-            elif suboption[1:2] == NOTIFY_MODEMSTATE:
-                if self.logger:
-                    self.logger.info("request for modem state")
-                # client polls for current state
-                self.check_modem_lines(force_notification=True)
-            elif suboption[1:2] == FLOWCONTROL_SUSPEND:
-                if self.logger:
-                    self.logger.info("suspend")
-                self._remote_suspend_flow = True
-            elif suboption[1:2] == FLOWCONTROL_RESUME:
-                if self.logger:
-                    self.logger.info("resume")
-                self._remote_suspend_flow = False
-            elif suboption[1:2] == SET_LINESTATE_MASK:
-                self.linstate_mask = ord(suboption[2:3])  # ensure it is a number
-                if self.logger:
-                    self.logger.info("line state mask: 0x{:02x}".format(self.linstate_mask))
-            elif suboption[1:2] == SET_MODEMSTATE_MASK:
-                self.modemstate_mask = ord(suboption[2:3])  # ensure it is a number
-                if self.logger:
-                    self.logger.info("modem state mask: 0x{:02x}".format(self.modemstate_mask))
-            elif suboption[1:2] == PURGE_DATA:
-                if suboption[2:3] == PURGE_RECEIVE_BUFFER:
-                    self.serial.reset_input_buffer()
-                    if self.logger:
-                        self.logger.info("purge in")
-                    self.rfc2217_send_subnegotiation(SERVER_PURGE_DATA, PURGE_RECEIVE_BUFFER)
-                elif suboption[2:3] == PURGE_TRANSMIT_BUFFER:
-                    self.serial.reset_output_buffer()
-                    if self.logger:
-                        self.logger.info("purge out")
-                    self.rfc2217_send_subnegotiation(SERVER_PURGE_DATA, PURGE_TRANSMIT_BUFFER)
-                elif suboption[2:3] == PURGE_BOTH_BUFFERS:
-                    self.serial.reset_input_buffer()
-                    self.serial.reset_output_buffer()
-                    if self.logger:
-                        self.logger.info("purge both")
-                    self.rfc2217_send_subnegotiation(SERVER_PURGE_DATA, PURGE_BOTH_BUFFERS)
-                else:
-                    if self.logger:
-                        self.logger.error("undefined PURGE_DATA: {!r}".format(list(suboption[2:])))
-            else:
-                if self.logger:
-                    self.logger.error("undefined COM_PORT_OPTION: {!r}".format(list(suboption[1:])))
-        else:
-            if self.logger:
-                self.logger.warning("unknown subnegotiation: {!r}".format(suboption))
-
-
-# simple client test
-if __name__ == '__main__':
-    import sys
-    s = Serial('rfc2217://localhost:7000', 115200)
-    sys.stdout.write('{}\n'.format(s))
-
-    sys.stdout.write("write...\n")
-    s.write(b"hello\n")
-    s.flush()
-    sys.stdout.write("read: {}\n".format(s.read(5)))
-    s.close()
diff --git a/venv/lib/python3.8/site-packages/serial/rfc2217.pyc b/venv/lib/python3.8/site-packages/serial/rfc2217.pyc
deleted file mode 100644
index 9d4727e4b93a66e141d98bc89a320dc1f90cd786..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 37632
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
Yea*aPx)6RFM+et7;|dSDRqaguA7HP;p#T5?

diff --git a/venv/lib/python3.8/site-packages/serial/rs485.py b/venv/lib/python3.8/site-packages/serial/rs485.py
deleted file mode 100644
index 2939350..0000000
--- a/venv/lib/python3.8/site-packages/serial/rs485.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-
-# RS485 support
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-"""\
-The settings for RS485 are stored in a dedicated object that can be applied to
-serial ports (where supported).
-NOTE: Some implementations may only support a subset of the settings.
-"""
-
-import time
-import serial
-
-
-class RS485Settings(object):
-    def __init__(
-            self,
-            rts_level_for_tx=True,
-            rts_level_for_rx=False,
-            loopback=False,
-            delay_before_tx=None,
-            delay_before_rx=None):
-        self.rts_level_for_tx = rts_level_for_tx
-        self.rts_level_for_rx = rts_level_for_rx
-        self.loopback = loopback
-        self.delay_before_tx = delay_before_tx
-        self.delay_before_rx = delay_before_rx
-
-
-class RS485(serial.Serial):
-    """\
-    A subclass that replaces the write method with one that toggles RTS
-    according to the RS485 settings.
-
-    NOTE: This may work unreliably on some serial ports (control signals not
-          synchronized or delayed compared to data). Using delays may be
-          unreliable (varying times, larger than expected) as the OS may not
-          support very fine grained delays (no smaller than in the order of
-          tens of milliseconds).
-
-    NOTE: Some implementations support this natively. Better performance
-          can be expected when the native version is used.
-
-    NOTE: The loopback property is ignored by this implementation. The actual
-          behavior depends on the used hardware.
-
-    Usage:
-
-        ser = RS485(...)
-        ser.rs485_mode = RS485Settings(...)
-        ser.write(b'hello')
-    """
-
-    def __init__(self, *args, **kwargs):
-        super(RS485, self).__init__(*args, **kwargs)
-        self._alternate_rs485_settings = None
-
-    def write(self, b):
-        """Write to port, controlling RTS before and after transmitting."""
-        if self._alternate_rs485_settings is not None:
-            # apply level for TX and optional delay
-            self.setRTS(self._alternate_rs485_settings.rts_level_for_tx)
-            if self._alternate_rs485_settings.delay_before_tx is not None:
-                time.sleep(self._alternate_rs485_settings.delay_before_tx)
-            # write and wait for data to be written
-            super(RS485, self).write(b)
-            super(RS485, self).flush()
-            # optional delay and apply level for RX
-            if self._alternate_rs485_settings.delay_before_rx is not None:
-                time.sleep(self._alternate_rs485_settings.delay_before_rx)
-            self.setRTS(self._alternate_rs485_settings.rts_level_for_rx)
-        else:
-            super(RS485, self).write(b)
-
-    # redirect where the property stores the settings so that underlying Serial
-    # instance does not see them
-    @property
-    def rs485_mode(self):
-        """\
-        Enable RS485 mode and apply new settings, set to None to disable.
-        See serial.rs485.RS485Settings for more info about the value.
-        """
-        return self._alternate_rs485_settings
-
-    @rs485_mode.setter
-    def rs485_mode(self, rs485_settings):
-        self._alternate_rs485_settings = rs485_settings
diff --git a/venv/lib/python3.8/site-packages/serial/rs485.pyc b/venv/lib/python3.8/site-packages/serial/rs485.pyc
deleted file mode 100644
index 09650af2bd23c1a969f0d383b7e878386b173413..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3266
zcmbtW&2Aev5azCa94k&;)UDC<MD)-ofU`!6Bn^TlXcDA{9vpP#pr|hkYL}8$rk28z
zvaKSw<lJ+CK1C0GioQi(p%2i0Gt|m<k{;5?CN-qU;c#ZYkJI}5TCZ3A^*k4=PYd7Q
zqPZW?6+#@Lk3<m*6Nw`TL5{^yEQ*%UEiuAOTf7qDr4T<IwMEepIu_Fo|Il6k&?Oy%
z{syW31Kr_7OQ*drtFe<KTg!BC``#U?YD{}u>q3^5RI<=TnJbT>9Zq%brJpD-b5+Tq
zmTEpXC4Ta@=X6~vBj>jEPWDeHn)EE@G}gt<q<8S_@acUyurn>o+1%)vuDtT4t(=^x
zrL>h<HtTV!TMS{Fv?CmMZf4Re|H0?LUxWQ@?qGF+925NMqJNC$BsvZ6MdS>43IF6e
z{0s4_BaS*y(2ubwr!CZI@C40$iS9)tUI>vvh*`j}#R7(H7BK9v0FMheHo~rheh0n(
z5FOl*8GWKn2H$4>>@Ab^nZJUS#@hK%<;Q*-gF+j%%!V49H0^q0u0HFNvA&JYX){Xc
z+>~rjTh!5fN>=pILg)4%CHuogX^MSQ4ii&Wi?ds2_wHtQZ{PYV`FcMDZ@+fPfMmX8
zv$CwLN}pvPW3%g#vW?9s{2c@n$oMR))J$iYrxjT?v&F*Dkjyx&7uu64-zkG=($s;i
zbV@0BZXHYSY+?!>Vh4>)>$X}^_~Y|9HP$IXzIjY5AE65=Q6Mn@pNPP5gv5whXbasT
zOkwgRu+|m2E2bL_xOfIRLl<&);A@G`Bg)j=DCYt$YCSh9*EG`dv@X4tGwmm~kf)`e
zAj@@F=k0iGuq-_s^hl4&b6XdHBA~>30~i~8COuviFmyO617=QbeJmGMtxc(hfRC-D
zBYa(kVs0y6TO(aLt`G-VS<lMoSSj7I$|tq0%AX10HQ<i?gP7ad98^HimWA@_W+I<E
zvX2*p^N0F^qO~1b_D@v3<hztJ?e?Tm^;p+*@k;8mIY<PIAXRYEvjOA(HLC(~$P-;J
z<*0<$#<jv%(H!5etaLMFOrsZEMJ|UEF=Iy;4D%Wk10tD~#*|LO9fboQU2y1INomDh
z&<bx?U@Aa)naIZ=9Go!MH4r*eResS2D^_goD8YiktgxT1<G^?l8W&C%my94fZkRyM
zYl{>7l2#&Y%*MlIu;ns)CXzO)+%J^5aOt6*sFRZ8IoG%_<p%kOj+GNt7pDmB>ip+U
zjrIND5Kal)??HGC`bm=9T&qQ1B}@?nbKR_IDEQ5_od5mdjfpnK-UxbfqAMaQYR?Et
zU!e2&XTp7nhYJh~ITpVN5do+~!*5b7qi_KyrTi8UrKDS=={mYh83YMV*IBT)!BL-1
zP1pR1ymX#M$8g8kopaK=(-9ePAI-JViRgNi6YWr=BcGtTKhfbbQ-05nH%0wB5BYt;
z<g`Vs6NMF1+&B`n=z9T5n|4<_F;9ysTy#T#rm>n_wn;9dA1=-Is3K?-UTqZqc3I)o
zMj;)%wq+~K?*7Lyuq`~E?g1|KBl8@Hf*$)lPzMtZ9+@%m8|nml%%rLcsYV1IU#rT^
zN-jN;gFXk4-nkG!iU;C_o#AOChw|Iu!6r=a&S*VPKcF47m*+UwSQ?pyoA3+BuOh$k
zA>@>L!}kgDCs6PZ&C#1E;_Y}R`Y76sccYyc-;g-F=@@Dpbjphm(oi9|Uok-_qtDX{
zysZP&Bx8!5graIGD}A~y&-O?nCZ^|;8M$<{Gg(7(pc~o`2u&_kM_k^`C<tXWvQiE0
zg6cRePn20)(84uLN}&i6h2lN@#Wle>VNgBm2oa*Y1_uq<PZY>?%>~pq^%OZWSVT)h
z94Ydz;Tkjlv(`yJ#nzwDf@yL83gnc#O-KL~)is69vy2Oul#+l8q=uwf1Jel6jIPf;
z#?rfU3Hjo4v{2gYcH_<V=FavNF5T15@Iy+4&+0^~x>*e6IoCxz9&ka<2zg(N_`2VO
T+U_A)=g2?Zcq`g!?QZ`IPWSw)

diff --git a/venv/lib/python3.8/site-packages/serial/serialcli.py b/venv/lib/python3.8/site-packages/serial/serialcli.py
deleted file mode 100644
index 0727a52..0000000
--- a/venv/lib/python3.8/site-packages/serial/serialcli.py
+++ /dev/null
@@ -1,251 +0,0 @@
-#! python
-#
-# Backend for .NET/Mono (IronPython), .NET >= 2
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2008-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-import System
-import System.IO.Ports
-from serial.serialutil import *
-
-# must invoke function with byte array, make a helper to convert strings
-# to byte arrays
-sab = System.Array[System.Byte]
-
-
-def as_byte_array(string):
-    return sab([ord(x) for x in string])  # XXX will require adaption when run with a 3.x compatible IronPython
-
-
-class Serial(SerialBase):
-    """Serial port implementation for .NET/Mono."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def open(self):
-        """\
-        Open port with current settings. This may throw a SerialException
-        if the port cannot be opened.
-        """
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self.is_open:
-            raise SerialException("Port is already open.")
-        try:
-            self._port_handle = System.IO.Ports.SerialPort(self.portstr)
-        except Exception as msg:
-            self._port_handle = None
-            raise SerialException("could not open port %s: %s" % (self.portstr, msg))
-
-        # if RTS and/or DTR are not set before open, they default to True
-        if self._rts_state is None:
-            self._rts_state = True
-        if self._dtr_state is None:
-            self._dtr_state = True
-
-        self._reconfigure_port()
-        self._port_handle.Open()
-        self.is_open = True
-        if not self._dsrdtr:
-            self._update_dtr_state()
-        if not self._rtscts:
-            self._update_rts_state()
-        self.reset_input_buffer()
-
-    def _reconfigure_port(self):
-        """Set communication parameters on opened port."""
-        if not self._port_handle:
-            raise SerialException("Can only operate on a valid port handle")
-
-        #~ self._port_handle.ReceivedBytesThreshold = 1
-
-        if self._timeout is None:
-            self._port_handle.ReadTimeout = System.IO.Ports.SerialPort.InfiniteTimeout
-        else:
-            self._port_handle.ReadTimeout = int(self._timeout * 1000)
-
-        # if self._timeout != 0 and self._interCharTimeout is not None:
-            # timeouts = (int(self._interCharTimeout * 1000),) + timeouts[1:]
-
-        if self._write_timeout is None:
-            self._port_handle.WriteTimeout = System.IO.Ports.SerialPort.InfiniteTimeout
-        else:
-            self._port_handle.WriteTimeout = int(self._write_timeout * 1000)
-
-        # Setup the connection info.
-        try:
-            self._port_handle.BaudRate = self._baudrate
-        except IOError as e:
-            # catch errors from illegal baudrate settings
-            raise ValueError(str(e))
-
-        if self._bytesize == FIVEBITS:
-            self._port_handle.DataBits = 5
-        elif self._bytesize == SIXBITS:
-            self._port_handle.DataBits = 6
-        elif self._bytesize == SEVENBITS:
-            self._port_handle.DataBits = 7
-        elif self._bytesize == EIGHTBITS:
-            self._port_handle.DataBits = 8
-        else:
-            raise ValueError("Unsupported number of data bits: %r" % self._bytesize)
-
-        if self._parity == PARITY_NONE:
-            self._port_handle.Parity = getattr(System.IO.Ports.Parity, 'None')  # reserved keyword in Py3k
-        elif self._parity == PARITY_EVEN:
-            self._port_handle.Parity = System.IO.Ports.Parity.Even
-        elif self._parity == PARITY_ODD:
-            self._port_handle.Parity = System.IO.Ports.Parity.Odd
-        elif self._parity == PARITY_MARK:
-            self._port_handle.Parity = System.IO.Ports.Parity.Mark
-        elif self._parity == PARITY_SPACE:
-            self._port_handle.Parity = System.IO.Ports.Parity.Space
-        else:
-            raise ValueError("Unsupported parity mode: %r" % self._parity)
-
-        if self._stopbits == STOPBITS_ONE:
-            self._port_handle.StopBits = System.IO.Ports.StopBits.One
-        elif self._stopbits == STOPBITS_ONE_POINT_FIVE:
-            self._port_handle.StopBits = System.IO.Ports.StopBits.OnePointFive
-        elif self._stopbits == STOPBITS_TWO:
-            self._port_handle.StopBits = System.IO.Ports.StopBits.Two
-        else:
-            raise ValueError("Unsupported number of stop bits: %r" % self._stopbits)
-
-        if self._rtscts and self._xonxoff:
-            self._port_handle.Handshake = System.IO.Ports.Handshake.RequestToSendXOnXOff
-        elif self._rtscts:
-            self._port_handle.Handshake = System.IO.Ports.Handshake.RequestToSend
-        elif self._xonxoff:
-            self._port_handle.Handshake = System.IO.Ports.Handshake.XOnXOff
-        else:
-            self._port_handle.Handshake = getattr(System.IO.Ports.Handshake, 'None')   # reserved keyword in Py3k
-
-    #~ def __del__(self):
-        #~ self.close()
-
-    def close(self):
-        """Close port"""
-        if self.is_open:
-            if self._port_handle:
-                try:
-                    self._port_handle.Close()
-                except System.IO.Ports.InvalidOperationException:
-                    # ignore errors. can happen for unplugged USB serial devices
-                    pass
-                self._port_handle = None
-            self.is_open = False
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    @property
-    def in_waiting(self):
-        """Return the number of characters currently in the input buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        return self._port_handle.BytesToRead
-
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        # must use single byte reads as this is the only way to read
-        # without applying encodings
-        data = bytearray()
-        while size:
-            try:
-                data.append(self._port_handle.ReadByte())
-            except System.TimeoutException:
-                break
-            else:
-                size -= 1
-        return bytes(data)
-
-    def write(self, data):
-        """Output the given string over the serial port."""
-        if not self.is_open:
-            raise portNotOpenError
-        #~ if not isinstance(data, (bytes, bytearray)):
-            #~ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
-        try:
-            # must call overloaded method with byte array argument
-            # as this is the only one not applying encodings
-            self._port_handle.Write(as_byte_array(data), 0, len(data))
-        except System.TimeoutException:
-            raise writeTimeoutError
-        return len(data)
-
-    def reset_input_buffer(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        self._port_handle.DiscardInBuffer()
-
-    def reset_output_buffer(self):
-        """\
-        Clear output buffer, aborting the current output and
-        discarding all that is in the buffer.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        self._port_handle.DiscardOutBuffer()
-
-    def _update_break_state(self):
-        """
-        Set break: Controls TXD. When active, to transmitting is possible.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        self._port_handle.BreakState = bool(self._break_state)
-
-    def _update_rts_state(self):
-        """Set terminal status line: Request To Send"""
-        if not self.is_open:
-            raise portNotOpenError
-        self._port_handle.RtsEnable = bool(self._rts_state)
-
-    def _update_dtr_state(self):
-        """Set terminal status line: Data Terminal Ready"""
-        if not self.is_open:
-            raise portNotOpenError
-        self._port_handle.DtrEnable = bool(self._dtr_state)
-
-    @property
-    def cts(self):
-        """Read terminal status line: Clear To Send"""
-        if not self.is_open:
-            raise portNotOpenError
-        return self._port_handle.CtsHolding
-
-    @property
-    def dsr(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self.is_open:
-            raise portNotOpenError
-        return self._port_handle.DsrHolding
-
-    @property
-    def ri(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self.is_open:
-            raise portNotOpenError
-        #~ return self._port_handle.XXX
-        return False  # XXX an error would be better
-
-    @property
-    def cd(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self.is_open:
-            raise portNotOpenError
-        return self._port_handle.CDHolding
-
-    # - - platform specific - - - -
-    # none
diff --git a/venv/lib/python3.8/site-packages/serial/serialcli.pyc b/venv/lib/python3.8/site-packages/serial/serialcli.pyc
deleted file mode 100644
index d1caa60ecf94fe9fe208506ad039925047930aad..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8308
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
adH`9|k@rw9O<0HEH4h1(RuPC*t^WbmR_tp4

diff --git a/venv/lib/python3.8/site-packages/serial/serialjava.py b/venv/lib/python3.8/site-packages/serial/serialjava.py
deleted file mode 100644
index 7bd5b3e..0000000
--- a/venv/lib/python3.8/site-packages/serial/serialjava.py
+++ /dev/null
@@ -1,249 +0,0 @@
-#!jython
-#
-# Backend Jython with JavaComm
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2002-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-from serial.serialutil import *
-
-
-def my_import(name):
-    mod = __import__(name)
-    components = name.split('.')
-    for comp in components[1:]:
-        mod = getattr(mod, comp)
-    return mod
-
-
-def detect_java_comm(names):
-    """try given list of modules and return that imports"""
-    for name in names:
-        try:
-            mod = my_import(name)
-            mod.SerialPort
-            return mod
-        except (ImportError, AttributeError):
-            pass
-    raise ImportError("No Java Communications API implementation found")
-
-
-# Java Communications API implementations
-# http://mho.republika.pl/java/comm/
-
-comm = detect_java_comm([
-    'javax.comm',  # Sun/IBM
-    'gnu.io',      # RXTX
-])
-
-
-def device(portnumber):
-    """Turn a port number into a device name"""
-    enum = comm.CommPortIdentifier.getPortIdentifiers()
-    ports = []
-    while enum.hasMoreElements():
-        el = enum.nextElement()
-        if el.getPortType() == comm.CommPortIdentifier.PORT_SERIAL:
-            ports.append(el)
-    return ports[portnumber].getName()
-
-
-class Serial(SerialBase):
-    """\
-    Serial port class, implemented with Java Communications API and
-    thus usable with jython and the appropriate java extension.
-    """
-
-    def open(self):
-        """\
-        Open port with current settings. This may throw a SerialException
-        if the port cannot be opened.
-        """
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self.is_open:
-            raise SerialException("Port is already open.")
-        if type(self._port) == type(''):      # strings are taken directly
-            portId = comm.CommPortIdentifier.getPortIdentifier(self._port)
-        else:
-            portId = comm.CommPortIdentifier.getPortIdentifier(device(self._port))     # numbers are transformed to a comport id obj
-        try:
-            self.sPort = portId.open("python serial module", 10)
-        except Exception as msg:
-            self.sPort = None
-            raise SerialException("Could not open port: %s" % msg)
-        self._reconfigurePort()
-        self._instream = self.sPort.getInputStream()
-        self._outstream = self.sPort.getOutputStream()
-        self.is_open = True
-
-    def _reconfigurePort(self):
-        """Set communication parameters on opened port."""
-        if not self.sPort:
-            raise SerialException("Can only operate on a valid port handle")
-
-        self.sPort.enableReceiveTimeout(30)
-        if self._bytesize == FIVEBITS:
-            jdatabits = comm.SerialPort.DATABITS_5
-        elif self._bytesize == SIXBITS:
-            jdatabits = comm.SerialPort.DATABITS_6
-        elif self._bytesize == SEVENBITS:
-            jdatabits = comm.SerialPort.DATABITS_7
-        elif self._bytesize == EIGHTBITS:
-            jdatabits = comm.SerialPort.DATABITS_8
-        else:
-            raise ValueError("unsupported bytesize: %r" % self._bytesize)
-
-        if self._stopbits == STOPBITS_ONE:
-            jstopbits = comm.SerialPort.STOPBITS_1
-        elif self._stopbits == STOPBITS_ONE_POINT_FIVE:
-            jstopbits = comm.SerialPort.STOPBITS_1_5
-        elif self._stopbits == STOPBITS_TWO:
-            jstopbits = comm.SerialPort.STOPBITS_2
-        else:
-            raise ValueError("unsupported number of stopbits: %r" % self._stopbits)
-
-        if self._parity == PARITY_NONE:
-            jparity = comm.SerialPort.PARITY_NONE
-        elif self._parity == PARITY_EVEN:
-            jparity = comm.SerialPort.PARITY_EVEN
-        elif self._parity == PARITY_ODD:
-            jparity = comm.SerialPort.PARITY_ODD
-        elif self._parity == PARITY_MARK:
-            jparity = comm.SerialPort.PARITY_MARK
-        elif self._parity == PARITY_SPACE:
-            jparity = comm.SerialPort.PARITY_SPACE
-        else:
-            raise ValueError("unsupported parity type: %r" % self._parity)
-
-        jflowin = jflowout = 0
-        if self._rtscts:
-            jflowin |= comm.SerialPort.FLOWCONTROL_RTSCTS_IN
-            jflowout |= comm.SerialPort.FLOWCONTROL_RTSCTS_OUT
-        if self._xonxoff:
-            jflowin |= comm.SerialPort.FLOWCONTROL_XONXOFF_IN
-            jflowout |= comm.SerialPort.FLOWCONTROL_XONXOFF_OUT
-
-        self.sPort.setSerialPortParams(self._baudrate, jdatabits, jstopbits, jparity)
-        self.sPort.setFlowControlMode(jflowin | jflowout)
-
-        if self._timeout >= 0:
-            self.sPort.enableReceiveTimeout(int(self._timeout*1000))
-        else:
-            self.sPort.disableReceiveTimeout()
-
-    def close(self):
-        """Close port"""
-        if self.is_open:
-            if self.sPort:
-                self._instream.close()
-                self._outstream.close()
-                self.sPort.close()
-                self.sPort = None
-            self.is_open = False
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    @property
-    def in_waiting(self):
-        """Return the number of characters currently in the input buffer."""
-        if not self.sPort:
-            raise portNotOpenError
-        return self._instream.available()
-
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.sPort:
-            raise portNotOpenError
-        read = bytearray()
-        if size > 0:
-            while len(read) < size:
-                x = self._instream.read()
-                if x == -1:
-                    if self.timeout >= 0:
-                        break
-                else:
-                    read.append(x)
-        return bytes(read)
-
-    def write(self, data):
-        """Output the given string over the serial port."""
-        if not self.sPort:
-            raise portNotOpenError
-        if not isinstance(data, (bytes, bytearray)):
-            raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
-        self._outstream.write(data)
-        return len(data)
-
-    def reset_input_buffer(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.sPort:
-            raise portNotOpenError
-        self._instream.skip(self._instream.available())
-
-    def reset_output_buffer(self):
-        """\
-        Clear output buffer, aborting the current output and
-        discarding all that is in the buffer.
-        """
-        if not self.sPort:
-            raise portNotOpenError
-        self._outstream.flush()
-
-    def send_break(self, duration=0.25):
-        """Send break condition. Timed, returns to idle state after given duration."""
-        if not self.sPort:
-            raise portNotOpenError
-        self.sPort.sendBreak(duration*1000.0)
-
-    def _update_break_state(self):
-        """Set break: Controls TXD. When active, to transmitting is possible."""
-        if self.fd is None:
-            raise portNotOpenError
-        raise SerialException("The _update_break_state function is not implemented in java.")
-
-    def _update_rts_state(self):
-        """Set terminal status line: Request To Send"""
-        if not self.sPort:
-            raise portNotOpenError
-        self.sPort.setRTS(self._rts_state)
-
-    def _update_dtr_state(self):
-        """Set terminal status line: Data Terminal Ready"""
-        if not self.sPort:
-            raise portNotOpenError
-        self.sPort.setDTR(self._dtr_state)
-
-    @property
-    def cts(self):
-        """Read terminal status line: Clear To Send"""
-        if not self.sPort:
-            raise portNotOpenError
-        self.sPort.isCTS()
-
-    @property
-    def dsr(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self.sPort:
-            raise portNotOpenError
-        self.sPort.isDSR()
-
-    @property
-    def ri(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self.sPort:
-            raise portNotOpenError
-        self.sPort.isRI()
-
-    @property
-    def cd(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self.sPort:
-            raise portNotOpenError
-        self.sPort.isCD()
diff --git a/venv/lib/python3.8/site-packages/serial/serialjava.pyc b/venv/lib/python3.8/site-packages/serial/serialjava.pyc
deleted file mode 100644
index 7db4a583dd771da9bec41356d541f83245da4cb3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9577
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

diff --git a/venv/lib/python3.8/site-packages/serial/serialposix.py b/venv/lib/python3.8/site-packages/serial/serialposix.py
deleted file mode 100644
index afe5062..0000000
--- a/venv/lib/python3.8/site-packages/serial/serialposix.py
+++ /dev/null
@@ -1,811 +0,0 @@
-#!/usr/bin/env python
-#
-# backend for serial IO for POSIX compatible systems, like Linux, OSX
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2001-2016 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-#
-# parts based on code from Grant B. Edwards  <grante@visi.com>:
-#  ftp://ftp.visi.com/users/grante/python/PosixSerial.py
-#
-# references: http://www.easysw.com/~mike/serial/serial.html
-
-# Collection of port names (was previously used by number_to_device which was
-# removed.
-# - Linux                   /dev/ttyS%d (confirmed)
-# - cygwin/win32            /dev/com%d (confirmed)
-# - openbsd (OpenBSD)       /dev/cua%02d
-# - bsd*, freebsd*          /dev/cuad%d
-# - darwin (OS X)           /dev/cuad%d
-# - netbsd                  /dev/dty%02d (NetBSD 1.6 testing by Erk)
-# - irix (IRIX)             /dev/ttyf%d (partially tested) names depending on flow control
-# - hp (HP-UX)              /dev/tty%dp0 (not tested)
-# - sunos (Solaris/SunOS)   /dev/tty%c (letters, 'a'..'z') (confirmed)
-# - aix (AIX)               /dev/tty%d
-
-
-# pylint: disable=abstract-method
-import errno
-import fcntl
-import os
-import select
-import struct
-import sys
-import termios
-
-import serial
-from serial.serialutil import SerialBase, SerialException, to_bytes, \
-    portNotOpenError, writeTimeoutError, Timeout
-
-
-class PlatformSpecificBase(object):
-    BAUDRATE_CONSTANTS = {}
-
-    def _set_special_baudrate(self, baudrate):
-        raise NotImplementedError('non-standard baudrates are not supported on this platform')
-
-    def _set_rs485_mode(self, rs485_settings):
-        raise NotImplementedError('RS485 not supported on this platform')
-
-
-# some systems support an extra flag to enable the two in POSIX unsupported
-# paritiy settings for MARK and SPACE
-CMSPAR = 0  # default, for unsupported platforms, override below
-
-# try to detect the OS so that a device can be selected...
-# this code block should supply a device() and set_special_baudrate() function
-# for the platform
-plat = sys.platform.lower()
-
-if plat[:5] == 'linux':    # Linux (confirmed)  # noqa
-    import array
-
-    # extra termios flags
-    CMSPAR = 0o10000000000  # Use "stick" (mark/space) parity
-
-    # baudrate ioctls
-    TCGETS2 = 0x802C542A
-    TCSETS2 = 0x402C542B
-    BOTHER = 0o010000
-
-    # RS485 ioctls
-    TIOCGRS485 = 0x542E
-    TIOCSRS485 = 0x542F
-    SER_RS485_ENABLED = 0b00000001
-    SER_RS485_RTS_ON_SEND = 0b00000010
-    SER_RS485_RTS_AFTER_SEND = 0b00000100
-    SER_RS485_RX_DURING_TX = 0b00010000
-
-    class PlatformSpecific(PlatformSpecificBase):
-        BAUDRATE_CONSTANTS = {
-            0:       0o000000,  # hang up
-            50:      0o000001,
-            75:      0o000002,
-            110:     0o000003,
-            134:     0o000004,
-            150:     0o000005,
-            200:     0o000006,
-            300:     0o000007,
-            600:     0o000010,
-            1200:    0o000011,
-            1800:    0o000012,
-            2400:    0o000013,
-            4800:    0o000014,
-            9600:    0o000015,
-            19200:   0o000016,
-            38400:   0o000017,
-            57600:   0o010001,
-            115200:  0o010002,
-            230400:  0o010003,
-            460800:  0o010004,
-            500000:  0o010005,
-            576000:  0o010006,
-            921600:  0o010007,
-            1000000: 0o010010,
-            1152000: 0o010011,
-            1500000: 0o010012,
-            2000000: 0o010013,
-            2500000: 0o010014,
-            3000000: 0o010015,
-            3500000: 0o010016,
-            4000000: 0o010017
-        }
-
-        def _set_special_baudrate(self, baudrate):
-            # right size is 44 on x86_64, allow for some growth
-            buf = array.array('i', [0] * 64)
-            try:
-                # get serial_struct
-                fcntl.ioctl(self.fd, TCGETS2, buf)
-                # set custom speed
-                buf[2] &= ~termios.CBAUD
-                buf[2] |= BOTHER
-                buf[9] = buf[10] = baudrate
-
-                # set serial_struct
-                fcntl.ioctl(self.fd, TCSETS2, buf)
-            except IOError as e:
-                raise ValueError('Failed to set custom baud rate ({}): {}'.format(baudrate, e))
-
-        def _set_rs485_mode(self, rs485_settings):
-            buf = array.array('i', [0] * 8)  # flags, delaytx, delayrx, padding
-            try:
-                fcntl.ioctl(self.fd, TIOCGRS485, buf)
-                buf[0] |= SER_RS485_ENABLED
-                if rs485_settings is not None:
-                    if rs485_settings.loopback:
-                        buf[0] |= SER_RS485_RX_DURING_TX
-                    else:
-                        buf[0] &= ~SER_RS485_RX_DURING_TX
-                    if rs485_settings.rts_level_for_tx:
-                        buf[0] |= SER_RS485_RTS_ON_SEND
-                    else:
-                        buf[0] &= ~SER_RS485_RTS_ON_SEND
-                    if rs485_settings.rts_level_for_rx:
-                        buf[0] |= SER_RS485_RTS_AFTER_SEND
-                    else:
-                        buf[0] &= ~SER_RS485_RTS_AFTER_SEND
-                    if rs485_settings.delay_before_tx is not None:
-                        buf[1] = int(rs485_settings.delay_before_tx * 1000)
-                    if rs485_settings.delay_before_rx is not None:
-                        buf[2] = int(rs485_settings.delay_before_rx * 1000)
-                else:
-                    buf[0] = 0  # clear SER_RS485_ENABLED
-                fcntl.ioctl(self.fd, TIOCSRS485, buf)
-            except IOError as e:
-                raise ValueError('Failed to set RS485 mode: {}'.format(e))
-
-
-elif plat == 'cygwin':       # cygwin/win32 (confirmed)
-
-    class PlatformSpecific(PlatformSpecificBase):
-        BAUDRATE_CONSTANTS = {
-            128000: 0x01003,
-            256000: 0x01005,
-            500000: 0x01007,
-            576000: 0x01008,
-            921600: 0x01009,
-            1000000: 0x0100a,
-            1152000: 0x0100b,
-            1500000: 0x0100c,
-            2000000: 0x0100d,
-            2500000: 0x0100e,
-            3000000: 0x0100f
-        }
-
-
-elif plat[:6] == 'darwin':   # OS X
-    import array
-    IOSSIOSPEED = 0x80045402  # _IOW('T', 2, speed_t)
-
-    class PlatformSpecific(PlatformSpecificBase):
-        osx_version = os.uname()[2].split('.')
-        # Tiger or above can support arbitrary serial speeds
-        if int(osx_version[0]) >= 8:
-            def _set_special_baudrate(self, baudrate):
-                # use IOKit-specific call to set up high speeds
-                buf = array.array('i', [baudrate])
-                fcntl.ioctl(self.fd, IOSSIOSPEED, buf, 1)
-
-elif plat[:3] == 'bsd' or \
-     plat[:7] == 'freebsd' or \
-     plat[:6] == 'netbsd' or \
-     plat[:7] == 'openbsd':
-
-    class ReturnBaudrate(object):
-        def __getitem__(self, key):
-            return key
-
-    class PlatformSpecific(PlatformSpecificBase):
-        # Only tested on FreeBSD:
-        # The baud rate may be passed in as
-        # a literal value.
-        BAUDRATE_CONSTANTS = ReturnBaudrate()
-
-else:
-    class PlatformSpecific(PlatformSpecificBase):
-        pass
-
-
-# load some constants for later use.
-# try to use values from termios, use defaults from linux otherwise
-TIOCMGET = getattr(termios, 'TIOCMGET', 0x5415)
-TIOCMBIS = getattr(termios, 'TIOCMBIS', 0x5416)
-TIOCMBIC = getattr(termios, 'TIOCMBIC', 0x5417)
-TIOCMSET = getattr(termios, 'TIOCMSET', 0x5418)
-
-# TIOCM_LE = getattr(termios, 'TIOCM_LE', 0x001)
-TIOCM_DTR = getattr(termios, 'TIOCM_DTR', 0x002)
-TIOCM_RTS = getattr(termios, 'TIOCM_RTS', 0x004)
-# TIOCM_ST = getattr(termios, 'TIOCM_ST', 0x008)
-# TIOCM_SR = getattr(termios, 'TIOCM_SR', 0x010)
-
-TIOCM_CTS = getattr(termios, 'TIOCM_CTS', 0x020)
-TIOCM_CAR = getattr(termios, 'TIOCM_CAR', 0x040)
-TIOCM_RNG = getattr(termios, 'TIOCM_RNG', 0x080)
-TIOCM_DSR = getattr(termios, 'TIOCM_DSR', 0x100)
-TIOCM_CD = getattr(termios, 'TIOCM_CD', TIOCM_CAR)
-TIOCM_RI = getattr(termios, 'TIOCM_RI', TIOCM_RNG)
-# TIOCM_OUT1 = getattr(termios, 'TIOCM_OUT1', 0x2000)
-# TIOCM_OUT2 = getattr(termios, 'TIOCM_OUT2', 0x4000)
-if hasattr(termios, 'TIOCINQ'):
-    TIOCINQ = termios.TIOCINQ
-else:
-    TIOCINQ = getattr(termios, 'FIONREAD', 0x541B)
-TIOCOUTQ = getattr(termios, 'TIOCOUTQ', 0x5411)
-
-TIOCM_zero_str = struct.pack('I', 0)
-TIOCM_RTS_str = struct.pack('I', TIOCM_RTS)
-TIOCM_DTR_str = struct.pack('I', TIOCM_DTR)
-
-TIOCSBRK = getattr(termios, 'TIOCSBRK', 0x5427)
-TIOCCBRK = getattr(termios, 'TIOCCBRK', 0x5428)
-
-
-class Serial(SerialBase, PlatformSpecific):
-    """\
-    Serial port class POSIX implementation. Serial port configuration is
-    done with termios and fcntl. Runs on Linux and many other Un*x like
-    systems.
-    """
-
-    def open(self):
-        """\
-        Open port with current settings. This may throw a SerialException
-        if the port cannot be opened."""
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self.is_open:
-            raise SerialException("Port is already open.")
-        self.fd = None
-        # open
-        try:
-            self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
-        except OSError as msg:
-            self.fd = None
-            raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
-        #~ fcntl.fcntl(self.fd, fcntl.F_SETFL, 0)  # set blocking
-
-        try:
-            self._reconfigure_port(force_update=True)
-        except:
-            try:
-                os.close(self.fd)
-            except:
-                # ignore any exception when closing the port
-                # also to keep original exception that happened when setting up
-                pass
-            self.fd = None
-            raise
-        else:
-            self.is_open = True
-        try:
-            if not self._dsrdtr:
-                self._update_dtr_state()
-            if not self._rtscts:
-                self._update_rts_state()
-        except IOError as e:
-            if e.errno in (errno.EINVAL, errno.ENOTTY):
-                # ignore Invalid argument and Inappropriate ioctl
-                pass
-            else:
-                raise
-        self.reset_input_buffer()
-        self.pipe_abort_read_r, self.pipe_abort_read_w = os.pipe()
-        self.pipe_abort_write_r, self.pipe_abort_write_w = os.pipe()
-        fcntl.fcntl(self.pipe_abort_read_r, fcntl.F_SETFL, os.O_NONBLOCK)
-        fcntl.fcntl(self.pipe_abort_write_r, fcntl.F_SETFL, os.O_NONBLOCK)
-
-    def _reconfigure_port(self, force_update=False):
-        """Set communication parameters on opened port."""
-        if self.fd is None:
-            raise SerialException("Can only operate on a valid file descriptor")
-
-        # if exclusive lock is requested, create it before we modify anything else
-        if self._exclusive is not None:
-            if self._exclusive:
-                try:
-                    fcntl.flock(self.fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
-                except IOError as msg:
-                    raise SerialException(msg.errno, "Could not exclusively lock port {}: {}".format(self._port, msg))
-            else:
-                fcntl.flock(self.fd, fcntl.LOCK_UN)
-
-        custom_baud = None
-
-        vmin = vtime = 0                # timeout is done via select
-        if self._inter_byte_timeout is not None:
-            vmin = 1
-            vtime = int(self._inter_byte_timeout * 10)
-        try:
-            orig_attr = termios.tcgetattr(self.fd)
-            iflag, oflag, cflag, lflag, ispeed, ospeed, cc = orig_attr
-        except termios.error as msg:      # if a port is nonexistent but has a /dev file, it'll fail here
-            raise SerialException("Could not configure port: {}".format(msg))
-        # set up raw mode / no echo / binary
-        cflag |= (termios.CLOCAL | termios.CREAD)
-        lflag &= ~(termios.ICANON | termios.ECHO | termios.ECHOE |
-                   termios.ECHOK | termios.ECHONL |
-                   termios.ISIG | termios.IEXTEN)  # |termios.ECHOPRT
-        for flag in ('ECHOCTL', 'ECHOKE'):  # netbsd workaround for Erk
-            if hasattr(termios, flag):
-                lflag &= ~getattr(termios, flag)
-
-        oflag &= ~(termios.OPOST | termios.ONLCR | termios.OCRNL)
-        iflag &= ~(termios.INLCR | termios.IGNCR | termios.ICRNL | termios.IGNBRK)
-        if hasattr(termios, 'IUCLC'):
-            iflag &= ~termios.IUCLC
-        if hasattr(termios, 'PARMRK'):
-            iflag &= ~termios.PARMRK
-
-        # setup baud rate
-        try:
-            ispeed = ospeed = getattr(termios, 'B{}'.format(self._baudrate))
-        except AttributeError:
-            try:
-                ispeed = ospeed = self.BAUDRATE_CONSTANTS[self._baudrate]
-            except KeyError:
-                #~ raise ValueError('Invalid baud rate: %r' % self._baudrate)
-                # may need custom baud rate, it isn't in our list.
-                ispeed = ospeed = getattr(termios, 'B38400')
-                try:
-                    custom_baud = int(self._baudrate)  # store for later
-                except ValueError:
-                    raise ValueError('Invalid baud rate: {!r}'.format(self._baudrate))
-                else:
-                    if custom_baud < 0:
-                        raise ValueError('Invalid baud rate: {!r}'.format(self._baudrate))
-
-        # setup char len
-        cflag &= ~termios.CSIZE
-        if self._bytesize == 8:
-            cflag |= termios.CS8
-        elif self._bytesize == 7:
-            cflag |= termios.CS7
-        elif self._bytesize == 6:
-            cflag |= termios.CS6
-        elif self._bytesize == 5:
-            cflag |= termios.CS5
-        else:
-            raise ValueError('Invalid char len: {!r}'.format(self._bytesize))
-        # setup stop bits
-        if self._stopbits == serial.STOPBITS_ONE:
-            cflag &= ~(termios.CSTOPB)
-        elif self._stopbits == serial.STOPBITS_ONE_POINT_FIVE:
-            cflag |= (termios.CSTOPB)  # XXX same as TWO.. there is no POSIX support for 1.5
-        elif self._stopbits == serial.STOPBITS_TWO:
-            cflag |= (termios.CSTOPB)
-        else:
-            raise ValueError('Invalid stop bit specification: {!r}'.format(self._stopbits))
-        # setup parity
-        iflag &= ~(termios.INPCK | termios.ISTRIP)
-        if self._parity == serial.PARITY_NONE:
-            cflag &= ~(termios.PARENB | termios.PARODD | CMSPAR)
-        elif self._parity == serial.PARITY_EVEN:
-            cflag &= ~(termios.PARODD | CMSPAR)
-            cflag |= (termios.PARENB)
-        elif self._parity == serial.PARITY_ODD:
-            cflag &= ~CMSPAR
-            cflag |= (termios.PARENB | termios.PARODD)
-        elif self._parity == serial.PARITY_MARK and CMSPAR:
-            cflag |= (termios.PARENB | CMSPAR | termios.PARODD)
-        elif self._parity == serial.PARITY_SPACE and CMSPAR:
-            cflag |= (termios.PARENB | CMSPAR)
-            cflag &= ~(termios.PARODD)
-        else:
-            raise ValueError('Invalid parity: {!r}'.format(self._parity))
-        # setup flow control
-        # xonxoff
-        if hasattr(termios, 'IXANY'):
-            if self._xonxoff:
-                iflag |= (termios.IXON | termios.IXOFF)  # |termios.IXANY)
-            else:
-                iflag &= ~(termios.IXON | termios.IXOFF | termios.IXANY)
-        else:
-            if self._xonxoff:
-                iflag |= (termios.IXON | termios.IXOFF)
-            else:
-                iflag &= ~(termios.IXON | termios.IXOFF)
-        # rtscts
-        if hasattr(termios, 'CRTSCTS'):
-            if self._rtscts:
-                cflag |= (termios.CRTSCTS)
-            else:
-                cflag &= ~(termios.CRTSCTS)
-        elif hasattr(termios, 'CNEW_RTSCTS'):   # try it with alternate constant name
-            if self._rtscts:
-                cflag |= (termios.CNEW_RTSCTS)
-            else:
-                cflag &= ~(termios.CNEW_RTSCTS)
-        # XXX should there be a warning if setting up rtscts (and xonxoff etc) fails??
-
-        # buffer
-        # vmin "minimal number of characters to be read. 0 for non blocking"
-        if vmin < 0 or vmin > 255:
-            raise ValueError('Invalid vmin: {!r}'.format(vmin))
-        cc[termios.VMIN] = vmin
-        # vtime
-        if vtime < 0 or vtime > 255:
-            raise ValueError('Invalid vtime: {!r}'.format(vtime))
-        cc[termios.VTIME] = vtime
-        # activate settings
-        if force_update or [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] != orig_attr:
-            termios.tcsetattr(
-                self.fd,
-                termios.TCSANOW,
-                [iflag, oflag, cflag, lflag, ispeed, ospeed, cc])
-
-        # apply custom baud rate, if any
-        if custom_baud is not None:
-            self._set_special_baudrate(custom_baud)
-
-        if self._rs485_mode is not None:
-            self._set_rs485_mode(self._rs485_mode)
-
-    def close(self):
-        """Close port"""
-        if self.is_open:
-            if self.fd is not None:
-                os.close(self.fd)
-                self.fd = None
-                os.close(self.pipe_abort_read_w)
-                os.close(self.pipe_abort_read_r)
-                os.close(self.pipe_abort_write_w)
-                os.close(self.pipe_abort_write_r)
-                self.pipe_abort_read_r, self.pipe_abort_read_w = None, None
-                self.pipe_abort_write_r, self.pipe_abort_write_w = None, None
-            self.is_open = False
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    @property
-    def in_waiting(self):
-        """Return the number of bytes currently in the input buffer."""
-        #~ s = fcntl.ioctl(self.fd, termios.FIONREAD, TIOCM_zero_str)
-        s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str)
-        return struct.unpack('I', s)[0]
-
-    # select based implementation, proved to work on many systems
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        read = bytearray()
-        timeout = Timeout(self._timeout)
-        while len(read) < size:
-            try:
-                ready, _, _ = select.select([self.fd, self.pipe_abort_read_r], [], [], timeout.time_left())
-                if self.pipe_abort_read_r in ready:
-                    os.read(self.pipe_abort_read_r, 1000)
-                    break
-                # If select was used with a timeout, and the timeout occurs, it
-                # returns with empty lists -> thus abort read operation.
-                # For timeout == 0 (non-blocking operation) also abort when
-                # there is nothing to read.
-                if not ready:
-                    break   # timeout
-                buf = os.read(self.fd, size - len(read))
-                # read should always return some data as select reported it was
-                # ready to read when we get to this point.
-                if not buf:
-                    # Disconnected devices, at least on Linux, show the
-                    # behavior that they are always ready to read immediately
-                    # but reading returns nothing.
-                    raise SerialException(
-                        'device reports readiness to read but returned no data '
-                        '(device disconnected or multiple access on port?)')
-                read.extend(buf)
-            except OSError as e:
-                # this is for Python 3.x where select.error is a subclass of
-                # OSError ignore BlockingIOErrors and EINTR. other errors are shown
-                # https://www.python.org/dev/peps/pep-0475.
-                if e.errno not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('read failed: {}'.format(e))
-            except select.error as e:
-                # this is for Python 2.x
-                # ignore BlockingIOErrors and EINTR. all errors are shown
-                # see also http://www.python.org/dev/peps/pep-3151/#select
-                if e[0] not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('read failed: {}'.format(e))
-            if timeout.expired():
-                break
-        return bytes(read)
-
-    def cancel_read(self):
-        if self.is_open:
-            os.write(self.pipe_abort_read_w, b"x")
-
-    def cancel_write(self):
-        if self.is_open:
-            os.write(self.pipe_abort_write_w, b"x")
-
-    def write(self, data):
-        """Output the given byte string over the serial port."""
-        if not self.is_open:
-            raise portNotOpenError
-        d = to_bytes(data)
-        tx_len = length = len(d)
-        timeout = Timeout(self._write_timeout)
-        while tx_len > 0:
-            try:
-                n = os.write(self.fd, d)
-                if timeout.is_non_blocking:
-                    # Zero timeout indicates non-blocking - simply return the
-                    # number of bytes of data actually written
-                    return n
-                elif not timeout.is_infinite:
-                    # when timeout is set, use select to wait for being ready
-                    # with the time left as timeout
-                    if timeout.expired():
-                        raise writeTimeoutError
-                    abort, ready, _ = select.select([self.pipe_abort_write_r], [self.fd], [], timeout.time_left())
-                    if abort:
-                        os.read(self.pipe_abort_write_r, 1000)
-                        break
-                    if not ready:
-                        raise writeTimeoutError
-                else:
-                    assert timeout.time_left() is None
-                    # wait for write operation
-                    abort, ready, _ = select.select([self.pipe_abort_write_r], [self.fd], [], None)
-                    if abort:
-                        os.read(self.pipe_abort_write_r, 1)
-                        break
-                    if not ready:
-                        raise SerialException('write failed (select)')
-                d = d[n:]
-                tx_len -= n
-            except SerialException:
-                raise
-            except OSError as e:
-                # this is for Python 3.x where select.error is a subclass of
-                # OSError ignore BlockingIOErrors and EINTR. other errors are shown
-                # https://www.python.org/dev/peps/pep-0475.
-                if e.errno not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('write failed: {}'.format(e))
-            except select.error as e:
-                # this is for Python 2.x
-                # ignore BlockingIOErrors and EINTR. all errors are shown
-                # see also http://www.python.org/dev/peps/pep-3151/#select
-                if e[0] not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('write failed: {}'.format(e))
-            if not timeout.is_non_blocking and timeout.expired():
-                raise writeTimeoutError
-        return length - len(d)
-
-    def flush(self):
-        """\
-        Flush of file like objects. In this case, wait until all data
-        is written.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        termios.tcdrain(self.fd)
-
-    def reset_input_buffer(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        termios.tcflush(self.fd, termios.TCIFLUSH)
-
-    def reset_output_buffer(self):
-        """\
-        Clear output buffer, aborting the current output and discarding all
-        that is in the buffer.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        termios.tcflush(self.fd, termios.TCOFLUSH)
-
-    def send_break(self, duration=0.25):
-        """\
-        Send break condition. Timed, returns to idle state after given
-        duration.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        termios.tcsendbreak(self.fd, int(duration / 0.25))
-
-    def _update_break_state(self):
-        """\
-        Set break: Controls TXD. When active, no transmitting is possible.
-        """
-        if self._break_state:
-            fcntl.ioctl(self.fd, TIOCSBRK)
-        else:
-            fcntl.ioctl(self.fd, TIOCCBRK)
-
-    def _update_rts_state(self):
-        """Set terminal status line: Request To Send"""
-        if self._rts_state:
-            fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_RTS_str)
-        else:
-            fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_RTS_str)
-
-    def _update_dtr_state(self):
-        """Set terminal status line: Data Terminal Ready"""
-        if self._dtr_state:
-            fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str)
-        else:
-            fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_DTR_str)
-
-    @property
-    def cts(self):
-        """Read terminal status line: Clear To Send"""
-        if not self.is_open:
-            raise portNotOpenError
-        s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
-        return struct.unpack('I', s)[0] & TIOCM_CTS != 0
-
-    @property
-    def dsr(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self.is_open:
-            raise portNotOpenError
-        s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
-        return struct.unpack('I', s)[0] & TIOCM_DSR != 0
-
-    @property
-    def ri(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self.is_open:
-            raise portNotOpenError
-        s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
-        return struct.unpack('I', s)[0] & TIOCM_RI != 0
-
-    @property
-    def cd(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self.is_open:
-            raise portNotOpenError
-        s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
-        return struct.unpack('I', s)[0] & TIOCM_CD != 0
-
-    # - - platform specific - - - -
-
-    @property
-    def out_waiting(self):
-        """Return the number of bytes currently in the output buffer."""
-        #~ s = fcntl.ioctl(self.fd, termios.FIONREAD, TIOCM_zero_str)
-        s = fcntl.ioctl(self.fd, TIOCOUTQ, TIOCM_zero_str)
-        return struct.unpack('I', s)[0]
-
-    def fileno(self):
-        """\
-        For easier use of the serial port instance with select.
-        WARNING: this function is not portable to different platforms!
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        return self.fd
-
-    def set_input_flow_control(self, enable=True):
-        """\
-        Manually control flow - when software flow control is enabled.
-        This will send XON (true) or XOFF (false) to the other device.
-        WARNING: this function is not portable to different platforms!
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if enable:
-            termios.tcflow(self.fd, termios.TCION)
-        else:
-            termios.tcflow(self.fd, termios.TCIOFF)
-
-    def set_output_flow_control(self, enable=True):
-        """\
-        Manually control flow of outgoing data - when hardware or software flow
-        control is enabled.
-        WARNING: this function is not portable to different platforms!
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if enable:
-            termios.tcflow(self.fd, termios.TCOON)
-        else:
-            termios.tcflow(self.fd, termios.TCOOFF)
-
-    def nonblocking(self):
-        """DEPRECATED - has no use"""
-        import warnings
-        warnings.warn("nonblocking() has no effect, already nonblocking", DeprecationWarning)
-
-
-class PosixPollSerial(Serial):
-    """\
-    Poll based read implementation. Not all systems support poll properly.
-    However this one has better handling of errors, such as a device
-    disconnecting while it's in use (e.g. USB-serial unplugged).
-    """
-
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        read = bytearray()
-        poll = select.poll()
-        poll.register(self.fd, select.POLLIN | select.POLLERR | select.POLLHUP | select.POLLNVAL)
-        if size > 0:
-            while len(read) < size:
-                # print "\tread(): size",size, "have", len(read)    #debug
-                # wait until device becomes ready to read (or something fails)
-                for fd, event in poll.poll(self._timeout * 1000):
-                    if event & (select.POLLERR | select.POLLHUP | select.POLLNVAL):
-                        raise SerialException('device reports error (poll)')
-                    #  we don't care if it is select.POLLIN or timeout, that's
-                    #  handled below
-                buf = os.read(self.fd, size - len(read))
-                read.extend(buf)
-                if ((self._timeout is not None and self._timeout >= 0) or
-                        (self._inter_byte_timeout is not None and self._inter_byte_timeout > 0)) and not buf:
-                    break   # early abort on timeout
-        return bytes(read)
-
-
-class VTIMESerial(Serial):
-    """\
-    Implement timeout using vtime of tty device instead of using select.
-    This means that no inter character timeout can be specified and that
-    the error handling is degraded.
-
-    Overall timeout is disabled when inter-character timeout is used.
-    """
-
-    def _reconfigure_port(self, force_update=True):
-        """Set communication parameters on opened port."""
-        super(VTIMESerial, self)._reconfigure_port()
-        fcntl.fcntl(self.fd, fcntl.F_SETFL, 0)  # clear O_NONBLOCK
-
-        if self._inter_byte_timeout is not None:
-            vmin = 1
-            vtime = int(self._inter_byte_timeout * 10)
-        elif self._timeout is None:
-            vmin = 1
-            vtime = 0
-        else:
-            vmin = 0
-            vtime = int(self._timeout * 10)
-        try:
-            orig_attr = termios.tcgetattr(self.fd)
-            iflag, oflag, cflag, lflag, ispeed, ospeed, cc = orig_attr
-        except termios.error as msg:      # if a port is nonexistent but has a /dev file, it'll fail here
-            raise serial.SerialException("Could not configure port: {}".format(msg))
-
-        if vtime < 0 or vtime > 255:
-            raise ValueError('Invalid vtime: {!r}'.format(vtime))
-        cc[termios.VTIME] = vtime
-        cc[termios.VMIN] = vmin
-
-        termios.tcsetattr(
-                self.fd,
-                termios.TCSANOW,
-                [iflag, oflag, cflag, lflag, ispeed, ospeed, cc])
-
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        read = bytearray()
-        while len(read) < size:
-            buf = os.read(self.fd, size - len(read))
-            if not buf:
-                break
-            read.extend(buf)
-        return bytes(read)
-
-    # hack to make hasattr return false
-    cancel_read = property()
diff --git a/venv/lib/python3.8/site-packages/serial/serialposix.pyc b/venv/lib/python3.8/site-packages/serial/serialposix.pyc
deleted file mode 100644
index f008f2bbc49b8a4a5688d6d583ad2d0a56787dac..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 24286
zcmdsfeQX?Aa^LG2a>$`5QKG01YPC{p^)=E;qmR{cwOZ}2$RR1sNg8T<MxvHJdu}-0
zq?#J`P~AN%(vj@-?&1;{27DJ>f&e!B5g;&ZpW)yxiIa^#Hnwvxf}9awV8jUQ#OH%A
zK?27}V&tzRm*1~m_e_(bZhaDI7@;(;U%#&RRj;aEy{hU?|Ie*`XMgU0->$3ZZwIbd
z@C)+YO4;~tsD@HA?YyC8jJQ0dW>RrJt!C13zDvz?#rbYE(;eqCY9<rsd(=!%obOdL
zy^>F<MpiBMshK{txJAuuQH%X*re7^?RWn=F;x;w2O&NAtIRk1AgXmHpDfOXJ@6K#j
zPPbavp%w;tKeJOgJC)t7Ogp3Qr<8xhh$b?mW`>lFu6HRLo$gk4R?X~DHhSEvZ1gy+
zZ1lKK+34{FWuwRa${tWNFDe^-Y?p3#w7Wf^ynkS@t3m0eXmo&fCV}1;pdpNBmjL<+
zz}-o}X#v~=z`X=q`tf$fVX63wiHiG@6%PpD3#hnX0KdI@#xJUwgNYd&NLKxpAd6KG
zO4Wf>XBK7>@M8ho2EaoCcrgL^QWEfs0=N}`hXt^f06dZeyw_f*qXPJ&3BY4Xz_$gE
zcsVYBUrhk!l7Lvz_Bx$NJaA0qfb>o(`(^bZNcE74N=_;Jw3NIQm*kawMoJFHC1;g=
zPD+l%CFe;XZ0BfP@(PKCCCB2D3(9^~N{+`RBg%eFN^)_@MP<J(B`4yNOUiyjN>0Wl
zmz9%~l9%I>H<fcjN=_-~w9M-*^&!aoSJRl|LSD_}l{Xjzzpd;m0-TRaMwLA#C1;e=
zr4}%|g0jci!pyl&iE~U!&L>KaO35p6I}^&Dly)w}C0CVwO-f!>c2Uh>zMoM}pK=bU
zImn6Y?e%y~**BE)nsC$2cIidsysqq$Ebz&0JjS5xDP`YM_B+byRSUq4C7CyrU6#yc
zWml992EHx8cVr$$&kQj1mU7-yRS=HOT;c7)D8+-p954{&F!^cqp@CwEka4wu`?~^+
z`E~Qb?$r<9m4}$Q(oeqcP34K0EaxC4mHQq1m2wcCD(pj2c6_(i7^?+NIMBYGSgt!u
zq1*JrUcxo2vn!z!gxhhm)bztrGn`s-yb0gO4F&Q;-wmCLyXZ7qp)MUl>8(aBoNM}v
z<t3-?&bf7VQb)P`8A!+Q3r-+$AQTPdA{BWJu}NWV5cQPQDamvztDH*%x}HM9A16`3
zFBm}*Dz#v!1vFqtKCMDfPqzv|b3JM<t+9a#p*dje14G%Ey);+~ehkC0o8Ixzyzez1
zn)mPvo2J)VoOOIN3|9iP>6zg@H!y>hAaoY<eTU53fn(M@(^+0>xOF!)mulfXGv~~k
zXKd%aGpJNPcfxG?X5e_XuIqY4M~#R@^JpTxhbCI#JwP?*G|XbtZZ(`seSPRCzZ7B6
zeA7JY_cepOS6g)SO(5&G)C}C^{L+f~p5q5>7JxxtU#$@|&6>?_9TTH*>y9Z^r56W7
z;-Z^eOH9EwAKr6(hroUHX3Gm*Z{7^TnjZ!x1}u%txqc8P>*f2L{CwU#{=|bzo%x?V
z-Y2cQKupb?1&$i6`h9by*)r?E+`JPe=WO~d&qLSwe7-NZfED%P6*wI>Pe-#@tSv2Z
zc(ya=dXC**mKamHEJ=Y>!iCE48rqKUholuDQz7XXJR})415gUO18#K<!A{tNvO5!2
zxj0n{cOnm}FD@=MoJGeA9b3pe$Ldl!a2j*r7Tgi1RZTcK+$u?e^T_4T%(mQyeWu~g
z<{PfpT0XseailtO;q>|ZYiIO|M3;C~h2eBtRWM<M0yGtHV#>&FebHz$1BW8aKrRI{
zfDIC4&Zni|b);U?JB`Kl?3!<zv$dA(*TCCm4FupdvBa$<PGLRNl4Y%JNMza;#f2a<
zZshsry9-TLA&II1MMkYrjhjA)2Lb1xzPAY<K@F>X;o_^$GB-}u4^WvyB2xs<KSLr-
zW~dtmw>u>DXl^;KtKhU+B{^2BBBQHSEfsJ(2!OHC+vC<~WujV`DwQjvrApbN5VlC9
z7E#z4=JQaWMV5IHzn~XM#>k|yJF;n)rNT`@!^M-8Q}3fhxi42vU2zqN&&^kmoMA$W
zak*?R8O#;RWU_W=sH05&$hc$p1u0Z@^sWHSP_+9IP&8!sh>fkG3m2&E8C;;H_u`VJ
zmOKI-84B_Uv>&KDBhZYYZjIPGr~!}IP=tqYfo{DU7wpP=ae+p?4;LuY`*DFDeE=79
zY2tE7*)QR8SlLH#IjZbqxExn@4wn<u)<&SN*{5(ht?WE5XOw*wmvhQKj|+6J3%Eep
z7{LYl!bM!5LR`WHD#B$o!tL%&+1xOvx8m*Y?ap?01-QVrh(u6HF{1H#ojGF5#pWKN
z_w&qgdECFtgtX-T4iic;_Y_)ixsvW(tcXiF>Hb43i%TuQ?FEcW`Q?5NPuzayJ^``0
zTbX<RC=#-RtI)AaB6bxzaSg7w`X-W;<bD&ocv^BFr7<eWp=r09IrC?c%ShS3>cyxe
zw|yHrXYR__07fNcU)q6DG55J|?Z&8>d;g;Y7!`9rbMzQS#oQ-fJB?8>_s8?EVpPnj
z?3*3^fRra9krM;;JTj=#?JkS_Dg`WU@6|`Ks`%@OHVe%qIO!QhxNv3@EhVKFnStvh
zWBX-fAg&i=grM(vP<dJnLEU|vQY&*R6s6`7AVi~i1nniQ3|znj5dOp9#f6L-xS773
zDC<#ExHnW6%es|3%Bah$+UiwNThrbN)fHyd{XXUYf-)YXd59e_78-bzrfy6X6AF`O
zsJr0Ba*kwFLSsO<rp_zO3Zn~Mk)(p-NG5A;16v7nDTq+B-U`CzqHH=QcO5f#G&pey
z8cU8#Aws3*`?VFx&DFiIAvw2MM~<z}*|IBF3Rfp8<@1sc9e>fq4leklWRxv@Y^ri?
z!is>)ZQ$aR)=oLTJGDm3(YrX;L$))E;#IVV+18xQ4`&<vN%E`|K(XxO7qD@a8aC3Y
z-KimCyD^yFXAJ25Y!yX}1F=u1i2wUEiV%hNepdPaiwg&u@MpNfASodeAqj8C>LMW<
z0QV~YZzi8)Nk6NBvzo>L3^MsgN#HF{0&fxEuwO<3VcZ3R1~F-3jEc7<i$R<oXf74C
zyP8r5SW2p&_Kty4w+p4dZD>k`a0jJ=O!Z0V2{N@_0M<2?l5E}o45``Kn1cN%TTP`}
zU*OIxq{&sY2xW0Ev<@&ih(vbgN^z=iRVs)USZaEXY~PJ$b7{6#zaQ=fWO>4>3QX0y
zTOGe`6-!sEmAj(cLB*~%ocEkY6^eE>Tn@Q?C*UjP>Qt#(o+yp41MV+}d!GOwovffc
zsiC)rP};PeMs20a?q(fy<v<7V>~ILxJ5OqJU?%;548pmUW!x6Tzp{=Y$#qzTbuIF^
zMecZhHsQ=az%O7w$^e@fyN!M$YwS$zSe5QE_NDp^vW}=r7Ex^NVM1(djw-YdE#JT|
zm_(An(0ZQZUtc<#&TbbuRbQEZ=z4WDDt}zDG5i8Z*;xI7Mk8Cp2$%yK!w7f@5`6@^
z59odbx(`&J5$HZpeMX@BK=m1c?gQ0l1iBAYpAqOjP<=+A`#|*(l|yWLIAP;FO}s@r
z_FrJ{mVH`*MfC10JGSi3iaWO6ow;Mn?kqdD?9Pfiw(QQbW6SO=JGSi3vSZ8c%pJRZ
zVBus7oGjG|y*p!yd-M*?hoyjIC_8k$xp>qTuGNIb%|J`+joYPv32nxDxRCiegw-K)
z$vx|qKyvyicE`-q$f++aikoa=O_*C|1G^4z`Qz3rghIvN5j`1H@)0sAt|}k5@l0F^
zp4ZocsOo7Pw`xbvp5H_@=&R@{Mljbm!MU8q2IBTBaZedTlw`f72U>fW^BrfCaM{)<
z>#dr-nHuFkjVGuKv0!Z;Dt{&J38>_WLc|tq2M}AuRHf^E6sa~@a#e*aDJ$2IrIS_*
zUFt(&^<miM!0S*6;Bawz#73M}!?=fZyWg$+&rrsZoO@}!1Vyv!zbr-nm94@j7*s^i
zqWp@+nD6KsGGO9Flv4tqN77d9prt|C|4<ZtRE6m>spS(tU2rG0jg(rEA#02Ec3qu>
zQ!h@HVY4dVnwS{Zv_bhQnyqZt9X5Mb=|zS1Yxo6SNK|T<Ax5_~Bxq4~i&owe!x~W#
zz)~8Dm8=;oS0j_9Mca<pE;=K7ZsGbH?5!6`#>l3JQ@afzTPSCn#Q1F?YKJSED@1>n
zGowh~bk6^J+*8I7<<|Ax<u<2(FB=d!puonSzR|Z?7H0FgP2cJNZ9KD0$Kf~Po`6Fx
z+P$UC!eE;Mfx)Bp(%DT`mi{1~*rucK-^D!vg(5^+UNd+;Eb^!Ug%g5UZ$c2n>#Lo_
zWnH9tO>`>JBbvUwDORFCiYL11DE-5@C!mzfS$jst{uIr!t-T9LYU$1@8?CtiNj#lR
zN8C5#o-)Rh6v*vH>paj`kdJJM?Nfv<lLt(mb@%0w;oGcFRAK?yEsyFqVH0zARj}!{
zOU8<2clVl-g1cu`35;XzUY5{sC+$?nD^}vps+1FVg-Y2q0hufswcIPKi>%UB_x;sH
z<7LZL*flz%s}{x+H&#(w>oAjI=^c463D27~F*@$PkR0*U?aDju4wi5aDvGw%Zl^qE
zU3ZTs!3!+Op@e`}L=Dg`@Ad)`k7M`+U1(4*Ae1he=CuPFrg`mv#=$!+N@=$!tUA00
zDl9w@;*0nQc^t=k1P1<yUdiBOo|Oy^@_mxQAzj=QgokZxs}$nMzD+XlSqw-9fg(8L
zZ)cv0@(#Jx!9BP|00o{7#!nGagj*fegQr7sI}|^K%VU?ciTD$J_}`-(L=^2&9K*2W
z_ey>rmF;0-<L@Ie@u#t+eZ}=gEeOn8Q|01a(~W(h;?K^nhHH9r?tBY2UizfnppOl~
zzwVe1=?ji*w&HpgGjHCsTAujWZ_qI+4;E|QirIuu+Ba`|Czs8Jd*6|Ev<E)O%T1j`
zz!l`yP{1!ZgA(e|5biijz_58hVe7?O0*N#Z>ZfVtk4U+kLUcLcQL);kR!&oMg$0%E
z^hmx}(ySWegFZC|tzE-TdvCxbxkXHpKM&(M0yWz0pkG>IvEJ!uNVpYqdMY-juWXYi
zh}MBZH|?EMhGDD>NoV>Aj!bBB+UwyHF~G;8`~be(K6Mvi8yt!5VY>>p7##HuX)v1X
zpb8F2>CR;7klbLfWjRj-O<<4f#6O02=p~m0tG9d~UT+%l#SfY{D~yF$tgXO-?;}{E
z7A=1}a6}e|ExC+qa3b=ld2}()IwtKIj-3zk=<^n%5EkJY;DdTZIdB?iL#2tRfjWW(
z@T?WE3O8@5f&tVTzEiV7CTK1%#uUUaG;DG9vP^e-G@v23lw(a%A*%FnTPJaAk$gn(
zxIvXQ#I&o=E<D|^NFK9B5c(oNrmEKXv?VfUs#=;VR4VU^F_<@{u^Ur`>r!Q^tep*{
zOvm>zb6Pp7zSEwgj6+6LZ#02h_E_;-j#RJOfp4QnsnlAs;V-G;z6#%c7(rl2b&M(r
zK?|>jpxxSc&}!B7mReyI9*sH2?`STv^DhSToo(q^cckw_Ps2c@)K^^tu*_!pOQns|
zl0TeI8{1$sO&dc-I^Bh*J*h0xt@0BV-i9{#6Bhn;oc2k?VBr_mXJM3s(;%0-;3R{?
ziqMeLfQJ9$UGf{sfzPO1yB`1thFCc#+@+aYMC)U~b*azxsK?#vaYj8xrdK`As>glm
z@fM|h4&eG8;qkA4$NLqvc?kVS{Ylr@qcx&p3N1a-f}>CR+@i%tzrJkMmu>nopfB6i
z*uYJ6zl`v_{c8OCPpQXS6;>Ej@(4l#QFIxDZ4P!y1pYzB!2jt-8R=-Jq(i#NUD71x
zi&!X3W4EMx^s~MCGAtl?E*)XxVn=_+h-&PEGY6;v?xN>edH#>%=P$IMuRzwy$gtB9
z_4|Pyu94t!+WRsj<%@#FA4yTp?G>N{5$JFX_uzw6SBPLw_?aFPE^2ZMdyQaLFhjk%
z`zaqm3)9{av~EhRX{lv06d)dj$o>aEl)4KE46?Zo-uR&uz}Epm_jf61qvbrr*<m3u
zotL;-Ghp|ZQ_;i2ii_+m#gDhi<KK-RAJLEBi60Nh<3EcZAJvb~$B*IILgW4EsPSX^
zF{X-f!f_`fh+MI}Ij+K-S~ww<#^OpR^>Dpuf!81}3y9qTkwL$jfH)-(pI-x^dmfD7
z;+{1b=`AuJ5e|oQMuu}%TKa>yCCzN-1q_J#Gigghz9NvlUD0gMM|jpubWYFx*Anm-
z1pZtM-)>nZ^Q8pfs{-hCg$VH6u1sh}M5~vm_?jkr3`;6&T<K9=6yUF{sr;4Im04@`
zusw~dp=cNpt|ETfCH%6pn^<~X`G3(BG1etv#Wy&LZuQ_=_u68z>*WZ;o?b3gf8_}{
zR`+(r4Bl>4xHcNXZW+Rl$PnIC{!(`|{I>+p4?gbP3$=T%$GpBrD&jfDj*34Y1HQec
z;@c73L2^Sh3Wo*X=w=?F;$6!B({57nFrP-qfjq&@qb-7jD~M4LMH`$M^ktaW^<K=d
z-adMG6ZIhRb-hv4gJ^_w6IuHxs~$o0Y*F*Lh583I?@@+m9Fv8S{ePiAOs!jmK4uOJ
zGD2@9e=oy%kF$ho7@y&OB7Xd_Jf4gSBM4M2=Ok|G6gIRn;~tuei!INsYjt?3<}=a|
z0h^3oq=o@yhx$c6c$qsOl%1y65T!<fBmh)1->WrT+nhr*1wtQ#y6-N9O<!A@slrGQ
zkNC0+Z3U>UW=P{yfkdyEC|rZeaziv3=C4lxKR8I;F5D<c;jK~Yrgc3?qi_s$Xn7xd
z<>H02XGQfYdU_~~%#$DvH0<lRA_+4hxC9{uLu@sIuHUQqX2bCa9K4ixfPj!Ci42v9
zKLiO2jtFMSDTG=~+z1fohAVugM|^j*^sY>)fHNu%reawxlqROD`riExDhJe#;uhXp
zbY%$U>e3LA%WSr!wIh(AvKmNoSDB-;KcOtr`VEzeu5w02S6LZh&)STA2oL3G9M%!t
zS_`4SMd}~cm#8T~JsiCug$15%rLb5Sh2|*gA6G=4GNV^U7D?ckE8P&dV!3!#*PXaq
znJ5Vw?$rY6k?WA`eF_J*iZqJa1xx1&7Fv>pZ<iIXmZGOcdCKvk3<qdy5m^h=uP4_I
z%M7=nXcV(_XIr5TrV%H+=*HKb6;XgCa6q~$l#4SHf*u`E?*5=7T4<qsF}l7MT}Ptp
zs~VbAg7D$MqLmZjBVen_)UC0ighxzh#7ap>e|GX&_109eRH;rD?@X+&SDDs$E|zXV
zUze$tD^~HA*1a{U2|<A!ij{Y%+Ut&RKT#T!8puwKk0+rf?qDrw_ljz*d3<x!x-QGd
z_+vfnn`MB?(4s21FH8smtIJJqxj8qd7yK?LMAqx>)a0bKgg&f!CJ&hSNCfQ8&7uao
zQz_omxDM+$1hfgGQYeGirp4hRBd>NMQFZVr*Hj1hZb44RY{`mC2V@}`$9p7vSsn<Y
z`Koll@ws!2+PpwC+qrr>*N~hD32?k)3lf?-%VT`KZb9wWb0O&SpH61c+?za|{5CQw
z#nVX!@gqnPUy?Qkjf40NAs{QAdKD*<0po?#e&aB%JNU!N<p4_4#$ID<dMB<saknSc
zZyZQ(!}IOQUutJ+5VZyw+GT9V-7Z}B;<rso_82c2FW|Ss*pb?q<{4>E>LAWRds4eF
zsw`@-N4a+IWj`sM9>PfZ?_jzgFbEi<z~_(nlJn9yGTfJ-)LxMc_Af(@LKhg#2DdAp
z>MaZpa8ngS2v&)C*bx*f=(tD;x+w5GD*HxB2ieS^i-aU3iCc9fve1)w-@p+AxzNq?
zuNhnZEv^~+QNR%~-LGfPS@WPQGv^K)%G@|Z9Qh<h65BXV1Q;4jIGnFIS)r2*>(@Ob
z4Bm3WmXFskV4H|u^T4|i@|p|66vf(sE!fona)37V0XlEpMxV0t<|t^_M1@%vM?@CV
zw$vYV{3Z_MTKMDIs%yS)c}oZnOPt2Jpc@chPK3E$^<mAWq2}wvA(5rJ_8Q_5suO)2
zH(6Cs_zGZ%JV4^;7Td^hzWq?~5WT#GJ_0Ce&~AW8?2UfTSXm*5Ms(FpFE&IG{<ED7
z-PWJQ3gCYi|3h;N=G86G7-TCV4G9Fo!ve+a?#00lDlD|J;3v4lV9n55WUNck-iAjg
zF{U3JXdBzUje~dwfv|YJr=NSm0*+=-_l_ED0D5I65fS*{s3A2mW}MJ)t~`R^L0uW9
zg5keZ?Yn4Un#MLkMOh-@g5LucY31Ud1yht6U{8z4XwFBhE9ooowoTqF&Y3kc(ivbG
zmAF`#xL`_ao6LMonhgiGRw_=lx+sga!1SF5Exd;XGnhF|Ln_{oX*U(Zw%TZzvyEo`
ze!D5Y%+ruTw5vWr?id8EXxg62iD0!L5A<6@z9W_|fxrtl7!hK52@ZA$ks%X7eZ@dv
zpsJa<sG98tP(M8fBgZ>BKFoWK(8aqmX02XlBhYEt?%OBCCoJvFNvJT?us|~x1G_8{
zJ89%(qal0h0AUtEos``Juil^^9h2FM^0r1sUXVSD?Q2UPHy&p>MC_yWIb^LGL0C93
zdUdo|vRb?+YltM!3{J1LG{d#EK8YdN=!*Ctsv8*w$@YJrY<mnDm7$p|YwW_tbFw>Q
zbYT<7z`%x$B0Y!@$-%Cj*q(%^IayAmfM4*_PvdEQj-hQV=Do;x2HysbOE8}Ofbb`7
z!Rt7-{eZkb2cFi<-KF+`qdkaKVeRF-!IPQ>{gScr^#qIKBnD2=jE#o=oaZs1n({%Z
zz2H7@C~HEX{1XP#YIcW8vVhZ@?kyWh7C=TaMVsd2s29A<D0S3&@Ur1uR_j*8DA%tD
zlf1BTTgE`Z90Xc08{{qmDbo+;A!_<XTHJvV%J@JjDT0`R0Qmw0NEXs3ONjz`zW~z?
zq|X-(RDnoAc_$wE!50nGyo=v7(JsO*vbmqfYE895*k^@F=iT>Uv?lH0{X3uUxit|b
z^Mnu)29eX4ywPTA)-iLM6HWwVo#YcTRVlZcp)76$)~_Lv-Kr|^ZPq!-a&8<HFJcb2
z$XZ$hV7c|{Oh9I;!${U|;x<P@)aoPQC>4ZBw5As>BivbA)FZ(q52N=?(O1Kn3$3rQ
ziGPVi9=`Yd`UJ=Rf5=o9k)b}3g*E{l&e)yGK(|PP!7^!T7+K>uG_C$L(*dIon%h>%
z4U)|`TmFbSVKcJmx?3k~(Ja@#8xVP<S<M2T0+xT1jaG1vZ+*&{p3W_^IlBNs7GRH{
z+5xd#uLaI2lY6<T1$hkuo)~S*cK~tWAkaGETff}f5uMf{bSuZ2u#T7gT<zo7Ky^(7
z<{am92&mETCUz6YZH%R3j8R|v?ihpO0qp>C!|33RuPqiD5dBcd$SPVBJ7sd0!CQ>v
z6JjR3R|~nNMp|2>uO$^&jw6W<8FXjos1%BmH*S}&Z6I#o^j7L*8!bY58-<ntO$#j{
z(ddC4B8i{cEcRGphgwMN!;4_}V(x1EwTWtdJhmUNi%{zuL@iAv+81A#+GtG5JGk1R
zrKb>iw9dAXD>O&l1%LnMZP^v^ETQS*=2M7I^imMsE@+!VgDLPXsV1l)iIH9A8{M-|
z0PfRYX+za+dT@zCeA%ZWok;W~*M`O;-Z)d<tuRHtw-ISa4)PA`wg<m1j^(({)4XR(
z=UN({!@v^f2#UJ6;pY~dV#;8DRq62c)u?`wjz`eB#;|{o!aEt#N_5gno-AF<=;c*N
z2BQ<lm&^h_MBq0Yfmyjb4$b!-_DJZ&*eg$o2JF|oU=c!)ln(aC+tYzN+i*H))!4+&
z4CPRo)GpGsN4Gn8ZcQWEK>io1tw!$KMBig=RCZ;t3$;<nJyZ6U%g98id}%e(phf|2
zv{b{Dm&B&{{`jCHIZvP!TA(H3!ow^7q{dc&U<wZwPfH&s%t{mPd(SS3zAI}kZwd+J
zu0_&Sv>0whqR+RmwDNdsT|>zRqRqO8_O7>a1hF~1X*fEKuAYvgaUN?be94gLv#9hZ
z@znOne+r%uQ?)60n#16!%IRIVgC`VqtR!5VPZfO7%_F;soYFx<)KtZnGmO*M75a42
zu{5M)AugUmSb8^#$SPql5#6wTrdx}$NjCZ`O!#_(_0O2xK+=(J*2lcX@44Q{gc1%z
zV;H<ky!EoRG_{qz>)4kz9&_Z#?}9lYH&UZe+H;|93O#KK>JXSx`)i0gi}JsS?HE3!
zrvF^1duKCHN0#(mz9{n7jpzz6s<=33j>9VnOG?MU`MvY&t<Az*-G1=tn0q#J@Fk4-
zdoc&E(y~9z9*oG-wL)#fnUa1Q3@Wzz{tY6EiUh5`PihvlIjp}M!2W?#D@^D(gNc?w
zW6dgkVlV27?~|M1X^FF=9j^v;>yX|S6X#BOUs{d?J*YN`my#=!H?%PUK8KA|7eq70
zhi%082{G^iF_1wY`mEo^0Z;FuUD3DvBo0_Yg`Z%-k0Xf{{z;fHomxO1K@g(;R?{lG
zF3z0LmOOlBN#Z57A*Q2%PLEn8y!CxaAM58@9<)~pj9rC6npSO>QF@HEj6YEn9BLmJ
z^y^%m{gb%eK&49zp)^N$&A-(~pgzdsR?HsUIR$~&ky!_UhVl`Y1M-OtAf4kpwbeBb
zKwYcO`FsN+M)}Q}*TSKGg(oa3|K?l+ai*tDe5%SbgXUcLu!b)dNns2D-QV#@iV0h`
z#Hos5oW~dwPE<1oFN`B!=AtLn%+1kzb%My}F<D0(YcuwSFW?g_BBmJ<Y6ur;^PxUK
z)BX%o1pK{x!rbI!M`lQ&p6ByxLVP&^-r*=jltZXS*!&_Xfbw74pfgm!|7xh<pQF$3
zP6e=<LEOzZx#80s7Lx^hCAN?S*mV_&v^nUzk;(=!>AGud{U=N+xw=#B)ty?ky4HUI
z;PbER9<;)BjVvX}h5e}~7dFRFWOUx&)FBX6yIHSREe7{mvrOtp#JIEMBWTGFS1hiS
zI7GB@`1g2Adzbb5O!$hJ_3xS7V=~9&KQj4aCf{W8CrrM@<WHG=n~BZjzcTr6NIIyH
z+_Q!#-$he{5bF|fp6SM?td3+qpY0py?av{X&1SOMeq6FW*`9%3`PVnlBc)sAvxv9&
zoxNMlM&oJkj_gARPW&Fees=^1rjPJ;g?wg#ax)-SNZ4!#AHhL1yY{55eUkzoniG3w
z^rA!jNj4ZZP){Sjv7%+uwdO;7J%k<t2tU4Gffyi!%EKV+BkS2X=fj6EXCnT*=?ACK
zR2`q<3(Oj#$oN%2VT_Kmj?fS9G04mfkBcFd+g(n+^mn^Fb~^H8!g<|j&Cfgb2|bFZ
zc$P~*xZWe^Tf&<dd$|Kdex5YlKsrd9_Fm+%Wgu1oej)6_pfvbu5eka57r~mi@ZAes
z^t%@Z&Zan_(nB?FEdLR`KdW5SSB&M7G$#=bd;=pTU!WQP{t@+A_@v;y5`VL9e|7U$
z{4dbL0WZ#nI%@a}>cJP_x)CRj9vpga_bAS5j2e5}cKWnXN#3<UpW34~6yIXJ@Nl1x
z-p`1h&dYr95gR=l+-6k24}Uq_Mf4caZH@@s$mz_j;r~ykGv$W<I8Q)nw8s4`^lRqG
z0Vhg1hTv)A=Sk+sT-L8Lp;HQr$*(Xr8X~KFXWoUwT*qJBn!0fV;Zf8^nVqoo7owQI
zcKepVGhezhdP6*8)^D&;P_fcl>nF_p3nnzZTfc>*<07_xn`NIc`5#QEoQY=y4C;j&
z^y)pE|0)HziHyoHT!^l$m+{+`K8*09o#}&cSsgHr8e0tgv7Yw(ht{8?iVSdrgzA4s
zdtc^Yh;a&4!5}_X2p<!6jzN^l_u`~j9O?}CqfQfr*YzUX4(<EbxRIraquvM@z2QQ#
zzvna%l*F~hr%?4Z=+hCJH56)N5)~HhniLZfn-G7G^*hYb0E~EObShu?%<D@FArck}
zqm{;lB9h{?WVqTfC*MP~vMl6ypes4P_0xpj&%|VMgvnthV&}PloOIavq|-!cbnM2&
zxRoc+StdNRTHHUZH<-N7WReL@tzuZUip+h63H5F<idi?AD>0#=$Kt`;qTRy!VJ4iA
zRY9WJ0kKBfvi658{|`*s)^6)(c*`Bq;);qMAmJ7h#jDpU46?L-lI4G!$;V7=Bw|G4
zJ5gK_SV0pTKbKYThEK0T0TGgu23>Dj$0cnH0SaAR)}O|Fi{9<v%Sh<hP5eWsUM{`+
z#eo#uyJ-oe(<$7#_?H^K)t?&Px!oA<GV!Ae7-d^|zvkDyJ3EL_KKw)E#b8&Im-_*u
qAAx^^{OL56Ne_QV{lxCWbSUEs6!MS#WySy32gmYO<3)VJ>i+@SpFHUR

diff --git a/venv/lib/python3.8/site-packages/serial/serialutil.py b/venv/lib/python3.8/site-packages/serial/serialutil.py
deleted file mode 100644
index 7d51752..0000000
--- a/venv/lib/python3.8/site-packages/serial/serialutil.py
+++ /dev/null
@@ -1,693 +0,0 @@
-#! python
-#
-# Base class and support functions used by various backends.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2001-2016 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-import io
-import time
-
-# ``memoryview`` was introduced in Python 2.7 and ``bytes(some_memoryview)``
-# isn't returning the contents (very unfortunate). Therefore we need special
-# cases and test for it. Ensure that there is a ``memoryview`` object for older
-# Python versions. This is easier than making every test dependent on its
-# existence.
-try:
-    memoryview
-except (NameError, AttributeError):
-    # implementation does not matter as we do not really use it.
-    # it just must not inherit from something else we might care for.
-    class memoryview(object):   # pylint: disable=redefined-builtin,invalid-name
-        pass
-
-try:
-    unicode
-except (NameError, AttributeError):
-    unicode = str       # for Python 3, pylint: disable=redefined-builtin,invalid-name
-
-try:
-    basestring
-except (NameError, AttributeError):
-    basestring = (str,)    # for Python 3, pylint: disable=redefined-builtin,invalid-name
-
-
-# "for byte in data" fails for python3 as it returns ints instead of bytes
-def iterbytes(b):
-    """Iterate over bytes, returning bytes instead of ints (python3)"""
-    if isinstance(b, memoryview):
-        b = b.tobytes()
-    i = 0
-    while True:
-        a = b[i:i + 1]
-        i += 1
-        if a:
-            yield a
-        else:
-            break
-
-
-# all Python versions prior 3.x convert ``str([17])`` to '[17]' instead of '\x11'
-# so a simple ``bytes(sequence)`` doesn't work for all versions
-def to_bytes(seq):
-    """convert a sequence to a bytes type"""
-    if isinstance(seq, bytes):
-        return seq
-    elif isinstance(seq, bytearray):
-        return bytes(seq)
-    elif isinstance(seq, memoryview):
-        return seq.tobytes()
-    elif isinstance(seq, unicode):
-        raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
-    else:
-        # handle list of integers and bytes (one or more items) for Python 2 and 3
-        return bytes(bytearray(seq))
-
-
-# create control bytes
-XON = to_bytes([17])
-XOFF = to_bytes([19])
-
-CR = to_bytes([13])
-LF = to_bytes([10])
-
-
-PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE = 'N', 'E', 'O', 'M', 'S'
-STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO = (1, 1.5, 2)
-FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8)
-
-PARITY_NAMES = {
-    PARITY_NONE: 'None',
-    PARITY_EVEN: 'Even',
-    PARITY_ODD: 'Odd',
-    PARITY_MARK: 'Mark',
-    PARITY_SPACE: 'Space',
-}
-
-
-class SerialException(IOError):
-    """Base class for serial port related exceptions."""
-
-
-class SerialTimeoutException(SerialException):
-    """Write timeouts give an exception"""
-
-
-writeTimeoutError = SerialTimeoutException('Write timeout')
-portNotOpenError = SerialException('Attempting to use a port that is not open')
-
-
-class Timeout(object):
-    """\
-    Abstraction for timeout operations. Using time.monotonic() if available
-    or time.time() in all other cases.
-
-    The class can also be initialized with 0 or None, in order to support
-    non-blocking and fully blocking I/O operations. The attributes
-    is_non_blocking and is_infinite are set accordingly.
-    """
-    if hasattr(time, 'monotonic'):
-        # Timeout implementation with time.monotonic(). This function is only
-        # supported by Python 3.3 and above. It returns a time in seconds
-        # (float) just as time.time(), but is not affected by system clock
-        # adjustments.
-        TIME = time.monotonic
-    else:
-        # Timeout implementation with time.time(). This is compatible with all
-        # Python versions but has issues if the clock is adjusted while the
-        # timeout is running.
-        TIME = time.time
-
-    def __init__(self, duration):
-        """Initialize a timeout with given duration"""
-        self.is_infinite = (duration is None)
-        self.is_non_blocking = (duration == 0)
-        self.duration = duration
-        if duration is not None:
-            self.target_time = self.TIME() + duration
-        else:
-            self.target_time = None
-
-    def expired(self):
-        """Return a boolean, telling if the timeout has expired"""
-        return self.target_time is not None and self.time_left() <= 0
-
-    def time_left(self):
-        """Return how many seconds are left until the timeout expires"""
-        if self.is_non_blocking:
-            return 0
-        elif self.is_infinite:
-            return None
-        else:
-            delta = self.target_time - self.TIME()
-            if delta > self.duration:
-                # clock jumped, recalculate
-                self.target_time = self.TIME() + self.duration
-                return self.duration
-            else:
-                return max(0, delta)
-
-    def restart(self, duration):
-        """\
-        Restart a timeout, only supported if a timeout was already set up
-        before.
-        """
-        self.duration = duration
-        self.target_time = self.TIME() + duration
-
-
-class SerialBase(io.RawIOBase):
-    """\
-    Serial port base class. Provides __init__ function and properties to
-    get/set port settings.
-    """
-
-    # default values, may be overridden in subclasses that do not support all values
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000,
-                 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000,
-                 3000000, 3500000, 4000000)
-    BYTESIZES = (FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS)
-    PARITIES = (PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE)
-    STOPBITS = (STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO)
-
-    def __init__(self,
-                 port=None,
-                 baudrate=9600,
-                 bytesize=EIGHTBITS,
-                 parity=PARITY_NONE,
-                 stopbits=STOPBITS_ONE,
-                 timeout=None,
-                 xonxoff=False,
-                 rtscts=False,
-                 write_timeout=None,
-                 dsrdtr=False,
-                 inter_byte_timeout=None,
-                 exclusive=None,
-                 **kwargs):
-        """\
-        Initialize comm port object. If a "port" is given, then the port will be
-        opened immediately. Otherwise a Serial port object in closed state
-        is returned.
-        """
-
-        self.is_open = False
-        self.portstr = None
-        self.name = None
-        # correct values are assigned below through properties
-        self._port = None
-        self._baudrate = None
-        self._bytesize = None
-        self._parity = None
-        self._stopbits = None
-        self._timeout = None
-        self._write_timeout = None
-        self._xonxoff = None
-        self._rtscts = None
-        self._dsrdtr = None
-        self._inter_byte_timeout = None
-        self._rs485_mode = None  # disabled by default
-        self._rts_state = True
-        self._dtr_state = True
-        self._break_state = False
-        self._exclusive = None
-
-        # assign values using get/set methods using the properties feature
-        self.port = port
-        self.baudrate = baudrate
-        self.bytesize = bytesize
-        self.parity = parity
-        self.stopbits = stopbits
-        self.timeout = timeout
-        self.write_timeout = write_timeout
-        self.xonxoff = xonxoff
-        self.rtscts = rtscts
-        self.dsrdtr = dsrdtr
-        self.inter_byte_timeout = inter_byte_timeout
-        self.exclusive = exclusive
-
-        # watch for backward compatible kwargs
-        if 'writeTimeout' in kwargs:
-            self.write_timeout = kwargs.pop('writeTimeout')
-        if 'interCharTimeout' in kwargs:
-            self.inter_byte_timeout = kwargs.pop('interCharTimeout')
-        if kwargs:
-            raise ValueError('unexpected keyword arguments: {!r}'.format(kwargs))
-
-        if port is not None:
-            self.open()
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    # to be implemented by subclasses:
-    # def open(self):
-    # def close(self):
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    @property
-    def port(self):
-        """\
-        Get the current port setting. The value that was passed on init or using
-        setPort() is passed back.
-        """
-        return self._port
-
-    @port.setter
-    def port(self, port):
-        """\
-        Change the port.
-        """
-        if port is not None and not isinstance(port, basestring):
-            raise ValueError('"port" must be None or a string, not {}'.format(type(port)))
-        was_open = self.is_open
-        if was_open:
-            self.close()
-        self.portstr = port
-        self._port = port
-        self.name = self.portstr
-        if was_open:
-            self.open()
-
-    @property
-    def baudrate(self):
-        """Get the current baud rate setting."""
-        return self._baudrate
-
-    @baudrate.setter
-    def baudrate(self, baudrate):
-        """\
-        Change baud rate. It raises a ValueError if the port is open and the
-        baud rate is not possible. If the port is closed, then the value is
-        accepted and the exception is raised when the port is opened.
-        """
-        try:
-            b = int(baudrate)
-        except TypeError:
-            raise ValueError("Not a valid baudrate: {!r}".format(baudrate))
-        else:
-            if b < 0:
-                raise ValueError("Not a valid baudrate: {!r}".format(baudrate))
-            self._baudrate = b
-            if self.is_open:
-                self._reconfigure_port()
-
-    @property
-    def bytesize(self):
-        """Get the current byte size setting."""
-        return self._bytesize
-
-    @bytesize.setter
-    def bytesize(self, bytesize):
-        """Change byte size."""
-        if bytesize not in self.BYTESIZES:
-            raise ValueError("Not a valid byte size: {!r}".format(bytesize))
-        self._bytesize = bytesize
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def exclusive(self):
-        """Get the current exclusive access setting."""
-        return self._exclusive
-
-    @exclusive.setter
-    def exclusive(self, exclusive):
-        """Change the exclusive access setting."""
-        self._exclusive = exclusive
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def parity(self):
-        """Get the current parity setting."""
-        return self._parity
-
-    @parity.setter
-    def parity(self, parity):
-        """Change parity setting."""
-        if parity not in self.PARITIES:
-            raise ValueError("Not a valid parity: {!r}".format(parity))
-        self._parity = parity
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def stopbits(self):
-        """Get the current stop bits setting."""
-        return self._stopbits
-
-    @stopbits.setter
-    def stopbits(self, stopbits):
-        """Change stop bits size."""
-        if stopbits not in self.STOPBITS:
-            raise ValueError("Not a valid stop bit size: {!r}".format(stopbits))
-        self._stopbits = stopbits
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def timeout(self):
-        """Get the current timeout setting."""
-        return self._timeout
-
-    @timeout.setter
-    def timeout(self, timeout):
-        """Change timeout setting."""
-        if timeout is not None:
-            try:
-                timeout + 1     # test if it's a number, will throw a TypeError if not...
-            except TypeError:
-                raise ValueError("Not a valid timeout: {!r}".format(timeout))
-            if timeout < 0:
-                raise ValueError("Not a valid timeout: {!r}".format(timeout))
-        self._timeout = timeout
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def write_timeout(self):
-        """Get the current timeout setting."""
-        return self._write_timeout
-
-    @write_timeout.setter
-    def write_timeout(self, timeout):
-        """Change timeout setting."""
-        if timeout is not None:
-            if timeout < 0:
-                raise ValueError("Not a valid timeout: {!r}".format(timeout))
-            try:
-                timeout + 1     # test if it's a number, will throw a TypeError if not...
-            except TypeError:
-                raise ValueError("Not a valid timeout: {!r}".format(timeout))
-
-        self._write_timeout = timeout
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def inter_byte_timeout(self):
-        """Get the current inter-character timeout setting."""
-        return self._inter_byte_timeout
-
-    @inter_byte_timeout.setter
-    def inter_byte_timeout(self, ic_timeout):
-        """Change inter-byte timeout setting."""
-        if ic_timeout is not None:
-            if ic_timeout < 0:
-                raise ValueError("Not a valid timeout: {!r}".format(ic_timeout))
-            try:
-                ic_timeout + 1     # test if it's a number, will throw a TypeError if not...
-            except TypeError:
-                raise ValueError("Not a valid timeout: {!r}".format(ic_timeout))
-
-        self._inter_byte_timeout = ic_timeout
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def xonxoff(self):
-        """Get the current XON/XOFF setting."""
-        return self._xonxoff
-
-    @xonxoff.setter
-    def xonxoff(self, xonxoff):
-        """Change XON/XOFF setting."""
-        self._xonxoff = xonxoff
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def rtscts(self):
-        """Get the current RTS/CTS flow control setting."""
-        return self._rtscts
-
-    @rtscts.setter
-    def rtscts(self, rtscts):
-        """Change RTS/CTS flow control setting."""
-        self._rtscts = rtscts
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def dsrdtr(self):
-        """Get the current DSR/DTR flow control setting."""
-        return self._dsrdtr
-
-    @dsrdtr.setter
-    def dsrdtr(self, dsrdtr=None):
-        """Change DsrDtr flow control setting."""
-        if dsrdtr is None:
-            # if not set, keep backwards compatibility and follow rtscts setting
-            self._dsrdtr = self._rtscts
-        else:
-            # if defined independently, follow its value
-            self._dsrdtr = dsrdtr
-        if self.is_open:
-            self._reconfigure_port()
-
-    @property
-    def rts(self):
-        return self._rts_state
-
-    @rts.setter
-    def rts(self, value):
-        self._rts_state = value
-        if self.is_open:
-            self._update_rts_state()
-
-    @property
-    def dtr(self):
-        return self._dtr_state
-
-    @dtr.setter
-    def dtr(self, value):
-        self._dtr_state = value
-        if self.is_open:
-            self._update_dtr_state()
-
-    @property
-    def break_condition(self):
-        return self._break_state
-
-    @break_condition.setter
-    def break_condition(self, value):
-        self._break_state = value
-        if self.is_open:
-            self._update_break_state()
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-    # functions useful for RS-485 adapters
-
-    @property
-    def rs485_mode(self):
-        """\
-        Enable RS485 mode and apply new settings, set to None to disable.
-        See serial.rs485.RS485Settings for more info about the value.
-        """
-        return self._rs485_mode
-
-    @rs485_mode.setter
-    def rs485_mode(self, rs485_settings):
-        self._rs485_mode = rs485_settings
-        if self.is_open:
-            self._reconfigure_port()
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    _SAVED_SETTINGS = ('baudrate', 'bytesize', 'parity', 'stopbits', 'xonxoff',
-                       'dsrdtr', 'rtscts', 'timeout', 'write_timeout',
-                       'inter_byte_timeout')
-
-    def get_settings(self):
-        """\
-        Get current port settings as a dictionary. For use with
-        apply_settings().
-        """
-        return dict([(key, getattr(self, '_' + key)) for key in self._SAVED_SETTINGS])
-
-    def apply_settings(self, d):
-        """\
-        Apply stored settings from a dictionary returned from
-        get_settings(). It's allowed to delete keys from the dictionary. These
-        values will simply left unchanged.
-        """
-        for key in self._SAVED_SETTINGS:
-            if key in d and d[key] != getattr(self, '_' + key):   # check against internal "_" value
-                setattr(self, key, d[key])          # set non "_" value to use properties write function
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def __repr__(self):
-        """String representation of the current port settings and its state."""
-        return '{name}<id=0x{id:x}, open={p.is_open}>(port={p.portstr!r}, ' \
-               'baudrate={p.baudrate!r}, bytesize={p.bytesize!r}, parity={p.parity!r}, ' \
-               'stopbits={p.stopbits!r}, timeout={p.timeout!r}, xonxoff={p.xonxoff!r}, ' \
-               'rtscts={p.rtscts!r}, dsrdtr={p.dsrdtr!r})'.format(
-                   name=self.__class__.__name__, id=id(self), p=self)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-    # compatibility with io library
-    # pylint: disable=invalid-name,missing-docstring
-
-    def readable(self):
-        return True
-
-    def writable(self):
-        return True
-
-    def seekable(self):
-        return False
-
-    def readinto(self, b):
-        data = self.read(len(b))
-        n = len(data)
-        try:
-            b[:n] = data
-        except TypeError as err:
-            import array
-            if not isinstance(b, array.array):
-                raise err
-            b[:n] = array.array('b', data)
-        return n
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-    # context manager
-
-    def __enter__(self):
-        if not self.is_open:
-            self.open()
-        return self
-
-    def __exit__(self, *args, **kwargs):
-        self.close()
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    def send_break(self, duration=0.25):
-        """\
-        Send break condition. Timed, returns to idle state after given
-        duration.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        self.break_condition = True
-        time.sleep(duration)
-        self.break_condition = False
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-    # backwards compatibility / deprecated functions
-
-    def flushInput(self):
-        self.reset_input_buffer()
-
-    def flushOutput(self):
-        self.reset_output_buffer()
-
-    def inWaiting(self):
-        return self.in_waiting
-
-    def sendBreak(self, duration=0.25):
-        self.send_break(duration)
-
-    def setRTS(self, value=1):
-        self.rts = value
-
-    def setDTR(self, value=1):
-        self.dtr = value
-
-    def getCTS(self):
-        return self.cts
-
-    def getDSR(self):
-        return self.dsr
-
-    def getRI(self):
-        return self.ri
-
-    def getCD(self):
-        return self.cd
-
-    def setPort(self, port):
-        self.port = port
-
-    @property
-    def writeTimeout(self):
-        return self.write_timeout
-
-    @writeTimeout.setter
-    def writeTimeout(self, timeout):
-        self.write_timeout = timeout
-
-    @property
-    def interCharTimeout(self):
-        return self.inter_byte_timeout
-
-    @interCharTimeout.setter
-    def interCharTimeout(self, interCharTimeout):
-        self.inter_byte_timeout = interCharTimeout
-
-    def getSettingsDict(self):
-        return self.get_settings()
-
-    def applySettingsDict(self, d):
-        self.apply_settings(d)
-
-    def isOpen(self):
-        return self.is_open
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-    # additional functionality
-
-    def read_all(self):
-        """\
-        Read all bytes currently available in the buffer of the OS.
-        """
-        return self.read(self.in_waiting)
-
-    def read_until(self, terminator=LF, size=None):
-        """\
-        Read until a termination sequence is found ('\n' by default), the size
-        is exceeded or until timeout occurs.
-        """
-        lenterm = len(terminator)
-        line = bytearray()
-        timeout = Timeout(self._timeout)
-        while True:
-            c = self.read(1)
-            if c:
-                line += c
-                if line[-lenterm:] == terminator:
-                    break
-                if size is not None and len(line) >= size:
-                    break
-            else:
-                break
-            if timeout.expired():
-                break
-        return bytes(line)
-
-    def iread_until(self, *args, **kwargs):
-        """\
-        Read lines, implemented as generator. It will raise StopIteration on
-        timeout (empty read).
-        """
-        while True:
-            line = self.read_until(*args, **kwargs)
-            if not line:
-                break
-            yield line
-
-
-#  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-if __name__ == '__main__':
-    import sys
-    s = SerialBase()
-    sys.stdout.write('port name:  {}\n'.format(s.name))
-    sys.stdout.write('baud rates: {}\n'.format(s.BAUDRATES))
-    sys.stdout.write('byte sizes: {}\n'.format(s.BYTESIZES))
-    sys.stdout.write('parities:   {}\n'.format(s.PARITIES))
-    sys.stdout.write('stop bits:  {}\n'.format(s.STOPBITS))
-    sys.stdout.write('{}\n'.format(s))
diff --git a/venv/lib/python3.8/site-packages/serial/serialutil.pyc b/venv/lib/python3.8/site-packages/serial/serialutil.pyc
deleted file mode 100644
index 3800ba7b1a41101aa13accc5538c7c820e81c163..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 20027
zcmd5^TWlOhcD>CZDUzZ{JuFd@EvaRT5@k!2pYl_-DUq_dUXyYUEy)wxy~F7y+2nAB
z>h2NAT`AaIX&*t5Y#y7<<_Ry5&jbh%Ao&Wi2#^PYd;~~<00Dv|NPzqV*pKW-f_!Yw
zxz*j%98roy&Mv}X*Hl$kSKqp?x^?T;6#jEp-~arXb+sbNUpKzr#uZI=h<Nz7q$*Mp
zS?>|w66;#+taSPv;umDDLzem^yd;)od8p}>IZM2P+!eVa@=?i>nkCoyTo<1^((>FA
zpYyw=)TQmbPCi)LAzqhe@K}#{-7;^<9ZO2RTHKKq`?T1T7I$i~H!b#y*C*ai@sQai
z-hj+?$;Vw%+9jm{DGf?#x0LpXHz?k2@%G4EK|U@>X|I&_N$D~1_KLSpJY@FET&H~8
zDW&~VIv}MXDIJucOS}W(?~?Q0koW`mIw<}iz7C1M8()XT-y`Qshs1ka{KJZpCo+^g
zF5VIGAJ^KWS?v?zKOx>R9jD&*Y|S4P@3{CPi^ueVC$k4^@sEr5lq_{fIMI<%=}9R)
zDL$SA7M~LTNm)E0i^Jlb5dSGzJShi&MypvptktJlt50h6NNe>etv=maJ)+f5w^pBK
zwZ5;W98?^68Y~t32!B&?AF|8-ay?wX8ThLi<5{S_NXF|yf<c3QoZ<-bG6GJNnANUZ
zD=+)5t9`ica@}iGQ8cZzDU;|qB%|kM8$s1OR}E%It3j=?c6RNR^X~Z<&pto;^0~+l
zgK{<bYQ#ZxbY<P)qx<<dU)OC_2v7l6CoV!6xkzG>TS&o^K>bnX7dwdY+ahMDw=G$F
zQR0GxCEmSd@gLGLbo_Qll6@I%ZsGB(Os`ruPRSKq*SvxhNBFYn0+Pwt56iJ{*Khiv
zJ-Z(J(HT4R<3?BuYV)ST4r)>Cmp!{ahin|#BP;9iLcR9F=>Q!_zyVBYkBYA#V*7Hf
z;_Fc39k?CWwd<I#oe3NM2nUSOiOg!crfIo};H}{{?nRFQMx<{$hC;L#iF6EFgI2fI
zYwfZ6@ZHm~0qK|6?vIgdK>9wSwU|@^_dw(sf{a=)czUCtHzt%oog`3tqf2irO59D=
zhKHcD$f;k2wwjjM5EC?fmG{O!c}_q!z6_}$`fm#`ha#TAEf5{_UF=C}tQ%jHYXnA>
zRuObBDoUd#F^o#R24co`*^c}h4IhNC<2p);6gysD@s;w8T2QHbz8%FONFCYb(6?*#
z*p3=2EA=q;y)*Vo)h|cBjV{;_ooE-Y*~8(~2vO}6h_x;xhP<p}t{jGC!{`nvt}Kwe
zPDwNa7$(9HZ(#@Z&;yo4$}1~=%`>dQdO+{6UbzNTUEVf(P`2Z`tH7S)8=gQy?&t)6
z^d;AUj$Uh5fgH2P3ijZBu#d?uCe$g)s#BUyXgaOw`<fP28s^aqfB*GXKpBT7N5YW=
zl!ZW{AYP{GHD3oeanr9UDyBV8E8Z`MON!UxO1a|4gJ@h-T{5v&@mJ!YUaO!=|1y0x
zfTGc79<*8qwHoh5qew22jFoCRitM?12)>|RvPotLdlmBU*?!t{G^!+U_^_iYkx;v?
zSFf~71s*|%*Ks8(Fg}318Q)B>?AIId7KUk~k82^=#EwlLkv$*W^zCx3Ikc96IY;qK
zlc_YfHO1pl*L;jC8Bs)T*$B;P)QrX8VvrA-6~fd2P0EG{@j^MagGlAC4k=JYYA{05
zWyB`H7x|j+K|u1v_U5HjplJjf2)2&DgBC>zwhinV*f6kL`e{qRK7nNdGXf?A%m)}G
zutvNES}%BnjbW=Si2oS>O@?=m$=#haPW%Jn*=ilYQi4@7B#Q@WJKR;B$Qm>-<^vkQ
zP&uRxo=O{_1`ST6MVK&$wZU+%1`ST8MOZeEYlBm{8Z;P5i)zsjhSRwkG<Z5K!pu3M
zJv@`EL4z}C@u>JmwZYk34H}H5#be?h(+1~qHE8f`T7;2gYlG)<HE8gBT7+$NTpPTQ
zt3iVo(<00%SWy@SQ2mnJHHIiE(dK;G29_4AE3|nzSAzzxq(zutu*1;c)m#l4yp|SW
zhz)Cl*K;*!@J3pMNp?~jTxiyKfs{^(_bzKnBjQbJ=CpX9)6CQ2y{DOH#QVHv&WQKE
zX3mN?rI}IjrZsa;yepb{R=f|yb2!q{bK(`X@_F%QH1mRZA8O`BZFW_gy(Hc>@vdwB
zyyidB{LA8%wDBwA{gh^274Kusye8f!nt5F@`6=_5OiOQw|Ar3J&D8)8Ur37=#J`{o
z%FP;Ymif|~;#D;BmUy0K-WGpM3Fph*4k=v}Z%*qkQU5MdR2Pug_%q^c<b5{N$D{U@
zuzoY}{K$6QpccfgYtJ=m73z5CF3(;Gp%B72K!dp6$ByRx7$#+GdP0W!BpTIQ!Si@o
z@E#Lb3=({u$#<CiC6hDI>A`jA^x*e9k@P^Z2VcOX9ef{VQt;(rB!Y(n!6SkE3zI*!
zklZaGLF>T&9uoPh9wfU5BzXJcAadW{gI@mi06MsPRD#cjPolp+KP$mM&%cDby%(g?
zkC*e}Y;p-#v>SjJ)5?X_s`imvNHd*j1}h+QE486qtlCUXPnzjXGgye3TUd^n3>IZ3
zgQc0t3<#!D*jw)IG_xlKV=rwf-h$l+0~(pf<W@m5`{h=rW)8@$F3k+dt!~X6lv}-;
zIV87Wt>LM|atlTpGLOrxKFvHKw{~jgh}z|rEcHs*Z=ucNQCf@^C<XY6y8MX#2<Rb^
z`8Nr6z&ss%5p#EadD#%WKD+2w;!%5Y&Q2x|%p08PYG>?t!LKnfEmwnT)t>d0G1wg^
z7EJWP^0My*nDeXaqxLjfhpU0kM0o}^Z-KcFtDzp@DOmJzvn#yPEE0UrFdqA#8sRLc
zX3OPr6^yCYPUP~v&cXDSORGbzKzFv>@VNL$N?d$ktooR{QpQ}qZtg^JePuR?BeOP3
zruUfkj=Rbk-%YD}ShZHKt<~q|OgCX1Rq&u%FkS>hGmL4?LDH~FP(v_#cqi+_=*3rF
z;)2h2x==O?Ky>2j_)QU=Bt`PHI~)4trKAE<B|1Jrk_}G_>F8(&CWB*rHa3Eoj)T_2
z#*y)EIxzN-jEmW1SVPE~QB@YoVY$NbrTq~sQelJutAQE$)j5aC!g+zoi%ec(a-PY{
zOkQR38k1L;ypAO1YU*CpjiA=pQCqW~k~O!{ei8bL_*xn2#ft3#pTeg1I{M9$n&vAn
z)i*>R1rBDWF^c~d735j|y#rlJp{X>&5T@4#y*g^o;Lgo*wE?@5M%rpQvR7b7LnNS}
z39=1?x`8$Cd?sjM{VQPdk<&EklE$;;%F-z20GNE$sIKoT$5?sIHej)mWv~phR~LfH
z0%W}wm$8P<`Xg|3NN@qpJe%8qqnxbWnj)x!bDqNBOzutQaBYV=$|k>uKGe3A9TjTv
z0<KJ(e}IC)E`1MJC`07|*|1}bc1tv?`Xz7!nx40fmW5`;1Mh1M*37Ny@Fu!eA|bi7
zP_E6B3<d*+H1{GAIOpuBOJ1|KRmx@9Owp?ywW76&%Bc|wm-8eNRcWdRRgomrQZ%bD
zu@i^R6tlh{(iLgS*I*dcfNdeeAEN7MHxk*=3rEH-6_0-8Dk;0)pXE7{R#vBqveo~S
z*b$?KZ%&|X8##zN<}Yv=4k~0EL=}69_236t$E2)Y4&(8-Ry!e`SX0yWd!8;__)IvB
zTX|2)MY#_4f%{|0lJFzCRqknmE)Ay{uIrR=t%cb#f7rhRiWX+e5QGUAYvnR#O3K|;
zDg^al*g;Mv!Fp7)YPW$+GnUJGN!NHQ^(YEvtG-U-DMRz7nQe13xluhqQyG*i^Z-Ep
z&^Y9y*}|RAD}){tN!}1hz{=0n5$EG6czeoJZh>c~lNFsi0q()0NB&o@1T?<GDM_cl
z=FlB-i4hRGN!-wfXw3!ljnLOgJ|_)2$*{j|O96ZOYh1>$x1(U~h7=4z=^s#8*s2_0
zcD8AJP<7CrPUHX<aXaOJ)9gPHc&bh@a=>f>m&(Dr$QW&jscLD5gu`?<ZN}5aSXItm
zgcEpNd0IV?YENbkK~g4BoOFBXAV;G^sNF#Q^p^4Msp&&!-o=k*CW@1#iK25EC5Pxx
zf;;aZrv|H|+KvO;Hfh<(zu}7LWfOSd9-5@IJ6lzov9Vg{c@hoVsMlyQ{Q%cbke&zd
zx`duBBaC<}PgHY1N6{WMxH9HU&P=8RB|bJKC`Yz!g0hnz;(By~ZZ=oZQntAaXrbvT
zg34)6S#jGypGQwWBG5lM8O_l&H%Mrs(TJYXJWbR4D#tCPEzV3|xi~qK$STpYDQP*t
zwqU6fNPl$F+IW4dtS0M}7Qzz9HWHSLngN2`LfFg*`34$5`FfqYLic37KUuI3VOP0n
zjJ%l|BWlm)wso)x&BqI}g!P%H#z;$(8(y-J)3kzNkKAdoM>?@cAy5&Qbg9v6eA*d?
zbelmN<hdikW6K<_Yj2&vjTR?fH{}dsXxp5@PWBPak0B$4eyd>hbBeb5<<P@U(KeoZ
zI3A%_y^TD=mG1Ee@yJ~?X!1xoVGt60RA=fIg2T0wa8W_PMK{VYX-zc4C(1=&7kwhx
z8N~hTc*Ix$$ubEH^5v~C2mm!4bUy~cFcTxsFo@3ZH1ixH^~c8`#PP{IgV1(Mm;_sI
zy$`dNc@}-NGKl&m&Q?<AN4gD^iHu>Bvv{(N4D%McJO3bt`3f2|8RpX*!#vYun1uYT
z-12G0Eu~Gl<<m{M<@Wu!g_CNcP7JQpAZ*pWYWzP?v)rF?h}_K>M;8u3CG|&bTgMRV
zuWw|beUHjQ$I(YC3tgX{I(L2g^5qtuc^XaI$TM`Ty+`O<CL$Jf74Q@?i4H(UJt^Ta
z&1l%bMu#yMatT%M0e{LY!3h6mWKkF2wu!;vT;XuKkr8#uJ;W-EtkQ~pXQp`W(oE5w
ztJYW53l`R^Eu?q`kF}8$^fO*>8!5ORPDt^<p(JGCST-dKq1rZC*vThtA<KBtIX6Dz
zJcul32r*vPCL5f-W&{D=UqZO(q*jG{s7FF<wWyHLszRs?c4S&s$FFIF=IS`xZK0$k
z6dRAiakyYN<-IAj$ILXTRO5IzB^@E(HtE<2yr-#g-QO|zkWw{eXu!~x_EAG!K=4nm
zW(4U_2OibcBdM&^`JS*pp;R2k>OE?#c-RVZv%Qw4cR}5+>Id64W<QU2eu?8yUG<RG
zMuJt^9Bsxbc9Oo*W~>s*d$F2rSv9fhOmRH8OtQ6|8)q8Ne{G8heU9(Ov+YqD8YE@*
z;^2n#uyb0k{cM|&ONb3}_aWydESuW^Y&Uv8z-zwssOXKpi>FdQ_C&1=KeO!=v9D=!
zUsL_Y2(_!O+ckeRon8_3nQWRcD2<yZUJ&ug=7tFOt|AQ_8`WLXQSGys#2;u}8G>zn
z?1{}G+He+8T<V@y!EN?p2tEo3+emsk44XT*-_5Ar-4;bfU^i3tx&v)qn|O_*ZOc;;
z@A_;b!8hHZ)y-MX6K02&i*B<`OVe1*FRJDqTxwC$YaWZtr{?7NC&z@*!4|y~m^O`v
zdFW0DgY7@<kQ=)gDwBjH%;MpcooKRcwoi&p5$=n4fd;OWLxdJw)_qamUJc@fY$rq+
z&&|+vy2%(CKIy8#s+(%;N@dzDj$NG?cZ(A<Gm}&A6m<)3-bXk>95%&GC#fZWeY*sR
z`!QJbo`Lwg88dZd+g3YLv|dMM?E^I~7{q&-k-FS%f?3inA;Ld^;tn~4p(Qv*d^T{r
z1c!ZJf_c-Nt?m@Wy3r^2zXqp363_d6ydlN?m<laCfFa{CGPw)u%NsDCMP}G@xRqf(
zKd6z@+|D`$idA81qc_UCU-hv+030Gllznn<DNoOt1wU$TX{lI8ATDA|qF|Zor0UPb
zHbR$ln>H60;(UlfB$NI%WF4YS$%sKH84IkXO{YxYIUgarZAuQHla1{52bo}X@3u}i
z{S0(^sF++uhN1xTOD!-X9FPRor2B`=YZ%a?#sDp9+z%tOQLn*3iyHT{s6juA{W8}t
z2NFpdL;pn$w+4|`Lf{iS{Tk_&?Cjr1w6N2ses9L$j7GQ7%W(8Y;9YojZFudBZaH2U
zj@}&M#`J~Z@JzOuX9`K=i5ASBfM)4RraN5=i5EcgNt}u1O`M5lO`Hj`r$>k|6Pn{{
zP_gT3v@p<x@DR`F%8STvs=8EHss7>;MdM1^I2BOkx!8(a30?P3Nbkd_kdA`79=owq
zzVUPKO0^Tsp(;(BNMicY8{1|W5j5m+e*L>lzcl#~RfZpbLa;E@h_L+qqr!5${dkFd
ze~GaCLk<?Q6%F>xQ~z}ojF3{bYP>9jlqV=qG)E>1vObXLVubNMeXVvSbEbVotlOPp
zLC`&sYC&#yF(!(-x{Fc{1&x?Zg#7WS2HvBUbkm|^)$Qz$C(iI~wDgpoIMTBUx=_^l
ziv-qLsfy?~6&QkVPDW7QneY<bJ>}TUoL7c~lltZ~fFFj=9Gl|Wj+L%)D1--YzxqEC
zvFe+*_QNw@um*6_q2JmI0Xcjh76htOaZpGIVOuua5*-39h+sAMKXN4JD~Kh2bBz&E
zn;VkfK`jWELZrZq;cheBKyg_P=OaB<vb4%<TX5*Q{u(26e}I=p<Vvw%Qt|I^-csv;
zb-Z*o;r6Ei8Nmu5tKlazr@*-nC^?TP_ga7yO-&4JGFg=IcslhLaWKZ#bq4)nW^se~
zCu|Dgl#YqSWO%S0c(C;~RM9Ta0jVZ1G_wJ`24a1%E^1m`QzJBH%$kOAMVvygVK9v-
z77cIFC`gCP5Jf7d30;myRo`E6j-x(jgHiXUuh=%eY13nV^h|u^4~cPBNtcQG+qDU=
zK9EN=c9BzVjNs3eM(oZu=H~pcjcT3X%~c!G!X*3e03Rega_=PbU`V;RG>~Eu^<x2b
zXA0`HzM$(tu#!Ox8|OvNxb$o8Y8fl-+I$<)$hecBcFpwLlY@+cm0l`fdosupDQZ;<
z5gIi4(+OF`wJlvr@W_`J8TPxg37+oA-m3(t`8l;fxFH-ZYK!iu9DGwLXbR-kJTj{C
zz~pd14>W;$M7XGNe@t+}k-R4d7sOh1JinEu_u;kz?jw-9jcmqA7i%KyH$1jQcwi8>
zA09Z{hqeF@9+5C;BRDixfF5V^@D`z|c<qPg()f`_herJ(ZG?p$0u9dR^h+;S2GS;e
z@dt|kE9faFW?UF;S3NmjLnkM45Iv-TIrJN~5lOTqbdwpoD`A2t4%N(vkBTS-4o@4a
z)1mplZA7t?GdYOvK@_KRGw<DLQQIZHpY7XY1P`Joh*~l6=#0bh^=t;1b+79FKc~G<
z2wxLjAG3&SThkt2s@{}5m@nkOya#`qYjQO;+lV}>@gSnTdOimXrwiWU_a$5rsf|^=
zu@i2?_}0S-SO%_XpjP-LCAA(w<4O{Cd6$H%dhn}DUPe0}0V~MPW9WguhT+JS8oD#F
z=Qz)`roCf_Q5T>~cz6xJwy-8Q4&v(|&g!E_y_@*;z*3oU@9?)38a4bpgk82_v@ZuW
z;}pt{?<0VFuHL{BVB}QaDICIwvu>{3sK%!?P+VgHGaDam84>P#JfVV<DcUdXcB-m+
z1s<m4tRUAG$!|9hRgTYuhM}?fVXKJQ@uVO$SF39HrBGtE(22X*u`R51c}pwtYZ$&R
zW-HrfK0?6ttE;1VgM>baD(UK1w+?^Xp%16^JFTPEj*c#~G9X+ee;rrElTK?0xIs5(
zmC_)SQtIdNlNxaB6(kxq6fN+VG750PX6|nqk;E1MlvErT_DksW^p`nc#Ny)!9uC)G
zbyW}bq=5QGH5lJ6!p}AdtR#-UT1KgqC?h-*zK&&F*~|IEr;G%19(KNkM1NpI6^>J7
z-7=G(;|*Nf5^d5vXrgzT=q1Lv)Y=Qwc3LAx*@Q^^e|NTYYJ{NbkGZ5r7)&AYdg@NE
z@p@`~>h+AMo)S-|wlVHa%^Ihtwn%8C=lM6B$kX!&I>T)^ML05!Zks=ypuaGnUXF`n
zAC5a?h^AL(%;m|e6AaZ=FL-hCy5_mEC{A3Rn952MlkdDcqanTT;$BQbY5ev_?$q?u
zM83?&R5FwM)8pg$+wYG#@9EY?a=UnC?9zlY$xdm`q>;ledmU=2aIZ{HPR+Okd1K?5
zYtzo>(Aa2+<IKH{L<g9hT3$Ejpr~K4CV>##-y=+8NUf0E!9(5P;vz}+nbi&96j{`5
z1Wv;a=Q`&LOv+4VnN*l8GFf5*MJ*1c*l93XWwOrXi%h=61oON&Kh5OJOuowGE)$wl
zYHv8-VD6hteg=uUx<7weCDZu@R5Ybfb6Z=yIW~Ioa7Dj^q`R{lTSEMFLk{;_gM~s@
z0S>#3pZ;eCd-v`c?Ap5z*UseX!}kEL-O1I1Z(QBhVE<s}-tOe;9qifLqy2aE?&$6B
z-QQc#&mhvS{sB|!FYuGxDd5RYURv%R+^59GFC^i-qU%PqWb|+%PsF`u+rv?x)@A3P
zB7`QVb?K3lT%F1(PP*gKtQ`eb!~T>0sMFEM$TRph8xC~`S+gH8h4-r8O7~{R(gT*J
zid<;UH9KT_b<W~|phLNH_NFxmqSNV%ae&(YCCB-UExyC#SDAd5$*(c_btb>T<Tsi8
z7L#9M^2<!V&E!{*<VA04?0qN!YM;qz<6=9)X2;l!Mpk}lVeWGVQyt=zS0|@0;->?Y
zPt2AJ(GjgjI?)<`XB2yw>eWl9eL0uV#Q8-g)FLYNDz|N6S!IAX%r9iUNlZqR*M1z#
z>aq3}4j1&>>g(*?-Mb&Zsl#7lDx9zmT1Pty){f-U*LeV+eyhK5=tuJ3_{OY0lzsje
DjnVz>

diff --git a/venv/lib/python3.8/site-packages/serial/serialwin32.py b/venv/lib/python3.8/site-packages/serial/serialwin32.py
deleted file mode 100644
index 7b88999..0000000
--- a/venv/lib/python3.8/site-packages/serial/serialwin32.py
+++ /dev/null
@@ -1,475 +0,0 @@
-#! python
-#
-# backend for Windows ("win32" incl. 32/64 bit support)
-#
-# (C) 2001-2015 Chris Liechti <cliechti@gmx.net>
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# SPDX-License-Identifier:    BSD-3-Clause
-#
-# Initial patch to use ctypes by Giovanni Bajo <rasky@develer.com>
-
-# pylint: disable=invalid-name,too-few-public-methods
-import ctypes
-import time
-from serial import win32
-
-import serial
-from serial.serialutil import SerialBase, SerialException, to_bytes, portNotOpenError, writeTimeoutError
-
-
-class Serial(SerialBase):
-    """Serial port implementation for Win32 based on ctypes."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def __init__(self, *args, **kwargs):
-        self._port_handle = None
-        self._overlapped_read = None
-        self._overlapped_write = None
-        super(Serial, self).__init__(*args, **kwargs)
-
-    def open(self):
-        """\
-        Open port with current settings. This may throw a SerialException
-        if the port cannot be opened.
-        """
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self.is_open:
-            raise SerialException("Port is already open.")
-        # the "\\.\COMx" format is required for devices other than COM1-COM8
-        # not all versions of windows seem to support this properly
-        # so that the first few ports are used with the DOS device name
-        port = self.name
-        try:
-            if port.upper().startswith('COM') and int(port[3:]) > 8:
-                port = '\\\\.\\' + port
-        except ValueError:
-            # for like COMnotanumber
-            pass
-        self._port_handle = win32.CreateFile(
-            port,
-            win32.GENERIC_READ | win32.GENERIC_WRITE,
-            0,  # exclusive access
-            None,  # no security
-            win32.OPEN_EXISTING,
-            win32.FILE_ATTRIBUTE_NORMAL | win32.FILE_FLAG_OVERLAPPED,
-            0)
-        if self._port_handle == win32.INVALID_HANDLE_VALUE:
-            self._port_handle = None    # 'cause __del__ is called anyway
-            raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
-
-        try:
-            self._overlapped_read = win32.OVERLAPPED()
-            self._overlapped_read.hEvent = win32.CreateEvent(None, 1, 0, None)
-            self._overlapped_write = win32.OVERLAPPED()
-            #~ self._overlapped_write.hEvent = win32.CreateEvent(None, 1, 0, None)
-            self._overlapped_write.hEvent = win32.CreateEvent(None, 0, 0, None)
-
-            # Setup a 4k buffer
-            win32.SetupComm(self._port_handle, 4096, 4096)
-
-            # Save original timeout values:
-            self._orgTimeouts = win32.COMMTIMEOUTS()
-            win32.GetCommTimeouts(self._port_handle, ctypes.byref(self._orgTimeouts))
-
-            self._reconfigure_port()
-
-            # Clear buffers:
-            # Remove anything that was there
-            win32.PurgeComm(
-                self._port_handle,
-                win32.PURGE_TXCLEAR | win32.PURGE_TXABORT |
-                win32.PURGE_RXCLEAR | win32.PURGE_RXABORT)
-        except:
-            try:
-                self._close()
-            except:
-                # ignore any exception when closing the port
-                # also to keep original exception that happened when setting up
-                pass
-            self._port_handle = None
-            raise
-        else:
-            self.is_open = True
-
-    def _reconfigure_port(self):
-        """Set communication parameters on opened port."""
-        if not self._port_handle:
-            raise SerialException("Can only operate on a valid port handle")
-
-        # Set Windows timeout values
-        # timeouts is a tuple with the following items:
-        # (ReadIntervalTimeout,ReadTotalTimeoutMultiplier,
-        #  ReadTotalTimeoutConstant,WriteTotalTimeoutMultiplier,
-        #  WriteTotalTimeoutConstant)
-        timeouts = win32.COMMTIMEOUTS()
-        if self._timeout is None:
-            pass  # default of all zeros is OK
-        elif self._timeout == 0:
-            timeouts.ReadIntervalTimeout = win32.MAXDWORD
-        else:
-            timeouts.ReadTotalTimeoutConstant = max(int(self._timeout * 1000), 1)
-        if self._timeout != 0 and self._inter_byte_timeout is not None:
-            timeouts.ReadIntervalTimeout = max(int(self._inter_byte_timeout * 1000), 1)
-
-        if self._write_timeout is None:
-            pass
-        elif self._write_timeout == 0:
-            timeouts.WriteTotalTimeoutConstant = win32.MAXDWORD
-        else:
-            timeouts.WriteTotalTimeoutConstant = max(int(self._write_timeout * 1000), 1)
-        win32.SetCommTimeouts(self._port_handle, ctypes.byref(timeouts))
-
-        win32.SetCommMask(self._port_handle, win32.EV_ERR)
-
-        # Setup the connection info.
-        # Get state and modify it:
-        comDCB = win32.DCB()
-        win32.GetCommState(self._port_handle, ctypes.byref(comDCB))
-        comDCB.BaudRate = self._baudrate
-
-        if self._bytesize == serial.FIVEBITS:
-            comDCB.ByteSize = 5
-        elif self._bytesize == serial.SIXBITS:
-            comDCB.ByteSize = 6
-        elif self._bytesize == serial.SEVENBITS:
-            comDCB.ByteSize = 7
-        elif self._bytesize == serial.EIGHTBITS:
-            comDCB.ByteSize = 8
-        else:
-            raise ValueError("Unsupported number of data bits: {!r}".format(self._bytesize))
-
-        if self._parity == serial.PARITY_NONE:
-            comDCB.Parity = win32.NOPARITY
-            comDCB.fParity = 0  # Disable Parity Check
-        elif self._parity == serial.PARITY_EVEN:
-            comDCB.Parity = win32.EVENPARITY
-            comDCB.fParity = 1  # Enable Parity Check
-        elif self._parity == serial.PARITY_ODD:
-            comDCB.Parity = win32.ODDPARITY
-            comDCB.fParity = 1  # Enable Parity Check
-        elif self._parity == serial.PARITY_MARK:
-            comDCB.Parity = win32.MARKPARITY
-            comDCB.fParity = 1  # Enable Parity Check
-        elif self._parity == serial.PARITY_SPACE:
-            comDCB.Parity = win32.SPACEPARITY
-            comDCB.fParity = 1  # Enable Parity Check
-        else:
-            raise ValueError("Unsupported parity mode: {!r}".format(self._parity))
-
-        if self._stopbits == serial.STOPBITS_ONE:
-            comDCB.StopBits = win32.ONESTOPBIT
-        elif self._stopbits == serial.STOPBITS_ONE_POINT_FIVE:
-            comDCB.StopBits = win32.ONE5STOPBITS
-        elif self._stopbits == serial.STOPBITS_TWO:
-            comDCB.StopBits = win32.TWOSTOPBITS
-        else:
-            raise ValueError("Unsupported number of stop bits: {!r}".format(self._stopbits))
-
-        comDCB.fBinary = 1  # Enable Binary Transmission
-        # Char. w/ Parity-Err are replaced with 0xff (if fErrorChar is set to TRUE)
-        if self._rs485_mode is None:
-            if self._rtscts:
-                comDCB.fRtsControl = win32.RTS_CONTROL_HANDSHAKE
-            else:
-                comDCB.fRtsControl = win32.RTS_CONTROL_ENABLE if self._rts_state else win32.RTS_CONTROL_DISABLE
-            comDCB.fOutxCtsFlow = self._rtscts
-        else:
-            # checks for unsupported settings
-            # XXX verify if platform really does not have a setting for those
-            if not self._rs485_mode.rts_level_for_tx:
-                raise ValueError(
-                    'Unsupported value for RS485Settings.rts_level_for_tx: {!r}'.format(
-                        self._rs485_mode.rts_level_for_tx,))
-            if self._rs485_mode.rts_level_for_rx:
-                raise ValueError(
-                    'Unsupported value for RS485Settings.rts_level_for_rx: {!r}'.format(
-                        self._rs485_mode.rts_level_for_rx,))
-            if self._rs485_mode.delay_before_tx is not None:
-                raise ValueError(
-                    'Unsupported value for RS485Settings.delay_before_tx: {!r}'.format(
-                        self._rs485_mode.delay_before_tx,))
-            if self._rs485_mode.delay_before_rx is not None:
-                raise ValueError(
-                    'Unsupported value for RS485Settings.delay_before_rx: {!r}'.format(
-                        self._rs485_mode.delay_before_rx,))
-            if self._rs485_mode.loopback:
-                raise ValueError(
-                    'Unsupported value for RS485Settings.loopback: {!r}'.format(
-                        self._rs485_mode.loopback,))
-            comDCB.fRtsControl = win32.RTS_CONTROL_TOGGLE
-            comDCB.fOutxCtsFlow = 0
-
-        if self._dsrdtr:
-            comDCB.fDtrControl = win32.DTR_CONTROL_HANDSHAKE
-        else:
-            comDCB.fDtrControl = win32.DTR_CONTROL_ENABLE if self._dtr_state else win32.DTR_CONTROL_DISABLE
-        comDCB.fOutxDsrFlow = self._dsrdtr
-        comDCB.fOutX = self._xonxoff
-        comDCB.fInX = self._xonxoff
-        comDCB.fNull = 0
-        comDCB.fErrorChar = 0
-        comDCB.fAbortOnError = 0
-        comDCB.XonChar = serial.XON
-        comDCB.XoffChar = serial.XOFF
-
-        if not win32.SetCommState(self._port_handle, ctypes.byref(comDCB)):
-            raise SerialException(
-                'Cannot configure port, something went wrong. '
-                'Original message: {!r}'.format(ctypes.WinError()))
-
-    #~ def __del__(self):
-        #~ self.close()
-
-    def _close(self):
-        """internal close port helper"""
-        if self._port_handle is not None:
-            # Restore original timeout values:
-            win32.SetCommTimeouts(self._port_handle, self._orgTimeouts)
-            if self._overlapped_read is not None:
-                self.cancel_read()
-                win32.CloseHandle(self._overlapped_read.hEvent)
-                self._overlapped_read = None
-            if self._overlapped_write is not None:
-                self.cancel_write()
-                win32.CloseHandle(self._overlapped_write.hEvent)
-                self._overlapped_write = None
-            win32.CloseHandle(self._port_handle)
-            self._port_handle = None
-
-    def close(self):
-        """Close port"""
-        if self.is_open:
-            self._close()
-            self.is_open = False
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    @property
-    def in_waiting(self):
-        """Return the number of bytes currently in the input buffer."""
-        flags = win32.DWORD()
-        comstat = win32.COMSTAT()
-        if not win32.ClearCommError(self._port_handle, ctypes.byref(flags), ctypes.byref(comstat)):
-            raise SerialException("ClearCommError failed ({!r})".format(ctypes.WinError()))
-        return comstat.cbInQue
-
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if size > 0:
-            win32.ResetEvent(self._overlapped_read.hEvent)
-            flags = win32.DWORD()
-            comstat = win32.COMSTAT()
-            if not win32.ClearCommError(self._port_handle, ctypes.byref(flags), ctypes.byref(comstat)):
-                raise SerialException("ClearCommError failed ({!r})".format(ctypes.WinError()))
-            n = min(comstat.cbInQue, size) if self.timeout == 0 else size
-            if n > 0:
-                buf = ctypes.create_string_buffer(n)
-                rc = win32.DWORD()
-                read_ok = win32.ReadFile(
-                    self._port_handle,
-                    buf,
-                    n,
-                    ctypes.byref(rc),
-                    ctypes.byref(self._overlapped_read))
-                if not read_ok and win32.GetLastError() not in (win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
-                    raise SerialException("ReadFile failed ({!r})".format(ctypes.WinError()))
-                result_ok = win32.GetOverlappedResult(
-                    self._port_handle,
-                    ctypes.byref(self._overlapped_read),
-                    ctypes.byref(rc),
-                    True)
-                if not result_ok:
-                    if win32.GetLastError() != win32.ERROR_OPERATION_ABORTED:
-                        raise SerialException("GetOverlappedResult failed ({!r})".format(ctypes.WinError()))
-                read = buf.raw[:rc.value]
-            else:
-                read = bytes()
-        else:
-            read = bytes()
-        return bytes(read)
-
-    def write(self, data):
-        """Output the given byte string over the serial port."""
-        if not self.is_open:
-            raise portNotOpenError
-        #~ if not isinstance(data, (bytes, bytearray)):
-            #~ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
-        # convert data (needed in case of memoryview instance: Py 3.1 io lib), ctypes doesn't like memoryview
-        data = to_bytes(data)
-        if data:
-            #~ win32event.ResetEvent(self._overlapped_write.hEvent)
-            n = win32.DWORD()
-            success = win32.WriteFile(self._port_handle, data, len(data), ctypes.byref(n), self._overlapped_write)
-            if self._write_timeout != 0:  # if blocking (None) or w/ write timeout (>0)
-                if not success and win32.GetLastError() not in (win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
-                    raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))
-
-                # Wait for the write to complete.
-                #~ win32.WaitForSingleObject(self._overlapped_write.hEvent, win32.INFINITE)
-                win32.GetOverlappedResult(self._port_handle, self._overlapped_write, ctypes.byref(n), True)
-                if win32.GetLastError() == win32.ERROR_OPERATION_ABORTED:
-                    return n.value  # canceled IO is no error
-                if n.value != len(data):
-                    raise writeTimeoutError
-                return n.value
-            else:
-                errorcode = win32.ERROR_SUCCESS if success else win32.GetLastError()
-                if errorcode in (win32.ERROR_INVALID_USER_BUFFER, win32.ERROR_NOT_ENOUGH_MEMORY,
-                                 win32.ERROR_OPERATION_ABORTED):
-                    return 0
-                elif errorcode in (win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
-                    # no info on true length provided by OS function in async mode
-                    return len(data)
-                else:
-                    raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))
-        else:
-            return 0
-
-    def flush(self):
-        """\
-        Flush of file like objects. In this case, wait until all data
-        is written.
-        """
-        while self.out_waiting:
-            time.sleep(0.05)
-        # XXX could also use WaitCommEvent with mask EV_TXEMPTY, but it would
-        # require overlapped IO and it's also only possible to set a single mask
-        # on the port---
-
-    def reset_input_buffer(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        win32.PurgeComm(self._port_handle, win32.PURGE_RXCLEAR | win32.PURGE_RXABORT)
-
-    def reset_output_buffer(self):
-        """\
-        Clear output buffer, aborting the current output and discarding all
-        that is in the buffer.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        win32.PurgeComm(self._port_handle, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT)
-
-    def _update_break_state(self):
-        """Set break: Controls TXD. When active, to transmitting is possible."""
-        if not self.is_open:
-            raise portNotOpenError
-        if self._break_state:
-            win32.SetCommBreak(self._port_handle)
-        else:
-            win32.ClearCommBreak(self._port_handle)
-
-    def _update_rts_state(self):
-        """Set terminal status line: Request To Send"""
-        if self._rts_state:
-            win32.EscapeCommFunction(self._port_handle, win32.SETRTS)
-        else:
-            win32.EscapeCommFunction(self._port_handle, win32.CLRRTS)
-
-    def _update_dtr_state(self):
-        """Set terminal status line: Data Terminal Ready"""
-        if self._dtr_state:
-            win32.EscapeCommFunction(self._port_handle, win32.SETDTR)
-        else:
-            win32.EscapeCommFunction(self._port_handle, win32.CLRDTR)
-
-    def _GetCommModemStatus(self):
-        if not self.is_open:
-            raise portNotOpenError
-        stat = win32.DWORD()
-        win32.GetCommModemStatus(self._port_handle, ctypes.byref(stat))
-        return stat.value
-
-    @property
-    def cts(self):
-        """Read terminal status line: Clear To Send"""
-        return win32.MS_CTS_ON & self._GetCommModemStatus() != 0
-
-    @property
-    def dsr(self):
-        """Read terminal status line: Data Set Ready"""
-        return win32.MS_DSR_ON & self._GetCommModemStatus() != 0
-
-    @property
-    def ri(self):
-        """Read terminal status line: Ring Indicator"""
-        return win32.MS_RING_ON & self._GetCommModemStatus() != 0
-
-    @property
-    def cd(self):
-        """Read terminal status line: Carrier Detect"""
-        return win32.MS_RLSD_ON & self._GetCommModemStatus() != 0
-
-    # - - platform specific - - - -
-
-    def set_buffer_size(self, rx_size=4096, tx_size=None):
-        """\
-        Recommend a buffer size to the driver (device driver can ignore this
-        value). Must be called before the port is opened.
-        """
-        if tx_size is None:
-            tx_size = rx_size
-        win32.SetupComm(self._port_handle, rx_size, tx_size)
-
-    def set_output_flow_control(self, enable=True):
-        """\
-        Manually control flow - when software flow control is enabled.
-        This will do the same as if XON (true) or XOFF (false) are received
-        from the other device and control the transmission accordingly.
-        WARNING: this function is not portable to different platforms!
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if enable:
-            win32.EscapeCommFunction(self._port_handle, win32.SETXON)
-        else:
-            win32.EscapeCommFunction(self._port_handle, win32.SETXOFF)
-
-    @property
-    def out_waiting(self):
-        """Return how many bytes the in the outgoing buffer"""
-        flags = win32.DWORD()
-        comstat = win32.COMSTAT()
-        if not win32.ClearCommError(self._port_handle, ctypes.byref(flags), ctypes.byref(comstat)):
-            raise SerialException("ClearCommError failed ({!r})".format(ctypes.WinError()))
-        return comstat.cbOutQue
-
-    def _cancel_overlapped_io(self, overlapped):
-        """Cancel a blocking read operation, may be called from other thread"""
-        # check if read operation is pending
-        rc = win32.DWORD()
-        err = win32.GetOverlappedResult(
-            self._port_handle,
-            ctypes.byref(overlapped),
-            ctypes.byref(rc),
-            False)
-        if not err and win32.GetLastError() in (win32.ERROR_IO_PENDING, win32.ERROR_IO_INCOMPLETE):
-            # cancel, ignoring any errors (e.g. it may just have finished on its own)
-            win32.CancelIoEx(self._port_handle, overlapped)
-
-    def cancel_read(self):
-        """Cancel a blocking read operation, may be called from other thread"""
-        self._cancel_overlapped_io(self._overlapped_read)
-
-    def cancel_write(self):
-        """Cancel a blocking write operation, may be called from other thread"""
-        self._cancel_overlapped_io(self._overlapped_write)
-
-    @SerialBase.exclusive.setter
-    def exclusive(self, exclusive):
-        """Change the exclusive access setting."""
-        if exclusive is not None and not exclusive:
-            raise ValueError('win32 only supports exclusive access (not: {})'.format(exclusive))
-        else:
-            serial.SerialBase.exclusive.__set__(self, exclusive)
diff --git a/venv/lib/python3.8/site-packages/serial/serialwin32.pyc b/venv/lib/python3.8/site-packages/serial/serialwin32.pyc
deleted file mode 100644
index f994e45d0f20623b8322f654f19b39493f08b30e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14471
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

diff --git a/venv/lib/python3.8/site-packages/serial/threaded/__init__.py b/venv/lib/python3.8/site-packages/serial/threaded/__init__.py
deleted file mode 100644
index 74b6924..0000000
--- a/venv/lib/python3.8/site-packages/serial/threaded/__init__.py
+++ /dev/null
@@ -1,295 +0,0 @@
-#!/usr/bin/env python3
-#
-# Working with threading and pySerial
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2015-2016 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-"""\
-Support threading with serial ports.
-"""
-import serial
-import threading
-
-
-class Protocol(object):
-    """\
-    Protocol as used by the ReaderThread. This base class provides empty
-    implementations of all methods.
-    """
-
-    def connection_made(self, transport):
-        """Called when reader thread is started"""
-
-    def data_received(self, data):
-        """Called with snippets received from the serial port"""
-
-    def connection_lost(self, exc):
-        """\
-        Called when the serial port is closed or the reader loop terminated
-        otherwise.
-        """
-        if isinstance(exc, Exception):
-            raise exc
-
-
-class Packetizer(Protocol):
-    """
-    Read binary packets from serial port. Packets are expected to be terminated
-    with a TERMINATOR byte (null byte by default).
-
-    The class also keeps track of the transport.
-    """
-
-    TERMINATOR = b'\0'
-
-    def __init__(self):
-        self.buffer = bytearray()
-        self.transport = None
-
-    def connection_made(self, transport):
-        """Store transport"""
-        self.transport = transport
-
-    def connection_lost(self, exc):
-        """Forget transport"""
-        self.transport = None
-        super(Packetizer, self).connection_lost(exc)
-
-    def data_received(self, data):
-        """Buffer received data, find TERMINATOR, call handle_packet"""
-        self.buffer.extend(data)
-        while self.TERMINATOR in self.buffer:
-            packet, self.buffer = self.buffer.split(self.TERMINATOR, 1)
-            self.handle_packet(packet)
-
-    def handle_packet(self, packet):
-        """Process packets - to be overridden by subclassing"""
-        raise NotImplementedError('please implement functionality in handle_packet')
-
-
-class FramedPacket(Protocol):
-    """
-    Read binary packets. Packets are expected to have a start and stop marker.
-
-    The class also keeps track of the transport.
-    """
-
-    START = b'('
-    STOP = b')'
-
-    def __init__(self):
-        self.packet = bytearray()
-        self.in_packet = False
-        self.transport = None
-
-    def connection_made(self, transport):
-        """Store transport"""
-        self.transport = transport
-
-    def connection_lost(self, exc):
-        """Forget transport"""
-        self.transport = None
-        self.in_packet = False
-        del self.packet[:]
-        super(FramedPacket, self).connection_lost(exc)
-
-    def data_received(self, data):
-        """Find data enclosed in START/STOP, call handle_packet"""
-        for byte in serial.iterbytes(data):
-            if byte == self.START:
-                self.in_packet = True
-            elif byte == self.STOP:
-                self.in_packet = False
-                self.handle_packet(bytes(self.packet)) # make read-only copy
-                del self.packet[:]
-            elif self.in_packet:
-                self.packet.extend(byte)
-            else:
-                self.handle_out_of_packet_data(byte)
-
-    def handle_packet(self, packet):
-        """Process packets - to be overridden by subclassing"""
-        raise NotImplementedError('please implement functionality in handle_packet')
-
-    def handle_out_of_packet_data(self, data):
-        """Process data that is received outside of packets"""
-        pass
-
-
-class LineReader(Packetizer):
-    """
-    Read and write (Unicode) lines from/to serial port.
-    The encoding is applied.
-    """
-
-    TERMINATOR = b'\r\n'
-    ENCODING = 'utf-8'
-    UNICODE_HANDLING = 'replace'
-
-    def handle_packet(self, packet):
-        self.handle_line(packet.decode(self.ENCODING, self.UNICODE_HANDLING))
-
-    def handle_line(self, line):
-        """Process one line - to be overridden by subclassing"""
-        raise NotImplementedError('please implement functionality in handle_line')
-
-    def write_line(self, text):
-        """
-        Write text to the transport. ``text`` is a Unicode string and the encoding
-        is applied before sending ans also the newline is append.
-        """
-        # + is not the best choice but bytes does not support % or .format in py3 and we want a single write call
-        self.transport.write(text.encode(self.ENCODING, self.UNICODE_HANDLING) + self.TERMINATOR)
-
-
-class ReaderThread(threading.Thread):
-    """\
-    Implement a serial port read loop and dispatch to a Protocol instance (like
-    the asyncio.Protocol) but do it with threads.
-
-    Calls to close() will close the serial port but it is also possible to just
-    stop() this thread and continue the serial port instance otherwise.
-    """
-
-    def __init__(self, serial_instance, protocol_factory):
-        """\
-        Initialize thread.
-
-        Note that the serial_instance' timeout is set to one second!
-        Other settings are not changed.
-        """
-        super(ReaderThread, self).__init__()
-        self.daemon = True
-        self.serial = serial_instance
-        self.protocol_factory = protocol_factory
-        self.alive = True
-        self._lock = threading.Lock()
-        self._connection_made = threading.Event()
-        self.protocol = None
-
-    def stop(self):
-        """Stop the reader thread"""
-        self.alive = False
-        if hasattr(self.serial, 'cancel_read'):
-            self.serial.cancel_read()
-        self.join(2)
-
-    def run(self):
-        """Reader loop"""
-        if not hasattr(self.serial, 'cancel_read'):
-            self.serial.timeout = 1
-        self.protocol = self.protocol_factory()
-        try:
-            self.protocol.connection_made(self)
-        except Exception as e:
-            self.alive = False
-            self.protocol.connection_lost(e)
-            self._connection_made.set()
-            return
-        error = None
-        self._connection_made.set()
-        while self.alive and self.serial.is_open:
-            try:
-                # read all that is there or wait for one byte (blocking)
-                data = self.serial.read(self.serial.in_waiting or 1)
-            except serial.SerialException as e:
-                # probably some I/O problem such as disconnected USB serial
-                # adapters -> exit
-                error = e
-                break
-            else:
-                if data:
-                    # make a separated try-except for called used code
-                    try:
-                        self.protocol.data_received(data)
-                    except Exception as e:
-                        error = e
-                        break
-        self.alive = False
-        self.protocol.connection_lost(error)
-        self.protocol = None
-
-    def write(self, data):
-        """Thread safe writing (uses lock)"""
-        with self._lock:
-            self.serial.write(data)
-
-    def close(self):
-        """Close the serial port and exit reader thread (uses lock)"""
-        # use the lock to let other threads finish writing
-        with self._lock:
-            # first stop reading, so that closing can be done on idle port
-            self.stop()
-            self.serial.close()
-
-    def connect(self):
-        """
-        Wait until connection is set up and return the transport and protocol
-        instances.
-        """
-        if self.alive:
-            self._connection_made.wait()
-            if not self.alive:
-                raise RuntimeError('connection_lost already called')
-            return (self, self.protocol)
-        else:
-            raise RuntimeError('already stopped')
-
-    # - -  context manager, returns protocol
-
-    def __enter__(self):
-        """\
-        Enter context handler. May raise RuntimeError in case the connection
-        could not be created.
-        """
-        self.start()
-        self._connection_made.wait()
-        if not self.alive:
-            raise RuntimeError('connection_lost already called')
-        return self.protocol
-
-    def __exit__(self, exc_type, exc_val, exc_tb):
-        """Leave context: close port"""
-        self.close()
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    # pylint: disable=wrong-import-position
-    import sys
-    import time
-    import traceback
-
-    #~ PORT = 'spy:///dev/ttyUSB0'
-    PORT = 'loop://'
-
-    class PrintLines(LineReader):
-        def connection_made(self, transport):
-            super(PrintLines, self).connection_made(transport)
-            sys.stdout.write('port opened\n')
-            self.write_line('hello world')
-
-        def handle_line(self, data):
-            sys.stdout.write('line received: {!r}\n'.format(data))
-
-        def connection_lost(self, exc):
-            if exc:
-                traceback.print_exc(exc)
-            sys.stdout.write('port closed\n')
-
-    ser = serial.serial_for_url(PORT, baudrate=115200, timeout=1)
-    with ReaderThread(ser, PrintLines) as protocol:
-        protocol.write_line('hello')
-        time.sleep(2)
-
-    # alternative usage
-    ser = serial.serial_for_url(PORT, baudrate=115200, timeout=1)
-    t = ReaderThread(ser, PrintLines)
-    t.start()
-    transport, protocol = t.connect()
-    protocol.write_line('hello')
-    time.sleep(2)
-    t.close()
diff --git a/venv/lib/python3.8/site-packages/serial/tools/__init__.pyc b/venv/lib/python3.8/site-packages/serial/tools/__init__.pyc
deleted file mode 100644
index 318d7d9f9d7800084ed7a7ea0c39800a2dc2c345..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 140
zcmZSn%*(|&d0%KU0~9a<X$K%KW&si@3=F{<AQ3+eAi;n}6q^FY^z@TTGjme(b25|k
zax(KuD|9O?%;L>VbdB`P^@~%BG81$3OY-w`iuL2;GxIV_;^XxSDoZ$kI&E_EQ%ZAE
L?Lg)i12F>tkJ}uS

diff --git a/venv/lib/python3.8/site-packages/serial/tools/hexlify_codec.py b/venv/lib/python3.8/site-packages/serial/tools/hexlify_codec.py
deleted file mode 100644
index 1371da2..0000000
--- a/venv/lib/python3.8/site-packages/serial/tools/hexlify_codec.py
+++ /dev/null
@@ -1,124 +0,0 @@
-#! python
-#
-# This is a codec to create and decode hexdumps with spaces between characters. used by miniterm.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2015-2016 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-"""\
-Python 'hex' Codec - 2-digit hex with spaces content transfer encoding.
-
-Encode and decode may be a bit missleading at first sight...
-
-The textual representation is a hex dump: e.g. "40 41"
-The "encoded" data of this is the binary form, e.g. b"@A"
-
-Therefore decoding is binary to text and thus converting binary data to hex dump.
-
-"""
-
-import codecs
-import serial
-
-
-try:
-    unicode
-except (NameError, AttributeError):
-    unicode = str       # for Python 3, pylint: disable=redefined-builtin,invalid-name
-
-
-HEXDIGITS = '0123456789ABCDEF'
-
-
-# Codec APIs
-
-def hex_encode(data, errors='strict'):
-    """'40 41 42' -> b'@ab'"""
-    return (serial.to_bytes([int(h, 16) for h in data.split()]), len(data))
-
-
-def hex_decode(data, errors='strict'):
-    """b'@ab' -> '40 41 42'"""
-    return (unicode(''.join('{:02X} '.format(ord(b)) for b in serial.iterbytes(data))), len(data))
-
-
-class Codec(codecs.Codec):
-    def encode(self, data, errors='strict'):
-        """'40 41 42' -> b'@ab'"""
-        return serial.to_bytes([int(h, 16) for h in data.split()])
-
-    def decode(self, data, errors='strict'):
-        """b'@ab' -> '40 41 42'"""
-        return unicode(''.join('{:02X} '.format(ord(b)) for b in serial.iterbytes(data)))
-
-
-class IncrementalEncoder(codecs.IncrementalEncoder):
-    """Incremental hex encoder"""
-
-    def __init__(self, errors='strict'):
-        self.errors = errors
-        self.state = 0
-
-    def reset(self):
-        self.state = 0
-
-    def getstate(self):
-        return self.state
-
-    def setstate(self, state):
-        self.state = state
-
-    def encode(self, data, final=False):
-        """\
-        Incremental encode, keep track of digits and emit a byte when a pair
-        of hex digits is found. The space is optional unless the error
-        handling is defined to be 'strict'.
-        """
-        state = self.state
-        encoded = []
-        for c in data.upper():
-            if c in HEXDIGITS:
-                z = HEXDIGITS.index(c)
-                if state:
-                    encoded.append(z + (state & 0xf0))
-                    state = 0
-                else:
-                    state = 0x100 + (z << 4)
-            elif c == ' ':      # allow spaces to separate values
-                if state and self.errors == 'strict':
-                    raise UnicodeError('odd number of hex digits')
-                state = 0
-            else:
-                if self.errors == 'strict':
-                    raise UnicodeError('non-hex digit found: {!r}'.format(c))
-        self.state = state
-        return serial.to_bytes(encoded)
-
-
-class IncrementalDecoder(codecs.IncrementalDecoder):
-    """Incremental decoder"""
-    def decode(self, data, final=False):
-        return unicode(''.join('{:02X} '.format(ord(b)) for b in serial.iterbytes(data)))
-
-
-class StreamWriter(Codec, codecs.StreamWriter):
-    """Combination of hexlify codec and StreamWriter"""
-
-
-class StreamReader(Codec, codecs.StreamReader):
-    """Combination of hexlify codec and StreamReader"""
-
-
-def getregentry():
-    """encodings module API"""
-    return codecs.CodecInfo(
-        name='hexlify',
-        encode=hex_encode,
-        decode=hex_decode,
-        incrementalencoder=IncrementalEncoder,
-        incrementaldecoder=IncrementalDecoder,
-        streamwriter=StreamWriter,
-        streamreader=StreamReader,
-        #~ _is_text_encoding=True,
-    )
diff --git a/venv/lib/python3.8/site-packages/serial/tools/hexlify_codec.pyc b/venv/lib/python3.8/site-packages/serial/tools/hexlify_codec.pyc
deleted file mode 100644
index d8cfc1153acbcd77a9ecac028411c679d85e3982..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4872
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
UT&Y+oR0<R2iSrZ1$--puZ`Ay)-2eap

diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports.py b/venv/lib/python3.8/site-packages/serial/tools/list_ports.py
deleted file mode 100644
index 827e81f..0000000
--- a/venv/lib/python3.8/site-packages/serial/tools/list_ports.py
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/env python
-#
-# Serial port enumeration. Console tool and backend selection.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2011-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-"""\
-This module will provide a function called comports that returns an
-iterable (generator or list) that will enumerate available com ports. Note that
-on some systems non-existent ports may be listed.
-
-Additionally a grep function is supplied that can be used to search for ports
-based on their descriptions or hardware ID.
-"""
-
-import sys
-import os
-import re
-
-# chose an implementation, depending on os
-#~ if sys.platform == 'cli':
-#~ else:
-if os.name == 'nt':  # sys.platform == 'win32':
-    from serial.tools.list_ports_windows import comports
-elif os.name == 'posix':
-    from serial.tools.list_ports_posix import comports
-#~ elif os.name == 'java':
-else:
-    raise ImportError("Sorry: no implementation for your platform ('{}') available".format(os.name))
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-def grep(regexp, include_links=False):
-    """\
-    Search for ports using a regular expression. Port name, description and
-    hardware ID are searched. The function returns an iterable that returns the
-    same tuples as comport() would do.
-    """
-    r = re.compile(regexp, re.I)
-    for info in comports(include_links):
-        port, desc, hwid = info
-        if r.search(port) or r.search(desc) or r.search(hwid):
-            yield info
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-def main():
-    import argparse
-
-    parser = argparse.ArgumentParser(description='Serial port enumeration')
-
-    parser.add_argument(
-        'regexp',
-        nargs='?',
-        help='only show ports that match this regex')
-
-    parser.add_argument(
-        '-v', '--verbose',
-        action='store_true',
-        help='show more messages')
-
-    parser.add_argument(
-        '-q', '--quiet',
-        action='store_true',
-        help='suppress all messages')
-
-    parser.add_argument(
-        '-n',
-        type=int,
-        help='only output the N-th entry')
-
-    parser.add_argument(
-        '-s', '--include-links',
-        action='store_true',
-        help='include entries that are symlinks to real devices')
-
-    args = parser.parse_args()
-
-    hits = 0
-    # get iteraror w/ or w/o filter
-    if args.regexp:
-        if not args.quiet:
-            sys.stderr.write("Filtered list with regexp: {!r}\n".format(args.regexp))
-        iterator = sorted(grep(args.regexp, include_links=args.include_links))
-    else:
-        iterator = sorted(comports(include_links=args.include_links))
-    # list them
-    for n, (port, desc, hwid) in enumerate(iterator, 1):
-        if args.n is None or args.n == n:
-            sys.stdout.write("{:20}\n".format(port))
-            if args.verbose:
-                sys.stdout.write("    desc: {}\n".format(desc))
-                sys.stdout.write("    hwid: {}\n".format(hwid))
-        hits += 1
-    if not args.quiet:
-        if hits:
-            sys.stderr.write("{} ports found\n".format(hits))
-        else:
-            sys.stderr.write("no ports found\n")
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    main()
diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports.pyc b/venv/lib/python3.8/site-packages/serial/tools/list_ports.pyc
deleted file mode 100644
index 7532ec75ab67cdcacd3f576e686c3bf53d9c7971..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2815
zcmb_e&2k$>5bjx7vZdH@;v~)wA)bqgQiWtHP)W*AK#Gv6RDmlc2SS;oRBP?nT4%K@
z&&*m@#Xbb{4!i;f4xD)bPC0Pk2{`ZoaEGsZC0qEwDbns}rn{%7r~8|4RQhYK_GkN#
zuR1jPl<@m0UiUMah-d??q9~w5(FQt2KcJ0Z+%M5aiA+E{QxuixML_loQB6@&re1|M
zDx}hTV~es_q+^TeV~a&HGZa-uc3X-Tj}(1}<)-O-gi)nvMmjYzXDF(Qo1e(k=!oDS
zQ3kYLuW{t}715J!>~t@S^2F#toFuw$v%NSnI@DWv+VOFg>Q0y>Ceod(*UzkX+IK^*
zt?{`{oetAl?2QdK;h?^4QgnT0HJ&7P{#Icuo=uwfSPS2KVVuYe_|)RGsn;@S*mVs{
zx~ylk8#-@#PN!MgF#GUkQeRl>UO3d7MwT#9vsSwwMKQ;UNQVf0+nWAK{Mez(`~4)w
zCM5PwnDXr0u^`jVgtpVwTZma=scnX=K^VSkVyh$LIyUaJf5#i^hBg|6*62qMnzi^J
zeAaw`gr>fZjFO*0GftK-W6;lByzf3lZ#}bixQZR=xYtii4?7Aa$GrG3%Mn2mdJKBH
zeskH~ymgYR4*O<r6}%n1&ZEJ*qv)XM1auV8p`!h7$d|a@51xNX&q{O%DcUJIP>j9<
z*eP<~j)yRv98U4jF0t7`i4LY{t3+R`-6g{F6u4fm^Jd+zXf!_Sr?Q8%#_2YSV9j=(
zgjSpVzBSGvdrkcq0McpLGw)7j6(EXg>}w*kniE`91{Ky%y5^*yC)m@+*!vGCQ8)4D
zu#)yUG7X@*F@o#2^dQTVNJm*y%+~6hSE(UfPovM}ixcBH=Z{)aRZe>mPhrhtY!SN?
zE9<8qVEjmjF(aMsAdc$LkTmWtdd-#1JWisOB;IT$ahmTp_V3+k-}#_%yLorT85@Vm
ziqEpd!NU1=aX$J(amUDh2R<Bwj4GGZRn<_82CCxa&_BcLenZGiK|~4BAu&Jz6C8ao
z&k-qLgrR^TxTwr*0`>rJ9H~H!6yT8>MPQIw(aix`$GWo=%}?mgP3q25w7}?NhZl|=
z0#k?s>s@3d0$Dp{vcHqB(9SgNfX^<Cgd;vvzDm9}k^zo*0N-?;Sbm0`6_WiQ$<H!I
zqeaI4gXcfcGl0D;sISoBG#$=}mpRVGiy3k^6|X)=2L-{tQXIp)#BiB*&e1`IUE>kE
z^JFJ2u876-*y3dBRZ(yPW$NxLW?Gycgmo7i-u;`N^0Eu$UMq<0FS2a0^=mR$4k0hQ
z`+7q6mbhcq26xo2qqJ*6ILHBH6TEa8<8^_KaF`yGElypFQ6W5(hIZQtT0beUX_CHM
zhBiw<o35J;3IZ%xvKM-=qUQ@jaPIinH})I@t<l&sb~AGZDIf~vo<O~TJdnR>dz%}#
zz(e-ggGl#40pT_p@v`eUs77NqkBxVi*b)rQG@(J^r;Jkx)(`u}U4x|ro8`WrdnRbT
z*6>~I*V|zXEx8+L9>xhSC6G9uAY5#)D9-AtUbeNE547XRU#{MM@37|P&}IJNjIQdJ
z6B0hYg=C)14@U{w%5qSaV;Q(yPAKjVmensnCRYHG-488NbQY5Pb{n@}>L0Vj0<*|k
z6t!U^VjLKvIQ5c4nZ+tsl#X?L7jnSPN5)#I=D>pd3L#j>L@jn&a21zmjDUi~iX5(G
z>1c+JkU^Qumrdw}^~N=2Hk8WL*-`5v8Zni?3Zmoa3Jk^G$##W_QT-O@za<kH5G_XP
z8zjJ97^m;UrF)2m)NHU2R1|-w@moFhTgYdFN>EkT)Rka9SXMVcnN_??>a5sb4<!6{
zn?1MNb<Uz>quq|OPP^T@$^u4h=2~0|**4!{ehH(3ubaZxVDm9ww+C?=Wdm2#<L&=3
zls^Y@o*&8otIw@P5~Y@$wo!1r9)g45O(l~rkdKOgejm$Gy#hfcm{s_e=hX#;x3pNU
K&Q)*Es(%4^hOG4f

diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_common.py b/venv/lib/python3.8/site-packages/serial/tools/list_ports_common.py
deleted file mode 100644
index 145e63e..0000000
--- a/venv/lib/python3.8/site-packages/serial/tools/list_ports_common.py
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/env python
-#
-# This is a helper module for the various platform dependent list_port
-# implementations.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-import re
-import glob
-import os
-
-
-def numsplit(text):
-    """\
-    Convert string into a list of texts and numbers in order to support a
-    natural sorting.
-    """
-    result = []
-    for group in re.split(r'(\d+)', text):
-        if group:
-            try:
-                group = int(group)
-            except ValueError:
-                pass
-            result.append(group)
-    return result
-
-
-class ListPortInfo(object):
-    """Info collection base class for serial ports"""
-
-    def __init__(self, device=None):
-        self.device = device
-        self.name = None
-        self.description = 'n/a'
-        self.hwid = 'n/a'
-        # USB specific data
-        self.vid = None
-        self.pid = None
-        self.serial_number = None
-        self.location = None
-        self.manufacturer = None
-        self.product = None
-        self.interface = None
-        # special handling for links
-        if device is not None and os.path.islink(device):
-            self.hwid = 'LINK={}'.format(os.path.realpath(device))
-
-    def usb_description(self):
-        """return a short string to name the port based on USB info"""
-        if self.interface is not None:
-            return '{} - {}'.format(self.product, self.interface)
-        elif self.product is not None:
-            return self.product
-        else:
-            return self.name
-
-    def usb_info(self):
-        """return a string with USB related information about device"""
-        return 'USB VID:PID={:04X}:{:04X}{}{}'.format(
-            self.vid or 0,
-            self.pid or 0,
-            ' SER={}'.format(self.serial_number) if self.serial_number is not None else '',
-            ' LOCATION={}'.format(self.location) if self.location is not None else '')
-
-    def apply_usb_info(self):
-        """update description and hwid from USB data"""
-        self.description = self.usb_description()
-        self.hwid = self.usb_info()
-
-    def __eq__(self, other):
-        return self.device == other.device
-
-    def __lt__(self, other):
-        return numsplit(self.device) < numsplit(other.device)
-
-    def __str__(self):
-        return '{} - {}'.format(self.device, self.description)
-
-    def __getitem__(self, index):
-        """Item access: backwards compatible -> (port, desc, hwid)"""
-        if index == 0:
-            return self.device
-        elif index == 1:
-            return self.description
-        elif index == 2:
-            return self.hwid
-        else:
-            raise IndexError('{} > 2'.format(index))
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-def list_links(devices):
-    """\
-    search all /dev devices and look for symlinks to known ports already
-    listed in devices.
-    """
-    links = []
-    for device in glob.glob('/dev/*'):
-        if os.path.islink(device) and os.path.realpath(device) in devices:
-            links.append(device)
-    return links
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    print(ListPortInfo('dummy'))
diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_common.pyc b/venv/lib/python3.8/site-packages/serial/tools/list_ports_common.pyc
deleted file mode 100644
index 67c57f41db06c018bbfa0e3315e6b3d21f3d144e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3315
zcmcImZFAE`5WbV`Bn|;WOVeihc66X)29hw8LYpZWO2~kxjA3NTOQ!9OES-ZASu(m)
zNGAA8!;kIv{($z`Jv-3yHIc2=YPDMJ%d>k|`}_3lU)|}au^1mUT<_qtZIA?iDKa58
z!35$h7%7sPFoEcUsgvYTh!>j>)kV?}JAo)SgsF*SN*qdY|3S_cx~*wgOaH;qi6vP2
z$`sCZoHhd45@IC9-V@=3*oJ8--oSJq?)`p8i~{inb{EC|yl~9JG=$IcbE58QVrN#A
z4}_F5m*V*wDYomR4;}exQQ-d!vTiG&PsJb#$9j?Pn$juj$~50nY3>RYsVucl6@BH*
zp0g^-6O~tko+&L9R8c0TRM4~4a9H5oXqGJHk*mrmQx+naT4teb;5)6~k}H>6#KCDH
zO5=#P!z^`h8tKTLo5l5MlvQS<EMb6B5)FqYPg<nm>O|lSKPZi@GRH=?%Ay*!@K7+Z
zYv7hwdR3YwD_PoG&eFWvTiW~KroMS&>H6}m6>G{g%2r%aWEL9MX$ryWxEKtIe0jL<
zW?%x*vU_L1+mAp*V@fW{DOr>A^0chW^U}>h`Va;l<NbEtFDRpYP>gqR+7}?kBLy@N
zNt4R?R*FqP#Dl0oAR;tPjX|_IP3R%X3_*t&yfw|ttVm{<IVHkwi!x@ffY8TPTx6Mv
zU0UR-7g?j?EV5Shi&FWB6^9v<Z<BMK3;=Edr~t+^qnsFc>Loz0XW%c?@Cg2T2L5^m
z{(1)fdItV_2L5{H6fqun9ZU7hSE3f>kIR{u-842_;!cr!CXWWjoq|SUY+R;83XC;g
zzD^Sc&F=U*#Pu{3eVE$gl#7@Zam4S@mj+Q@^`jUN1=^_xhh>pev2#uE0H7)H)NpU`
zcdW_!A*J~E!KHPYr%vk&ux=MXglzg>Fuw8~kB7;K;96aSDvGeph1zL~@)Ff&8-oDC
z+V~MhMc3bV-%C10d@xc=>R{BWgAYF;LJ8&)04IaUh39eKqECk8*6~Ju78Wbp)9)2@
z1tLqGF63Fc5F7=3G!Os4BZ|<6%}_jw7Qs;pzN1bWE7WMz<p8bE1!I+To>6a&bsFz<
z4(q@qO`?wd67<*ZUG=nmZ}oBe-tB|cYd4;cR{iB*bTG1%K-Jv{Zy$^>nBg~pN<DnE
z{_~UeqYk7k@;dyC2!$HX6FEnOvK-P7IjPjr#G=%u7zE#gx3eGu(~5o<<xyU#@fk?p
zfbl>&^bI;m?f91ae!NgzhHf=XB4^ZlrQ<b$dQtVuVxTB@P>DJoT#I-oq^1l%Cqh&7
zq+%!ASSYf6J;}grNGxGo1ZU-k1CQ$BW2XfYAVR;ea~<y@<&MVy_W&<4g?nkr<Lw3l
zi`M3q)_1{Ks*HH&Yz=o@s4u_(Zse~d;1Un7nctz2O3m8w?h*?8#3F0#eMq=I3CA;x
zuMOCqI8JW-XH*daKI~k;i^dcC+u@d)%p{7~HxK2X$G1mY&zux;sH3&UzDMf^U?-ta
z^5{IOL5Le99nsL9?&C3dx+Dr%^zFDlEW#!XT0gP~p<=0`*@Jx;*9;~66Yn*U144kk
z1=4nAprSZ7)~;ghj(1*1Wn!_Q4~AI2dYMs6YpO-d_f_t|tBU&Wa*9_)N=Z-2U7n-J
z=9;?R;i1M*@J&cP!W*o1o|rw}U~#Vh2lJGk9xqyG^l80iT#6vI{)HSRZ$vOBr{(wz
zI({!e0M?pTey!PEtp`}6GrIM~N{U!(KTkh}a>#RrM+`Me_!W__iCiFZ5#(Js%pJr2
zFr*CweTnyln6SazndVe;rrBuL=*QTF=TVx&Z(3fGYB1RMHNl+-DNbH>i{3W2Y-}*R
b1mW>J%g+4dv$#gZu=Me{T62D3bx!^Z4=}F)

diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_linux.py b/venv/lib/python3.8/site-packages/serial/tools/list_ports_linux.py
deleted file mode 100644
index 4be27cd..0000000
--- a/venv/lib/python3.8/site-packages/serial/tools/list_ports_linux.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env python
-#
-# This is a module that gathers a list of serial ports including details on
-# GNU/Linux systems.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2011-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-import glob
-import os
-from serial.tools import list_ports_common
-
-
-class SysFS(list_ports_common.ListPortInfo):
-    """Wrapper for easy sysfs access and device info"""
-
-    def __init__(self, device):
-        super(SysFS, self).__init__(device)
-        # special handling for links
-        if device is not None and os.path.islink(device):
-            device = os.path.realpath(device)
-            is_link = True
-        else:
-            is_link = False
-        self.name = os.path.basename(device)
-        self.usb_device_path = None
-        if os.path.exists('/sys/class/tty/{}/device'.format(self.name)):
-            self.device_path = os.path.realpath('/sys/class/tty/{}/device'.format(self.name))
-            self.subsystem = os.path.basename(os.path.realpath(os.path.join(self.device_path, 'subsystem')))
-        else:
-            self.device_path = None
-            self.subsystem = None
-        # check device type
-        if self.subsystem == 'usb-serial':
-            self.usb_interface_path = os.path.dirname(self.device_path)
-        elif self.subsystem == 'usb':
-            self.usb_interface_path = self.device_path
-        else:
-            self.usb_interface_path = None
-        # fill-in info for USB devices
-        if self.usb_interface_path is not None:
-            self.usb_device_path = os.path.dirname(self.usb_interface_path)
-
-            try:
-                num_if = int(self.read_line(self.usb_device_path, 'bNumInterfaces'))
-            except ValueError:
-                num_if = 1
-
-            self.vid = int(self.read_line(self.usb_device_path, 'idVendor'), 16)
-            self.pid = int(self.read_line(self.usb_device_path, 'idProduct'), 16)
-            self.serial_number = self.read_line(self.usb_device_path, 'serial')
-            if num_if > 1:  # multi interface devices like FT4232
-                self.location = os.path.basename(self.usb_interface_path)
-            else:
-                self.location = os.path.basename(self.usb_device_path)
-
-            self.manufacturer = self.read_line(self.usb_device_path, 'manufacturer')
-            self.product = self.read_line(self.usb_device_path, 'product')
-            self.interface = self.read_line(self.device_path, 'interface')
-
-        if self.subsystem in ('usb', 'usb-serial'):
-            self.apply_usb_info()
-        #~ elif self.subsystem in ('pnp', 'amba'):  # PCI based devices, raspi
-        elif self.subsystem == 'pnp':  # PCI based devices
-            self.description = self.name
-            self.hwid = self.read_line(self.device_path, 'id')
-        elif self.subsystem == 'amba':  # raspi
-            self.description = self.name
-            self.hwid = os.path.basename(self.device_path)
-
-        if is_link:
-            self.hwid += ' LINK={}'.format(device)
-
-    def read_line(self, *args):
-        """\
-        Helper function to read a single line from a file.
-        One or more parameters are allowed, they are joined with os.path.join.
-        Returns None on errors..
-        """
-        try:
-            with open(os.path.join(*args)) as f:
-                line = f.readline().strip()
-            return line
-        except IOError:
-            return None
-
-
-def comports(include_links=False):
-    devices = glob.glob('/dev/ttyS*')           # built-in serial ports
-    devices.extend(glob.glob('/dev/ttyUSB*'))   # usb-serial with own driver
-    devices.extend(glob.glob('/dev/ttyACM*'))   # usb-serial with CDC-ACM profile
-    devices.extend(glob.glob('/dev/ttyAMA*'))   # ARM internal port (raspi)
-    devices.extend(glob.glob('/dev/rfcomm*'))   # BT serial devices
-    devices.extend(glob.glob('/dev/ttyAP*'))    # Advantech multi-port serial controllers
-    if include_links:
-        devices.extend(list_ports_common.list_links(devices))
-    return [info
-            for info in [SysFS(d) for d in devices]
-            if info.subsystem != "platform"]    # hide non-present internal serial ports
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    for port, desc, hwid in sorted(comports()):
-        print("{}: {} [{}]".format(port, desc, hwid))
diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_linux.pyc b/venv/lib/python3.8/site-packages/serial/tools/list_ports_linux.pyc
deleted file mode 100644
index 08ffc258c5904b84d635518b52e03049c6219fa0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3038
zcmb_e?`|7K5TErWj_t%r|IjogNL;BRtg5jQ(12Q~=pUe!Xj;zD6hk?kee2|s^PPLU
zZeywWRHS}EAn^|H0=x~+0H1gO_|2RziOWZ7-|p@Fy_wmW*>(P|*ZyeFJ?PQoH;eZt
z80HsDAs$6BQRi^2sG|g5qPRo@hdK_a&>`*6?hN%oo1q_wo)dl3nWb=+flit99ED}t
zD^d0n?O!HcAzfys=ZbDUI#1t0Pn9|~>daF(N4iS7MtYw54lRFv`*EMP5;3LSsKBh~
zAN)2O3QKzuQydxV57W#Vzn2aMX=2%n_Sk&ZKJ<&3Z(tY~lZH*=MW@6LvWX6bC0Wdn
z*KRn>xsGWo3x-3Tx&1VAbzsJ>8JoUwgI-S?ypqrj^^>Tl-6-j&y%HpN@aJ!0n0-JN
zkD_PrwM4rmdZyTEWhGv_vlAF(zszyvMTI8RDq9E4ZkZ#y47u#rf>!$vjYa1R@@%oF
z6^jMYg!q=&66nIiB6Uhm6<-E5H=!=fb;8c_ru|hYSv*>>UGvBER493`keU&xvxS$7
zlTS~+2u^rb_{w@J4DMAa`%~E^VLl-<@Uv_!atAY8dy-yen44xeH7#B#1Wy;1BjobM
zi7~HD^H&T0Gt>B5fnPp`N4OAy+_1BR6lKi_+7j)RDXWwiT;ViVNnFqtBsABAR%WDs
zZdzl#(D*tf8->)ONZBc=qZGntWG7e~q@-BejT6YgO|yczg{*D$;=q`ewd2;BY2{gK
ztDK~xF3467ObyV;bk~i}q9BHP0j-o=_&_INnnkQs#G>$imWHFAwPjY4i!5L{2$E4h
z=-E-GGdl;waKgtQixR6dP_<|uCPT~h5`}gKuVBy(8Vq|<f79kPRzZ-$HX~G|C)LlU
z`F@l{*7rqIYDCj8usdRRH!wO023oL(i_J9ANF#C2&qLvh2)m;9(N2s=XF7-lKM(wI
zKDKr@jS`Qo6(_?e6ZLF4oRknjJoMuT-(u_&c**Y}-gUh5kon1I&_$rwlQ``KHcAtZ
zqvkQj<Cxh+OlU*#*vIa`+kR?ugG?`rhAbiO?L3V_37<el$9>tF-0lW+kWA)dteUOv
zD2l^Y9Ce$paJ0X^|KWze@&5X|%@10+Wi6Ygu>r?na}~zsaO|-`%NXVgCQ{4ljH;?P
z)SGIfR8`f|l6qS$snrs%&f~u_`L6=5V=Smu&=*vX_mD%${ql1R^A)D?)k(`lv)pyK
zKmI7^#LwsG0Hp@x43`vIC*}i(w$LNLeE7_v_7)o141C_JQFf1%QlPXS@+4s~zeBq_
z`Q6sB^z~8F;{dugb$Pqoz%@~_9c!2O&FyFD0H}Tx>t?MGy$1r0gF%{UcNk=xT{^>I
z05FK-^r;Rnxpqg71;bgQL-%Q9cihx8Ih&e{J5uLqluBY;PD&S+=qyV!(>!9>ltWK8
zH67~2<HYs24n3~zB2hz0G>)XPoE4lyckX@4%DmH9H#pGV1x%tT$hHlRC8EB7Ec{AS
zgsb%`hT)b#Wd~cnqAIGc8f>B%?fYCYC|oXd-yfix#0;|Kz8|JN-<M4DSl5wpuPTYz
zc@B)>qA#m*sk+v~iX4o?1N=7tIKX%1_JI@QAn)<2Ko$q7;#Pl%btcE+G!|)_pZ!z3
zNaGy4O@s%uTaQlB0dy62h3`xB_%X1nMgHTif+Tk+d%@+v<QGVB4%?>maPIEh=-U@1
z`UUuP`^Gfl`pvs9A?{v3hRFJSo4P1_HH-s`JJ3L~NHS(SPP@`y^uEQ>ApKa{p<JHw
zo+wwNJk9bB&%NttC;xvZ65C*<T>kDL0EX*=&|Q`%e@9(VlWZFVQR4fCTj!d&;;tF@
z+cop3!3pZU!xI;lWiW4mO=*B0;2iq}I^liXGVj2N+}+C{d6$?jXCP=g_ml0BD23Ye
kytlw{<n=4cUvcWAylAd*LpD4upsk*8&TUi|7SN9W1&s=QJ^%m!

diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_osx.py b/venv/lib/python3.8/site-packages/serial/tools/list_ports_osx.py
deleted file mode 100644
index 79ce4f1..0000000
--- a/venv/lib/python3.8/site-packages/serial/tools/list_ports_osx.py
+++ /dev/null
@@ -1,260 +0,0 @@
-#!/usr/bin/env python
-#
-# This is a module that gathers a list of serial ports including details on OSX
-#
-# code originally from https://github.com/makerbot/pyserial/tree/master/serial/tools
-# with contributions from cibomahto, dgs3, FarMcKon, tedbrandston
-# and modifications by cliechti, hoihu, hardkrash
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2013-2015
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-
-# List all of the callout devices in OS/X by querying IOKit.
-
-# See the following for a reference of how to do this:
-# http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/WorkingWSerial/WWSerial_SerialDevs/SerialDevices.html#//apple_ref/doc/uid/TP30000384-CIHGEAFD
-
-# More help from darwin_hid.py
-
-# Also see the 'IORegistryExplorer' for an idea of what we are actually searching
-
-import ctypes
-import ctypes.util
-
-from serial.tools import list_ports_common
-
-iokit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('IOKit'))
-cf = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))
-
-kIOMasterPortDefault = ctypes.c_void_p.in_dll(iokit, "kIOMasterPortDefault")
-kCFAllocatorDefault = ctypes.c_void_p.in_dll(cf, "kCFAllocatorDefault")
-
-kCFStringEncodingMacRoman = 0
-
-iokit.IOServiceMatching.restype = ctypes.c_void_p
-
-iokit.IOServiceGetMatchingServices.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
-iokit.IOServiceGetMatchingServices.restype = ctypes.c_void_p
-
-iokit.IORegistryEntryGetParentEntry.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
-
-iokit.IORegistryEntryCreateCFProperty.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32]
-iokit.IORegistryEntryCreateCFProperty.restype = ctypes.c_void_p
-
-iokit.IORegistryEntryGetPath.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
-iokit.IORegistryEntryGetPath.restype = ctypes.c_void_p
-
-iokit.IORegistryEntryGetName.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
-iokit.IORegistryEntryGetName.restype = ctypes.c_void_p
-
-iokit.IOObjectGetClass.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
-iokit.IOObjectGetClass.restype = ctypes.c_void_p
-
-iokit.IOObjectRelease.argtypes = [ctypes.c_void_p]
-
-
-cf.CFStringCreateWithCString.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32]
-cf.CFStringCreateWithCString.restype = ctypes.c_void_p
-
-cf.CFStringGetCStringPtr.argtypes = [ctypes.c_void_p, ctypes.c_uint32]
-cf.CFStringGetCStringPtr.restype = ctypes.c_char_p
-
-cf.CFNumberGetValue.argtypes = [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_void_p]
-cf.CFNumberGetValue.restype = ctypes.c_void_p
-
-# void CFRelease ( CFTypeRef cf );
-cf.CFRelease.argtypes = [ctypes.c_void_p]
-cf.CFRelease.restype = None
-
-# CFNumber type defines
-kCFNumberSInt8Type = 1
-kCFNumberSInt16Type = 2
-kCFNumberSInt32Type = 3
-kCFNumberSInt64Type = 4
-
-
-def get_string_property(device_type, property):
-    """
-    Search the given device for the specified string property
-
-    @param device_type Type of Device
-    @param property String to search for
-    @return Python string containing the value, or None if not found.
-    """
-    key = cf.CFStringCreateWithCString(
-            kCFAllocatorDefault,
-            property.encode("mac_roman"),
-            kCFStringEncodingMacRoman)
-
-    CFContainer = iokit.IORegistryEntryCreateCFProperty(
-            device_type,
-            key,
-            kCFAllocatorDefault,
-            0)
-    output = None
-
-    if CFContainer:
-        output = cf.CFStringGetCStringPtr(CFContainer, 0)
-        if output is not None:
-            output = output.decode('mac_roman')
-        cf.CFRelease(CFContainer)
-    return output
-
-
-def get_int_property(device_type, property, cf_number_type):
-    """
-    Search the given device for the specified string property
-
-    @param device_type Device to search
-    @param property String to search for
-    @param cf_number_type CFType number
-
-    @return Python string containing the value, or None if not found.
-    """
-    key = cf.CFStringCreateWithCString(
-            kCFAllocatorDefault,
-            property.encode("mac_roman"),
-            kCFStringEncodingMacRoman)
-
-    CFContainer = iokit.IORegistryEntryCreateCFProperty(
-            device_type,
-            key,
-            kCFAllocatorDefault,
-            0)
-
-    if CFContainer:
-        if (cf_number_type == kCFNumberSInt32Type):
-            number = ctypes.c_uint32()
-        elif (cf_number_type == kCFNumberSInt16Type):
-            number = ctypes.c_uint16()
-        cf.CFNumberGetValue(CFContainer, cf_number_type, ctypes.byref(number))
-        cf.CFRelease(CFContainer)
-        return number.value
-    return None
-
-
-def IORegistryEntryGetName(device):
-    pathname = ctypes.create_string_buffer(100)  # TODO: Is this ok?
-    iokit.IOObjectGetClass(device, ctypes.byref(pathname))
-    return pathname.value
-
-
-def GetParentDeviceByType(device, parent_type):
-    """ Find the first parent of a device that implements the parent_type
-        @param IOService Service to inspect
-        @return Pointer to the parent type, or None if it was not found.
-    """
-    # First, try to walk up the IOService tree to find a parent of this device that is a IOUSBDevice.
-    parent_type = parent_type.encode('mac_roman')
-    while IORegistryEntryGetName(device) != parent_type:
-        parent = ctypes.c_void_p()
-        response = iokit.IORegistryEntryGetParentEntry(
-                device,
-                "IOService".encode("mac_roman"),
-                ctypes.byref(parent))
-        # If we weren't able to find a parent for the device, we're done.
-        if response != 0:
-            return None
-        device = parent
-    return device
-
-
-def GetIOServicesByType(service_type):
-    """
-    returns iterator over specified service_type
-    """
-    serial_port_iterator = ctypes.c_void_p()
-
-    iokit.IOServiceGetMatchingServices(
-            kIOMasterPortDefault,
-            iokit.IOServiceMatching(service_type.encode('mac_roman')),
-            ctypes.byref(serial_port_iterator))
-
-    services = []
-    while iokit.IOIteratorIsValid(serial_port_iterator):
-        service = iokit.IOIteratorNext(serial_port_iterator)
-        if not service:
-            break
-        services.append(service)
-    iokit.IOObjectRelease(serial_port_iterator)
-    return services
-
-
-def location_to_string(locationID):
-    """
-    helper to calculate port and bus number from locationID
-    """
-    loc = ['{}-'.format(locationID >> 24)]
-    while locationID & 0xf00000:
-        if len(loc) > 1:
-            loc.append('.')
-        loc.append('{}'.format((locationID >> 20) & 0xf))
-        locationID <<= 4
-    return ''.join(loc)
-
-
-class SuitableSerialInterface(object):
-    pass
-
-
-def scan_interfaces():
-    """
-    helper function to scan USB interfaces
-    returns a list of SuitableSerialInterface objects with name and id attributes
-    """
-    interfaces = []
-    for service in GetIOServicesByType('IOSerialBSDClient'):
-        device = get_string_property(service, "IOCalloutDevice")
-        if device:
-            usb_device = GetParentDeviceByType(service, "IOUSBInterface")
-            if usb_device:
-                name = get_string_property(usb_device, "USB Interface Name") or None
-                locationID = get_int_property(usb_device, "locationID", kCFNumberSInt32Type) or ''
-                i = SuitableSerialInterface()
-                i.id = locationID
-                i.name = name
-                interfaces.append(i)
-    return interfaces
-
-
-def search_for_locationID_in_interfaces(serial_interfaces, locationID):
-    for interface in serial_interfaces:
-        if (interface.id == locationID):
-            return interface.name
-    return None
-
-
-def comports(include_links=False):
-    # XXX include_links is currently ignored. are links in /dev even supported here?
-    # Scan for all iokit serial ports
-    services = GetIOServicesByType('IOSerialBSDClient')
-    ports = []
-    serial_interfaces = scan_interfaces()
-    for service in services:
-        # First, add the callout device file.
-        device = get_string_property(service, "IOCalloutDevice")
-        if device:
-            info = list_ports_common.ListPortInfo(device)
-            # If the serial port is implemented by IOUSBDevice
-            usb_device = GetParentDeviceByType(service, "IOUSBDevice")
-            if usb_device:
-                # fetch some useful informations from properties
-                info.vid = get_int_property(usb_device, "idVendor", kCFNumberSInt16Type)
-                info.pid = get_int_property(usb_device, "idProduct", kCFNumberSInt16Type)
-                info.serial_number = get_string_property(usb_device, "USB Serial Number")
-                info.product = get_string_property(usb_device, "USB Product Name") or 'n/a'
-                info.manufacturer = get_string_property(usb_device, "USB Vendor Name")
-                locationID = get_int_property(usb_device, "locationID", kCFNumberSInt32Type)
-                info.location = location_to_string(locationID)
-                info.interface = search_for_locationID_in_interfaces(serial_interfaces, locationID)
-                info.apply_usb_info()
-            ports.append(info)
-    return ports
-
-# test
-if __name__ == '__main__':
-    for port, desc, hwid in sorted(comports()):
-        print("{}: {} [{}]".format(port, desc, hwid))
diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_osx.pyc b/venv/lib/python3.8/site-packages/serial/tools/list_ports_osx.pyc
deleted file mode 100644
index a5c2c2b76f768c7d73dc538581a841460e4f266c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7164
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

diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_posix.py b/venv/lib/python3.8/site-packages/serial/tools/list_ports_posix.py
deleted file mode 100644
index 0d580b0..0000000
--- a/venv/lib/python3.8/site-packages/serial/tools/list_ports_posix.py
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/usr/bin/env python
-#
-# This is a module that gathers a list of serial ports on POSIXy systems.
-# For some specific implementations, see also list_ports_linux, list_ports_osx
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2011-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-"""\
-The ``comports`` function is expected to return an iterable that yields tuples
-of 3 strings: port name, human readable description and a hardware ID.
-
-As currently no method is known to get the second two strings easily, they are
-currently just identical to the port name.
-"""
-
-import glob
-import sys
-import os
-from serial.tools import list_ports_common
-
-# try to detect the OS so that a device can be selected...
-plat = sys.platform.lower()
-
-if plat[:5] == 'linux':    # Linux (confirmed)  # noqa
-    from serial.tools.list_ports_linux import comports
-
-elif plat[:6] == 'darwin':   # OS X (confirmed)
-    from serial.tools.list_ports_osx import comports
-
-elif plat == 'cygwin':       # cygwin/win32
-    # cygwin accepts /dev/com* in many contexts
-    # (such as 'open' call, explicit 'ls'), but 'glob.glob'
-    # and bare 'ls' do not; so use /dev/ttyS* instead
-    def comports(include_links=False):
-        devices = glob.glob('/dev/ttyS*')
-        if include_links:
-            devices.extend(list_ports_common.list_links(devices))
-        return [list_ports_common.ListPortInfo(d) for d in devices]
-
-elif plat[:7] == 'openbsd':    # OpenBSD
-    def comports(include_links=False):
-        devices = glob.glob('/dev/cua*')
-        if include_links:
-            devices.extend(list_ports_common.list_links(devices))
-        return [list_ports_common.ListPortInfo(d) for d in devices]
-
-elif plat[:3] == 'bsd' or plat[:7] == 'freebsd':
-    def comports(include_links=False):
-        devices = glob.glob('/dev/cua*[!.init][!.lock]')
-        if include_links:
-            devices.extend(list_ports_common.list_links(devices))
-        return [list_ports_common.ListPortInfo(d) for d in devices]
-
-elif plat[:6] == 'netbsd':   # NetBSD
-    def comports(include_links=False):
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/dty*')
-        if include_links:
-            devices.extend(list_ports_common.list_links(devices))
-        return [list_ports_common.ListPortInfo(d) for d in devices]
-
-elif plat[:4] == 'irix':     # IRIX
-    def comports(include_links=False):
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/ttyf*')
-        if include_links:
-            devices.extend(list_ports_common.list_links(devices))
-        return [list_ports_common.ListPortInfo(d) for d in devices]
-
-elif plat[:2] == 'hp':       # HP-UX (not tested)
-    def comports(include_links=False):
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/tty*p0')
-        if include_links:
-            devices.extend(list_ports_common.list_links(devices))
-        return [list_ports_common.ListPortInfo(d) for d in devices]
-
-elif plat[:5] == 'sunos':    # Solaris/SunOS
-    def comports(include_links=False):
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/tty*c')
-        if include_links:
-            devices.extend(list_ports_common.list_links(devices))
-        return [list_ports_common.ListPortInfo(d) for d in devices]
-
-elif plat[:3] == 'aix':      # AIX
-    def comports(include_links=False):
-        """scan for available ports. return a list of device names."""
-        devices = glob.glob('/dev/tty*')
-        if include_links:
-            devices.extend(list_ports_common.list_links(devices))
-        return [list_ports_common.ListPortInfo(d) for d in devices]
-
-else:
-    # platform detection has failed...
-    import serial
-    sys.stderr.write("""\
-don't know how to enumerate ttys on this system.
-! I you know how the serial ports are named send this information to
-! the author of this module:
-
-sys.platform = {!r}
-os.name = {!r}
-pySerial version = {}
-
-also add the naming scheme of the serial ports and with a bit luck you can get
-this module running...
-""".format(sys.platform, os.name, serial.VERSION))
-    raise ImportError("Sorry: no implementation for your platform ('{}') available".format(os.name))
-
-# test
-if __name__ == '__main__':
-    for port, desc, hwid in sorted(comports()):
-        print("{}: {} [{}]".format(port, desc, hwid))
diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_posix.pyc b/venv/lib/python3.8/site-packages/serial/tools/list_ports_posix.pyc
deleted file mode 100644
index 184c3f3e167120f4615a6f7d473d6f73f6ef5f7a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3966
zcmd5<Uvm^i5bwRa{M#HP0TM(&CRU{qDA=PE5m6KiQj*d_y;x9n7%!Whx!hd#c8-}@
zE>}X8CBFLweD}>~-~9@{```!g!4II_z1(rU_(IBXS3BFg-P6<ko0*>9mj6By9{Z(o
zFM(&jNxa|0%gvSmBtQe(0AvZ$02(M1atRuxp<ISWndLI173fYtV*&zIg3cs#rr;^M
zm<BZsvI0U*z+MS#%I1@h&OkSWMhHQ6KOmDSG?`|TABQHhBa<s^GQ;YhL5A=Hx(*>b
z!|!LYYn64sfjlzQVIb)CDC*`&=l<kK$abD>{{p!%wEdlR6v8pq%?9%LQ1>hAPM~g)
zb*q6~8tQ&x-AUBF#=2X9JT=sP$2!XVb=EZld3vamtfSb@u<qMHo*nA$48g5JqY4D(
z5$GHR`3B3Apvush16762JhaNN^fbUs7eJnSrfCKI?)w1LF_41&PnGuH0d*WyNRxs+
zZf`Ba*EoA8ps@&zC6LRYPJmhjwZu+8x%2Rk;C_Y+pah$1Z_=Vz2mronE3v(um~PKl
z@3yx^E6)<IO(wJxYQLuvucYusSmkq@i5L}L*?1>a!nb2D23n=k37_{;<wDaEZwu$G
z&UW2(K|VzmchyDF&b!#vs#tPYsa#@pj|Yk~DPqx%t?b8EiH+M)7=G+Tl3S}XpAJN3
zL|6H?krdNjX8IWgw5vQupoCM2K@Yxfh64)~JDm<Ll6oM}XZYM#CwE?GiH>y=r{srx
zi~@~9{SW@`t|2tw7qCgS^Gyb)i70hVrYA^6O{%kezp$Lf$03NCcAck2#<s6B7L&m)
zio7v#D?$aYTX?w|HXfkE8xyDT3BWGEW5D@bgeL*`06Haj9MBYhQ-X&}IC<pYt_!iP
zN%g4a{b2LLTA3V?+uhXc)bS3!ip^&j{uek68(GV6M?Zycv71hmL+2>3VFTQ_8z@D!
zom{7~mg=2|GrY8a?P~Mtl}m3$@7A2MI!<fenAD-g2%4U8dOzw7>J-~~yc~rB!Cate
zJRa2aRJP;fL1Hk2z8Qlgj|&LuG%=ihoo0Yju2TqgnxX?wHA1J)Q{_3J2Git}TUMz9
zPWcqNAEo?YIntT-TX;`RvbV*n;D3hT$~XkP)-&Y~G--E@hDfk}w2T$;qgbb0M0i(5
zqsk;`JqoNq#p>q5<03a&Bhn8JWsSTy0;q)Bf%XOOQ*HJB!R>{Y!)Uygv<?NNk6r+Y
zs)(ni-FsCan#E{_<@Q4F@?q?>^>K{&1af(1+^d4n_#(QH90ow2z5oyv;`r6sW1~8R
z=k=j%u`kEbahLJzmnK{F%&0`$^ob0qEbk(_^GNRezzL**zKx{I4V+iqC|njBVqo&I
zE=<6P6EKHz#J0HbO5|n4%BZ(S?qRzzlRa<H2~n;%M@DC<T(eEr$UIfo!w`pxdTH#b
zi?|_HY-n6W9I|-m4K|sAh)2pgqN!-&!Z1#q5wWBJd3@xb!X<5m-FO6|iQ`dXXnpP5
zA{IN^i!@L6I4?S5kXMFdAqksj8M=$2D0J^5gqz0N!F3{~x{I8*i&U~mjSeRS$BI$-
zYpW}6_5AY_%M%A_HoLLTnoUO)Wd&LCiW3i3+}7Gjd}h|rY)X?fn|zLYTEzrERYT*L
z(-o;iOu`DLM}CK+7Sz=AmE~iGUi-7;gaIgeA+Z}#H|BWE+x+SOFf(qS5BI`NA$qB-
z<?;F!zY2IfnkvrX-g<p=<MX?o(%j(Bi*;*}i53`;S+iNV!Iw%F!J^0leIKyU?&~pv
z%KYu+St`fyL9ygMT%@FLVl!E)2K1jV&z0tb<9t;s)yjNOt%wreCr}>0rmDfr?Ac(c
JTn)|z{{rbjkvjkY

diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_windows.py b/venv/lib/python3.8/site-packages/serial/tools/list_ports_windows.py
deleted file mode 100644
index f28047b..0000000
--- a/venv/lib/python3.8/site-packages/serial/tools/list_ports_windows.py
+++ /dev/null
@@ -1,305 +0,0 @@
-#! python
-#
-# Enumerate serial ports on Windows including a human readable description
-# and hardware information.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2001-2016 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-# pylint: disable=invalid-name,too-few-public-methods
-import re
-import ctypes
-from ctypes.wintypes import BOOL
-from ctypes.wintypes import HWND
-from ctypes.wintypes import DWORD
-from ctypes.wintypes import WORD
-from ctypes.wintypes import LONG
-from ctypes.wintypes import ULONG
-from ctypes.wintypes import HKEY
-from ctypes.wintypes import BYTE
-import serial
-from serial.win32 import ULONG_PTR
-from serial.tools import list_ports_common
-
-
-def ValidHandle(value, func, arguments):
-    if value == 0:
-        raise ctypes.WinError()
-    return value
-
-
-NULL = 0
-HDEVINFO = ctypes.c_void_p
-LPCTSTR = ctypes.c_wchar_p
-PCTSTR = ctypes.c_wchar_p
-PTSTR = ctypes.c_wchar_p
-LPDWORD = PDWORD = ctypes.POINTER(DWORD)
-#~ LPBYTE = PBYTE = ctypes.POINTER(BYTE)
-LPBYTE = PBYTE = ctypes.c_void_p        # XXX avoids error about types
-
-ACCESS_MASK = DWORD
-REGSAM = ACCESS_MASK
-
-
-class GUID(ctypes.Structure):
-    _fields_ = [
-        ('Data1', DWORD),
-        ('Data2', WORD),
-        ('Data3', WORD),
-        ('Data4', BYTE * 8),
-    ]
-
-    def __str__(self):
-        return "{{{:08x}-{:04x}-{:04x}-{}-{}}}".format(
-            self.Data1,
-            self.Data2,
-            self.Data3,
-            ''.join(["{:02x}".format(d) for d in self.Data4[:2]]),
-            ''.join(["{:02x}".format(d) for d in self.Data4[2:]]),
-        )
-
-
-class SP_DEVINFO_DATA(ctypes.Structure):
-    _fields_ = [
-        ('cbSize', DWORD),
-        ('ClassGuid', GUID),
-        ('DevInst', DWORD),
-        ('Reserved', ULONG_PTR),
-    ]
-
-    def __str__(self):
-        return "ClassGuid:{} DevInst:{}".format(self.ClassGuid, self.DevInst)
-
-
-PSP_DEVINFO_DATA = ctypes.POINTER(SP_DEVINFO_DATA)
-
-PSP_DEVICE_INTERFACE_DETAIL_DATA = ctypes.c_void_p
-
-setupapi = ctypes.windll.LoadLibrary("setupapi")
-SetupDiDestroyDeviceInfoList = setupapi.SetupDiDestroyDeviceInfoList
-SetupDiDestroyDeviceInfoList.argtypes = [HDEVINFO]
-SetupDiDestroyDeviceInfoList.restype = BOOL
-
-SetupDiClassGuidsFromName = setupapi.SetupDiClassGuidsFromNameW
-SetupDiClassGuidsFromName.argtypes = [PCTSTR, ctypes.POINTER(GUID), DWORD, PDWORD]
-SetupDiClassGuidsFromName.restype = BOOL
-
-SetupDiEnumDeviceInfo = setupapi.SetupDiEnumDeviceInfo
-SetupDiEnumDeviceInfo.argtypes = [HDEVINFO, DWORD, PSP_DEVINFO_DATA]
-SetupDiEnumDeviceInfo.restype = BOOL
-
-SetupDiGetClassDevs = setupapi.SetupDiGetClassDevsW
-SetupDiGetClassDevs.argtypes = [ctypes.POINTER(GUID), PCTSTR, HWND, DWORD]
-SetupDiGetClassDevs.restype = HDEVINFO
-SetupDiGetClassDevs.errcheck = ValidHandle
-
-SetupDiGetDeviceRegistryProperty = setupapi.SetupDiGetDeviceRegistryPropertyW
-SetupDiGetDeviceRegistryProperty.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD]
-SetupDiGetDeviceRegistryProperty.restype = BOOL
-
-SetupDiGetDeviceInstanceId = setupapi.SetupDiGetDeviceInstanceIdW
-SetupDiGetDeviceInstanceId.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, PTSTR, DWORD, PDWORD]
-SetupDiGetDeviceInstanceId.restype = BOOL
-
-SetupDiOpenDevRegKey = setupapi.SetupDiOpenDevRegKey
-SetupDiOpenDevRegKey.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM]
-SetupDiOpenDevRegKey.restype = HKEY
-
-advapi32 = ctypes.windll.LoadLibrary("Advapi32")
-RegCloseKey = advapi32.RegCloseKey
-RegCloseKey.argtypes = [HKEY]
-RegCloseKey.restype = LONG
-
-RegQueryValueEx = advapi32.RegQueryValueExW
-RegQueryValueEx.argtypes = [HKEY, LPCTSTR , LPDWORD, LPDWORD, LPBYTE, LPDWORD]
-RegQueryValueEx.restype = LONG
-
-
-DIGCF_PRESENT = 2
-DIGCF_DEVICEINTERFACE = 16
-INVALID_HANDLE_VALUE = 0
-ERROR_INSUFFICIENT_BUFFER = 122
-SPDRP_HARDWAREID = 1
-SPDRP_FRIENDLYNAME = 12
-SPDRP_LOCATION_PATHS = 35
-SPDRP_MFG = 11
-DICS_FLAG_GLOBAL = 1
-DIREG_DEV = 0x00000001
-KEY_READ = 0x20019
-
-
-def iterate_comports():
-    """Return a generator that yields descriptions for serial ports"""
-    GUIDs = (GUID * 8)()  # so far only seen one used, so hope 8 are enough...
-    guids_size = DWORD()
-    if not SetupDiClassGuidsFromName(
-            "Ports",
-            GUIDs,
-            ctypes.sizeof(GUIDs),
-            ctypes.byref(guids_size)):
-        raise ctypes.WinError()
-
-    # repeat for all possible GUIDs
-    for index in range(guids_size.value):
-        bInterfaceNumber = None
-        g_hdi = SetupDiGetClassDevs(
-            ctypes.byref(GUIDs[index]),
-            None,
-            NULL,
-            DIGCF_PRESENT)  # was DIGCF_PRESENT|DIGCF_DEVICEINTERFACE which misses CDC ports
-
-        devinfo = SP_DEVINFO_DATA()
-        devinfo.cbSize = ctypes.sizeof(devinfo)
-        index = 0
-        while SetupDiEnumDeviceInfo(g_hdi, index, ctypes.byref(devinfo)):
-            index += 1
-
-            # get the real com port name
-            hkey = SetupDiOpenDevRegKey(
-                g_hdi,
-                ctypes.byref(devinfo),
-                DICS_FLAG_GLOBAL,
-                0,
-                DIREG_DEV,  # DIREG_DRV for SW info
-                KEY_READ)
-            port_name_buffer = ctypes.create_unicode_buffer(250)
-            port_name_length = ULONG(ctypes.sizeof(port_name_buffer))
-            RegQueryValueEx(
-                hkey,
-                "PortName",
-                None,
-                None,
-                ctypes.byref(port_name_buffer),
-                ctypes.byref(port_name_length))
-            RegCloseKey(hkey)
-
-            # unfortunately does this method also include parallel ports.
-            # we could check for names starting with COM or just exclude LPT
-            # and hope that other "unknown" names are serial ports...
-            if port_name_buffer.value.startswith('LPT'):
-                continue
-
-            # hardware ID
-            szHardwareID = ctypes.create_unicode_buffer(250)
-            # try to get ID that includes serial number
-            if not SetupDiGetDeviceInstanceId(
-                    g_hdi,
-                    ctypes.byref(devinfo),
-                    #~ ctypes.byref(szHardwareID),
-                    szHardwareID,
-                    ctypes.sizeof(szHardwareID) - 1,
-                    None):
-                # fall back to more generic hardware ID if that would fail
-                if not SetupDiGetDeviceRegistryProperty(
-                        g_hdi,
-                        ctypes.byref(devinfo),
-                        SPDRP_HARDWAREID,
-                        None,
-                        ctypes.byref(szHardwareID),
-                        ctypes.sizeof(szHardwareID) - 1,
-                        None):
-                    # Ignore ERROR_INSUFFICIENT_BUFFER
-                    if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER:
-                        raise ctypes.WinError()
-            # stringify
-            szHardwareID_str = szHardwareID.value
-
-            info = list_ports_common.ListPortInfo(port_name_buffer.value)
-
-            # in case of USB, make a more readable string, similar to that form
-            # that we also generate on other platforms
-            if szHardwareID_str.startswith('USB'):
-                m = re.search(r'VID_([0-9a-f]{4})(&PID_([0-9a-f]{4}))?(&MI_(\d{2}))?(\\(\w+))?', szHardwareID_str, re.I)
-                if m:
-                    info.vid = int(m.group(1), 16)
-                    if m.group(3):
-                        info.pid = int(m.group(3), 16)
-                    if m.group(5):
-                        bInterfaceNumber = int(m.group(5))
-                    if m.group(7):
-                        info.serial_number = m.group(7)
-                # calculate a location string
-                loc_path_str = ctypes.create_unicode_buffer(250)
-                if SetupDiGetDeviceRegistryProperty(
-                        g_hdi,
-                        ctypes.byref(devinfo),
-                        SPDRP_LOCATION_PATHS,
-                        None,
-                        ctypes.byref(loc_path_str),
-                        ctypes.sizeof(loc_path_str) - 1,
-                        None):
-                    m = re.finditer(r'USBROOT\((\w+)\)|#USB\((\w+)\)', loc_path_str.value)
-                    location = []
-                    for g in m:
-                        if g.group(1):
-                            location.append('{:d}'.format(int(g.group(1)) + 1))
-                        else:
-                            if len(location) > 1:
-                                location.append('.')
-                            else:
-                                location.append('-')
-                            location.append(g.group(2))
-                    if bInterfaceNumber is not None:
-                        location.append(':{}.{}'.format(
-                            'x',  # XXX how to determine correct bConfigurationValue?
-                            bInterfaceNumber))
-                    if location:
-                        info.location = ''.join(location)
-                info.hwid = info.usb_info()
-            elif szHardwareID_str.startswith('FTDIBUS'):
-                m = re.search(r'VID_([0-9a-f]{4})\+PID_([0-9a-f]{4})(\+(\w+))?', szHardwareID_str, re.I)
-                if m:
-                    info.vid = int(m.group(1), 16)
-                    info.pid = int(m.group(2), 16)
-                    if m.group(4):
-                        info.serial_number = m.group(4)
-                # USB location is hidden by FDTI driver :(
-                info.hwid = info.usb_info()
-            else:
-                info.hwid = szHardwareID_str
-
-            # friendly name
-            szFriendlyName = ctypes.create_unicode_buffer(250)
-            if SetupDiGetDeviceRegistryProperty(
-                    g_hdi,
-                    ctypes.byref(devinfo),
-                    SPDRP_FRIENDLYNAME,
-                    #~ SPDRP_DEVICEDESC,
-                    None,
-                    ctypes.byref(szFriendlyName),
-                    ctypes.sizeof(szFriendlyName) - 1,
-                    None):
-                info.description = szFriendlyName.value
-            #~ else:
-                # Ignore ERROR_INSUFFICIENT_BUFFER
-                #~ if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER:
-                    #~ raise IOError("failed to get details for %s (%s)" % (devinfo, szHardwareID.value))
-                # ignore errors and still include the port in the list, friendly name will be same as port name
-
-            # manufacturer
-            szManufacturer = ctypes.create_unicode_buffer(250)
-            if SetupDiGetDeviceRegistryProperty(
-                    g_hdi,
-                    ctypes.byref(devinfo),
-                    SPDRP_MFG,
-                    #~ SPDRP_DEVICEDESC,
-                    None,
-                    ctypes.byref(szManufacturer),
-                    ctypes.sizeof(szManufacturer) - 1,
-                    None):
-                info.manufacturer = szManufacturer.value
-            yield info
-        SetupDiDestroyDeviceInfoList(g_hdi)
-
-
-def comports(include_links=False):
-    """Return a list of info objects about serial ports"""
-    return list(iterate_comports())
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# test
-if __name__ == '__main__':
-    for port, desc, hwid in sorted(comports()):
-        print("{}: {} [{}]".format(port, desc, hwid))
diff --git a/venv/lib/python3.8/site-packages/serial/tools/list_ports_windows.pyc b/venv/lib/python3.8/site-packages/serial/tools/list_ports_windows.pyc
deleted file mode 100644
index fa5f4b67d67057b2ffcadc11348f3912d671db13..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6912
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

diff --git a/venv/lib/python3.8/site-packages/serial/tools/miniterm.py b/venv/lib/python3.8/site-packages/serial/tools/miniterm.py
deleted file mode 100644
index 88307c6..0000000
--- a/venv/lib/python3.8/site-packages/serial/tools/miniterm.py
+++ /dev/null
@@ -1,976 +0,0 @@
-#!/usr/bin/env python
-#
-# Very simple serial terminal
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C)2002-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-import codecs
-import os
-import sys
-import threading
-
-import serial
-from serial.tools.list_ports import comports
-from serial.tools import hexlify_codec
-
-# pylint: disable=wrong-import-order,wrong-import-position
-
-codecs.register(lambda c: hexlify_codec.getregentry() if c == 'hexlify' else None)
-
-try:
-    raw_input
-except NameError:
-    # pylint: disable=redefined-builtin,invalid-name
-    raw_input = input   # in python3 it's "raw"
-    unichr = chr
-
-
-def key_description(character):
-    """generate a readable description for a key"""
-    ascii_code = ord(character)
-    if ascii_code < 32:
-        return 'Ctrl+{:c}'.format(ord('@') + ascii_code)
-    else:
-        return repr(character)
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-class ConsoleBase(object):
-    """OS abstraction for console (input/output codec, no echo)"""
-
-    def __init__(self):
-        if sys.version_info >= (3, 0):
-            self.byte_output = sys.stdout.buffer
-        else:
-            self.byte_output = sys.stdout
-        self.output = sys.stdout
-
-    def setup(self):
-        """Set console to read single characters, no echo"""
-
-    def cleanup(self):
-        """Restore default console settings"""
-
-    def getkey(self):
-        """Read a single key from the console"""
-        return None
-
-    def write_bytes(self, byte_string):
-        """Write bytes (already encoded)"""
-        self.byte_output.write(byte_string)
-        self.byte_output.flush()
-
-    def write(self, text):
-        """Write string"""
-        self.output.write(text)
-        self.output.flush()
-
-    def cancel(self):
-        """Cancel getkey operation"""
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-    # context manager:
-    # switch terminal temporary to normal mode (e.g. to get user input)
-
-    def __enter__(self):
-        self.cleanup()
-        return self
-
-    def __exit__(self, *args, **kwargs):
-        self.setup()
-
-
-if os.name == 'nt':  # noqa
-    import msvcrt
-    import ctypes
-
-    class Out(object):
-        """file-like wrapper that uses os.write"""
-
-        def __init__(self, fd):
-            self.fd = fd
-
-        def flush(self):
-            pass
-
-        def write(self, s):
-            os.write(self.fd, s)
-
-    class Console(ConsoleBase):
-        def __init__(self):
-            super(Console, self).__init__()
-            self._saved_ocp = ctypes.windll.kernel32.GetConsoleOutputCP()
-            self._saved_icp = ctypes.windll.kernel32.GetConsoleCP()
-            ctypes.windll.kernel32.SetConsoleOutputCP(65001)
-            ctypes.windll.kernel32.SetConsoleCP(65001)
-            self.output = codecs.getwriter('UTF-8')(Out(sys.stdout.fileno()), 'replace')
-            # the change of the code page is not propagated to Python, manually fix it
-            sys.stderr = codecs.getwriter('UTF-8')(Out(sys.stderr.fileno()), 'replace')
-            sys.stdout = self.output
-            self.output.encoding = 'UTF-8'  # needed for input
-
-        def __del__(self):
-            ctypes.windll.kernel32.SetConsoleOutputCP(self._saved_ocp)
-            ctypes.windll.kernel32.SetConsoleCP(self._saved_icp)
-
-        def getkey(self):
-            while True:
-                z = msvcrt.getwch()
-                if z == unichr(13):
-                    return unichr(10)
-                elif z in (unichr(0), unichr(0x0e)):    # functions keys, ignore
-                    msvcrt.getwch()
-                else:
-                    return z
-
-        def cancel(self):
-            # CancelIo, CancelSynchronousIo do not seem to work when using
-            # getwch, so instead, send a key to the window with the console
-            hwnd = ctypes.windll.kernel32.GetConsoleWindow()
-            ctypes.windll.user32.PostMessageA(hwnd, 0x100, 0x0d, 0)
-
-elif os.name == 'posix':
-    import atexit
-    import termios
-    import fcntl
-
-    class Console(ConsoleBase):
-        def __init__(self):
-            super(Console, self).__init__()
-            self.fd = sys.stdin.fileno()
-            self.old = termios.tcgetattr(self.fd)
-            atexit.register(self.cleanup)
-            if sys.version_info < (3, 0):
-                self.enc_stdin = codecs.getreader(sys.stdin.encoding)(sys.stdin)
-            else:
-                self.enc_stdin = sys.stdin
-
-        def setup(self):
-            new = termios.tcgetattr(self.fd)
-            new[3] = new[3] & ~termios.ICANON & ~termios.ECHO & ~termios.ISIG
-            new[6][termios.VMIN] = 1
-            new[6][termios.VTIME] = 0
-            termios.tcsetattr(self.fd, termios.TCSANOW, new)
-
-        def getkey(self):
-            c = self.enc_stdin.read(1)
-            if c == unichr(0x7f):
-                c = unichr(8)    # map the BS key (which yields DEL) to backspace
-            return c
-
-        def cancel(self):
-            fcntl.ioctl(self.fd, termios.TIOCSTI, b'\0')
-
-        def cleanup(self):
-            termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.old)
-
-else:
-    raise NotImplementedError(
-        'Sorry no implementation for your platform ({}) available.'.format(sys.platform))
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-class Transform(object):
-    """do-nothing: forward all data unchanged"""
-    def rx(self, text):
-        """text received from serial port"""
-        return text
-
-    def tx(self, text):
-        """text to be sent to serial port"""
-        return text
-
-    def echo(self, text):
-        """text to be sent but displayed on console"""
-        return text
-
-
-class CRLF(Transform):
-    """ENTER sends CR+LF"""
-
-    def tx(self, text):
-        return text.replace('\n', '\r\n')
-
-
-class CR(Transform):
-    """ENTER sends CR"""
-
-    def rx(self, text):
-        return text.replace('\r', '\n')
-
-    def tx(self, text):
-        return text.replace('\n', '\r')
-
-
-class LF(Transform):
-    """ENTER sends LF"""
-
-
-class NoTerminal(Transform):
-    """remove typical terminal control codes from input"""
-
-    REPLACEMENT_MAP = dict((x, 0x2400 + x) for x in range(32) if unichr(x) not in '\r\n\b\t')
-    REPLACEMENT_MAP.update(
-        {
-            0x7F: 0x2421,  # DEL
-            0x9B: 0x2425,  # CSI
-        })
-
-    def rx(self, text):
-        return text.translate(self.REPLACEMENT_MAP)
-
-    echo = rx
-
-
-class NoControls(NoTerminal):
-    """Remove all control codes, incl. CR+LF"""
-
-    REPLACEMENT_MAP = dict((x, 0x2400 + x) for x in range(32))
-    REPLACEMENT_MAP.update(
-        {
-            0x20: 0x2423,  # visual space
-            0x7F: 0x2421,  # DEL
-            0x9B: 0x2425,  # CSI
-        })
-
-
-class Printable(Transform):
-    """Show decimal code for all non-ASCII characters and replace most control codes"""
-
-    def rx(self, text):
-        r = []
-        for c in text:
-            if ' ' <= c < '\x7f' or c in '\r\n\b\t':
-                r.append(c)
-            elif c < ' ':
-                r.append(unichr(0x2400 + ord(c)))
-            else:
-                r.extend(unichr(0x2080 + ord(d) - 48) for d in '{:d}'.format(ord(c)))
-                r.append(' ')
-        return ''.join(r)
-
-    echo = rx
-
-
-class Colorize(Transform):
-    """Apply different colors for received and echo"""
-
-    def __init__(self):
-        # XXX make it configurable, use colorama?
-        self.input_color = '\x1b[37m'
-        self.echo_color = '\x1b[31m'
-
-    def rx(self, text):
-        return self.input_color + text
-
-    def echo(self, text):
-        return self.echo_color + text
-
-
-class DebugIO(Transform):
-    """Print what is sent and received"""
-
-    def rx(self, text):
-        sys.stderr.write(' [RX:{}] '.format(repr(text)))
-        sys.stderr.flush()
-        return text
-
-    def tx(self, text):
-        sys.stderr.write(' [TX:{}] '.format(repr(text)))
-        sys.stderr.flush()
-        return text
-
-
-# other ideas:
-# - add date/time for each newline
-# - insert newline after: a) timeout b) packet end character
-
-EOL_TRANSFORMATIONS = {
-    'crlf': CRLF,
-    'cr': CR,
-    'lf': LF,
-}
-
-TRANSFORMATIONS = {
-    'direct': Transform,    # no transformation
-    'default': NoTerminal,
-    'nocontrol': NoControls,
-    'printable': Printable,
-    'colorize': Colorize,
-    'debug': DebugIO,
-}
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-def ask_for_port():
-    """\
-    Show a list of ports and ask the user for a choice. To make selection
-    easier on systems with long device names, also allow the input of an
-    index.
-    """
-    sys.stderr.write('\n--- Available ports:\n')
-    ports = []
-    for n, (port, desc, hwid) in enumerate(sorted(comports()), 1):
-        sys.stderr.write('--- {:2}: {:20} {!r}\n'.format(n, port, desc))
-        ports.append(port)
-    while True:
-        port = raw_input('--- Enter port index or full name: ')
-        try:
-            index = int(port) - 1
-            if not 0 <= index < len(ports):
-                sys.stderr.write('--- Invalid index!\n')
-                continue
-        except ValueError:
-            pass
-        else:
-            port = ports[index]
-        return port
-
-
-class Miniterm(object):
-    """\
-    Terminal application. Copy data from serial port to console and vice versa.
-    Handle special keys from the console to show menu etc.
-    """
-
-    def __init__(self, serial_instance, echo=False, eol='crlf', filters=()):
-        self.console = Console()
-        self.serial = serial_instance
-        self.echo = echo
-        self.raw = False
-        self.input_encoding = 'UTF-8'
-        self.output_encoding = 'UTF-8'
-        self.eol = eol
-        self.filters = filters
-        self.update_transformations()
-        self.exit_character = 0x1d  # GS/CTRL+]
-        self.menu_character = 0x14  # Menu: CTRL+T
-        self.alive = None
-        self._reader_alive = None
-        self.receiver_thread = None
-        self.rx_decoder = None
-        self.tx_decoder = None
-
-    def _start_reader(self):
-        """Start reader thread"""
-        self._reader_alive = True
-        # start serial->console thread
-        self.receiver_thread = threading.Thread(target=self.reader, name='rx')
-        self.receiver_thread.daemon = True
-        self.receiver_thread.start()
-
-    def _stop_reader(self):
-        """Stop reader thread only, wait for clean exit of thread"""
-        self._reader_alive = False
-        if hasattr(self.serial, 'cancel_read'):
-            self.serial.cancel_read()
-        self.receiver_thread.join()
-
-    def start(self):
-        """start worker threads"""
-        self.alive = True
-        self._start_reader()
-        # enter console->serial loop
-        self.transmitter_thread = threading.Thread(target=self.writer, name='tx')
-        self.transmitter_thread.daemon = True
-        self.transmitter_thread.start()
-        self.console.setup()
-
-    def stop(self):
-        """set flag to stop worker threads"""
-        self.alive = False
-
-    def join(self, transmit_only=False):
-        """wait for worker threads to terminate"""
-        self.transmitter_thread.join()
-        if not transmit_only:
-            if hasattr(self.serial, 'cancel_read'):
-                self.serial.cancel_read()
-            self.receiver_thread.join()
-
-    def close(self):
-        self.serial.close()
-
-    def update_transformations(self):
-        """take list of transformation classes and instantiate them for rx and tx"""
-        transformations = [EOL_TRANSFORMATIONS[self.eol]] + [TRANSFORMATIONS[f]
-                                                             for f in self.filters]
-        self.tx_transformations = [t() for t in transformations]
-        self.rx_transformations = list(reversed(self.tx_transformations))
-
-    def set_rx_encoding(self, encoding, errors='replace'):
-        """set encoding for received data"""
-        self.input_encoding = encoding
-        self.rx_decoder = codecs.getincrementaldecoder(encoding)(errors)
-
-    def set_tx_encoding(self, encoding, errors='replace'):
-        """set encoding for transmitted data"""
-        self.output_encoding = encoding
-        self.tx_encoder = codecs.getincrementalencoder(encoding)(errors)
-
-    def dump_port_settings(self):
-        """Write current settings to sys.stderr"""
-        sys.stderr.write("\n--- Settings: {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits}\n".format(
-            p=self.serial))
-        sys.stderr.write('--- RTS: {:8}  DTR: {:8}  BREAK: {:8}\n'.format(
-            ('active' if self.serial.rts else 'inactive'),
-            ('active' if self.serial.dtr else 'inactive'),
-            ('active' if self.serial.break_condition else 'inactive')))
-        try:
-            sys.stderr.write('--- CTS: {:8}  DSR: {:8}  RI: {:8}  CD: {:8}\n'.format(
-                ('active' if self.serial.cts else 'inactive'),
-                ('active' if self.serial.dsr else 'inactive'),
-                ('active' if self.serial.ri else 'inactive'),
-                ('active' if self.serial.cd else 'inactive')))
-        except serial.SerialException:
-            # on RFC 2217 ports, it can happen if no modem state notification was
-            # yet received. ignore this error.
-            pass
-        sys.stderr.write('--- software flow control: {}\n'.format('active' if self.serial.xonxoff else 'inactive'))
-        sys.stderr.write('--- hardware flow control: {}\n'.format('active' if self.serial.rtscts else 'inactive'))
-        sys.stderr.write('--- serial input encoding: {}\n'.format(self.input_encoding))
-        sys.stderr.write('--- serial output encoding: {}\n'.format(self.output_encoding))
-        sys.stderr.write('--- EOL: {}\n'.format(self.eol.upper()))
-        sys.stderr.write('--- filters: {}\n'.format(' '.join(self.filters)))
-
-    def reader(self):
-        """loop and copy serial->console"""
-        try:
-            while self.alive and self._reader_alive:
-                # read all that is there or wait for one byte
-                data = self.serial.read(self.serial.in_waiting or 1)
-                if data:
-                    if self.raw:
-                        self.console.write_bytes(data)
-                    else:
-                        text = self.rx_decoder.decode(data)
-                        for transformation in self.rx_transformations:
-                            text = transformation.rx(text)
-                        self.console.write(text)
-        except serial.SerialException:
-            self.alive = False
-            self.console.cancel()
-            raise       # XXX handle instead of re-raise?
-
-    def writer(self):
-        """\
-        Loop and copy console->serial until self.exit_character character is
-        found. When self.menu_character is found, interpret the next key
-        locally.
-        """
-        menu_active = False
-        try:
-            while self.alive:
-                try:
-                    c = self.console.getkey()
-                except KeyboardInterrupt:
-                    c = '\x03'
-                if not self.alive:
-                    break
-                if menu_active:
-                    self.handle_menu_key(c)
-                    menu_active = False
-                elif c == self.menu_character:
-                    menu_active = True      # next char will be for menu
-                elif c == self.exit_character:
-                    self.stop()             # exit app
-                    break
-                else:
-                    #~ if self.raw:
-                    text = c
-                    for transformation in self.tx_transformations:
-                        text = transformation.tx(text)
-                    self.serial.write(self.tx_encoder.encode(text))
-                    if self.echo:
-                        echo_text = c
-                        for transformation in self.tx_transformations:
-                            echo_text = transformation.echo(echo_text)
-                        self.console.write(echo_text)
-        except:
-            self.alive = False
-            raise
-
-    def handle_menu_key(self, c):
-        """Implement a simple menu / settings"""
-        if c == self.menu_character or c == self.exit_character:
-            # Menu/exit character again -> send itself
-            self.serial.write(self.tx_encoder.encode(c))
-            if self.echo:
-                self.console.write(c)
-        elif c == '\x15':                       # CTRL+U -> upload file
-            self.upload_file()
-        elif c in '\x08hH?':                    # CTRL+H, h, H, ? -> Show help
-            sys.stderr.write(self.get_help_text())
-        elif c == '\x12':                       # CTRL+R -> Toggle RTS
-            self.serial.rts = not self.serial.rts
-            sys.stderr.write('--- RTS {} ---\n'.format('active' if self.serial.rts else 'inactive'))
-        elif c == '\x04':                       # CTRL+D -> Toggle DTR
-            self.serial.dtr = not self.serial.dtr
-            sys.stderr.write('--- DTR {} ---\n'.format('active' if self.serial.dtr else 'inactive'))
-        elif c == '\x02':                       # CTRL+B -> toggle BREAK condition
-            self.serial.break_condition = not self.serial.break_condition
-            sys.stderr.write('--- BREAK {} ---\n'.format('active' if self.serial.break_condition else 'inactive'))
-        elif c == '\x05':                       # CTRL+E -> toggle local echo
-            self.echo = not self.echo
-            sys.stderr.write('--- local echo {} ---\n'.format('active' if self.echo else 'inactive'))
-        elif c == '\x06':                       # CTRL+F -> edit filters
-            self.change_filter()
-        elif c == '\x0c':                       # CTRL+L -> EOL mode
-            modes = list(EOL_TRANSFORMATIONS)  # keys
-            eol = modes.index(self.eol) + 1
-            if eol >= len(modes):
-                eol = 0
-            self.eol = modes[eol]
-            sys.stderr.write('--- EOL: {} ---\n'.format(self.eol.upper()))
-            self.update_transformations()
-        elif c == '\x01':                       # CTRL+A -> set encoding
-            self.change_encoding()
-        elif c == '\x09':                       # CTRL+I -> info
-            self.dump_port_settings()
-        #~ elif c == '\x01':                       # CTRL+A -> cycle escape mode
-        #~ elif c == '\x0c':                       # CTRL+L -> cycle linefeed mode
-        elif c in 'pP':                         # P -> change port
-            self.change_port()
-        elif c in 'sS':                         # S -> suspend / open port temporarily
-            self.suspend_port()
-        elif c in 'bB':                         # B -> change baudrate
-            self.change_baudrate()
-        elif c == '8':                          # 8 -> change to 8 bits
-            self.serial.bytesize = serial.EIGHTBITS
-            self.dump_port_settings()
-        elif c == '7':                          # 7 -> change to 8 bits
-            self.serial.bytesize = serial.SEVENBITS
-            self.dump_port_settings()
-        elif c in 'eE':                         # E -> change to even parity
-            self.serial.parity = serial.PARITY_EVEN
-            self.dump_port_settings()
-        elif c in 'oO':                         # O -> change to odd parity
-            self.serial.parity = serial.PARITY_ODD
-            self.dump_port_settings()
-        elif c in 'mM':                         # M -> change to mark parity
-            self.serial.parity = serial.PARITY_MARK
-            self.dump_port_settings()
-        elif c in 'sS':                         # S -> change to space parity
-            self.serial.parity = serial.PARITY_SPACE
-            self.dump_port_settings()
-        elif c in 'nN':                         # N -> change to no parity
-            self.serial.parity = serial.PARITY_NONE
-            self.dump_port_settings()
-        elif c == '1':                          # 1 -> change to 1 stop bits
-            self.serial.stopbits = serial.STOPBITS_ONE
-            self.dump_port_settings()
-        elif c == '2':                          # 2 -> change to 2 stop bits
-            self.serial.stopbits = serial.STOPBITS_TWO
-            self.dump_port_settings()
-        elif c == '3':                          # 3 -> change to 1.5 stop bits
-            self.serial.stopbits = serial.STOPBITS_ONE_POINT_FIVE
-            self.dump_port_settings()
-        elif c in 'xX':                         # X -> change software flow control
-            self.serial.xonxoff = (c == 'X')
-            self.dump_port_settings()
-        elif c in 'rR':                         # R -> change hardware flow control
-            self.serial.rtscts = (c == 'R')
-            self.dump_port_settings()
-        else:
-            sys.stderr.write('--- unknown menu character {} --\n'.format(key_description(c)))
-
-    def upload_file(self):
-        """Ask user for filenname and send its contents"""
-        sys.stderr.write('\n--- File to upload: ')
-        sys.stderr.flush()
-        with self.console:
-            filename = sys.stdin.readline().rstrip('\r\n')
-            if filename:
-                try:
-                    with open(filename, 'rb') as f:
-                        sys.stderr.write('--- Sending file {} ---\n'.format(filename))
-                        while True:
-                            block = f.read(1024)
-                            if not block:
-                                break
-                            self.serial.write(block)
-                            # Wait for output buffer to drain.
-                            self.serial.flush()
-                            sys.stderr.write('.')   # Progress indicator.
-                    sys.stderr.write('\n--- File {} sent ---\n'.format(filename))
-                except IOError as e:
-                    sys.stderr.write('--- ERROR opening file {}: {} ---\n'.format(filename, e))
-
-    def change_filter(self):
-        """change the i/o transformations"""
-        sys.stderr.write('\n--- Available Filters:\n')
-        sys.stderr.write('\n'.join(
-            '---   {:<10} = {.__doc__}'.format(k, v)
-            for k, v in sorted(TRANSFORMATIONS.items())))
-        sys.stderr.write('\n--- Enter new filter name(s) [{}]: '.format(' '.join(self.filters)))
-        with self.console:
-            new_filters = sys.stdin.readline().lower().split()
-        if new_filters:
-            for f in new_filters:
-                if f not in TRANSFORMATIONS:
-                    sys.stderr.write('--- unknown filter: {}\n'.format(repr(f)))
-                    break
-            else:
-                self.filters = new_filters
-                self.update_transformations()
-        sys.stderr.write('--- filters: {}\n'.format(' '.join(self.filters)))
-
-    def change_encoding(self):
-        """change encoding on the serial port"""
-        sys.stderr.write('\n--- Enter new encoding name [{}]: '.format(self.input_encoding))
-        with self.console:
-            new_encoding = sys.stdin.readline().strip()
-        if new_encoding:
-            try:
-                codecs.lookup(new_encoding)
-            except LookupError:
-                sys.stderr.write('--- invalid encoding name: {}\n'.format(new_encoding))
-            else:
-                self.set_rx_encoding(new_encoding)
-                self.set_tx_encoding(new_encoding)
-        sys.stderr.write('--- serial input encoding: {}\n'.format(self.input_encoding))
-        sys.stderr.write('--- serial output encoding: {}\n'.format(self.output_encoding))
-
-    def change_baudrate(self):
-        """change the baudrate"""
-        sys.stderr.write('\n--- Baudrate: ')
-        sys.stderr.flush()
-        with self.console:
-            backup = self.serial.baudrate
-            try:
-                self.serial.baudrate = int(sys.stdin.readline().strip())
-            except ValueError as e:
-                sys.stderr.write('--- ERROR setting baudrate: {} ---\n'.format(e))
-                self.serial.baudrate = backup
-            else:
-                self.dump_port_settings()
-
-    def change_port(self):
-        """Have a conversation with the user to change the serial port"""
-        with self.console:
-            try:
-                port = ask_for_port()
-            except KeyboardInterrupt:
-                port = None
-        if port and port != self.serial.port:
-            # reader thread needs to be shut down
-            self._stop_reader()
-            # save settings
-            settings = self.serial.getSettingsDict()
-            try:
-                new_serial = serial.serial_for_url(port, do_not_open=True)
-                # restore settings and open
-                new_serial.applySettingsDict(settings)
-                new_serial.rts = self.serial.rts
-                new_serial.dtr = self.serial.dtr
-                new_serial.open()
-                new_serial.break_condition = self.serial.break_condition
-            except Exception as e:
-                sys.stderr.write('--- ERROR opening new port: {} ---\n'.format(e))
-                new_serial.close()
-            else:
-                self.serial.close()
-                self.serial = new_serial
-                sys.stderr.write('--- Port changed to: {} ---\n'.format(self.serial.port))
-            # and restart the reader thread
-            self._start_reader()
-
-    def suspend_port(self):
-        """\
-        open port temporarily, allow reconnect, exit and port change to get
-        out of the loop
-        """
-        # reader thread needs to be shut down
-        self._stop_reader()
-        self.serial.close()
-        sys.stderr.write('\n--- Port closed: {} ---\n'.format(self.serial.port))
-        do_change_port = False
-        while not self.serial.is_open:
-            sys.stderr.write('--- Quit: {exit} | p: port change | any other key to reconnect ---\n'.format(
-                exit=key_description(self.exit_character)))
-            k = self.console.getkey()
-            if k == self.exit_character:
-                self.stop()             # exit app
-                break
-            elif k in 'pP':
-                do_change_port = True
-                break
-            try:
-                self.serial.open()
-            except Exception as e:
-                sys.stderr.write('--- ERROR opening port: {} ---\n'.format(e))
-        if do_change_port:
-            self.change_port()
-        else:
-            # and restart the reader thread
-            self._start_reader()
-            sys.stderr.write('--- Port opened: {} ---\n'.format(self.serial.port))
-
-    def get_help_text(self):
-        """return the help text"""
-        # help text, starts with blank line!
-        return """
---- pySerial ({version}) - miniterm - help
----
---- {exit:8} Exit program
---- {menu:8} Menu escape key, followed by:
---- Menu keys:
----    {menu:7} Send the menu character itself to remote
----    {exit:7} Send the exit character itself to remote
----    {info:7} Show info
----    {upload:7} Upload file (prompt will be shown)
----    {repr:7} encoding
----    {filter:7} edit filters
---- Toggles:
----    {rts:7} RTS   {dtr:7} DTR   {brk:7} BREAK
----    {echo:7} echo  {eol:7} EOL
----
---- Port settings ({menu} followed by the following):
----    p          change port
----    7 8        set data bits
----    N E O S M  change parity (None, Even, Odd, Space, Mark)
----    1 2 3      set stop bits (1, 2, 1.5)
----    b          change baud rate
----    x X        disable/enable software flow control
----    r R        disable/enable hardware flow control
-""".format(version=getattr(serial, 'VERSION', 'unknown version'),
-           exit=key_description(self.exit_character),
-           menu=key_description(self.menu_character),
-           rts=key_description('\x12'),
-           dtr=key_description('\x04'),
-           brk=key_description('\x02'),
-           echo=key_description('\x05'),
-           info=key_description('\x09'),
-           upload=key_description('\x15'),
-           repr=key_description('\x01'),
-           filter=key_description('\x06'),
-           eol=key_description('\x0c'))
-
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-# default args can be used to override when calling main() from an other script
-# e.g to create a miniterm-my-device.py
-def main(default_port=None, default_baudrate=9600, default_rts=None, default_dtr=None):
-    """Command line tool, entry point"""
-
-    import argparse
-
-    parser = argparse.ArgumentParser(
-        description="Miniterm - A simple terminal program for the serial port.")
-
-    parser.add_argument(
-        "port",
-        nargs='?',
-        help="serial port name ('-' to show port list)",
-        default=default_port)
-
-    parser.add_argument(
-        "baudrate",
-        nargs='?',
-        type=int,
-        help="set baud rate, default: %(default)s",
-        default=default_baudrate)
-
-    group = parser.add_argument_group("port settings")
-
-    group.add_argument(
-        "--parity",
-        choices=['N', 'E', 'O', 'S', 'M'],
-        type=lambda c: c.upper(),
-        help="set parity, one of {N E O S M}, default: N",
-        default='N')
-
-    group.add_argument(
-        "--rtscts",
-        action="store_true",
-        help="enable RTS/CTS flow control (default off)",
-        default=False)
-
-    group.add_argument(
-        "--xonxoff",
-        action="store_true",
-        help="enable software flow control (default off)",
-        default=False)
-
-    group.add_argument(
-        "--rts",
-        type=int,
-        help="set initial RTS line state (possible values: 0, 1)",
-        default=default_rts)
-
-    group.add_argument(
-        "--dtr",
-        type=int,
-        help="set initial DTR line state (possible values: 0, 1)",
-        default=default_dtr)
-
-    group.add_argument(
-        "--ask",
-        action="store_true",
-        help="ask again for port when open fails",
-        default=False)
-
-    group = parser.add_argument_group("data handling")
-
-    group.add_argument(
-        "-e", "--echo",
-        action="store_true",
-        help="enable local echo (default off)",
-        default=False)
-
-    group.add_argument(
-        "--encoding",
-        dest="serial_port_encoding",
-        metavar="CODEC",
-        help="set the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default: %(default)s",
-        default='UTF-8')
-
-    group.add_argument(
-        "-f", "--filter",
-        action="append",
-        metavar="NAME",
-        help="add text transformation",
-        default=[])
-
-    group.add_argument(
-        "--eol",
-        choices=['CR', 'LF', 'CRLF'],
-        type=lambda c: c.upper(),
-        help="end of line mode",
-        default='CRLF')
-
-    group.add_argument(
-        "--raw",
-        action="store_true",
-        help="Do no apply any encodings/transformations",
-        default=False)
-
-    group = parser.add_argument_group("hotkeys")
-
-    group.add_argument(
-        "--exit-char",
-        type=int,
-        metavar='NUM',
-        help="Unicode of special character that is used to exit the application, default: %(default)s",
-        default=0x1d)  # GS/CTRL+]
-
-    group.add_argument(
-        "--menu-char",
-        type=int,
-        metavar='NUM',
-        help="Unicode code of special character that is used to control miniterm (menu), default: %(default)s",
-        default=0x14)  # Menu: CTRL+T
-
-    group = parser.add_argument_group("diagnostics")
-
-    group.add_argument(
-        "-q", "--quiet",
-        action="store_true",
-        help="suppress non-error messages",
-        default=False)
-
-    group.add_argument(
-        "--develop",
-        action="store_true",
-        help="show Python traceback on error",
-        default=False)
-
-    args = parser.parse_args()
-
-    if args.menu_char == args.exit_char:
-        parser.error('--exit-char can not be the same as --menu-char')
-
-    if args.filter:
-        if 'help' in args.filter:
-            sys.stderr.write('Available filters:\n')
-            sys.stderr.write('\n'.join(
-                '{:<10} = {.__doc__}'.format(k, v)
-                for k, v in sorted(TRANSFORMATIONS.items())))
-            sys.stderr.write('\n')
-            sys.exit(1)
-        filters = args.filter
-    else:
-        filters = ['default']
-
-    while True:
-        # no port given on command line -> ask user now
-        if args.port is None or args.port == '-':
-            try:
-                args.port = ask_for_port()
-            except KeyboardInterrupt:
-                sys.stderr.write('\n')
-                parser.error('user aborted and port is not given')
-            else:
-                if not args.port:
-                    parser.error('port is not given')
-        try:
-            serial_instance = serial.serial_for_url(
-                args.port,
-                args.baudrate,
-                parity=args.parity,
-                rtscts=args.rtscts,
-                xonxoff=args.xonxoff,
-                do_not_open=True)
-
-            if not hasattr(serial_instance, 'cancel_read'):
-                # enable timeout for alive flag polling if cancel_read is not available
-                serial_instance.timeout = 1
-
-            if args.dtr is not None:
-                if not args.quiet:
-                    sys.stderr.write('--- forcing DTR {}\n'.format('active' if args.dtr else 'inactive'))
-                serial_instance.dtr = args.dtr
-            if args.rts is not None:
-                if not args.quiet:
-                    sys.stderr.write('--- forcing RTS {}\n'.format('active' if args.rts else 'inactive'))
-                serial_instance.rts = args.rts
-
-            serial_instance.open()
-        except serial.SerialException as e:
-            sys.stderr.write('could not open port {}: {}\n'.format(repr(args.port), e))
-            if args.develop:
-                raise
-            if not args.ask:
-                sys.exit(1)
-            else:
-                args.port = '-'
-        else:
-            break
-
-    miniterm = Miniterm(
-        serial_instance,
-        echo=args.echo,
-        eol=args.eol.lower(),
-        filters=filters)
-    miniterm.exit_character = unichr(args.exit_char)
-    miniterm.menu_character = unichr(args.menu_char)
-    miniterm.raw = args.raw
-    miniterm.set_rx_encoding(args.serial_port_encoding)
-    miniterm.set_tx_encoding(args.serial_port_encoding)
-
-    if not args.quiet:
-        sys.stderr.write('--- Miniterm on {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} ---\n'.format(
-            p=miniterm.serial))
-        sys.stderr.write('--- Quit: {} | Menu: {} | Help: {} followed by {} ---\n'.format(
-            key_description(miniterm.exit_character),
-            key_description(miniterm.menu_character),
-            key_description(miniterm.menu_character),
-            key_description('\x08')))
-
-    miniterm.start()
-    try:
-        miniterm.join(True)
-    except KeyboardInterrupt:
-        pass
-    if not args.quiet:
-        sys.stderr.write("\n--- exit ---\n")
-    miniterm.join()
-    miniterm.close()
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-if __name__ == '__main__':
-    main()
diff --git a/venv/lib/python3.8/site-packages/serial/tools/miniterm.pyc b/venv/lib/python3.8/site-packages/serial/tools/miniterm.pyc
deleted file mode 100644
index 3e6e5cbad94cc5ac3114af02788fd93d6947d8ab..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 30469
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

diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/__init__.pyc b/venv/lib/python3.8/site-packages/serial/urlhandler/__init__.pyc
deleted file mode 100644
index 17d71fe01ef09a8825cacd00df3b4851b9a8a8c8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 145
zcmZSn%*(|&d0%KU0~9a<X$K%KW&si@3=F{<AQ3+eAi;n}6k7qs^z@TTGjme(b25|k
zax(KuD|9O?%;L>VbdB`P^@~%BG81$3ON(+c67y1WQj7HC<1_OzOXB183MxxDfZA<x
Q^HWN5Qtd#N6az5>06;GunE(I)

diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_alt.py b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_alt.py
deleted file mode 100644
index c14a87e..0000000
--- a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_alt.py
+++ /dev/null
@@ -1,55 +0,0 @@
-#! python
-#
-# This module implements a special URL handler that allows selecting an
-# alternate implementation provided by some backends.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-#
-# URL format:    alt://port[?option[=value][&option[=value]]]
-# options:
-# - class=X used class named X instead of Serial
-#
-# example:
-#   use poll based implementation on Posix (Linux):
-#   python -m serial.tools.miniterm alt:///dev/ttyUSB0?class=PosixPollSerial
-
-try:
-    import urlparse
-except ImportError:
-    import urllib.parse as urlparse
-
-import serial
-
-
-def serial_class_for_url(url):
-    """extract host and port from an URL string"""
-    parts = urlparse.urlsplit(url)
-    if parts.scheme != 'alt':
-        raise serial.SerialException(
-            'expected a string in the form "alt://port[?option[=value][&option[=value]]]": '
-            'not starting with alt:// ({!r})'.format(parts.scheme))
-    class_name = 'Serial'
-    try:
-        for option, values in urlparse.parse_qs(parts.query, True).items():
-            if option == 'class':
-                class_name = values[0]
-            else:
-                raise ValueError('unknown option: {!r}'.format(option))
-    except ValueError as e:
-        raise serial.SerialException(
-            'expected a string in the form '
-            '"alt://port[?option[=value][&option[=value]]]": {!r}'.format(e))
-    if not hasattr(serial, class_name):
-        raise ValueError('unknown class: {!r}'.format(class_name))
-    cls = getattr(serial, class_name)
-    if not issubclass(cls, serial.Serial):
-        raise ValueError('class {!r} is not an instance of Serial'.format(class_name))
-    return (''.join([parts.netloc, parts.path]), cls)
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-if __name__ == '__main__':
-    s = serial.serial_for_url('alt:///dev/ttyS0?class=PosixPollSerial')
-    print(s)
diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_hwgrep.py b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_hwgrep.py
deleted file mode 100644
index 49bbebe..0000000
--- a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_hwgrep.py
+++ /dev/null
@@ -1,89 +0,0 @@
-#! python
-#
-# This module implements a special URL handler that uses the port listing to
-# find ports by searching the string descriptions.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2011-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-#
-# URL format:    hwgrep://<regexp>&<option>
-#
-# where <regexp> is a Python regexp according to the re module
-#
-# violating the normal definition for URLs, the charachter `&` is used to
-# separate parameters from the arguments (instead of `?`, but the question mark
-# is heavily used in regexp'es)
-#
-# options:
-# n=<N>     pick the N'th entry instead of the first one (numbering starts at 1)
-# skip_busy tries to open port to check if it is busy, fails on posix as ports are not locked!
-
-import serial
-import serial.tools.list_ports
-
-try:
-    basestring
-except NameError:
-    basestring = str    # python 3  pylint: disable=redefined-builtin
-
-
-class Serial(serial.Serial):
-    """Just inherit the native Serial port implementation and patch the port property."""
-    # pylint: disable=no-member
-
-    @serial.Serial.port.setter
-    def port(self, value):
-        """translate port name before storing it"""
-        if isinstance(value, basestring) and value.startswith('hwgrep://'):
-            serial.Serial.port.__set__(self, self.from_url(value))
-        else:
-            serial.Serial.port.__set__(self, value)
-
-    def from_url(self, url):
-        """extract host and port from an URL string"""
-        if url.lower().startswith("hwgrep://"):
-            url = url[9:]
-        n = 0
-        test_open = False
-        args = url.split('&')
-        regexp = args.pop(0)
-        for arg in args:
-            if '=' in arg:
-                option, value = arg.split('=', 1)
-            else:
-                option = arg
-                value = None
-            if option == 'n':
-                # pick n'th element
-                n = int(value) - 1
-                if n < 1:
-                    raise ValueError('option "n" expects a positive integer larger than 1: {!r}'.format(value))
-            elif option == 'skip_busy':
-                # open to test if port is available. not the nicest way..
-                test_open = True
-            else:
-                raise ValueError('unknown option: {!r}'.format(option))
-        # use a for loop to get the 1st element from the generator
-        for port, desc, hwid in sorted(serial.tools.list_ports.grep(regexp)):
-            if test_open:
-                try:
-                    s = serial.Serial(port)
-                except serial.SerialException:
-                    # it has some error, skip this one
-                    continue
-                else:
-                    s.close()
-            if n:
-                n -= 1
-                continue
-            return port
-        else:
-            raise serial.SerialException('no ports found matching regexp {!r}'.format(url))
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-if __name__ == '__main__':
-    s = Serial(None)
-    s.port = 'hwgrep://ttyS0'
-    print(s)
diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_hwgrep.pyc b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_hwgrep.pyc
deleted file mode 100644
index 4413aaa3c9659aea9c6b55136713a123e22cc622..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1627
zcmcIkZEF)j5T3nD+O${|(W(e~DusM85fR@|@fAfRLW-zCIj(n`=Hg{H>~2g7Er|L{
z{R{p8eP*s!#jhH&liA(botfu(Hu1N$)$RG$mpSc!n)tnk;XlF@_$sQ11_!=kf2Tz{
zBK69gq=t^^{VKVeq?FPP8bo9iy)GisMB^q66%{dkA^J@8X3!+PL`8$%N91-%H~IR{
zxUxkBwpx^~uzm8>NaD@*5{f9l<I@Z5ZfaL%)j_QhmL6dEE)3EQkP8;6V;VO&`xx1j
zWJeNYi`XA5Q-8A^^T8J|&t^U(r5WMwkc5#=Ocu%yI;oQ-Q|qujnO1tDO~95lNoI;<
znuUBM@e(n0cB)<2>Ev7$4@UAKh6i92h;|hPbc@dKu|JOXo5wW#R_`t%f!s3302;(A
zv;J2^y@7uA8`<C-E;GK$g05>e*+eH>dT5<ae6X%G+esPx3L;1IZKtQVy4_y8#Rpem
zN?#fuGLvhWZe?Ekz=vdt9T)t(3?m`J3lV)BqtJk12*NU)H1#^9Y2a&z&Q8*qtJ;i)
zgn3;J1LN``t7f_lhs5~%@H*YCSy>g`s@&>SrI{@*EpA*(uU)-#rE|SoC+y<35x}ps
z>jLm#b6cf#Go9&9pKm^c;aMvbpH&wkVT0GXN?~INhv64Rj-eQV*<Ij8;CXIO5!AQ1
zLm{H^PhM&+9=$tCZ)4hvXb-kQyMX@{he2gApNH7j!PzI=)BrP_*K>n<0dDe;j4Y%k
z;$cxSKA0sh`_DlTL;WW?B~#_k!x$@+`ebNlkluu)$8<Wqtryc|!}Zz>zCc^qxpsY4
zcb|KfwP0=Kg~zJ&A!W9_5W+GDM-Wzv{qZ8l9154x`%EIFNd(vhTsc!{pNlh^m&HHl
zko&lZ;aQUuoltAhhH6H&PPw2oWnn{N9FV3HTg)n+*6J&4o~F{ch_kMm<p5a*;KEVA
zY8LMwi4PakDNe-Mmef*oswJ-gC1$0;yEu&XgNGNw&gSJdw@|Zml26K`>IhkQ0Y8cA
z%kyC^^w9WY=fED50?E`p9>YWk=~<)k7lSS7`@i%lJ>9NRzst(;$6*esLs6_+YE7-i
Kr`Iu4E9wV~f^MAv

diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_loop.py b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_loop.py
deleted file mode 100644
index 7bf6cf9..0000000
--- a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_loop.py
+++ /dev/null
@@ -1,295 +0,0 @@
-#! python
-#
-# This module implements a loop back connection receiving itself what it sent.
-#
-# The purpose of this module is.. well... You can run the unit tests with it.
-# and it was so easy to implement ;-)
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2001-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-#
-# URL format:    loop://[option[/option...]]
-# options:
-# - "debug" print diagnostic messages
-import logging
-import numbers
-import time
-try:
-    import urlparse
-except ImportError:
-    import urllib.parse as urlparse
-try:
-    import queue
-except ImportError:
-    import Queue as queue
-
-from serial.serialutil import SerialBase, SerialException, to_bytes, iterbytes, writeTimeoutError, portNotOpenError
-
-# map log level names to constants. used in from_url()
-LOGGER_LEVELS = {
-    'debug': logging.DEBUG,
-    'info': logging.INFO,
-    'warning': logging.WARNING,
-    'error': logging.ERROR,
-}
-
-
-class Serial(SerialBase):
-    """Serial port implementation that simulates a loop back connection in plain software."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def __init__(self, *args, **kwargs):
-        self.buffer_size = 4096
-        self.queue = None
-        self.logger = None
-        self._cancel_write = False
-        super(Serial, self).__init__(*args, **kwargs)
-
-    def open(self):
-        """\
-        Open port with current settings. This may throw a SerialException
-        if the port cannot be opened.
-        """
-        if self.is_open:
-            raise SerialException("Port is already open.")
-        self.logger = None
-        self.queue = queue.Queue(self.buffer_size)
-
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        # not that there is anything to open, but the function applies the
-        # options found in the URL
-        self.from_url(self.port)
-
-        # not that there anything to configure...
-        self._reconfigure_port()
-        # all things set up get, now a clean start
-        self.is_open = True
-        if not self._dsrdtr:
-            self._update_dtr_state()
-        if not self._rtscts:
-            self._update_rts_state()
-        self.reset_input_buffer()
-        self.reset_output_buffer()
-
-    def close(self):
-        if self.is_open:
-            self.is_open = False
-            try:
-                self.queue.put_nowait(None)
-            except queue.Full:
-                pass
-        super(Serial, self).close()
-
-    def _reconfigure_port(self):
-        """\
-        Set communication parameters on opened port. For the loop://
-        protocol all settings are ignored!
-        """
-        # not that's it of any real use, but it helps in the unit tests
-        if not isinstance(self._baudrate, numbers.Integral) or not 0 < self._baudrate < 2 ** 32:
-            raise ValueError("invalid baudrate: {!r}".format(self._baudrate))
-        if self.logger:
-            self.logger.info('_reconfigure_port()')
-
-    def from_url(self, url):
-        """extract host and port from an URL string"""
-        parts = urlparse.urlsplit(url)
-        if parts.scheme != "loop":
-            raise SerialException(
-                'expected a string in the form '
-                '"loop://[?logging={debug|info|warning|error}]": not starting '
-                'with loop:// ({!r})'.format(parts.scheme))
-        try:
-            # process options now, directly altering self
-            for option, values in urlparse.parse_qs(parts.query, True).items():
-                if option == 'logging':
-                    logging.basicConfig()   # XXX is that good to call it here?
-                    self.logger = logging.getLogger('pySerial.loop')
-                    self.logger.setLevel(LOGGER_LEVELS[values[0]])
-                    self.logger.debug('enabled logging')
-                else:
-                    raise ValueError('unknown option: {!r}'.format(option))
-        except ValueError as e:
-            raise SerialException(
-                'expected a string in the form '
-                '"loop://[?logging={debug|info|warning|error}]": {}'.format(e))
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    @property
-    def in_waiting(self):
-        """Return the number of bytes currently in the input buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            # attention the logged value can differ from return value in
-            # threaded environments...
-            self.logger.debug('in_waiting -> {:d}'.format(self.queue.qsize()))
-        return self.queue.qsize()
-
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if self._timeout is not None and self._timeout != 0:
-            timeout = time.time() + self._timeout
-        else:
-            timeout = None
-        data = bytearray()
-        while size > 0 and self.is_open:
-            try:
-                b = self.queue.get(timeout=self._timeout)  # XXX inter char timeout
-            except queue.Empty:
-                if self._timeout == 0:
-                    break
-            else:
-                if b is not None:
-                    data += b
-                    size -= 1
-                else:
-                    break
-            # check for timeout now, after data has been read.
-            # useful for timeout = 0 (non blocking) read
-            if timeout and time.time() > timeout:
-                if self.logger:
-                    self.logger.info('read timeout')
-                break
-        return bytes(data)
-
-    def cancel_read(self):
-        self.queue.put_nowait(None)
-
-    def cancel_write(self):
-        self._cancel_write = True
-
-    def write(self, data):
-        """\
-        Output the given byte string over the serial port. Can block if the
-        connection is blocked. May raise SerialException if the connection is
-        closed.
-        """
-        self._cancel_write = False
-        if not self.is_open:
-            raise portNotOpenError
-        data = to_bytes(data)
-        # calculate aprox time that would be used to send the data
-        time_used_to_send = 10.0 * len(data) / self._baudrate
-        # when a write timeout is configured check if we would be successful
-        # (not sending anything, not even the part that would have time)
-        if self._write_timeout is not None and time_used_to_send > self._write_timeout:
-            # must wait so that unit test succeeds
-            time_left = self._write_timeout
-            while time_left > 0 and not self._cancel_write:
-                time.sleep(min(time_left, 0.5))
-                time_left -= 0.5
-            if self._cancel_write:
-                return 0  # XXX
-            raise writeTimeoutError
-        for byte in iterbytes(data):
-            self.queue.put(byte, timeout=self._write_timeout)
-        return len(data)
-
-    def reset_input_buffer(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('reset_input_buffer()')
-        try:
-            while self.queue.qsize():
-                self.queue.get_nowait()
-        except queue.Empty:
-            pass
-
-    def reset_output_buffer(self):
-        """\
-        Clear output buffer, aborting the current output and
-        discarding all that is in the buffer.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('reset_output_buffer()')
-        try:
-            while self.queue.qsize():
-                self.queue.get_nowait()
-        except queue.Empty:
-            pass
-
-    def _update_break_state(self):
-        """\
-        Set break: Controls TXD. When active, to transmitting is
-        possible.
-        """
-        if self.logger:
-            self.logger.info('_update_break_state({!r})'.format(self._break_state))
-
-    def _update_rts_state(self):
-        """Set terminal status line: Request To Send"""
-        if self.logger:
-            self.logger.info('_update_rts_state({!r}) -> state of CTS'.format(self._rts_state))
-
-    def _update_dtr_state(self):
-        """Set terminal status line: Data Terminal Ready"""
-        if self.logger:
-            self.logger.info('_update_dtr_state({!r}) -> state of DSR'.format(self._dtr_state))
-
-    @property
-    def cts(self):
-        """Read terminal status line: Clear To Send"""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('CTS -> state of RTS ({!r})'.format(self._rts_state))
-        return self._rts_state
-
-    @property
-    def dsr(self):
-        """Read terminal status line: Data Set Ready"""
-        if self.logger:
-            self.logger.info('DSR -> state of DTR ({!r})'.format(self._dtr_state))
-        return self._dtr_state
-
-    @property
-    def ri(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for RI')
-        return False
-
-    @property
-    def cd(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for CD')
-        return True
-
-    # - - - platform specific - - -
-    # None so far
-
-
-# simple client test
-if __name__ == '__main__':
-    import sys
-    s = Serial('loop://')
-    sys.stdout.write('{}\n'.format(s))
-
-    sys.stdout.write("write...\n")
-    s.write("hello\n")
-    s.flush()
-    sys.stdout.write("read: {!r}\n".format(s.read(5)))
-
-    s.close()
diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_loop.pyc b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_loop.pyc
deleted file mode 100644
index adf6757d1a8e0b62bf4ccfa0146cccc03d76d5fc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9394
zcmd5>O>i7X74F$x$y!;qY+3$`e=?5aWRr^5sU+nXLlVc5>~djbGm?Lz5QfptNE&H&
zX5Bq&YlB^t!l~SVTkaH9aHUd}Q!c=X69pH-g(~36EgU#N6@1_8nO(__Q?A0IkUhQK
zJ^lOod+&X(r~3CDqc8vbU)Nfy_#49SIXq_3Q7XiLM<q%v^z)8daLW3MTBxYruCiEF
z3srR^byY2@skKq1uPeuKiZO=N>M-A@j=DMMvP~^)Lzg4{E+1{^GQyW^&mk%*sjK<8
zrXr<QM^#u=r<vQX!kW#Esc^{VcBpVzonF|f!fh%VS4&v$i26{e`%1mDuuDa|RajSR
z6{WvhE^b0COsEJO8CCbO!96OPP^*(_b*~Dyt7wnfhgxS)H^x>D>e*mNzp#%pY-qNV
zU03(3aGXu-7^pZP%~BEVTw@nx9se7DvkeGb<xF18c?w~)*j>(Re4j35`8H(k1Uik=
zWqBQGo#}iSwR4e<gQS0gyHRx>kNGVU$jF`-PAYts2M|tB77H~M?vc!p3MVBqtirvL
z*`~sMk{MA^U4{FZr&u8M11dbIK13dJe@faw?1v-+sUMaM<bFgl<0?EV83^`i$?TQ^
zUFJC;WRCHVl|_gh#b?Umq!f>r#l6a#Yn<S|=8)JuyB&zYjoY0hYDZ}v<Z+g|`AU$x
zCT@3=Adie2xJj0E+{K`^=C-mljat$wPTfutAT`-i4!K6n_!W#Bf0GFgN5vm8`IyOX
zn7o9OiEmbr`~qhZkKjDw@70m~astT*SXr#lIacTrtG_V$wWC@*&uZ~p!LNA^NiGL{
z7gDIG)rz|7sJj*QBY+3mhFTw|ge^8OnVO9iAkx5;N{-!hJCXK?k9-7)@5gDJ`+mM1
zg~jgDQlxzozaKR?r+~*q$&zFOy=(+8YuN6xX`q3U#Jq)E^VDKDPQp`3yx2_Qw7Y(C
z{mg0q^lK+yX}*5S2*OTvb+QtqVG`+69i8P_D@%L|x7q1=gy$(dhAUOhK}UAZ-E$XH
zc+6)=u)9^I^Z^1Ln*|Df;3(=swb(e8x;iAyhWVD#s7Vp1tg5vUrRSw@Wzd&nj!2t2
zD;<`h$XErW!U62GW6JzcT0vv+4wJIsPGx>787S$Xc9#_Rez)YpDvpCYGwVp);_pf)
z0*VO1J8{0^wz^sag|3P699n9c?)*w@+;-3dCUthl4O|P`ne|rGAqq#!k>VvZiR@Ud
zAWgH}U5wle<40k$-^%R8<W~jqz;&XdAnZw_rfHUM+Fc`k0rjPLxvQfPBQ0e*a^u{^
z&>XjGFzRdrxK(0SV&ikFd>j=ItWc0Mo28K;C&`wVBP}?*)s4E5<i5?EM=(m!r$7Xo
zOFC=&z>JI`wKPq>j{0k}Z7J7zjnRl9KQubbbuLZ2oe(<gqwE`KchN%Urj?sbEl^do
z;HGqhBY<Lby18$4BHz=m&bs-aUTm%hEw-BQ#MD8yOqsrlq0LbwYN+mvJ9TGoW!xFB
z?y8Pf>L~4yXLO(}RO~7Cp&f#mAbcIwn-qw`ScqjH$Zw>Rs+OZ>NL=l!^qcgRI48&v
z-Dp}yEO=>4sEM-;?o>|cLXeoq8$;2f2g*m0P%LS7Cx~-zC+m1F7rIH}(aBho!{xP-
z%tTuyIPVx{n8jnbHU;riok?exQ~MGTftM5_T6GjfQRSw`%xPK{>aL?|)itHEm&pW>
zNh_-2jOokVT4=3`^~=@<vCELsE7Di^3K#`t4O0O|G1nl*HyMDr2s)Lu+uby7S?ALU
zbkL6SNE;Wf$SSa?b<@3&X;E@o%(JIX^|iV*rO@c4Z#!IgBsX48p}66(e$$vTiD^({
z7m1l<F1;NjF|<7Bh8j9@);*yO;r@`KHC~v#gnC6NG^lHG>amGaC|BBwa-zd8#}REz
zyX{5nMb!CHnn%kzNTk>GAn8Ukq#z!xhQ~E+8764<uH!L005yEt*#}&-I3<zUSDAmH
z0F}Y9!=d8b?!mJH6(By2TB|Dky2_zGWhH1KDVaU`-p6YF$I=<F5T$}1QG>QogQnlp
z>N^#6ud43hHO7D=0)70HE_f9_2O?z-{HVrxsk7pEz)n}kRK7#q1>T0#!Gi=7QHFZ3
zByn)gt?LSg7XZb;gEgV{#*OqiRD4|Y`wQjV8^Sc09IkGtzjU(WI-p7Y6_*~Z=Q?QR
z?n(wf0B3D|3QaLe?lteSYjRBvN$n;S4b>=G?|>J<R|Lgt7tDwr37(_vK2t#U-M8of
z(D{w;3pu?@VtThArFVsp-h1zvvo75iAf@RAt!pd>a2qG|3j(ZSAhQFLcY4<8G}%fZ
zZiuNU4HgqDsccHi-c8qFp{Q7Np91x(Pki|&%&gFIK|TBzbQ=DI*h9f|k~kM<Xj&^^
zogQ}}FQu7(%ara>_q=_4M|{S4)HYs&MImZ|iCa_Rp+)JIqx`bCR#7Gy4KrSjZbu2w
zqtxXq7cb6u{^gnLGneN)>aRx{*$~4_tpzS*but+i0{6&wR!owGk?2N7!i$LOc!JcA
z#wNgHp5nOlZ=iqGO2Zj*Mx6=gfU~D^2z4#4n-AAIg-3iG)dATFlDdHzhIYLvW>~Cx
zVa|ma-dClTlnkz{wtU%q4I_I|-qjYs)`Gd&lDpVrI8czZq*o$bXo72LLeoe%milyp
z1n<c=-4me|GyPG{*JLuYS$+lHeS-m%LlIZX^S&h<T<Ul{Pgda8Z1)%0#RP`>ud1XJ
z_3Cja=FDOsxfq&yk@pc)KT6)PPiu9hFBDQQOy&i;%2il3+p(hd!>Fc+6o+VCfi}E=
zSzP~&CYOC`N>7N10}GpQdWU7WVcJm|UYs>}J4{&(LI3kGZg?{y_U#k$7yF*W;QT*V
zS8si;(i7??Ev{YNA7~_DOkc;GoUp3S+(Y=_sH-sA`sRkkR%9tRWlC&oyNq2Q*l2?1
z>aCj!|8Fo#0CjL+MyWLB_ee@&?tx<?n0!Af;3I~VhS7#Zg=@dG<OXgYw<C~C7nC2$
zOS%o_-*?^GLNbXAFt`Gi0CNkH5ExfS;L--hx9Q$s7?Ea!p%__!6)YxMYpp+2H_hWj
ztaHDs`ykA*2!;oP*g@>7nBHQYf)Qa^Y*<b?+aS&@F+78u*do8^GN6U55X(iS3bYP-
zmPS_51;$Lw&`i6N_Xg}h>O=<{1f`H}aYB@?_jS%imjuEeh?QD=!b-!zxzi8uYhFa6
zhN&(`oqd&I{2l<&JPe{a?u=Auw{}#V>H*a6aYiiFV1L463Xl02l7}@39JF8_q6{#~
zwm8YAHMN(71UcNefItA13Au)?q2eTD?nNYPi6=yCZQ}Y#k~KTp^m|WJ=h#p91=XV*
z=03FORu7Oar!Jz_Pq5w+(pMw^68tR3w-LeeP)fI--Ht3v-GuKc#*M_FYXj9j6gOU|
z7~6z6{uV-B9mFPjFyJlvZ@P#vgV7jSY{2X?R*k=B&j~zc8+3&aKr_#L!IU__Buc&G
zXp=L1@$YDO-A&N--r!53&m<8daK@O@YTl}@m~(+OdTJSW0Bb}?aswd1^@sxLPfhR{
zQ2SVliPBI|%)U<;zg)H~_9t9FnZE__SY?0pD1b|-9vL`UHW#RNkRevk>0u|^lvkyb
zB|U{*>^-m6U3pQuRy|i1!CB$NZ@or#$^aBC5L)4`cdZOSfyFtweG*SRmB2i})k1oO
zkA2AvW77(BNdL-^NABxjuL{OldSdSI;XocSjD%qW7z`|ooRvraFCG$hs0?S%p>E5f
zlS3H%Q#=qa{v@pDSyVxN_TpUnwCDfeL<|;KngM$<_BNz{G{GXs4G)GcuDs7G+8~(d
zYwBYiVZXK9TiLU;V->eDk9U~fRjk@Ohh)o+@Gu7d6&`zpxT)d4FFC?0+K5uoe^{l`
z&lMSjodr*=Y-Fedb$AzjO5yY3U=iME?W~J1AlF%9-1(c+U;ryH$lwMr%rCh)n1Bva
z(?-O>Lx~5bvXdDTBRm>7c(Whl`^Al!jBRhk7;?>uLJl+~r<3<LHX>o%ihD4*h<JEW
zzr%F)rWnHRYsh~k-WM<=#R|*aj?(~FDIgME<Ki+KcOsr8S?+uWmz0L)1O-s6tABY&
zQIYb?T_Zz=srk8wL`SCW54voT;5^1sf5c;@1gr97q;wKPK3YoCAYbl$DL@Zwskcc|
z{fpR#BsD$feYvCtUA9V62e73-eYK?cf#Z=r@Ql1FeIT3FHY%{KD1uA+bc*E>D6=-T
z#26O_1Z_f;hcbm{Ik0eT((Hk1dUGglm7x=sguC;<Vvda=<3{4pS3*MN@oXGh(d+X@
z&QK4(LPP>FBG96XG6Hrs$!L1svohjRHb`b3#VwT#K0W*ma~RTm2Gbkp6t^ap{}p7c
zR34X3fg?ShXgu2ZOKHfv<V+i09@(go^<lT&?(sU#^)5XcJp9tIWg?;sbo>R<P1xBp
zFirmpDNP~Vj1i<v<CYyzew37^rXMXO_SsS?wZeZsETsm+jV<}e+>m?55e)D9DLy~o
zbFg?Rznz8MghlzX=7(7ed0t4JfBV|B_xAkEoP4+Sj-X1uym-87_vp0km8QlQ42>xM
zEURajTwy}W>m6p|F`=*WsL9?nCfAwVU~&`5APkb+6ZzOoDor~hH{Qd}a7E#%*XoDr
zBlYd|$?@%D$Lf>yvHCd5L-nEY`uMi-y1mNq+xY13`-T!JZlw+F%n37UC>aT{n$6~@
zSb>!&NizFF!|db2*^I`Vy>SqUT<ChwGRMf$<C5fl_fngegf^U{jmNz)zpLAeWOkRF
zjaP^Yi6m{r-LyYlT=7VxIz4m#+C_;eFU?-KA_sZnZEyC{>_vOY;(1p*k48z3d`>>p
zpAYbDkJEVX@CCPLdiL(u-V2*N1QD0Blu?$Fu353?dkl@Y;K)Sy->`UmbAk(c4apd;
mh{q5q?ZSsp(ry0ks*F~vxPalm9kqRbwrwUWd^hSGsr(1|iW0#9

diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_rfc2217.py b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_rfc2217.py
deleted file mode 100644
index 1898803..0000000
--- a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_rfc2217.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#! python
-#
-# This is a thin wrapper to load the rfc2271 implementation.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2011 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-from serial.rfc2217 import Serial  # noqa
diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_rfc2217.pyc b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_rfc2217.pyc
deleted file mode 100644
index 0e59f22725a5ee6699b76ba751f8ecbe57c79ea2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 214
zcmZSn%*)j^^H^vy0~9a;X$K%K76B3|K*Y$9!@!Ws$PmTIz?j0s5Ujxrl*s%K1R9J$
zRtX!B2u>}^Ow94q0BJ7a0}{nx0llKMWFsR(^B|xIg9a*5>;&ZN=_i$D=A`K7WG3n5
zWagDt=vG*m#haPv8tIwqL(I@GEy~GA%uC5hEz&P2$}h=J&d-U5nyXh(S;7G{#wIsE
Pr8Fnijt9st23Z3DYmqSO

diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_serve-rfc2217.py b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_serve-rfc2217.py
deleted file mode 100644
index 1898803..0000000
--- a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_serve-rfc2217.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#! python
-#
-# This is a thin wrapper to load the rfc2271 implementation.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2011 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-from serial.rfc2217 import Serial  # noqa
diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_socket.py b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_socket.py
deleted file mode 100644
index 5c77415..0000000
--- a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_socket.py
+++ /dev/null
@@ -1,356 +0,0 @@
-#! python
-#
-# This module implements a simple socket based client.
-# It does not support changing any port parameters and will silently ignore any
-# requests to do so.
-#
-# The purpose of this module is that applications using pySerial can connect to
-# TCP/IP to serial port converters that do not support RFC 2217.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2001-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-#
-# URL format:    socket://<host>:<port>[/option[/option...]]
-# options:
-# - "debug" print diagnostic messages
-
-import errno
-import logging
-import select
-import socket
-import time
-try:
-    import urlparse
-except ImportError:
-    import urllib.parse as urlparse
-
-from serial.serialutil import SerialBase, SerialException, to_bytes, \
-    portNotOpenError, writeTimeoutError, Timeout
-
-# map log level names to constants. used in from_url()
-LOGGER_LEVELS = {
-    'debug': logging.DEBUG,
-    'info': logging.INFO,
-    'warning': logging.WARNING,
-    'error': logging.ERROR,
-}
-
-POLL_TIMEOUT = 5
-
-
-class Serial(SerialBase):
-    """Serial port implementation for plain sockets."""
-
-    BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-                 9600, 19200, 38400, 57600, 115200)
-
-    def open(self):
-        """\
-        Open port with current settings. This may throw a SerialException
-        if the port cannot be opened.
-        """
-        self.logger = None
-        if self._port is None:
-            raise SerialException("Port must be configured before it can be used.")
-        if self.is_open:
-            raise SerialException("Port is already open.")
-        try:
-            # timeout is used for write timeout support :/ and to get an initial connection timeout
-            self._socket = socket.create_connection(self.from_url(self.portstr), timeout=POLL_TIMEOUT)
-        except Exception as msg:
-            self._socket = None
-            raise SerialException("Could not open port {}: {}".format(self.portstr, msg))
-        # after connecting, switch to non-blocking, we're using select
-        self._socket.setblocking(False)
-
-        # not that there is anything to configure...
-        self._reconfigure_port()
-        # all things set up get, now a clean start
-        self.is_open = True
-        if not self._dsrdtr:
-            self._update_dtr_state()
-        if not self._rtscts:
-            self._update_rts_state()
-        self.reset_input_buffer()
-        self.reset_output_buffer()
-
-    def _reconfigure_port(self):
-        """\
-        Set communication parameters on opened port. For the socket://
-        protocol all settings are ignored!
-        """
-        if self._socket is None:
-            raise SerialException("Can only operate on open ports")
-        if self.logger:
-            self.logger.info('ignored port configuration change')
-
-    def close(self):
-        """Close port"""
-        if self.is_open:
-            if self._socket:
-                try:
-                    self._socket.shutdown(socket.SHUT_RDWR)
-                    self._socket.close()
-                except:
-                    # ignore errors.
-                    pass
-                self._socket = None
-            self.is_open = False
-            # in case of quick reconnects, give the server some time
-            time.sleep(0.3)
-
-    def from_url(self, url):
-        """extract host and port from an URL string"""
-        parts = urlparse.urlsplit(url)
-        if parts.scheme != "socket":
-            raise SerialException(
-                'expected a string in the form '
-                '"socket://<host>:<port>[?logging={debug|info|warning|error}]": '
-                'not starting with socket:// ({!r})'.format(parts.scheme))
-        try:
-            # process options now, directly altering self
-            for option, values in urlparse.parse_qs(parts.query, True).items():
-                if option == 'logging':
-                    logging.basicConfig()   # XXX is that good to call it here?
-                    self.logger = logging.getLogger('pySerial.socket')
-                    self.logger.setLevel(LOGGER_LEVELS[values[0]])
-                    self.logger.debug('enabled logging')
-                else:
-                    raise ValueError('unknown option: {!r}'.format(option))
-            if not 0 <= parts.port < 65536:
-                raise ValueError("port not in range 0...65535")
-        except ValueError as e:
-            raise SerialException(
-                'expected a string in the form '
-                '"socket://<host>:<port>[?logging={debug|info|warning|error}]": {}'.format(e))
-
-        return (parts.hostname, parts.port)
-
-    #  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-
-    @property
-    def in_waiting(self):
-        """Return the number of bytes currently in the input buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-        # Poll the socket to see if it is ready for reading.
-        # If ready, at least one byte will be to read.
-        lr, lw, lx = select.select([self._socket], [], [], 0)
-        return len(lr)
-
-    # select based implementation, similar to posix, but only using socket API
-    # to be portable, additionally handle socket timeout which is used to
-    # emulate write timeouts
-    def read(self, size=1):
-        """\
-        Read size bytes from the serial port. If a timeout is set it may
-        return less characters as requested. With no timeout it will block
-        until the requested number of bytes is read.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        read = bytearray()
-        timeout = Timeout(self._timeout)
-        while len(read) < size:
-            try:
-                ready, _, _ = select.select([self._socket], [], [], timeout.time_left())
-                # If select was used with a timeout, and the timeout occurs, it
-                # returns with empty lists -> thus abort read operation.
-                # For timeout == 0 (non-blocking operation) also abort when
-                # there is nothing to read.
-                if not ready:
-                    break   # timeout
-                buf = self._socket.recv(size - len(read))
-                # read should always return some data as select reported it was
-                # ready to read when we get to this point, unless it is EOF
-                if not buf:
-                    raise SerialException('socket disconnected')
-                read.extend(buf)
-            except OSError as e:
-                # this is for Python 3.x where select.error is a subclass of
-                # OSError ignore BlockingIOErrors and EINTR. other errors are shown
-                # https://www.python.org/dev/peps/pep-0475.
-                if e.errno not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('read failed: {}'.format(e))
-            except (select.error, socket.error) as e:
-                # this is for Python 2.x
-                # ignore BlockingIOErrors and EINTR. all errors are shown
-                # see also http://www.python.org/dev/peps/pep-3151/#select
-                if e[0] not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('read failed: {}'.format(e))
-            if timeout.expired():
-                break
-        return bytes(read)
-
-    def write(self, data):
-        """\
-        Output the given byte string over the serial port. Can block if the
-        connection is blocked. May raise SerialException if the connection is
-        closed.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-
-        d = to_bytes(data)
-        tx_len = length = len(d)
-        timeout = Timeout(self._write_timeout)
-        while tx_len > 0:
-            try:
-                n = self._socket.send(d)
-                if timeout.is_non_blocking:
-                    # Zero timeout indicates non-blocking - simply return the
-                    # number of bytes of data actually written
-                    return n
-                elif not timeout.is_infinite:
-                    # when timeout is set, use select to wait for being ready
-                    # with the time left as timeout
-                    if timeout.expired():
-                        raise writeTimeoutError
-                    _, ready, _ = select.select([], [self._socket], [], timeout.time_left())
-                    if not ready:
-                        raise writeTimeoutError
-                else:
-                    assert timeout.time_left() is None
-                    # wait for write operation
-                    _, ready, _ = select.select([], [self._socket], [], None)
-                    if not ready:
-                        raise SerialException('write failed (select)')
-                d = d[n:]
-                tx_len -= n
-            except SerialException:
-                raise
-            except OSError as e:
-                # this is for Python 3.x where select.error is a subclass of
-                # OSError ignore BlockingIOErrors and EINTR. other errors are shown
-                # https://www.python.org/dev/peps/pep-0475.
-                if e.errno not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('write failed: {}'.format(e))
-            except select.error as e:
-                # this is for Python 2.x
-                # ignore BlockingIOErrors and EINTR. all errors are shown
-                # see also http://www.python.org/dev/peps/pep-3151/#select
-                if e[0] not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('write failed: {}'.format(e))
-            if not timeout.is_non_blocking and timeout.expired():
-                raise writeTimeoutError
-        return length - len(d)
-
-    def reset_input_buffer(self):
-        """Clear input buffer, discarding all that is in the buffer."""
-        if not self.is_open:
-            raise portNotOpenError
-
-        # just use recv to remove input, while there is some
-        ready = True
-        while ready:
-            ready, _, _ = select.select([self._socket], [], [], 0)
-            try:
-                self._socket.recv(4096)
-            except OSError as e:
-                # this is for Python 3.x where select.error is a subclass of
-                # OSError ignore BlockingIOErrors and EINTR. other errors are shown
-                # https://www.python.org/dev/peps/pep-0475.
-                if e.errno not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('read failed: {}'.format(e))
-            except (select.error, socket.error) as e:
-                # this is for Python 2.x
-                # ignore BlockingIOErrors and EINTR. all errors are shown
-                # see also http://www.python.org/dev/peps/pep-3151/#select
-                if e[0] not in (errno.EAGAIN, errno.EALREADY, errno.EWOULDBLOCK, errno.EINPROGRESS, errno.EINTR):
-                    raise SerialException('read failed: {}'.format(e))
-
-    def reset_output_buffer(self):
-        """\
-        Clear output buffer, aborting the current output and
-        discarding all that is in the buffer.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('ignored reset_output_buffer')
-
-    def send_break(self, duration=0.25):
-        """\
-        Send break condition. Timed, returns to idle state after given
-        duration.
-        """
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('ignored send_break({!r})'.format(duration))
-
-    def _update_break_state(self):
-        """Set break: Controls TXD. When active, to transmitting is
-        possible."""
-        if self.logger:
-            self.logger.info('ignored _update_break_state({!r})'.format(self._break_state))
-
-    def _update_rts_state(self):
-        """Set terminal status line: Request To Send"""
-        if self.logger:
-            self.logger.info('ignored _update_rts_state({!r})'.format(self._rts_state))
-
-    def _update_dtr_state(self):
-        """Set terminal status line: Data Terminal Ready"""
-        if self.logger:
-            self.logger.info('ignored _update_dtr_state({!r})'.format(self._dtr_state))
-
-    @property
-    def cts(self):
-        """Read terminal status line: Clear To Send"""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for cts')
-        return True
-
-    @property
-    def dsr(self):
-        """Read terminal status line: Data Set Ready"""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for dsr')
-        return True
-
-    @property
-    def ri(self):
-        """Read terminal status line: Ring Indicator"""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for ri')
-        return False
-
-    @property
-    def cd(self):
-        """Read terminal status line: Carrier Detect"""
-        if not self.is_open:
-            raise portNotOpenError
-        if self.logger:
-            self.logger.info('returning dummy for cd)')
-        return True
-
-    # - - - platform specific - - -
-
-    # works on Linux and probably all the other POSIX systems
-    def fileno(self):
-        """Get the file handle of the underlying socket for use with select"""
-        return self._socket.fileno()
-
-
-#
-# simple client test
-if __name__ == '__main__':
-    import sys
-    s = Serial('socket://localhost:7000')
-    sys.stdout.write('{}\n'.format(s))
-
-    sys.stdout.write("write...\n")
-    s.write(b"hello\n")
-    s.flush()
-    sys.stdout.write("read: {}\n".format(s.read(5)))
-
-    s.close()
diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_socket.pyc b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_socket.pyc
deleted file mode 100644
index 9d356d7b0c8523b528f0341c42d72614a6e5836a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9803
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
HbH4H?BoLNc

diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_spy.py b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_spy.py
deleted file mode 100644
index 3479010..0000000
--- a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_spy.py
+++ /dev/null
@@ -1,286 +0,0 @@
-#! python
-#
-# This module implements a special URL handler that wraps an other port,
-# print the traffic for debugging purposes. With this, it is possible
-# to debug the serial port traffic on every application that uses
-# serial_for_url.
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-#
-# URL format:    spy://port[?option[=value][&option[=value]]]
-# options:
-# - dev=X   a file or device to write to
-# - color   use escape code to colorize output
-# - raw     forward raw bytes instead of hexdump
-#
-# example:
-#   redirect output to an other terminal window on Posix (Linux):
-#   python -m serial.tools.miniterm spy:///dev/ttyUSB0?dev=/dev/pts/14\&color
-
-import sys
-import time
-
-import serial
-
-try:
-    import urlparse
-except ImportError:
-    import urllib.parse as urlparse
-
-
-def sixteen(data):
-    """\
-    yield tuples of hex and ASCII display in multiples of 16. Includes a
-    space after 8 bytes and (None, None) after 16 bytes and at the end.
-    """
-    n = 0
-    for b in serial.iterbytes(data):
-        yield ('{:02X} '.format(ord(b)), b.decode('ascii') if b' ' <= b < b'\x7f' else '.')
-        n += 1
-        if n == 8:
-            yield (' ', '')
-        elif n >= 16:
-            yield (None, None)
-            n = 0
-    if n > 0:
-        while n < 16:
-            n += 1
-            if n == 8:
-                yield (' ', '')
-            yield ('   ', ' ')
-        yield (None, None)
-
-
-def hexdump(data):
-    """yield lines with hexdump of data"""
-    values = []
-    ascii = []
-    offset = 0
-    for h, a in sixteen(data):
-        if h is None:
-            yield (offset, ' '.join([''.join(values), ''.join(ascii)]))
-            del values[:]
-            del ascii[:]
-            offset += 0x10
-        else:
-            values.append(h)
-            ascii.append(a)
-
-
-class FormatRaw(object):
-    """Forward only RX and TX data to output."""
-
-    def __init__(self, output, color):
-        self.output = output
-        self.color = color
-        self.rx_color = '\x1b[32m'
-        self.tx_color = '\x1b[31m'
-
-    def rx(self, data):
-        """show received data"""
-        if self.color:
-            self.output.write(self.rx_color)
-        self.output.write(data)
-        self.output.flush()
-
-    def tx(self, data):
-        """show transmitted data"""
-        if self.color:
-            self.output.write(self.tx_color)
-        self.output.write(data)
-        self.output.flush()
-
-    def control(self, name, value):
-        """(do not) show control calls"""
-        pass
-
-
-class FormatHexdump(object):
-    """\
-    Create a hex dump of RX ad TX data, show when control lines are read or
-    written.
-
-    output example::
-
-        000000.000 Q-RX flushInput
-        000002.469 RTS  inactive
-        000002.773 RTS  active
-        000003.001 TX   48 45 4C 4C 4F                                    HELLO
-        000003.102 RX   48 45 4C 4C 4F                                    HELLO
-
-    """
-
-    def __init__(self, output, color):
-        self.start_time = time.time()
-        self.output = output
-        self.color = color
-        self.rx_color = '\x1b[32m'
-        self.tx_color = '\x1b[31m'
-        self.control_color = '\x1b[37m'
-
-    def write_line(self, timestamp, label, value, value2=''):
-        self.output.write('{:010.3f} {:4} {}{}\n'.format(timestamp, label, value, value2))
-        self.output.flush()
-
-    def rx(self, data):
-        """show received data as hex dump"""
-        if self.color:
-            self.output.write(self.rx_color)
-        if data:
-            for offset, row in hexdump(data):
-                self.write_line(time.time() - self.start_time, 'RX', '{:04X}  '.format(offset), row)
-        else:
-            self.write_line(time.time() - self.start_time, 'RX', '<empty>')
-
-    def tx(self, data):
-        """show transmitted data as hex dump"""
-        if self.color:
-            self.output.write(self.tx_color)
-        for offset, row in hexdump(data):
-            self.write_line(time.time() - self.start_time, 'TX', '{:04X}  '.format(offset), row)
-
-    def control(self, name, value):
-        """show control calls"""
-        if self.color:
-            self.output.write(self.control_color)
-        self.write_line(time.time() - self.start_time, name, value)
-
-
-class Serial(serial.Serial):
-    """\
-    Inherit the native Serial port implementation and wrap all the methods and
-    attributes.
-    """
-    # pylint: disable=no-member
-
-    def __init__(self, *args, **kwargs):
-        super(Serial, self).__init__(*args, **kwargs)
-        self.formatter = None
-        self.show_all = False
-
-    @serial.Serial.port.setter
-    def port(self, value):
-        if value is not None:
-            serial.Serial.port.__set__(self, self.from_url(value))
-
-    def from_url(self, url):
-        """extract host and port from an URL string"""
-        parts = urlparse.urlsplit(url)
-        if parts.scheme != 'spy':
-            raise serial.SerialException(
-                'expected a string in the form '
-                '"spy://port[?option[=value][&option[=value]]]": '
-                'not starting with spy:// ({!r})'.format(parts.scheme))
-        # process options now, directly altering self
-        formatter = FormatHexdump
-        color = False
-        output = sys.stderr
-        try:
-            for option, values in urlparse.parse_qs(parts.query, True).items():
-                if option == 'file':
-                    output = open(values[0], 'w')
-                elif option == 'color':
-                    color = True
-                elif option == 'raw':
-                    formatter = FormatRaw
-                elif option == 'all':
-                    self.show_all = True
-                else:
-                    raise ValueError('unknown option: {!r}'.format(option))
-        except ValueError as e:
-            raise serial.SerialException(
-                'expected a string in the form '
-                '"spy://port[?option[=value][&option[=value]]]": {}'.format(e))
-        self.formatter = formatter(output, color)
-        return ''.join([parts.netloc, parts.path])
-
-    def write(self, tx):
-        self.formatter.tx(tx)
-        return super(Serial, self).write(tx)
-
-    def read(self, size=1):
-        rx = super(Serial, self).read(size)
-        if rx or self.show_all:
-            self.formatter.rx(rx)
-        return rx
-
-    if hasattr(serial.Serial, 'cancel_read'):
-        def cancel_read(self):
-            self.formatter.control('Q-RX', 'cancel_read')
-            super(Serial, self).cancel_read()
-
-    if hasattr(serial.Serial, 'cancel_write'):
-        def cancel_write(self):
-            self.formatter.control('Q-TX', 'cancel_write')
-            super(Serial, self).cancel_write()
-
-    @property
-    def in_waiting(self):
-        n = super(Serial, self).in_waiting
-        if self.show_all:
-            self.formatter.control('Q-RX', 'in_waiting -> {}'.format(n))
-        return n
-
-    def flush(self):
-        self.formatter.control('Q-TX', 'flush')
-        super(Serial, self).flush()
-
-    def reset_input_buffer(self):
-        self.formatter.control('Q-RX', 'reset_input_buffer')
-        super(Serial, self).reset_input_buffer()
-
-    def reset_output_buffer(self):
-        self.formatter.control('Q-TX', 'reset_output_buffer')
-        super(Serial, self).reset_output_buffer()
-
-    def send_break(self, duration=0.25):
-        self.formatter.control('BRK', 'send_break {}s'.format(duration))
-        super(Serial, self).send_break(duration)
-
-    @serial.Serial.break_condition.setter
-    def break_condition(self, level):
-        self.formatter.control('BRK', 'active' if level else 'inactive')
-        serial.Serial.break_condition.__set__(self, level)
-
-    @serial.Serial.rts.setter
-    def rts(self, level):
-        self.formatter.control('RTS', 'active' if level else 'inactive')
-        serial.Serial.rts.__set__(self, level)
-
-    @serial.Serial.dtr.setter
-    def dtr(self, level):
-        self.formatter.control('DTR', 'active' if level else 'inactive')
-        serial.Serial.dtr.__set__(self, level)
-
-    @serial.Serial.cts.getter
-    def cts(self):
-        level = super(Serial, self).cts
-        self.formatter.control('CTS', 'active' if level else 'inactive')
-        return level
-
-    @serial.Serial.dsr.getter
-    def dsr(self):
-        level = super(Serial, self).dsr
-        self.formatter.control('DSR', 'active' if level else 'inactive')
-        return level
-
-    @serial.Serial.ri.getter
-    def ri(self):
-        level = super(Serial, self).ri
-        self.formatter.control('RI', 'active' if level else 'inactive')
-        return level
-
-    @serial.Serial.cd.getter
-    def cd(self):
-        level = super(Serial, self).cd
-        self.formatter.control('CD', 'active' if level else 'inactive')
-        return level
-
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-if __name__ == '__main__':
-    ser = Serial(None)
-    ser.port = 'spy:///dev/ttyS0'
-    print(ser)
diff --git a/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_spy.pyc b/venv/lib/python3.8/site-packages/serial/urlhandler/protocol_spy.pyc
deleted file mode 100644
index e8a8824c06f84afda5d16fa24fa18b1437fe4233..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 10984
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

diff --git a/venv/lib/python3.8/site-packages/serial/win32.py b/venv/lib/python3.8/site-packages/serial/win32.py
deleted file mode 100644
index 905ce0f..0000000
--- a/venv/lib/python3.8/site-packages/serial/win32.py
+++ /dev/null
@@ -1,354 +0,0 @@
-#! python
-#
-# Constants and types for use with Windows API, used by serialwin32.py
-#
-# This file is part of pySerial. https://github.com/pyserial/pyserial
-# (C) 2001-2015 Chris Liechti <cliechti@gmx.net>
-#
-# SPDX-License-Identifier:    BSD-3-Clause
-
-# pylint: disable=invalid-name,too-few-public-methods,protected-access,too-many-instance-attributes
-
-from ctypes import c_ulong, c_void_p, c_int64, c_char, \
-                   WinDLL, sizeof, Structure, Union, POINTER
-from ctypes.wintypes import HANDLE
-from ctypes.wintypes import BOOL
-from ctypes.wintypes import LPCWSTR
-from ctypes.wintypes import DWORD
-from ctypes.wintypes import WORD
-from ctypes.wintypes import BYTE
-_stdcall_libraries = {}
-_stdcall_libraries['kernel32'] = WinDLL('kernel32')
-
-INVALID_HANDLE_VALUE = HANDLE(-1).value
-
-
-# some details of the windows API differ between 32 and 64 bit systems..
-def is_64bit():
-    """Returns true when running on a 64 bit system"""
-    return sizeof(c_ulong) != sizeof(c_void_p)
-
-# ULONG_PTR is a an ordinary number, not a pointer and contrary to the name it
-# is either 32 or 64 bits, depending on the type of windows...
-# so test if this a 32 bit windows...
-if is_64bit():
-    ULONG_PTR = c_int64
-else:
-    ULONG_PTR = c_ulong
-
-
-class _SECURITY_ATTRIBUTES(Structure):
-    pass
-LPSECURITY_ATTRIBUTES = POINTER(_SECURITY_ATTRIBUTES)
-
-
-try:
-    CreateEventW = _stdcall_libraries['kernel32'].CreateEventW
-except AttributeError:
-    # Fallback to non wide char version for old OS...
-    from ctypes.wintypes import LPCSTR
-    CreateEventA = _stdcall_libraries['kernel32'].CreateEventA
-    CreateEventA.restype = HANDLE
-    CreateEventA.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR]
-    CreateEvent = CreateEventA
-
-    CreateFileA = _stdcall_libraries['kernel32'].CreateFileA
-    CreateFileA.restype = HANDLE
-    CreateFileA.argtypes = [LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
-    CreateFile = CreateFileA
-else:
-    CreateEventW.restype = HANDLE
-    CreateEventW.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR]
-    CreateEvent = CreateEventW  # alias
-
-    CreateFileW = _stdcall_libraries['kernel32'].CreateFileW
-    CreateFileW.restype = HANDLE
-    CreateFileW.argtypes = [LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
-    CreateFile = CreateFileW  # alias
-
-
-class _OVERLAPPED(Structure):
-    pass
-
-OVERLAPPED = _OVERLAPPED
-
-
-class _COMSTAT(Structure):
-    pass
-
-COMSTAT = _COMSTAT
-
-
-class _DCB(Structure):
-    pass
-
-DCB = _DCB
-
-
-class _COMMTIMEOUTS(Structure):
-    pass
-
-COMMTIMEOUTS = _COMMTIMEOUTS
-
-GetLastError = _stdcall_libraries['kernel32'].GetLastError
-GetLastError.restype = DWORD
-GetLastError.argtypes = []
-
-LPOVERLAPPED = POINTER(_OVERLAPPED)
-LPDWORD = POINTER(DWORD)
-
-GetOverlappedResult = _stdcall_libraries['kernel32'].GetOverlappedResult
-GetOverlappedResult.restype = BOOL
-GetOverlappedResult.argtypes = [HANDLE, LPOVERLAPPED, LPDWORD, BOOL]
-
-ResetEvent = _stdcall_libraries['kernel32'].ResetEvent
-ResetEvent.restype = BOOL
-ResetEvent.argtypes = [HANDLE]
-
-LPCVOID = c_void_p
-
-WriteFile = _stdcall_libraries['kernel32'].WriteFile
-WriteFile.restype = BOOL
-WriteFile.argtypes = [HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED]
-
-LPVOID = c_void_p
-
-ReadFile = _stdcall_libraries['kernel32'].ReadFile
-ReadFile.restype = BOOL
-ReadFile.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED]
-
-CloseHandle = _stdcall_libraries['kernel32'].CloseHandle
-CloseHandle.restype = BOOL
-CloseHandle.argtypes = [HANDLE]
-
-ClearCommBreak = _stdcall_libraries['kernel32'].ClearCommBreak
-ClearCommBreak.restype = BOOL
-ClearCommBreak.argtypes = [HANDLE]
-
-LPCOMSTAT = POINTER(_COMSTAT)
-
-ClearCommError = _stdcall_libraries['kernel32'].ClearCommError
-ClearCommError.restype = BOOL
-ClearCommError.argtypes = [HANDLE, LPDWORD, LPCOMSTAT]
-
-SetupComm = _stdcall_libraries['kernel32'].SetupComm
-SetupComm.restype = BOOL
-SetupComm.argtypes = [HANDLE, DWORD, DWORD]
-
-EscapeCommFunction = _stdcall_libraries['kernel32'].EscapeCommFunction
-EscapeCommFunction.restype = BOOL
-EscapeCommFunction.argtypes = [HANDLE, DWORD]
-
-GetCommModemStatus = _stdcall_libraries['kernel32'].GetCommModemStatus
-GetCommModemStatus.restype = BOOL
-GetCommModemStatus.argtypes = [HANDLE, LPDWORD]
-
-LPDCB = POINTER(_DCB)
-
-GetCommState = _stdcall_libraries['kernel32'].GetCommState
-GetCommState.restype = BOOL
-GetCommState.argtypes = [HANDLE, LPDCB]
-
-LPCOMMTIMEOUTS = POINTER(_COMMTIMEOUTS)
-
-GetCommTimeouts = _stdcall_libraries['kernel32'].GetCommTimeouts
-GetCommTimeouts.restype = BOOL
-GetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
-
-PurgeComm = _stdcall_libraries['kernel32'].PurgeComm
-PurgeComm.restype = BOOL
-PurgeComm.argtypes = [HANDLE, DWORD]
-
-SetCommBreak = _stdcall_libraries['kernel32'].SetCommBreak
-SetCommBreak.restype = BOOL
-SetCommBreak.argtypes = [HANDLE]
-
-SetCommMask = _stdcall_libraries['kernel32'].SetCommMask
-SetCommMask.restype = BOOL
-SetCommMask.argtypes = [HANDLE, DWORD]
-
-SetCommState = _stdcall_libraries['kernel32'].SetCommState
-SetCommState.restype = BOOL
-SetCommState.argtypes = [HANDLE, LPDCB]
-
-SetCommTimeouts = _stdcall_libraries['kernel32'].SetCommTimeouts
-SetCommTimeouts.restype = BOOL
-SetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
-
-WaitForSingleObject = _stdcall_libraries['kernel32'].WaitForSingleObject
-WaitForSingleObject.restype = DWORD
-WaitForSingleObject.argtypes = [HANDLE, DWORD]
-
-CancelIoEx = _stdcall_libraries['kernel32'].CancelIoEx
-CancelIoEx.restype = BOOL
-CancelIoEx.argtypes = [HANDLE, LPOVERLAPPED]
-
-ONESTOPBIT = 0  # Variable c_int
-TWOSTOPBITS = 2  # Variable c_int
-ONE5STOPBITS = 1
-
-NOPARITY = 0  # Variable c_int
-ODDPARITY = 1  # Variable c_int
-EVENPARITY = 2  # Variable c_int
-MARKPARITY = 3
-SPACEPARITY = 4
-
-RTS_CONTROL_HANDSHAKE = 2  # Variable c_int
-RTS_CONTROL_DISABLE = 0  # Variable c_int
-RTS_CONTROL_ENABLE = 1  # Variable c_int
-RTS_CONTROL_TOGGLE = 3  # Variable c_int
-SETRTS = 3
-CLRRTS = 4
-
-DTR_CONTROL_HANDSHAKE = 2  # Variable c_int
-DTR_CONTROL_DISABLE = 0  # Variable c_int
-DTR_CONTROL_ENABLE = 1  # Variable c_int
-SETDTR = 5
-CLRDTR = 6
-
-MS_DSR_ON = 32  # Variable c_ulong
-EV_RING = 256  # Variable c_int
-EV_PERR = 512  # Variable c_int
-EV_ERR = 128  # Variable c_int
-SETXOFF = 1  # Variable c_int
-EV_RXCHAR = 1  # Variable c_int
-GENERIC_WRITE = 1073741824  # Variable c_long
-PURGE_TXCLEAR = 4  # Variable c_int
-FILE_FLAG_OVERLAPPED = 1073741824  # Variable c_int
-EV_DSR = 16  # Variable c_int
-MAXDWORD = 4294967295  # Variable c_uint
-EV_RLSD = 32  # Variable c_int
-
-ERROR_SUCCESS = 0
-ERROR_NOT_ENOUGH_MEMORY = 8
-ERROR_OPERATION_ABORTED = 995
-ERROR_IO_INCOMPLETE = 996
-ERROR_IO_PENDING = 997  # Variable c_long
-ERROR_INVALID_USER_BUFFER = 1784
-
-MS_CTS_ON = 16  # Variable c_ulong
-EV_EVENT1 = 2048  # Variable c_int
-EV_RX80FULL = 1024  # Variable c_int
-PURGE_RXABORT = 2  # Variable c_int
-FILE_ATTRIBUTE_NORMAL = 128  # Variable c_int
-PURGE_TXABORT = 1  # Variable c_int
-SETXON = 2  # Variable c_int
-OPEN_EXISTING = 3  # Variable c_int
-MS_RING_ON = 64  # Variable c_ulong
-EV_TXEMPTY = 4  # Variable c_int
-EV_RXFLAG = 2  # Variable c_int
-MS_RLSD_ON = 128  # Variable c_ulong
-GENERIC_READ = 2147483648  # Variable c_ulong
-EV_EVENT2 = 4096  # Variable c_int
-EV_CTS = 8  # Variable c_int
-EV_BREAK = 64  # Variable c_int
-PURGE_RXCLEAR = 8  # Variable c_int
-INFINITE = 0xFFFFFFFF
-
-
-class N11_OVERLAPPED4DOLLAR_48E(Union):
-    pass
-
-
-class N11_OVERLAPPED4DOLLAR_484DOLLAR_49E(Structure):
-    pass
-
-
-N11_OVERLAPPED4DOLLAR_484DOLLAR_49E._fields_ = [
-    ('Offset', DWORD),
-    ('OffsetHigh', DWORD),
-]
-
-PVOID = c_void_p
-
-N11_OVERLAPPED4DOLLAR_48E._anonymous_ = ['_0']
-N11_OVERLAPPED4DOLLAR_48E._fields_ = [
-    ('_0', N11_OVERLAPPED4DOLLAR_484DOLLAR_49E),
-    ('Pointer', PVOID),
-]
-_OVERLAPPED._anonymous_ = ['_0']
-_OVERLAPPED._fields_ = [
-    ('Internal', ULONG_PTR),
-    ('InternalHigh', ULONG_PTR),
-    ('_0', N11_OVERLAPPED4DOLLAR_48E),
-    ('hEvent', HANDLE),
-]
-_SECURITY_ATTRIBUTES._fields_ = [
-    ('nLength', DWORD),
-    ('lpSecurityDescriptor', LPVOID),
-    ('bInheritHandle', BOOL),
-]
-_COMSTAT._fields_ = [
-    ('fCtsHold', DWORD, 1),
-    ('fDsrHold', DWORD, 1),
-    ('fRlsdHold', DWORD, 1),
-    ('fXoffHold', DWORD, 1),
-    ('fXoffSent', DWORD, 1),
-    ('fEof', DWORD, 1),
-    ('fTxim', DWORD, 1),
-    ('fReserved', DWORD, 25),
-    ('cbInQue', DWORD),
-    ('cbOutQue', DWORD),
-]
-_DCB._fields_ = [
-    ('DCBlength', DWORD),
-    ('BaudRate', DWORD),
-    ('fBinary', DWORD, 1),
-    ('fParity', DWORD, 1),
-    ('fOutxCtsFlow', DWORD, 1),
-    ('fOutxDsrFlow', DWORD, 1),
-    ('fDtrControl', DWORD, 2),
-    ('fDsrSensitivity', DWORD, 1),
-    ('fTXContinueOnXoff', DWORD, 1),
-    ('fOutX', DWORD, 1),
-    ('fInX', DWORD, 1),
-    ('fErrorChar', DWORD, 1),
-    ('fNull', DWORD, 1),
-    ('fRtsControl', DWORD, 2),
-    ('fAbortOnError', DWORD, 1),
-    ('fDummy2', DWORD, 17),
-    ('wReserved', WORD),
-    ('XonLim', WORD),
-    ('XoffLim', WORD),
-    ('ByteSize', BYTE),
-    ('Parity', BYTE),
-    ('StopBits', BYTE),
-    ('XonChar', c_char),
-    ('XoffChar', c_char),
-    ('ErrorChar', c_char),
-    ('EofChar', c_char),
-    ('EvtChar', c_char),
-    ('wReserved1', WORD),
-]
-_COMMTIMEOUTS._fields_ = [
-    ('ReadIntervalTimeout', DWORD),
-    ('ReadTotalTimeoutMultiplier', DWORD),
-    ('ReadTotalTimeoutConstant', DWORD),
-    ('WriteTotalTimeoutMultiplier', DWORD),
-    ('WriteTotalTimeoutConstant', DWORD),
-]
-__all__ = ['GetLastError', 'MS_CTS_ON', 'FILE_ATTRIBUTE_NORMAL',
-           'DTR_CONTROL_ENABLE', '_COMSTAT', 'MS_RLSD_ON',
-           'GetOverlappedResult', 'SETXON', 'PURGE_TXABORT',
-           'PurgeComm', 'N11_OVERLAPPED4DOLLAR_48E', 'EV_RING',
-           'ONESTOPBIT', 'SETXOFF', 'PURGE_RXABORT', 'GetCommState',
-           'RTS_CONTROL_ENABLE', '_DCB', 'CreateEvent',
-           '_COMMTIMEOUTS', '_SECURITY_ATTRIBUTES', 'EV_DSR',
-           'EV_PERR', 'EV_RXFLAG', 'OPEN_EXISTING', 'DCB',
-           'FILE_FLAG_OVERLAPPED', 'EV_CTS', 'SetupComm',
-           'LPOVERLAPPED', 'EV_TXEMPTY', 'ClearCommBreak',
-           'LPSECURITY_ATTRIBUTES', 'SetCommBreak', 'SetCommTimeouts',
-           'COMMTIMEOUTS', 'ODDPARITY', 'EV_RLSD',
-           'GetCommModemStatus', 'EV_EVENT2', 'PURGE_TXCLEAR',
-           'EV_BREAK', 'EVENPARITY', 'LPCVOID', 'COMSTAT', 'ReadFile',
-           'PVOID', '_OVERLAPPED', 'WriteFile', 'GetCommTimeouts',
-           'ResetEvent', 'EV_RXCHAR', 'LPCOMSTAT', 'ClearCommError',
-           'ERROR_IO_PENDING', 'EscapeCommFunction', 'GENERIC_READ',
-           'RTS_CONTROL_HANDSHAKE', 'OVERLAPPED',
-           'DTR_CONTROL_HANDSHAKE', 'PURGE_RXCLEAR', 'GENERIC_WRITE',
-           'LPDCB', 'CreateEventW', 'SetCommMask', 'EV_EVENT1',
-           'SetCommState', 'LPVOID', 'CreateFileW', 'LPDWORD',
-           'EV_RX80FULL', 'TWOSTOPBITS', 'LPCOMMTIMEOUTS', 'MAXDWORD',
-           'MS_DSR_ON', 'MS_RING_ON',
-           'N11_OVERLAPPED4DOLLAR_484DOLLAR_49E', 'EV_ERR',
-           'ULONG_PTR', 'CreateFile', 'NOPARITY', 'CloseHandle']
diff --git a/venv/lib/python3.8/site-packages/serial/win32.pyc b/venv/lib/python3.8/site-packages/serial/win32.pyc
deleted file mode 100644
index 4e28b39b6236baa9863417e1824a6537909e1af0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7725
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
YVx{miB)=gIM}}p!LF@uil@IUezl_=iHvj+t

diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/INSTALLER b/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/RECORD b/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/RECORD
deleted file mode 100644
index 0dff3cf..0000000
--- a/venv/lib/python3.8/site-packages/setuptools-46.1.3.dist-info/RECORD
+++ /dev/null
@@ -1,196 +0,0 @@
-../../../bin/easy_install,sha256=X7WxLucPqH2jU6ZwBBJAZf7q16Le5_O2DO63EjKJ1AA,278
-../../../bin/easy_install-3.8,sha256=X7WxLucPqH2jU6ZwBBJAZf7q16Le5_O2DO63EjKJ1AA,278
-__pycache__/easy_install.cpython-38.pyc,,
-easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126
-pkg_resources/__init__.py,sha256=S6V847I2VNTBkYd5Z0kbFyFNGUOx1Lt_ifo-G1fu_LE,108626
-pkg_resources/__pycache__/__init__.cpython-38.pyc,,
-pkg_resources/__pycache__/py2_warn.cpython-38.pyc,,
-pkg_resources/__pycache__/py31compat.cpython-38.pyc,,
-pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc,,
-pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc,,
-pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc,,
-pkg_resources/_vendor/__pycache__/six.cpython-38.pyc,,
-pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701
-pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720
-pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513
-pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/utils.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc,,
-pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860
-pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416
-pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248
-pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355
-pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025
-pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421
-pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556
-pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055
-pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
-pkg_resources/extern/__init__.py,sha256=w_3T8ntsvFFioQYOgYoGGqafDiv4sLzecQRDjsB5yeE,2101
-pkg_resources/extern/__pycache__/__init__.cpython-38.pyc,,
-pkg_resources/py2_warn.py,sha256=TD579c837rUUUxA6ZGjJNhUAb6rOuVUdCk_0G1Kcph0,655
-pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558
-setuptools-46.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-setuptools-46.1.3.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078
-setuptools-46.1.3.dist-info/METADATA,sha256=xIeq1PvKyqTrHCOAfy7tgYd0p5URJtpfeJs5gllkNCw,4742
-setuptools-46.1.3.dist-info/RECORD,,
-setuptools-46.1.3.dist-info/WHEEL,sha256=p46_5Uhzqz6AzeSosiOnxK-zmFja1i22CrQCjmYe8ec,92
-setuptools-46.1.3.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239
-setuptools-46.1.3.dist-info/entry_points.txt,sha256=1K5Fr0-5Ph3ZRZFuwNaw8ERGiNLVqHvdKDNt3oXGS6w,3143
-setuptools-46.1.3.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38
-setuptools-46.1.3.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
-setuptools/__init__.py,sha256=olFlX8bEJQQXQce__CbY0RxyHxZJATVbYi_GWJuYXQg,7341
-setuptools/__pycache__/__init__.cpython-38.pyc,,
-setuptools/__pycache__/_deprecation_warning.cpython-38.pyc,,
-setuptools/__pycache__/_imp.cpython-38.pyc,,
-setuptools/__pycache__/archive_util.cpython-38.pyc,,
-setuptools/__pycache__/build_meta.cpython-38.pyc,,
-setuptools/__pycache__/config.cpython-38.pyc,,
-setuptools/__pycache__/dep_util.cpython-38.pyc,,
-setuptools/__pycache__/depends.cpython-38.pyc,,
-setuptools/__pycache__/dist.cpython-38.pyc,,
-setuptools/__pycache__/errors.cpython-38.pyc,,
-setuptools/__pycache__/extension.cpython-38.pyc,,
-setuptools/__pycache__/glob.cpython-38.pyc,,
-setuptools/__pycache__/installer.cpython-38.pyc,,
-setuptools/__pycache__/launch.cpython-38.pyc,,
-setuptools/__pycache__/lib2to3_ex.cpython-38.pyc,,
-setuptools/__pycache__/monkey.cpython-38.pyc,,
-setuptools/__pycache__/msvc.cpython-38.pyc,,
-setuptools/__pycache__/namespaces.cpython-38.pyc,,
-setuptools/__pycache__/package_index.cpython-38.pyc,,
-setuptools/__pycache__/py27compat.cpython-38.pyc,,
-setuptools/__pycache__/py31compat.cpython-38.pyc,,
-setuptools/__pycache__/py33compat.cpython-38.pyc,,
-setuptools/__pycache__/py34compat.cpython-38.pyc,,
-setuptools/__pycache__/sandbox.cpython-38.pyc,,
-setuptools/__pycache__/site-patch.cpython-38.pyc,,
-setuptools/__pycache__/ssl_support.cpython-38.pyc,,
-setuptools/__pycache__/unicode_utils.cpython-38.pyc,,
-setuptools/__pycache__/version.cpython-38.pyc,,
-setuptools/__pycache__/wheel.cpython-38.pyc,,
-setuptools/__pycache__/windows_support.cpython-38.pyc,,
-setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218
-setuptools/_imp.py,sha256=Qx0LJzEBaWk_6PfICamJtfBN2rh5K9sJq1wXvtZW-mc,2388
-setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-setuptools/_vendor/__pycache__/__init__.cpython-38.pyc,,
-setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc,,
-setuptools/_vendor/__pycache__/pyparsing.cpython-38.pyc,,
-setuptools/_vendor/__pycache__/six.cpython-38.pyc,,
-setuptools/_vendor/ordered_set.py,sha256=dbaCcs27dyN9gnMWGF5nA_BrVn6Q-NrjKYJpV9_fgBs,15130
-setuptools/_vendor/packaging/__about__.py,sha256=CpuMSyh1V7adw8QMjWKkY3LtdqRUkRX4MgJ6nF4stM0,744
-setuptools/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562
-setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/markers.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/requirements.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc,,
-setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc,,
-setuptools/_vendor/packaging/_compat.py,sha256=Ugdm-qcneSchW25JrtMIKgUxfEEBcCAz6WrEeXeqz9o,865
-setuptools/_vendor/packaging/_structures.py,sha256=pVd90XcXRGwpZRB_qdFuVEibhCHpX_bL5zYr9-N0mc8,1416
-setuptools/_vendor/packaging/markers.py,sha256=-meFl9Fr9V8rF5Rduzgett5EHK9wBYRUqssAV2pj0lw,8268
-setuptools/_vendor/packaging/requirements.py,sha256=3dwIJekt8RRGCUbgxX8reeAbgmZYjb0wcCRtmH63kxI,4742
-setuptools/_vendor/packaging/specifiers.py,sha256=0ZzQpcUnvrQ6LjR-mQRLzMr8G6hdRv-mY0VSf_amFtI,27778
-setuptools/_vendor/packaging/tags.py,sha256=EPLXhO6GTD7_oiWEO1U0l0PkfR8R_xivpMDHXnsTlts,12933
-setuptools/_vendor/packaging/utils.py,sha256=VaTC0Ei7zO2xl9ARiWmz2YFLFt89PuuhLbAlXMyAGms,1520
-setuptools/_vendor/packaging/version.py,sha256=Npdwnb8OHedj_2L86yiUqscujb7w_i5gmSK1PhOAFzg,11978
-setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055
-setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
-setuptools/archive_util.py,sha256=2VqSBaoRomeA2al-hYnyB-33ehP4exrknpZNy7qWin0,6626
-setuptools/build_meta.py,sha256=n3-3HF0uKfFAzNP02yz2V7q1ydlPaQ1b_IxHG33yWjU,9960
-setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
-setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752
-setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
-setuptools/command/__init__.py,sha256=QCAuA9whnq8Bnoc0bBaS6Lw_KAUO0DiHYZQXEMNn5hg,568
-setuptools/command/__pycache__/__init__.cpython-38.pyc,,
-setuptools/command/__pycache__/alias.cpython-38.pyc,,
-setuptools/command/__pycache__/bdist_egg.cpython-38.pyc,,
-setuptools/command/__pycache__/bdist_rpm.cpython-38.pyc,,
-setuptools/command/__pycache__/bdist_wininst.cpython-38.pyc,,
-setuptools/command/__pycache__/build_clib.cpython-38.pyc,,
-setuptools/command/__pycache__/build_ext.cpython-38.pyc,,
-setuptools/command/__pycache__/build_py.cpython-38.pyc,,
-setuptools/command/__pycache__/develop.cpython-38.pyc,,
-setuptools/command/__pycache__/dist_info.cpython-38.pyc,,
-setuptools/command/__pycache__/easy_install.cpython-38.pyc,,
-setuptools/command/__pycache__/egg_info.cpython-38.pyc,,
-setuptools/command/__pycache__/install.cpython-38.pyc,,
-setuptools/command/__pycache__/install_egg_info.cpython-38.pyc,,
-setuptools/command/__pycache__/install_lib.cpython-38.pyc,,
-setuptools/command/__pycache__/install_scripts.cpython-38.pyc,,
-setuptools/command/__pycache__/py36compat.cpython-38.pyc,,
-setuptools/command/__pycache__/register.cpython-38.pyc,,
-setuptools/command/__pycache__/rotate.cpython-38.pyc,,
-setuptools/command/__pycache__/saveopts.cpython-38.pyc,,
-setuptools/command/__pycache__/sdist.cpython-38.pyc,,
-setuptools/command/__pycache__/setopt.cpython-38.pyc,,
-setuptools/command/__pycache__/test.cpython-38.pyc,,
-setuptools/command/__pycache__/upload.cpython-38.pyc,,
-setuptools/command/__pycache__/upload_docs.cpython-38.pyc,,
-setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426
-setuptools/command/bdist_egg.py,sha256=ozITJYsQaxztvsQYZisp9CJqken1ed_EIYci8qgmorU,18406
-setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508
-setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637
-setuptools/command/build_clib.py,sha256=fWHSFGkk10VCddBWCszvNhowbG9Z9CZXVjQ2uSInoOs,4415
-setuptools/command/build_ext.py,sha256=X7dGN2BEoRGvm2jkIcPQvLnKzdDiqhHvVXb5uNY9cdw,13048
-setuptools/command/build_py.py,sha256=fho10QRGOaJcc3vttQ5vk5KYMV6HdZwj9HUIob6NHDM,9737
-setuptools/command/develop.py,sha256=B3-ImHP30Bxnqx-s_9Dp-fxtHhE245ACE1W5hmKY9xE,8188
-setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960
-setuptools/command/easy_install.py,sha256=bs5MX3fA2YGQoSuGfyNIbfpU0e4CO4F9lavB5FwuMNo,87679
-setuptools/command/egg_info.py,sha256=0mb9iAyE5yEMoIQxLcW_PSPEqTZOX2POFxaXGJHuvT8,25548
-setuptools/command/install.py,sha256=8doMxeQEDoK4Eco0mO2WlXXzzp9QnsGJQ7Z7yWkZPG8,4705
-setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203
-setuptools/command/install_lib.py,sha256=Uz42McsyHZAjrB6cw9E7Bz0xsaTbzxnM1PI9CBhiPtE,3875
-setuptools/command/install_scripts.py,sha256=x7sdEICuyFpaf5LuWXcTp49oYt8EeNbwKkW2Pv-TVXI,2519
-setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628
-setuptools/command/py36compat.py,sha256=TKqF6CPv-vsEFpOJUYmjBzmck-mCv_zHJMXO500PEAI,4994
-setuptools/command/register.py,sha256=kk3DxXCb5lXTvqnhfwx2g6q7iwbUmgTyXUCaBooBOUk,468
-setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164
-setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658
-setuptools/command/sdist.py,sha256=14kBw_QOZ9L_RQDqgf9DAlEuoj0zC30X5mfDWeiyZwU,8092
-setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085
-setuptools/command/test.py,sha256=okVw2id6qYh8hFAVGziX6dEYekAbaYfMtEx7XhgsSbg,9623
-setuptools/command/upload.py,sha256=XT3YFVfYPAmA5qhGg0euluU98ftxRUW-PzKcODMLxUs,462
-setuptools/command/upload_docs.py,sha256=G2gHjeNPcUGe_pr3EEk_6AoVD0E6nCp52mZgU2nkCpU,7314
-setuptools/config.py,sha256=6SB2OY3qcooOJmG_rsK_s0pKBsorBlDpfMJUyzjQIGk,20575
-setuptools/dep_util.py,sha256=BDx1BkzNQntvAB4alypHbW5UVBzjqths000PrUL4Zqc,949
-setuptools/depends.py,sha256=qt2RWllArRvhnm8lxsyRpcthEZYp4GHQgREl1q0LkFw,5517
-setuptools/dist.py,sha256=OfBnX-zJFlDA-QRO7OGitdTi_eEVKaiirbxyYeVx1nI,39211
-setuptools/errors.py,sha256=MVOcv381HNSajDgEUWzOQ4J6B5BHCBMSjHfaWcEwA1o,524
-setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729
-setuptools/extern/__init__.py,sha256=BilMS9Hq18nBaUOzcCrzoI9HnIhju45iVJBscqTqlDI,2128
-setuptools/extern/__pycache__/__init__.cpython-38.pyc,,
-setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084
-setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
-setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264
-setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
-setuptools/installer.py,sha256=8_Anc1VxnB92XKZjVmEAf8zfTfmjdv1cUPuTxHX_Q1I,5336
-setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787
-setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013
-setuptools/monkey.py,sha256=FGc9fffh7gAxMLFmJs2DW_OYWpBjkdbNS2n14UAK4NA,5264
-setuptools/msvc.py,sha256=Np7hXrKnn3EzqV3TQBOVDejhrveWrOQOgflAWgI2PGU,50989
-setuptools/namespaces.py,sha256=QuvIR8S5-u_S8_fLjPpn_utruUIsu2twdRu_KJPrKU0,3223
-setuptools/package_index.py,sha256=Q_pxXudgWZbQW_XJly42JHFPf73IKX-y0ZQOEB_cLM4,40740
-setuptools/py27compat.py,sha256=CWHkWWAYodu3QgiIAr8-34T-G6fiSgiVF0y7h11Ld7U,1504
-setuptools/py31compat.py,sha256=h2rtZghOfwoGYd8sQ0-auaKiF3TcL3qX0bX3VessqcE,838
-setuptools/py33compat.py,sha256=SMF9Z8wnGicTOkU1uRNwZ_kz5Z_bj29PUBbqdqeeNsc,1330
-setuptools/py34compat.py,sha256=KYOd6ybRxjBW8NJmYD8t_UyyVmysppFXqHpFLdslGXU,245
-setuptools/sandbox.py,sha256=TbqKGiEXwfLYrpQhd863Dch3_yGhOmlAkhCiBYaw-ec,14284
-setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218
-setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138
-setuptools/site-patch.py,sha256=25aScCA0GXCqUtSCbv386cTSbBl_u_kp_DJTnJssh-E,2346
-setuptools/ssl_support.py,sha256=TNNOq3VyV-4wkRwm0dmyIzF-iXBeWv4yIQ99eWa_bV8,8543
-setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996
-setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144
-setuptools/wheel.py,sha256=AUmt2W6wL2ZEo4opbgV_uISonAVDILbhm8E7nr3Ysl0,8468
-setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/__init__.py b/venv/lib/python3.8/site-packages/setuptools/_vendor/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py b/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py
deleted file mode 100644
index ec9942f..0000000
--- a/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py
+++ /dev/null
@@ -1,404 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-from __future__ import absolute_import
-
-import distutils.util
-
-try:
-    from importlib.machinery import EXTENSION_SUFFIXES
-except ImportError:  # pragma: no cover
-    import imp
-
-    EXTENSION_SUFFIXES = [x[0] for x in imp.get_suffixes()]
-    del imp
-import platform
-import re
-import sys
-import sysconfig
-import warnings
-
-
-INTERPRETER_SHORT_NAMES = {
-    "python": "py",  # Generic.
-    "cpython": "cp",
-    "pypy": "pp",
-    "ironpython": "ip",
-    "jython": "jy",
-}
-
-
-_32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32
-
-
-class Tag(object):
-
-    __slots__ = ["_interpreter", "_abi", "_platform"]
-
-    def __init__(self, interpreter, abi, platform):
-        self._interpreter = interpreter.lower()
-        self._abi = abi.lower()
-        self._platform = platform.lower()
-
-    @property
-    def interpreter(self):
-        return self._interpreter
-
-    @property
-    def abi(self):
-        return self._abi
-
-    @property
-    def platform(self):
-        return self._platform
-
-    def __eq__(self, other):
-        return (
-            (self.platform == other.platform)
-            and (self.abi == other.abi)
-            and (self.interpreter == other.interpreter)
-        )
-
-    def __hash__(self):
-        return hash((self._interpreter, self._abi, self._platform))
-
-    def __str__(self):
-        return "{}-{}-{}".format(self._interpreter, self._abi, self._platform)
-
-    def __repr__(self):
-        return "<{self} @ {self_id}>".format(self=self, self_id=id(self))
-
-
-def parse_tag(tag):
-    tags = set()
-    interpreters, abis, platforms = tag.split("-")
-    for interpreter in interpreters.split("."):
-        for abi in abis.split("."):
-            for platform_ in platforms.split("."):
-                tags.add(Tag(interpreter, abi, platform_))
-    return frozenset(tags)
-
-
-def _normalize_string(string):
-    return string.replace(".", "_").replace("-", "_")
-
-
-def _cpython_interpreter(py_version):
-    # TODO: Is using py_version_nodot for interpreter version critical?
-    return "cp{major}{minor}".format(major=py_version[0], minor=py_version[1])
-
-
-def _cpython_abis(py_version):
-    abis = []
-    version = "{}{}".format(*py_version[:2])
-    debug = pymalloc = ucs4 = ""
-    with_debug = sysconfig.get_config_var("Py_DEBUG")
-    has_refcount = hasattr(sys, "gettotalrefcount")
-    # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled
-    # extension modules is the best option.
-    # https://github.com/pypa/pip/issues/3383#issuecomment-173267692
-    has_ext = "_d.pyd" in EXTENSION_SUFFIXES
-    if with_debug or (with_debug is None and (has_refcount or has_ext)):
-        debug = "d"
-    if py_version < (3, 8):
-        with_pymalloc = sysconfig.get_config_var("WITH_PYMALLOC")
-        if with_pymalloc or with_pymalloc is None:
-            pymalloc = "m"
-        if py_version < (3, 3):
-            unicode_size = sysconfig.get_config_var("Py_UNICODE_SIZE")
-            if unicode_size == 4 or (
-                unicode_size is None and sys.maxunicode == 0x10FFFF
-            ):
-                ucs4 = "u"
-    elif debug:
-        # Debug builds can also load "normal" extension modules.
-        # We can also assume no UCS-4 or pymalloc requirement.
-        abis.append("cp{version}".format(version=version))
-    abis.insert(
-        0,
-        "cp{version}{debug}{pymalloc}{ucs4}".format(
-            version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4
-        ),
-    )
-    return abis
-
-
-def _cpython_tags(py_version, interpreter, abis, platforms):
-    for abi in abis:
-        for platform_ in platforms:
-            yield Tag(interpreter, abi, platform_)
-    for tag in (Tag(interpreter, "abi3", platform_) for platform_ in platforms):
-        yield tag
-    for tag in (Tag(interpreter, "none", platform_) for platform_ in platforms):
-        yield tag
-    # PEP 384 was first implemented in Python 3.2.
-    for minor_version in range(py_version[1] - 1, 1, -1):
-        for platform_ in platforms:
-            interpreter = "cp{major}{minor}".format(
-                major=py_version[0], minor=minor_version
-            )
-            yield Tag(interpreter, "abi3", platform_)
-
-
-def _pypy_interpreter():
-    return "pp{py_major}{pypy_major}{pypy_minor}".format(
-        py_major=sys.version_info[0],
-        pypy_major=sys.pypy_version_info.major,
-        pypy_minor=sys.pypy_version_info.minor,
-    )
-
-
-def _generic_abi():
-    abi = sysconfig.get_config_var("SOABI")
-    if abi:
-        return _normalize_string(abi)
-    else:
-        return "none"
-
-
-def _pypy_tags(py_version, interpreter, abi, platforms):
-    for tag in (Tag(interpreter, abi, platform) for platform in platforms):
-        yield tag
-    for tag in (Tag(interpreter, "none", platform) for platform in platforms):
-        yield tag
-
-
-def _generic_tags(interpreter, py_version, abi, platforms):
-    for tag in (Tag(interpreter, abi, platform) for platform in platforms):
-        yield tag
-    if abi != "none":
-        tags = (Tag(interpreter, "none", platform_) for platform_ in platforms)
-        for tag in tags:
-            yield tag
-
-
-def _py_interpreter_range(py_version):
-    """
-    Yield Python versions in descending order.
-
-    After the latest version, the major-only version will be yielded, and then
-    all following versions up to 'end'.
-    """
-    yield "py{major}{minor}".format(major=py_version[0], minor=py_version[1])
-    yield "py{major}".format(major=py_version[0])
-    for minor in range(py_version[1] - 1, -1, -1):
-        yield "py{major}{minor}".format(major=py_version[0], minor=minor)
-
-
-def _independent_tags(interpreter, py_version, platforms):
-    """
-    Return the sequence of tags that are consistent across implementations.
-
-    The tags consist of:
-    - py*-none-<platform>
-    - <interpreter>-none-any
-    - py*-none-any
-    """
-    for version in _py_interpreter_range(py_version):
-        for platform_ in platforms:
-            yield Tag(version, "none", platform_)
-    yield Tag(interpreter, "none", "any")
-    for version in _py_interpreter_range(py_version):
-        yield Tag(version, "none", "any")
-
-
-def _mac_arch(arch, is_32bit=_32_BIT_INTERPRETER):
-    if not is_32bit:
-        return arch
-
-    if arch.startswith("ppc"):
-        return "ppc"
-
-    return "i386"
-
-
-def _mac_binary_formats(version, cpu_arch):
-    formats = [cpu_arch]
-    if cpu_arch == "x86_64":
-        if version < (10, 4):
-            return []
-        formats.extend(["intel", "fat64", "fat32"])
-
-    elif cpu_arch == "i386":
-        if version < (10, 4):
-            return []
-        formats.extend(["intel", "fat32", "fat"])
-
-    elif cpu_arch == "ppc64":
-        # TODO: Need to care about 32-bit PPC for ppc64 through 10.2?
-        if version > (10, 5) or version < (10, 4):
-            return []
-        formats.append("fat64")
-
-    elif cpu_arch == "ppc":
-        if version > (10, 6):
-            return []
-        formats.extend(["fat32", "fat"])
-
-    formats.append("universal")
-    return formats
-
-
-def _mac_platforms(version=None, arch=None):
-    version_str, _, cpu_arch = platform.mac_ver()
-    if version is None:
-        version = tuple(map(int, version_str.split(".")[:2]))
-    if arch is None:
-        arch = _mac_arch(cpu_arch)
-    platforms = []
-    for minor_version in range(version[1], -1, -1):
-        compat_version = version[0], minor_version
-        binary_formats = _mac_binary_formats(compat_version, arch)
-        for binary_format in binary_formats:
-            platforms.append(
-                "macosx_{major}_{minor}_{binary_format}".format(
-                    major=compat_version[0],
-                    minor=compat_version[1],
-                    binary_format=binary_format,
-                )
-            )
-    return platforms
-
-
-# From PEP 513.
-def _is_manylinux_compatible(name, glibc_version):
-    # Check for presence of _manylinux module.
-    try:
-        import _manylinux
-
-        return bool(getattr(_manylinux, name + "_compatible"))
-    except (ImportError, AttributeError):
-        # Fall through to heuristic check below.
-        pass
-
-    return _have_compatible_glibc(*glibc_version)
-
-
-def _glibc_version_string():
-    # Returns glibc version string, or None if not using glibc.
-    import ctypes
-
-    # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
-    # manpage says, "If filename is NULL, then the returned handle is for the
-    # main program". This way we can let the linker do the work to figure out
-    # which libc our process is actually using.
-    process_namespace = ctypes.CDLL(None)
-    try:
-        gnu_get_libc_version = process_namespace.gnu_get_libc_version
-    except AttributeError:
-        # Symbol doesn't exist -> therefore, we are not linked to
-        # glibc.
-        return None
-
-    # Call gnu_get_libc_version, which returns a string like "2.5"
-    gnu_get_libc_version.restype = ctypes.c_char_p
-    version_str = gnu_get_libc_version()
-    # py2 / py3 compatibility:
-    if not isinstance(version_str, str):
-        version_str = version_str.decode("ascii")
-
-    return version_str
-
-
-# Separated out from have_compatible_glibc for easier unit testing.
-def _check_glibc_version(version_str, required_major, minimum_minor):
-    # Parse string and check against requested version.
-    #
-    # We use a regexp instead of str.split because we want to discard any
-    # random junk that might come after the minor version -- this might happen
-    # in patched/forked versions of glibc (e.g. Linaro's version of glibc
-    # uses version strings like "2.20-2014.11"). See gh-3588.
-    m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str)
-    if not m:
-        warnings.warn(
-            "Expected glibc version with 2 components major.minor,"
-            " got: %s" % version_str,
-            RuntimeWarning,
-        )
-        return False
-    return (
-        int(m.group("major")) == required_major
-        and int(m.group("minor")) >= minimum_minor
-    )
-
-
-def _have_compatible_glibc(required_major, minimum_minor):
-    version_str = _glibc_version_string()
-    if version_str is None:
-        return False
-    return _check_glibc_version(version_str, required_major, minimum_minor)
-
-
-def _linux_platforms(is_32bit=_32_BIT_INTERPRETER):
-    linux = _normalize_string(distutils.util.get_platform())
-    if linux == "linux_x86_64" and is_32bit:
-        linux = "linux_i686"
-    manylinux_support = (
-        ("manylinux2014", (2, 17)),  # CentOS 7 w/ glibc 2.17 (PEP 599)
-        ("manylinux2010", (2, 12)),  # CentOS 6 w/ glibc 2.12 (PEP 571)
-        ("manylinux1", (2, 5)),  # CentOS 5 w/ glibc 2.5 (PEP 513)
-    )
-    manylinux_support_iter = iter(manylinux_support)
-    for name, glibc_version in manylinux_support_iter:
-        if _is_manylinux_compatible(name, glibc_version):
-            platforms = [linux.replace("linux", name)]
-            break
-    else:
-        platforms = []
-    # Support for a later manylinux implies support for an earlier version.
-    platforms += [linux.replace("linux", name) for name, _ in manylinux_support_iter]
-    platforms.append(linux)
-    return platforms
-
-
-def _generic_platforms():
-    platform = _normalize_string(distutils.util.get_platform())
-    return [platform]
-
-
-def _interpreter_name():
-    name = platform.python_implementation().lower()
-    return INTERPRETER_SHORT_NAMES.get(name) or name
-
-
-def _generic_interpreter(name, py_version):
-    version = sysconfig.get_config_var("py_version_nodot")
-    if not version:
-        version = "".join(map(str, py_version[:2]))
-    return "{name}{version}".format(name=name, version=version)
-
-
-def sys_tags():
-    """
-    Returns the sequence of tag triples for the running interpreter.
-
-    The order of the sequence corresponds to priority order for the
-    interpreter, from most to least important.
-    """
-    py_version = sys.version_info[:2]
-    interpreter_name = _interpreter_name()
-    if platform.system() == "Darwin":
-        platforms = _mac_platforms()
-    elif platform.system() == "Linux":
-        platforms = _linux_platforms()
-    else:
-        platforms = _generic_platforms()
-
-    if interpreter_name == "cp":
-        interpreter = _cpython_interpreter(py_version)
-        abis = _cpython_abis(py_version)
-        for tag in _cpython_tags(py_version, interpreter, abis, platforms):
-            yield tag
-    elif interpreter_name == "pp":
-        interpreter = _pypy_interpreter()
-        abi = _generic_abi()
-        for tag in _pypy_tags(py_version, interpreter, abi, platforms):
-            yield tag
-    else:
-        interpreter = _generic_interpreter(interpreter_name, py_version)
-        abi = _generic_abi()
-        for tag in _generic_tags(interpreter, py_version, abi, platforms):
-            yield tag
-    for tag in _independent_tags(interpreter, py_version, platforms):
-        yield tag
diff --git a/venv/lib/python3.8/site-packages/setuptools/site-patch.py b/venv/lib/python3.8/site-packages/setuptools/site-patch.py
deleted file mode 100644
index be0d43d..0000000
--- a/venv/lib/python3.8/site-packages/setuptools/site-patch.py
+++ /dev/null
@@ -1,76 +0,0 @@
-def __boot():
-    import sys
-    import os
-    PYTHONPATH = os.environ.get('PYTHONPATH')
-    if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH):
-        PYTHONPATH = []
-    else:
-        PYTHONPATH = PYTHONPATH.split(os.pathsep)
-
-    pic = getattr(sys, 'path_importer_cache', {})
-    stdpath = sys.path[len(PYTHONPATH):]
-    mydir = os.path.dirname(__file__)
-
-    for item in stdpath:
-        if item == mydir or not item:
-            continue  # skip if current dir. on Windows, or my own directory
-        importer = pic.get(item)
-        if importer is not None:
-            loader = importer.find_module('site')
-            if loader is not None:
-                # This should actually reload the current module
-                loader.load_module('site')
-                break
-        else:
-            try:
-                import imp  # Avoid import loop in Python 3
-                stream, path, descr = imp.find_module('site', [item])
-            except ImportError:
-                continue
-            if stream is None:
-                continue
-            try:
-                # This should actually reload the current module
-                imp.load_module('site', stream, path, descr)
-            finally:
-                stream.close()
-            break
-    else:
-        raise ImportError("Couldn't find the real 'site' module")
-
-    # 2.2 comp
-    known_paths = dict([(
-        makepath(item)[1], 1) for item in sys.path])  # noqa
-
-    oldpos = getattr(sys, '__egginsert', 0)  # save old insertion position
-    sys.__egginsert = 0  # and reset the current one
-
-    for item in PYTHONPATH:
-        addsitedir(item)  # noqa
-
-    sys.__egginsert += oldpos  # restore effective old position
-
-    d, nd = makepath(stdpath[0])  # noqa
-    insert_at = None
-    new_path = []
-
-    for item in sys.path:
-        p, np = makepath(item)  # noqa
-
-        if np == nd and insert_at is None:
-            # We've hit the first 'system' path entry, so added entries go here
-            insert_at = len(new_path)
-
-        if np in known_paths or insert_at is None:
-            new_path.append(item)
-        else:
-            # new path after the insert point, back-insert it
-            new_path.insert(insert_at, item)
-            insert_at += 1
-
-    sys.path[:] = new_path
-
-
-if __name__ == 'site':
-    __boot()
-    del __boot
diff --git a/venv/lib64 b/venv/lib64
deleted file mode 120000
index 7951405..0000000
--- a/venv/lib64
+++ /dev/null
@@ -1 +0,0 @@
-lib
\ No newline at end of file
diff --git a/venv/pyvenv.cfg b/venv/pyvenv.cfg
index 9b19d30..971d463 100644
--- a/venv/pyvenv.cfg
+++ b/venv/pyvenv.cfg
@@ -1,3 +1,3 @@
-home = /usr/local/bin
-include-system-site-packages = false
-version = 3.8.2
+home = C:\Users\Robin\AppData\Local\Programs\Python\Python38
+include-system-site-packages = true
+version = 3.8.2
-- 
GitLab